Merge "Make it clear that we no longer use linux-tools-perf."
diff --git a/Android.mk b/Android.mk
deleted file mode 100644
index 741f31d..0000000
--- a/Android.mk
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright (C) 2013 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH := $(call my-dir)
-
-ifneq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),mips mips64))
-include $(LOCAL_PATH)/src/tools/perf/Android.mk
-endif
diff --git a/CleanSpec.mk b/CleanSpec.mk
deleted file mode 100644
index a97802d..0000000
--- a/CleanSpec.mk
+++ /dev/null
@@ -1,75 +0,0 @@
-# Copyright (C) 2007 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-# If you don't need to do a full clean build but would like to touch
-# a file or delete some intermediate files, add a clean step to the end
-# of the list.  These steps will only be run once, if they haven't been
-# run before.
-#
-# E.g.:
-#     $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
-#     $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
-#
-# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
-# files that are missing or have been moved.
-#
-# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
-# Use $(OUT_DIR) to refer to the "out" directory.
-#
-# If you need to re-do something that's already mentioned, just copy
-# the command and add it to the bottom of the list.  E.g., if a change
-# that you made last week required touching a file and a change you
-# made today requires touching the same file, just copy the old
-# touch step and add it to the end of the list.
-#
-# ************************************************
-# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
-# ************************************************
-
-# For example:
-#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
-#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
-#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
-#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
-$(call add-clean-step, rm -rf $(ANDROID_HOST_OUT)/obj/STATIC_LIBRARIES/libelf_intermediates)
-$(call add-clean-step, rm -rf $(ANDROID_HOST_OUT)/obj/STATIC_LIBRARIES/libebl_intermediates)
-$(call add-clean-step, rm -rf $(ANDROID_HOST_OUT)/obj/STATIC_LIBRARIES/libdw_intermediates)
-$(call add-clean-step, rm -rf $(ANDROID_HOST_OUT)/obj/STATIC_LIBRARIES/libdwfl_intermediates)
-$(call add-clean-step, rm -rf $(ANDROID_HOST_OUT)/obj/STATIC_LIBRARIES/libperf_intermediates)
-$(call add-clean-step, rm -rf $(ANDROID_HOST_OUT)/obj/EXECUTABLES/perf_intermediates)
-$(call add-clean-step, rm -rf $(OUT)/obj/STATIC_LIBRARIES/libperf_intermediates)
-$(call add-clean-step, rm -rf $(OUT)/obj/EXECUTABLES/perf_intermediates)
-
-$(call add-clean-step, rm -rf $(ANDROID_HOST_OUT)/obj/STATIC_LIBRARIES/libperf_intermediates)
-$(call add-clean-step, rm -rf $(ANDROID_HOST_OUT)/obj/STATIC_LIBRARIES/libdw_intermediates)
-$(call add-clean-step, rm -rf $(ANDROID_HOST_OUT)/obj/STATIC_LIBRARIES/libdwfl_intermediates)
-$(call add-clean-step, rm -rf $(ANDROID_HOST_OUT)/obj/STATIC_LIBRARIES/libelf_intermediates)
-$(call add-clean-step, rm -rf $(ANDROID_HOST_OUT)/obj/STATIC_LIBRARIES/libebl_intermediates)
-$(call add-clean-step, rm -rf $(ANDROID_HOST_OUT)/obj/EXECUTABLES/perf_intermediates)
-$(call add-clean-step, rm -rf $(OUT)/obj/STATIC_LIBRARIES/libperf_intermediates)
-$(call add-clean-step, rm -rf $(OUT)/obj/STATIC_LIBRARIES/libdw_intermediates)
-$(call add-clean-step, rm -rf $(OUT)/obj/STATIC_LIBRARIES/libdwfl_intermediates)
-$(call add-clean-step, rm -rf $(OUT)/obj/STATIC_LIBRARIES/libelf_intermediates)
-$(call add-clean-step, rm -rf $(OUT)/obj/STATIC_LIBRARIES/libebl_intermediates)
-$(call add-clean-step, rm -rf $(OUT)/obj/EXECUTABLES/perf_intermediates)
-
-$(call add-clean-step, rm -rf $(ANDROID_HOST_OUT)/obj/STATIC_LIBRARIES/libperf_intermediates)
-$(call add-clean-step, rm -rf $(ANDROID_HOST_OUT)/obj/EXECUTABLES/perf_intermediates)
-$(call add-clean-step, rm -rf $(OUT)/obj/STATIC_LIBRARIES/libperf_intermediates)
-$(call add-clean-step, rm -rf $(OUT)/obj/EXECUTABLES/perf_intermediates)
-
-# ************************************************
-# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
-# ************************************************
diff --git a/MODULE_LICENSE_GPL b/MODULE_LICENSE_GPL
deleted file mode 100644
index e69de29..0000000
--- a/MODULE_LICENSE_GPL
+++ /dev/null
diff --git a/NOTICE b/NOTICE
deleted file mode 100644
index d60c31a..0000000
--- a/NOTICE
+++ /dev/null
@@ -1,340 +0,0 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-	    How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    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, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year  name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..9f8c0a9
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+See system/extras/simpleperf/ instead.
diff --git a/android-fixes.h b/android-fixes.h
deleted file mode 100644
index 0963966..0000000
--- a/android-fixes.h
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Turn on our Android-specific changes until we can upstream them. */
-#define ANDROID_PATCHES
-
-#include <stddef.h>
-
-/* In libcxxabi. */
-extern char* __cxa_demangle(const char*, char*, size_t*, int*);
-
-/* So we can say HAVE_CPLUS_DEMANGLE (since we don't have libbfd). */
-static inline char* cplus_demangle(const char* c, int i) {
-  return __cxa_demangle(c, 0, 0, 0);
-}
diff --git a/src/include/linux/hash.h b/src/include/linux/hash.h
deleted file mode 100644
index f09a0ae..0000000
--- a/src/include/linux/hash.h
+++ /dev/null
@@ -1,81 +0,0 @@
-#ifndef _LINUX_HASH_H
-#define _LINUX_HASH_H
-/* Fast hashing routine for ints,  longs and pointers.
-   (C) 2002 Nadia Yvette Chambers, IBM */
-
-/*
- * Knuth recommends primes in approximately golden ratio to the maximum
- * integer representable by a machine word for multiplicative hashing.
- * Chuck Lever verified the effectiveness of this technique:
- * http://www.citi.umich.edu/techreports/reports/citi-tr-00-1.pdf
- *
- * These primes are chosen to be bit-sparse, that is operations on
- * them can use shifts and additions instead of multiplications for
- * machines where multiplications are slow.
- */
-
-#include <asm/types.h>
-#include <linux/compiler.h>
-
-/* 2^31 + 2^29 - 2^25 + 2^22 - 2^19 - 2^16 + 1 */
-#define GOLDEN_RATIO_PRIME_32 0x9e370001UL
-/*  2^63 + 2^61 - 2^57 + 2^54 - 2^51 - 2^18 + 1 */
-#define GOLDEN_RATIO_PRIME_64 0x9e37fffffffc0001UL
-
-#if BITS_PER_LONG == 32
-#define GOLDEN_RATIO_PRIME GOLDEN_RATIO_PRIME_32
-#define hash_long(val, bits) hash_32(val, bits)
-#elif BITS_PER_LONG == 64
-#define hash_long(val, bits) hash_64(val, bits)
-#define GOLDEN_RATIO_PRIME GOLDEN_RATIO_PRIME_64
-#else
-#error Wordsize not 32 or 64
-#endif
-
-static __always_inline u64 hash_64(u64 val, unsigned int bits)
-{
-	u64 hash = val;
-
-	/*  Sigh, gcc can't optimise this alone like it does for 32 bits. */
-	u64 n = hash;
-	n <<= 18;
-	hash -= n;
-	n <<= 33;
-	hash -= n;
-	n <<= 3;
-	hash += n;
-	n <<= 3;
-	hash -= n;
-	n <<= 4;
-	hash += n;
-	n <<= 2;
-	hash += n;
-
-	/* High bits are more random, so use them. */
-	return hash >> (64 - bits);
-}
-
-static inline u32 hash_32(u32 val, unsigned int bits)
-{
-	/* On some cpus multiply is faster, on others gcc will do shifts */
-	u32 hash = val * GOLDEN_RATIO_PRIME_32;
-
-	/* High bits are more random, so use them. */
-	return hash >> (32 - bits);
-}
-
-static inline unsigned long hash_ptr(const void *ptr, unsigned int bits)
-{
-	return hash_long((unsigned long)ptr, bits);
-}
-
-static inline u32 hash32_ptr(const void *ptr)
-{
-	unsigned long val = (unsigned long)ptr;
-
-#if BITS_PER_LONG == 64
-	val ^= (val >> 32);
-#endif
-	return (u32)val;
-}
-#endif /* _LINUX_HASH_H */
diff --git a/src/include/linux/list.h b/src/include/linux/list.h
deleted file mode 100644
index f4d8a2f..0000000
--- a/src/include/linux/list.h
+++ /dev/null
@@ -1,716 +0,0 @@
-#ifndef _LINUX_LIST_H
-#define _LINUX_LIST_H
-
-#include <linux/types.h>
-#include <linux/stddef.h>
-#include <linux/poison.h>
-#include <linux/const.h>
-
-/*
- * Simple doubly linked list implementation.
- *
- * Some of the internal functions ("__xxx") are useful when
- * manipulating whole lists rather than single entries, as
- * sometimes we already know the next/prev entries and we can
- * generate better code by using them directly rather than
- * using the generic single-entry routines.
- */
-
-#define LIST_HEAD_INIT(name) { &(name), &(name) }
-
-#define LIST_HEAD(name) \
-	struct list_head name = LIST_HEAD_INIT(name)
-
-static inline void INIT_LIST_HEAD(struct list_head *list)
-{
-	list->next = list;
-	list->prev = list;
-}
-
-/*
- * Insert a new entry between two known consecutive entries.
- *
- * This is only for internal list manipulation where we know
- * the prev/next entries already!
- */
-#ifndef CONFIG_DEBUG_LIST
-static inline void __list_add(struct list_head *new,
-			      struct list_head *prev,
-			      struct list_head *next)
-{
-	next->prev = new;
-	new->next = next;
-	new->prev = prev;
-	prev->next = new;
-}
-#else
-extern void __list_add(struct list_head *new,
-			      struct list_head *prev,
-			      struct list_head *next);
-#endif
-
-/**
- * list_add - add a new entry
- * @new: new entry to be added
- * @head: list head to add it after
- *
- * Insert a new entry after the specified head.
- * This is good for implementing stacks.
- */
-static inline void list_add(struct list_head *new, struct list_head *head)
-{
-	__list_add(new, head, head->next);
-}
-
-
-/**
- * list_add_tail - add a new entry
- * @new: new entry to be added
- * @head: list head to add it before
- *
- * Insert a new entry before the specified head.
- * This is useful for implementing queues.
- */
-static inline void list_add_tail(struct list_head *new, struct list_head *head)
-{
-	__list_add(new, head->prev, head);
-}
-
-/*
- * Delete a list entry by making the prev/next entries
- * point to each other.
- *
- * This is only for internal list manipulation where we know
- * the prev/next entries already!
- */
-static inline void __list_del(struct list_head * prev, struct list_head * next)
-{
-	next->prev = prev;
-	prev->next = next;
-}
-
-/**
- * list_del - deletes entry from list.
- * @entry: the element to delete from the list.
- * Note: list_empty() on entry does not return true after this, the entry is
- * in an undefined state.
- */
-#ifndef CONFIG_DEBUG_LIST
-static inline void __list_del_entry(struct list_head *entry)
-{
-	__list_del(entry->prev, entry->next);
-}
-
-static inline void list_del(struct list_head *entry)
-{
-	__list_del(entry->prev, entry->next);
-	entry->next = LIST_POISON1;
-	entry->prev = LIST_POISON2;
-}
-#else
-extern void __list_del_entry(struct list_head *entry);
-extern void list_del(struct list_head *entry);
-#endif
-
-/**
- * list_replace - replace old entry by new one
- * @old : the element to be replaced
- * @new : the new element to insert
- *
- * If @old was empty, it will be overwritten.
- */
-static inline void list_replace(struct list_head *old,
-				struct list_head *new)
-{
-	new->next = old->next;
-	new->next->prev = new;
-	new->prev = old->prev;
-	new->prev->next = new;
-}
-
-static inline void list_replace_init(struct list_head *old,
-					struct list_head *new)
-{
-	list_replace(old, new);
-	INIT_LIST_HEAD(old);
-}
-
-/**
- * list_del_init - deletes entry from list and reinitialize it.
- * @entry: the element to delete from the list.
- */
-static inline void list_del_init(struct list_head *entry)
-{
-	__list_del_entry(entry);
-	INIT_LIST_HEAD(entry);
-}
-
-/**
- * list_move - delete from one list and add as another's head
- * @list: the entry to move
- * @head: the head that will precede our entry
- */
-static inline void list_move(struct list_head *list, struct list_head *head)
-{
-	__list_del_entry(list);
-	list_add(list, head);
-}
-
-/**
- * list_move_tail - delete from one list and add as another's tail
- * @list: the entry to move
- * @head: the head that will follow our entry
- */
-static inline void list_move_tail(struct list_head *list,
-				  struct list_head *head)
-{
-	__list_del_entry(list);
-	list_add_tail(list, head);
-}
-
-/**
- * list_is_last - tests whether @list is the last entry in list @head
- * @list: the entry to test
- * @head: the head of the list
- */
-static inline int list_is_last(const struct list_head *list,
-				const struct list_head *head)
-{
-	return list->next == head;
-}
-
-/**
- * list_empty - tests whether a list is empty
- * @head: the list to test.
- */
-static inline int list_empty(const struct list_head *head)
-{
-	return head->next == head;
-}
-
-/**
- * list_empty_careful - tests whether a list is empty and not being modified
- * @head: the list to test
- *
- * Description:
- * tests whether a list is empty _and_ checks that no other CPU might be
- * in the process of modifying either member (next or prev)
- *
- * NOTE: using list_empty_careful() without synchronization
- * can only be safe if the only activity that can happen
- * to the list entry is list_del_init(). Eg. it cannot be used
- * if another CPU could re-list_add() it.
- */
-static inline int list_empty_careful(const struct list_head *head)
-{
-	struct list_head *next = head->next;
-	return (next == head) && (next == head->prev);
-}
-
-/**
- * list_rotate_left - rotate the list to the left
- * @head: the head of the list
- */
-static inline void list_rotate_left(struct list_head *head)
-{
-	struct list_head *first;
-
-	if (!list_empty(head)) {
-		first = head->next;
-		list_move_tail(first, head);
-	}
-}
-
-/**
- * list_is_singular - tests whether a list has just one entry.
- * @head: the list to test.
- */
-static inline int list_is_singular(const struct list_head *head)
-{
-	return !list_empty(head) && (head->next == head->prev);
-}
-
-static inline void __list_cut_position(struct list_head *list,
-		struct list_head *head, struct list_head *entry)
-{
-	struct list_head *new_first = entry->next;
-	list->next = head->next;
-	list->next->prev = list;
-	list->prev = entry;
-	entry->next = list;
-	head->next = new_first;
-	new_first->prev = head;
-}
-
-/**
- * list_cut_position - cut a list into two
- * @list: a new list to add all removed entries
- * @head: a list with entries
- * @entry: an entry within head, could be the head itself
- *	and if so we won't cut the list
- *
- * This helper moves the initial part of @head, up to and
- * including @entry, from @head to @list. You should
- * pass on @entry an element you know is on @head. @list
- * should be an empty list or a list you do not care about
- * losing its data.
- *
- */
-static inline void list_cut_position(struct list_head *list,
-		struct list_head *head, struct list_head *entry)
-{
-	if (list_empty(head))
-		return;
-	if (list_is_singular(head) &&
-		(head->next != entry && head != entry))
-		return;
-	if (entry == head)
-		INIT_LIST_HEAD(list);
-	else
-		__list_cut_position(list, head, entry);
-}
-
-static inline void __list_splice(const struct list_head *list,
-				 struct list_head *prev,
-				 struct list_head *next)
-{
-	struct list_head *first = list->next;
-	struct list_head *last = list->prev;
-
-	first->prev = prev;
-	prev->next = first;
-
-	last->next = next;
-	next->prev = last;
-}
-
-/**
- * list_splice - join two lists, this is designed for stacks
- * @list: the new list to add.
- * @head: the place to add it in the first list.
- */
-static inline void list_splice(const struct list_head *list,
-				struct list_head *head)
-{
-	if (!list_empty(list))
-		__list_splice(list, head, head->next);
-}
-
-/**
- * list_splice_tail - join two lists, each list being a queue
- * @list: the new list to add.
- * @head: the place to add it in the first list.
- */
-static inline void list_splice_tail(struct list_head *list,
-				struct list_head *head)
-{
-	if (!list_empty(list))
-		__list_splice(list, head->prev, head);
-}
-
-/**
- * list_splice_init - join two lists and reinitialise the emptied list.
- * @list: the new list to add.
- * @head: the place to add it in the first list.
- *
- * The list at @list is reinitialised
- */
-static inline void list_splice_init(struct list_head *list,
-				    struct list_head *head)
-{
-	if (!list_empty(list)) {
-		__list_splice(list, head, head->next);
-		INIT_LIST_HEAD(list);
-	}
-}
-
-/**
- * list_splice_tail_init - join two lists and reinitialise the emptied list
- * @list: the new list to add.
- * @head: the place to add it in the first list.
- *
- * Each of the lists is a queue.
- * The list at @list is reinitialised
- */
-static inline void list_splice_tail_init(struct list_head *list,
-					 struct list_head *head)
-{
-	if (!list_empty(list)) {
-		__list_splice(list, head->prev, head);
-		INIT_LIST_HEAD(list);
-	}
-}
-
-/**
- * list_entry - get the struct for this entry
- * @ptr:	the &struct list_head pointer.
- * @type:	the type of the struct this is embedded in.
- * @member:	the name of the list_struct within the struct.
- */
-#define list_entry(ptr, type, member) \
-	container_of(ptr, type, member)
-
-/**
- * list_first_entry - get the first element from a list
- * @ptr:	the list head to take the element from.
- * @type:	the type of the struct this is embedded in.
- * @member:	the name of the list_struct within the struct.
- *
- * Note, that list is expected to be not empty.
- */
-#define list_first_entry(ptr, type, member) \
-	list_entry((ptr)->next, type, member)
-
-/**
- * list_first_entry_or_null - get the first element from a list
- * @ptr:	the list head to take the element from.
- * @type:	the type of the struct this is embedded in.
- * @member:	the name of the list_struct within the struct.
- *
- * Note that if the list is empty, it returns NULL.
- */
-#define list_first_entry_or_null(ptr, type, member) \
-	(!list_empty(ptr) ? list_first_entry(ptr, type, member) : NULL)
-
-/**
- * list_for_each	-	iterate over a list
- * @pos:	the &struct list_head to use as a loop cursor.
- * @head:	the head for your list.
- */
-#define list_for_each(pos, head) \
-	for (pos = (head)->next; pos != (head); pos = pos->next)
-
-/**
- * list_for_each_prev	-	iterate over a list backwards
- * @pos:	the &struct list_head to use as a loop cursor.
- * @head:	the head for your list.
- */
-#define list_for_each_prev(pos, head) \
-	for (pos = (head)->prev; pos != (head); pos = pos->prev)
-
-/**
- * list_for_each_safe - iterate over a list safe against removal of list entry
- * @pos:	the &struct list_head to use as a loop cursor.
- * @n:		another &struct list_head to use as temporary storage
- * @head:	the head for your list.
- */
-#define list_for_each_safe(pos, n, head) \
-	for (pos = (head)->next, n = pos->next; pos != (head); \
-		pos = n, n = pos->next)
-
-/**
- * list_for_each_prev_safe - iterate over a list backwards safe against removal of list entry
- * @pos:	the &struct list_head to use as a loop cursor.
- * @n:		another &struct list_head to use as temporary storage
- * @head:	the head for your list.
- */
-#define list_for_each_prev_safe(pos, n, head) \
-	for (pos = (head)->prev, n = pos->prev; \
-	     pos != (head); \
-	     pos = n, n = pos->prev)
-
-/**
- * list_for_each_entry	-	iterate over list of given type
- * @pos:	the type * to use as a loop cursor.
- * @head:	the head for your list.
- * @member:	the name of the list_struct within the struct.
- */
-#define list_for_each_entry(pos, head, member)				\
-	for (pos = list_entry((head)->next, typeof(*pos), member);	\
-	     &pos->member != (head); 	\
-	     pos = list_entry(pos->member.next, typeof(*pos), member))
-
-/**
- * list_for_each_entry_reverse - iterate backwards over list of given type.
- * @pos:	the type * to use as a loop cursor.
- * @head:	the head for your list.
- * @member:	the name of the list_struct within the struct.
- */
-#define list_for_each_entry_reverse(pos, head, member)			\
-	for (pos = list_entry((head)->prev, typeof(*pos), member);	\
-	     &pos->member != (head); 	\
-	     pos = list_entry(pos->member.prev, typeof(*pos), member))
-
-/**
- * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue()
- * @pos:	the type * to use as a start point
- * @head:	the head of the list
- * @member:	the name of the list_struct within the struct.
- *
- * Prepares a pos entry for use as a start point in list_for_each_entry_continue().
- */
-#define list_prepare_entry(pos, head, member) \
-	((pos) ? : list_entry(head, typeof(*pos), member))
-
-/**
- * list_for_each_entry_continue - continue iteration over list of given type
- * @pos:	the type * to use as a loop cursor.
- * @head:	the head for your list.
- * @member:	the name of the list_struct within the struct.
- *
- * Continue to iterate over list of given type, continuing after
- * the current position.
- */
-#define list_for_each_entry_continue(pos, head, member) 		\
-	for (pos = list_entry(pos->member.next, typeof(*pos), member);	\
-	     &pos->member != (head);	\
-	     pos = list_entry(pos->member.next, typeof(*pos), member))
-
-/**
- * list_for_each_entry_continue_reverse - iterate backwards from the given point
- * @pos:	the type * to use as a loop cursor.
- * @head:	the head for your list.
- * @member:	the name of the list_struct within the struct.
- *
- * Start to iterate over list of given type backwards, continuing after
- * the current position.
- */
-#define list_for_each_entry_continue_reverse(pos, head, member)		\
-	for (pos = list_entry(pos->member.prev, typeof(*pos), member);	\
-	     &pos->member != (head);	\
-	     pos = list_entry(pos->member.prev, typeof(*pos), member))
-
-/**
- * list_for_each_entry_from - iterate over list of given type from the current point
- * @pos:	the type * to use as a loop cursor.
- * @head:	the head for your list.
- * @member:	the name of the list_struct within the struct.
- *
- * Iterate over list of given type, continuing from current position.
- */
-#define list_for_each_entry_from(pos, head, member) 			\
-	for (; &pos->member != (head);	\
-	     pos = list_entry(pos->member.next, typeof(*pos), member))
-
-/**
- * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry
- * @pos:	the type * to use as a loop cursor.
- * @n:		another type * to use as temporary storage
- * @head:	the head for your list.
- * @member:	the name of the list_struct within the struct.
- */
-#define list_for_each_entry_safe(pos, n, head, member)			\
-	for (pos = list_entry((head)->next, typeof(*pos), member),	\
-		n = list_entry(pos->member.next, typeof(*pos), member);	\
-	     &pos->member != (head); 					\
-	     pos = n, n = list_entry(n->member.next, typeof(*n), member))
-
-/**
- * list_for_each_entry_safe_continue - continue list iteration safe against removal
- * @pos:	the type * to use as a loop cursor.
- * @n:		another type * to use as temporary storage
- * @head:	the head for your list.
- * @member:	the name of the list_struct within the struct.
- *
- * Iterate over list of given type, continuing after current point,
- * safe against removal of list entry.
- */
-#define list_for_each_entry_safe_continue(pos, n, head, member) 		\
-	for (pos = list_entry(pos->member.next, typeof(*pos), member), 		\
-		n = list_entry(pos->member.next, typeof(*pos), member);		\
-	     &pos->member != (head);						\
-	     pos = n, n = list_entry(n->member.next, typeof(*n), member))
-
-/**
- * list_for_each_entry_safe_from - iterate over list from current point safe against removal
- * @pos:	the type * to use as a loop cursor.
- * @n:		another type * to use as temporary storage
- * @head:	the head for your list.
- * @member:	the name of the list_struct within the struct.
- *
- * Iterate over list of given type from current point, safe against
- * removal of list entry.
- */
-#define list_for_each_entry_safe_from(pos, n, head, member) 			\
-	for (n = list_entry(pos->member.next, typeof(*pos), member);		\
-	     &pos->member != (head);						\
-	     pos = n, n = list_entry(n->member.next, typeof(*n), member))
-
-/**
- * list_for_each_entry_safe_reverse - iterate backwards over list safe against removal
- * @pos:	the type * to use as a loop cursor.
- * @n:		another type * to use as temporary storage
- * @head:	the head for your list.
- * @member:	the name of the list_struct within the struct.
- *
- * Iterate backwards over list of given type, safe against removal
- * of list entry.
- */
-#define list_for_each_entry_safe_reverse(pos, n, head, member)		\
-	for (pos = list_entry((head)->prev, typeof(*pos), member),	\
-		n = list_entry(pos->member.prev, typeof(*pos), member);	\
-	     &pos->member != (head); 					\
-	     pos = n, n = list_entry(n->member.prev, typeof(*n), member))
-
-/**
- * list_safe_reset_next - reset a stale list_for_each_entry_safe loop
- * @pos:	the loop cursor used in the list_for_each_entry_safe loop
- * @n:		temporary storage used in list_for_each_entry_safe
- * @member:	the name of the list_struct within the struct.
- *
- * list_safe_reset_next is not safe to use in general if the list may be
- * modified concurrently (eg. the lock is dropped in the loop body). An
- * exception to this is if the cursor element (pos) is pinned in the list,
- * and list_safe_reset_next is called after re-taking the lock and before
- * completing the current iteration of the loop body.
- */
-#define list_safe_reset_next(pos, n, member)				\
-	n = list_entry(pos->member.next, typeof(*pos), member)
-
-/*
- * Double linked lists with a single pointer list head.
- * Mostly useful for hash tables where the two pointer list head is
- * too wasteful.
- * You lose the ability to access the tail in O(1).
- */
-
-#define HLIST_HEAD_INIT { .first = NULL }
-#define HLIST_HEAD(name) struct hlist_head name = {  .first = NULL }
-#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL)
-static inline void INIT_HLIST_NODE(struct hlist_node *h)
-{
-	h->next = NULL;
-	h->pprev = NULL;
-}
-
-static inline int hlist_unhashed(const struct hlist_node *h)
-{
-	return !h->pprev;
-}
-
-static inline int hlist_empty(const struct hlist_head *h)
-{
-	return !h->first;
-}
-
-static inline void __hlist_del(struct hlist_node *n)
-{
-	struct hlist_node *next = n->next;
-	struct hlist_node **pprev = n->pprev;
-	*pprev = next;
-	if (next)
-		next->pprev = pprev;
-}
-
-static inline void hlist_del(struct hlist_node *n)
-{
-	__hlist_del(n);
-	n->next = LIST_POISON1;
-	n->pprev = LIST_POISON2;
-}
-
-static inline void hlist_del_init(struct hlist_node *n)
-{
-	if (!hlist_unhashed(n)) {
-		__hlist_del(n);
-		INIT_HLIST_NODE(n);
-	}
-}
-
-static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
-{
-	struct hlist_node *first = h->first;
-	n->next = first;
-	if (first)
-		first->pprev = &n->next;
-	h->first = n;
-	n->pprev = &h->first;
-}
-
-/* next must be != NULL */
-static inline void hlist_add_before(struct hlist_node *n,
-					struct hlist_node *next)
-{
-	n->pprev = next->pprev;
-	n->next = next;
-	next->pprev = &n->next;
-	*(n->pprev) = n;
-}
-
-static inline void hlist_add_after(struct hlist_node *n,
-					struct hlist_node *next)
-{
-	next->next = n->next;
-	n->next = next;
-	next->pprev = &n->next;
-
-	if(next->next)
-		next->next->pprev  = &next->next;
-}
-
-/* after that we'll appear to be on some hlist and hlist_del will work */
-static inline void hlist_add_fake(struct hlist_node *n)
-{
-	n->pprev = &n->next;
-}
-
-/*
- * Move a list from one list head to another. Fixup the pprev
- * reference of the first entry if it exists.
- */
-static inline void hlist_move_list(struct hlist_head *old,
-				   struct hlist_head *new)
-{
-	new->first = old->first;
-	if (new->first)
-		new->first->pprev = &new->first;
-	old->first = NULL;
-}
-
-#define hlist_entry(ptr, type, member) container_of(ptr,type,member)
-
-#define hlist_for_each(pos, head) \
-	for (pos = (head)->first; pos ; pos = pos->next)
-
-#define hlist_for_each_safe(pos, n, head) \
-	for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
-	     pos = n)
-
-#define hlist_entry_safe(ptr, type, member) \
-	({ typeof(ptr) ____ptr = (ptr); \
-	   ____ptr ? hlist_entry(____ptr, type, member) : NULL; \
-	})
-
-/**
- * hlist_for_each_entry	- iterate over list of given type
- * @pos:	the type * to use as a loop cursor.
- * @head:	the head for your list.
- * @member:	the name of the hlist_node within the struct.
- */
-#define hlist_for_each_entry(pos, head, member)				\
-	for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\
-	     pos;							\
-	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
-
-/**
- * hlist_for_each_entry_continue - iterate over a hlist continuing after current point
- * @pos:	the type * to use as a loop cursor.
- * @member:	the name of the hlist_node within the struct.
- */
-#define hlist_for_each_entry_continue(pos, member)			\
-	for (pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member);\
-	     pos;							\
-	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
-
-/**
- * hlist_for_each_entry_from - iterate over a hlist continuing from current point
- * @pos:	the type * to use as a loop cursor.
- * @member:	the name of the hlist_node within the struct.
- */
-#define hlist_for_each_entry_from(pos, member)				\
-	for (; pos;							\
-	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
-
-/**
- * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry
- * @pos:	the type * to use as a loop cursor.
- * @n:		another &struct hlist_node to use as temporary storage
- * @head:	the head for your list.
- * @member:	the name of the hlist_node within the struct.
- */
-#define hlist_for_each_entry_safe(pos, n, head, member) 		\
-	for (pos = hlist_entry_safe((head)->first, typeof(*pos), member);\
-	     pos && ({ n = pos->member.next; 1; });			\
-	     pos = hlist_entry_safe(n, typeof(*pos), member))
-
-#endif
diff --git a/src/include/linux/perf_event.h b/src/include/linux/perf_event.h
deleted file mode 100644
index c8ba627..0000000
--- a/src/include/linux/perf_event.h
+++ /dev/null
@@ -1,868 +0,0 @@
-/*
- * Performance events:
- *
- *    Copyright (C) 2008-2009, Thomas Gleixner <tglx@linutronix.de>
- *    Copyright (C) 2008-2011, Red Hat, Inc., Ingo Molnar
- *    Copyright (C) 2008-2011, Red Hat, Inc., Peter Zijlstra
- *
- * Data type definitions, declarations, prototypes.
- *
- *    Started by: Thomas Gleixner and Ingo Molnar
- *
- * For licencing details see kernel-base/COPYING
- */
-#ifndef _LINUX_PERF_EVENT_H
-#define _LINUX_PERF_EVENT_H
-
-#include <uapi/linux/perf_event.h>
-
-/*
- * Kernel-internal data types and definitions:
- */
-
-#ifdef CONFIG_PERF_EVENTS
-# include <asm/perf_event.h>
-# include <asm/local64.h>
-#endif
-
-struct perf_guest_info_callbacks {
-	int				(*is_in_guest)(void);
-	int				(*is_user_mode)(void);
-	unsigned long			(*get_guest_ip)(void);
-};
-
-#ifdef CONFIG_HAVE_HW_BREAKPOINT
-#include <asm/hw_breakpoint.h>
-#endif
-
-#include <linux/list.h>
-#include <linux/mutex.h>
-#include <linux/rculist.h>
-#include <linux/rcupdate.h>
-#include <linux/spinlock.h>
-#include <linux/hrtimer.h>
-#include <linux/fs.h>
-#include <linux/pid_namespace.h>
-#include <linux/workqueue.h>
-#include <linux/ftrace.h>
-#include <linux/cpu.h>
-#include <linux/irq_work.h>
-#include <linux/static_key.h>
-#include <linux/jump_label_ratelimit.h>
-#include <linux/atomic.h>
-#include <linux/sysfs.h>
-#include <linux/perf_regs.h>
-#include <asm/local.h>
-
-struct perf_callchain_entry {
-	__u64				nr;
-	__u64				ip[PERF_MAX_STACK_DEPTH];
-};
-
-struct perf_raw_record {
-	u32				size;
-	void				*data;
-};
-
-/*
- * branch stack layout:
- *  nr: number of taken branches stored in entries[]
- *
- * Note that nr can vary from sample to sample
- * branches (to, from) are stored from most recent
- * to least recent, i.e., entries[0] contains the most
- * recent branch.
- */
-struct perf_branch_stack {
-	__u64				nr;
-	struct perf_branch_entry	entries[0];
-};
-
-struct perf_regs_user {
-	__u64		abi;
-	struct pt_regs	*regs;
-};
-
-struct task_struct;
-
-/*
- * extra PMU register associated with an event
- */
-struct hw_perf_event_extra {
-	u64		config;	/* register value */
-	unsigned int	reg;	/* register address or index */
-	int		alloc;	/* extra register already allocated */
-	int		idx;	/* index in shared_regs->regs[] */
-};
-
-struct event_constraint;
-
-/**
- * struct hw_perf_event - performance event hardware details:
- */
-struct hw_perf_event {
-#ifdef CONFIG_PERF_EVENTS
-	union {
-		struct { /* hardware */
-			u64		config;
-			u64		last_tag;
-			unsigned long	config_base;
-			unsigned long	event_base;
-			int		event_base_rdpmc;
-			int		idx;
-			int		last_cpu;
-			int		flags;
-
-			struct hw_perf_event_extra extra_reg;
-			struct hw_perf_event_extra branch_reg;
-
-			struct event_constraint *constraint;
-		};
-		struct { /* software */
-			struct hrtimer	hrtimer;
-		};
-		struct { /* tracepoint */
-			struct task_struct	*tp_target;
-			/* for tp_event->class */
-			struct list_head	tp_list;
-		};
-#ifdef CONFIG_HAVE_HW_BREAKPOINT
-		struct { /* breakpoint */
-			/*
-			 * Crufty hack to avoid the chicken and egg
-			 * problem hw_breakpoint has with context
-			 * creation and event initalization.
-			 */
-			struct task_struct		*bp_target;
-			struct arch_hw_breakpoint	info;
-			struct list_head		bp_list;
-		};
-#endif
-	};
-	int				state;
-	local64_t			prev_count;
-	u64				sample_period;
-	u64				last_period;
-	local64_t			period_left;
-	u64                             interrupts_seq;
-	u64				interrupts;
-
-	u64				freq_time_stamp;
-	u64				freq_count_stamp;
-#endif
-};
-
-/*
- * hw_perf_event::state flags
- */
-#define PERF_HES_STOPPED	0x01 /* the counter is stopped */
-#define PERF_HES_UPTODATE	0x02 /* event->count up-to-date */
-#define PERF_HES_ARCH		0x04
-
-struct perf_event;
-
-/*
- * Common implementation detail of pmu::{start,commit,cancel}_txn
- */
-#define PERF_EVENT_TXN 0x1
-
-/**
- * struct pmu - generic performance monitoring unit
- */
-struct pmu {
-	struct list_head		entry;
-
-	struct device			*dev;
-	const struct attribute_group	**attr_groups;
-	const char			*name;
-	int				type;
-
-	int * __percpu			pmu_disable_count;
-	struct perf_cpu_context * __percpu pmu_cpu_context;
-	int				task_ctx_nr;
-	int				hrtimer_interval_ms;
-
-	/*
-	 * Fully disable/enable this PMU, can be used to protect from the PMI
-	 * as well as for lazy/batch writing of the MSRs.
-	 */
-	void (*pmu_enable)		(struct pmu *pmu); /* optional */
-	void (*pmu_disable)		(struct pmu *pmu); /* optional */
-
-	/*
-	 * Try and initialize the event for this PMU.
-	 * Should return -ENOENT when the @event doesn't match this PMU.
-	 */
-	int (*event_init)		(struct perf_event *event);
-
-#define PERF_EF_START	0x01		/* start the counter when adding    */
-#define PERF_EF_RELOAD	0x02		/* reload the counter when starting */
-#define PERF_EF_UPDATE	0x04		/* update the counter when stopping */
-
-	/*
-	 * Adds/Removes a counter to/from the PMU, can be done inside
-	 * a transaction, see the ->*_txn() methods.
-	 */
-	int  (*add)			(struct perf_event *event, int flags);
-	void (*del)			(struct perf_event *event, int flags);
-
-	/*
-	 * Starts/Stops a counter present on the PMU. The PMI handler
-	 * should stop the counter when perf_event_overflow() returns
-	 * !0. ->start() will be used to continue.
-	 */
-	void (*start)			(struct perf_event *event, int flags);
-	void (*stop)			(struct perf_event *event, int flags);
-
-	/*
-	 * Updates the counter value of the event.
-	 */
-	void (*read)			(struct perf_event *event);
-
-	/*
-	 * Group events scheduling is treated as a transaction, add
-	 * group events as a whole and perform one schedulability test.
-	 * If the test fails, roll back the whole group
-	 *
-	 * Start the transaction, after this ->add() doesn't need to
-	 * do schedulability tests.
-	 */
-	void (*start_txn)		(struct pmu *pmu); /* optional */
-	/*
-	 * If ->start_txn() disabled the ->add() schedulability test
-	 * then ->commit_txn() is required to perform one. On success
-	 * the transaction is closed. On error the transaction is kept
-	 * open until ->cancel_txn() is called.
-	 */
-	int  (*commit_txn)		(struct pmu *pmu); /* optional */
-	/*
-	 * Will cancel the transaction, assumes ->del() is called
-	 * for each successful ->add() during the transaction.
-	 */
-	void (*cancel_txn)		(struct pmu *pmu); /* optional */
-
-	/*
-	 * Will return the value for perf_event_mmap_page::index for this event,
-	 * if no implementation is provided it will default to: event->hw.idx + 1.
-	 */
-	int (*event_idx)		(struct perf_event *event); /*optional */
-
-	/*
-	 * flush branch stack on context-switches (needed in cpu-wide mode)
-	 */
-	void (*flush_branch_stack)	(void);
-};
-
-/**
- * enum perf_event_active_state - the states of a event
- */
-enum perf_event_active_state {
-	PERF_EVENT_STATE_ERROR		= -2,
-	PERF_EVENT_STATE_OFF		= -1,
-	PERF_EVENT_STATE_INACTIVE	=  0,
-	PERF_EVENT_STATE_ACTIVE		=  1,
-};
-
-struct file;
-struct perf_sample_data;
-
-typedef void (*perf_overflow_handler_t)(struct perf_event *,
-					struct perf_sample_data *,
-					struct pt_regs *regs);
-
-enum perf_group_flag {
-	PERF_GROUP_SOFTWARE		= 0x1,
-};
-
-#define SWEVENT_HLIST_BITS		8
-#define SWEVENT_HLIST_SIZE		(1 << SWEVENT_HLIST_BITS)
-
-struct swevent_hlist {
-	struct hlist_head		heads[SWEVENT_HLIST_SIZE];
-	struct rcu_head			rcu_head;
-};
-
-#define PERF_ATTACH_CONTEXT	0x01
-#define PERF_ATTACH_GROUP	0x02
-#define PERF_ATTACH_TASK	0x04
-
-struct perf_cgroup;
-struct ring_buffer;
-
-/**
- * struct perf_event - performance event kernel representation:
- */
-struct perf_event {
-#ifdef CONFIG_PERF_EVENTS
-	/*
-	 * entry onto perf_event_context::event_list;
-	 *   modifications require ctx->lock
-	 *   RCU safe iterations.
-	 */
-	struct list_head		event_entry;
-
-	/*
-	 * XXX: group_entry and sibling_list should be mutually exclusive;
-	 * either you're a sibling on a group, or you're the group leader.
-	 * Rework the code to always use the same list element.
-	 *
-	 * Locked for modification by both ctx->mutex and ctx->lock; holding
-	 * either sufficies for read.
-	 */
-	struct list_head		group_entry;
-	struct list_head		sibling_list;
-
-	/*
-	 * We need storage to track the entries in perf_pmu_migrate_context; we
-	 * cannot use the event_entry because of RCU and we want to keep the
-	 * group in tact which avoids us using the other two entries.
-	 */
-	struct list_head		migrate_entry;
-
-	struct hlist_node		hlist_entry;
-	int				nr_siblings;
-	int				group_flags;
-	struct perf_event		*group_leader;
-	struct pmu			*pmu;
-
-	enum perf_event_active_state	state;
-	unsigned int			attach_state;
-	local64_t			count;
-	atomic64_t			child_count;
-
-	/*
-	 * These are the total time in nanoseconds that the event
-	 * has been enabled (i.e. eligible to run, and the task has
-	 * been scheduled in, if this is a per-task event)
-	 * and running (scheduled onto the CPU), respectively.
-	 *
-	 * They are computed from tstamp_enabled, tstamp_running and
-	 * tstamp_stopped when the event is in INACTIVE or ACTIVE state.
-	 */
-	u64				total_time_enabled;
-	u64				total_time_running;
-
-	/*
-	 * These are timestamps used for computing total_time_enabled
-	 * and total_time_running when the event is in INACTIVE or
-	 * ACTIVE state, measured in nanoseconds from an arbitrary point
-	 * in time.
-	 * tstamp_enabled: the notional time when the event was enabled
-	 * tstamp_running: the notional time when the event was scheduled on
-	 * tstamp_stopped: in INACTIVE state, the notional time when the
-	 *	event was scheduled off.
-	 */
-	u64				tstamp_enabled;
-	u64				tstamp_running;
-	u64				tstamp_stopped;
-
-	/*
-	 * timestamp shadows the actual context timing but it can
-	 * be safely used in NMI interrupt context. It reflects the
-	 * context time as it was when the event was last scheduled in.
-	 *
-	 * ctx_time already accounts for ctx->timestamp. Therefore to
-	 * compute ctx_time for a sample, simply add perf_clock().
-	 */
-	u64				shadow_ctx_time;
-
-	struct perf_event_attr		attr;
-	u16				header_size;
-	u16				id_header_size;
-	u16				read_size;
-	struct hw_perf_event		hw;
-
-	struct perf_event_context	*ctx;
-	atomic_long_t			refcount;
-
-	/*
-	 * These accumulate total time (in nanoseconds) that children
-	 * events have been enabled and running, respectively.
-	 */
-	atomic64_t			child_total_time_enabled;
-	atomic64_t			child_total_time_running;
-
-	/*
-	 * Protect attach/detach and child_list:
-	 */
-	struct mutex			child_mutex;
-	struct list_head		child_list;
-	struct perf_event		*parent;
-
-	int				oncpu;
-	int				cpu;
-
-	struct list_head		owner_entry;
-	struct task_struct		*owner;
-
-	/* mmap bits */
-	struct mutex			mmap_mutex;
-	atomic_t			mmap_count;
-
-	struct ring_buffer		*rb;
-	struct list_head		rb_entry;
-
-	/* poll related */
-	wait_queue_head_t		waitq;
-	struct fasync_struct		*fasync;
-
-	/* delayed work for NMIs and such */
-	int				pending_wakeup;
-	int				pending_kill;
-	int				pending_disable;
-	struct irq_work			pending;
-
-	atomic_t			event_limit;
-
-	void (*destroy)(struct perf_event *);
-	struct rcu_head			rcu_head;
-
-	struct pid_namespace		*ns;
-	u64				id;
-
-	perf_overflow_handler_t		overflow_handler;
-	void				*overflow_handler_context;
-
-#ifdef CONFIG_EVENT_TRACING
-	struct ftrace_event_call	*tp_event;
-	struct event_filter		*filter;
-#ifdef CONFIG_FUNCTION_TRACER
-	struct ftrace_ops               ftrace_ops;
-#endif
-#endif
-
-#ifdef CONFIG_CGROUP_PERF
-	struct perf_cgroup		*cgrp; /* cgroup event is attach to */
-	int				cgrp_defer_enabled;
-#endif
-
-#endif /* CONFIG_PERF_EVENTS */
-};
-
-enum perf_event_context_type {
-	task_context,
-	cpu_context,
-};
-
-/**
- * struct perf_event_context - event context structure
- *
- * Used as a container for task events and CPU events as well:
- */
-struct perf_event_context {
-	struct pmu			*pmu;
-	enum perf_event_context_type	type;
-	/*
-	 * Protect the states of the events in the list,
-	 * nr_active, and the list:
-	 */
-	raw_spinlock_t			lock;
-	/*
-	 * Protect the list of events.  Locking either mutex or lock
-	 * is sufficient to ensure the list doesn't change; to change
-	 * the list you need to lock both the mutex and the spinlock.
-	 */
-	struct mutex			mutex;
-
-	struct list_head		pinned_groups;
-	struct list_head		flexible_groups;
-	struct list_head		event_list;
-	int				nr_events;
-	int				nr_active;
-	int				is_active;
-	int				nr_stat;
-	int				nr_freq;
-	int				rotate_disable;
-	atomic_t			refcount;
-	struct task_struct		*task;
-
-	/*
-	 * Context clock, runs when context enabled.
-	 */
-	u64				time;
-	u64				timestamp;
-
-	/*
-	 * These fields let us detect when two contexts have both
-	 * been cloned (inherited) from a common ancestor.
-	 */
-	struct perf_event_context	*parent_ctx;
-	u64				parent_gen;
-	u64				generation;
-	int				pin_count;
-	int				nr_cgroups;	 /* cgroup evts */
-	int				nr_branch_stack; /* branch_stack evt */
-	struct rcu_head			rcu_head;
-};
-
-/*
- * Number of contexts where an event can trigger:
- *	task, softirq, hardirq, nmi.
- */
-#define PERF_NR_CONTEXTS	4
-
-/**
- * struct perf_event_cpu_context - per cpu event context structure
- */
-struct perf_cpu_context {
-	struct perf_event_context	ctx;
-	struct perf_event_context	*task_ctx;
-	int				active_oncpu;
-	int				exclusive;
-	struct hrtimer			hrtimer;
-	ktime_t				hrtimer_interval;
-	struct list_head		rotation_list;
-	struct pmu			*unique_pmu;
-	struct perf_cgroup		*cgrp;
-};
-
-struct perf_output_handle {
-	struct perf_event		*event;
-	struct ring_buffer		*rb;
-	unsigned long			wakeup;
-	unsigned long			size;
-	void				*addr;
-	int				page;
-};
-
-#ifdef CONFIG_PERF_EVENTS
-
-extern int perf_pmu_register(struct pmu *pmu, const char *name, int type);
-extern void perf_pmu_unregister(struct pmu *pmu);
-
-extern int perf_num_counters(void);
-extern const char *perf_pmu_name(void);
-extern void __perf_event_task_sched_in(struct task_struct *prev,
-				       struct task_struct *task);
-extern void __perf_event_task_sched_out(struct task_struct *prev,
-					struct task_struct *next);
-extern int perf_event_init_task(struct task_struct *child);
-extern void perf_event_exit_task(struct task_struct *child);
-extern void perf_event_free_task(struct task_struct *task);
-extern void perf_event_delayed_put(struct task_struct *task);
-extern void perf_event_print_debug(void);
-extern void perf_pmu_disable(struct pmu *pmu);
-extern void perf_pmu_enable(struct pmu *pmu);
-extern int perf_event_task_disable(void);
-extern int perf_event_task_enable(void);
-extern int perf_event_refresh(struct perf_event *event, int refresh);
-extern void perf_event_update_userpage(struct perf_event *event);
-extern int perf_event_release_kernel(struct perf_event *event);
-extern struct perf_event *
-perf_event_create_kernel_counter(struct perf_event_attr *attr,
-				int cpu,
-				struct task_struct *task,
-				perf_overflow_handler_t callback,
-				void *context);
-extern void perf_pmu_migrate_context(struct pmu *pmu,
-				int src_cpu, int dst_cpu);
-extern u64 perf_event_read_value(struct perf_event *event,
-				 u64 *enabled, u64 *running);
-
-
-struct perf_sample_data {
-	u64				type;
-
-	u64				ip;
-	struct {
-		u32	pid;
-		u32	tid;
-	}				tid_entry;
-	u64				time;
-	u64				addr;
-	u64				id;
-	u64				stream_id;
-	struct {
-		u32	cpu;
-		u32	reserved;
-	}				cpu_entry;
-	u64				period;
-	union  perf_mem_data_src	data_src;
-	struct perf_callchain_entry	*callchain;
-	struct perf_raw_record		*raw;
-	struct perf_branch_stack	*br_stack;
-	struct perf_regs_user		regs_user;
-	u64				stack_user_size;
-	u64				weight;
-};
-
-static inline void perf_sample_data_init(struct perf_sample_data *data,
-					 u64 addr, u64 period)
-{
-	/* remaining struct members initialized in perf_prepare_sample() */
-	data->addr = addr;
-	data->raw  = NULL;
-	data->br_stack = NULL;
-	data->period = period;
-	data->regs_user.abi = PERF_SAMPLE_REGS_ABI_NONE;
-	data->regs_user.regs = NULL;
-	data->stack_user_size = 0;
-	data->weight = 0;
-	data->data_src.val = 0;
-}
-
-extern void perf_output_sample(struct perf_output_handle *handle,
-			       struct perf_event_header *header,
-			       struct perf_sample_data *data,
-			       struct perf_event *event);
-extern void perf_prepare_sample(struct perf_event_header *header,
-				struct perf_sample_data *data,
-				struct perf_event *event,
-				struct pt_regs *regs);
-
-extern int perf_event_overflow(struct perf_event *event,
-				 struct perf_sample_data *data,
-				 struct pt_regs *regs);
-
-static inline bool is_sampling_event(struct perf_event *event)
-{
-	return event->attr.sample_period != 0;
-}
-
-/*
- * Return 1 for a software event, 0 for a hardware event
- */
-static inline int is_software_event(struct perf_event *event)
-{
-	return event->pmu->task_ctx_nr == perf_sw_context;
-}
-
-extern struct static_key perf_swevent_enabled[PERF_COUNT_SW_MAX];
-
-extern void __perf_sw_event(u32, u64, struct pt_regs *, u64);
-
-#ifndef perf_arch_fetch_caller_regs
-static inline void perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned long ip) { }
-#endif
-
-/*
- * Take a snapshot of the regs. Skip ip and frame pointer to
- * the nth caller. We only need a few of the regs:
- * - ip for PERF_SAMPLE_IP
- * - cs for user_mode() tests
- * - bp for callchains
- * - eflags, for future purposes, just in case
- */
-static inline void perf_fetch_caller_regs(struct pt_regs *regs)
-{
-	memset(regs, 0, sizeof(*regs));
-
-	perf_arch_fetch_caller_regs(regs, CALLER_ADDR0);
-}
-
-static __always_inline void
-perf_sw_event(u32 event_id, u64 nr, struct pt_regs *regs, u64 addr)
-{
-	struct pt_regs hot_regs;
-
-	if (static_key_false(&perf_swevent_enabled[event_id])) {
-		if (!regs) {
-			perf_fetch_caller_regs(&hot_regs);
-			regs = &hot_regs;
-		}
-		__perf_sw_event(event_id, nr, regs, addr);
-	}
-}
-
-extern struct static_key_deferred perf_sched_events;
-
-static inline void perf_event_task_sched_in(struct task_struct *prev,
-					    struct task_struct *task)
-{
-	if (static_key_false(&perf_sched_events.key))
-		__perf_event_task_sched_in(prev, task);
-}
-
-static inline void perf_event_task_sched_out(struct task_struct *prev,
-					     struct task_struct *next)
-{
-	perf_sw_event(PERF_COUNT_SW_CONTEXT_SWITCHES, 1, NULL, 0);
-
-	if (static_key_false(&perf_sched_events.key))
-		__perf_event_task_sched_out(prev, next);
-}
-
-extern void perf_event_mmap(struct vm_area_struct *vma);
-extern struct perf_guest_info_callbacks *perf_guest_cbs;
-extern int perf_register_guest_info_callbacks(struct perf_guest_info_callbacks *callbacks);
-extern int perf_unregister_guest_info_callbacks(struct perf_guest_info_callbacks *callbacks);
-
-extern void perf_event_comm(struct task_struct *tsk);
-extern void perf_event_fork(struct task_struct *tsk);
-
-/* Callchains */
-DECLARE_PER_CPU(struct perf_callchain_entry, perf_callchain_entry);
-
-extern void perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs);
-extern void perf_callchain_kernel(struct perf_callchain_entry *entry, struct pt_regs *regs);
-
-static inline void perf_callchain_store(struct perf_callchain_entry *entry, u64 ip)
-{
-	if (entry->nr < PERF_MAX_STACK_DEPTH)
-		entry->ip[entry->nr++] = ip;
-}
-
-extern int sysctl_perf_event_paranoid;
-extern int sysctl_perf_event_mlock;
-extern int sysctl_perf_event_sample_rate;
-extern int sysctl_perf_cpu_time_max_percent;
-
-extern void perf_sample_event_took(u64 sample_len_ns);
-
-extern int perf_proc_update_handler(struct ctl_table *table, int write,
-		void __user *buffer, size_t *lenp,
-		loff_t *ppos);
-extern int perf_cpu_time_max_percent_handler(struct ctl_table *table, int write,
-		void __user *buffer, size_t *lenp,
-		loff_t *ppos);
-
-
-static inline bool perf_paranoid_tracepoint_raw(void)
-{
-	return sysctl_perf_event_paranoid > -1;
-}
-
-static inline bool perf_paranoid_cpu(void)
-{
-	return sysctl_perf_event_paranoid > 0;
-}
-
-static inline bool perf_paranoid_kernel(void)
-{
-	return sysctl_perf_event_paranoid > 1;
-}
-
-extern void perf_event_init(void);
-extern void perf_tp_event(u64 addr, u64 count, void *record,
-			  int entry_size, struct pt_regs *regs,
-			  struct hlist_head *head, int rctx,
-			  struct task_struct *task);
-extern void perf_bp_event(struct perf_event *event, void *data);
-
-#ifndef perf_misc_flags
-# define perf_misc_flags(regs) \
-		(user_mode(regs) ? PERF_RECORD_MISC_USER : PERF_RECORD_MISC_KERNEL)
-# define perf_instruction_pointer(regs)	instruction_pointer(regs)
-#endif
-
-static inline bool has_branch_stack(struct perf_event *event)
-{
-	return event->attr.sample_type & PERF_SAMPLE_BRANCH_STACK;
-}
-
-extern int perf_output_begin(struct perf_output_handle *handle,
-			     struct perf_event *event, unsigned int size);
-extern void perf_output_end(struct perf_output_handle *handle);
-extern unsigned int perf_output_copy(struct perf_output_handle *handle,
-			     const void *buf, unsigned int len);
-extern unsigned int perf_output_skip(struct perf_output_handle *handle,
-				     unsigned int len);
-extern int perf_swevent_get_recursion_context(void);
-extern void perf_swevent_put_recursion_context(int rctx);
-extern u64 perf_swevent_set_period(struct perf_event *event);
-extern void perf_event_enable(struct perf_event *event);
-extern void perf_event_disable(struct perf_event *event);
-extern int __perf_event_disable(void *info);
-extern void perf_event_task_tick(void);
-#else
-static inline void
-perf_event_task_sched_in(struct task_struct *prev,
-			 struct task_struct *task)			{ }
-static inline void
-perf_event_task_sched_out(struct task_struct *prev,
-			  struct task_struct *next)			{ }
-static inline int perf_event_init_task(struct task_struct *child)	{ return 0; }
-static inline void perf_event_exit_task(struct task_struct *child)	{ }
-static inline void perf_event_free_task(struct task_struct *task)	{ }
-static inline void perf_event_delayed_put(struct task_struct *task)	{ }
-static inline void perf_event_print_debug(void)				{ }
-static inline int perf_event_task_disable(void)				{ return -EINVAL; }
-static inline int perf_event_task_enable(void)				{ return -EINVAL; }
-static inline int perf_event_refresh(struct perf_event *event, int refresh)
-{
-	return -EINVAL;
-}
-
-static inline void
-perf_sw_event(u32 event_id, u64 nr, struct pt_regs *regs, u64 addr)	{ }
-static inline void
-perf_bp_event(struct perf_event *event, void *data)			{ }
-
-static inline int perf_register_guest_info_callbacks
-(struct perf_guest_info_callbacks *callbacks)				{ return 0; }
-static inline int perf_unregister_guest_info_callbacks
-(struct perf_guest_info_callbacks *callbacks)				{ return 0; }
-
-static inline void perf_event_mmap(struct vm_area_struct *vma)		{ }
-static inline void perf_event_comm(struct task_struct *tsk)		{ }
-static inline void perf_event_fork(struct task_struct *tsk)		{ }
-static inline void perf_event_init(void)				{ }
-static inline int  perf_swevent_get_recursion_context(void)		{ return -1; }
-static inline void perf_swevent_put_recursion_context(int rctx)		{ }
-static inline u64 perf_swevent_set_period(struct perf_event *event)	{ return 0; }
-static inline void perf_event_enable(struct perf_event *event)		{ }
-static inline void perf_event_disable(struct perf_event *event)		{ }
-static inline int __perf_event_disable(void *info)			{ return -1; }
-static inline void perf_event_task_tick(void)				{ }
-#endif
-
-#if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_NO_HZ_FULL)
-extern bool perf_event_can_stop_tick(void);
-#else
-static inline bool perf_event_can_stop_tick(void)			{ return true; }
-#endif
-
-#if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_CPU_SUP_INTEL)
-extern void perf_restore_debug_store(void);
-#else
-static inline void perf_restore_debug_store(void)			{ }
-#endif
-
-#define perf_output_put(handle, x) perf_output_copy((handle), &(x), sizeof(x))
-
-/*
- * This has to have a higher priority than migration_notifier in sched/core.c.
- */
-#define perf_cpu_notifier(fn)						\
-do {									\
-	static struct notifier_block fn##_nb =				\
-		{ .notifier_call = fn, .priority = CPU_PRI_PERF };	\
-	unsigned long cpu = smp_processor_id();				\
-	unsigned long flags;						\
-	fn(&fn##_nb, (unsigned long)CPU_UP_PREPARE,			\
-		(void *)(unsigned long)cpu);				\
-	local_irq_save(flags);						\
-	fn(&fn##_nb, (unsigned long)CPU_STARTING,			\
-		(void *)(unsigned long)cpu);				\
-	local_irq_restore(flags);					\
-	fn(&fn##_nb, (unsigned long)CPU_ONLINE,				\
-		(void *)(unsigned long)cpu);				\
-	register_cpu_notifier(&fn##_nb);				\
-} while (0)
-
-
-struct perf_pmu_events_attr {
-	struct device_attribute attr;
-	u64 id;
-	const char *event_str;
-};
-
-#define PMU_EVENT_ATTR(_name, _var, _id, _show)				\
-static struct perf_pmu_events_attr _var = {				\
-	.attr = __ATTR(_name, 0444, _show, NULL),			\
-	.id   =  _id,							\
-};
-
-#define PMU_FORMAT_ATTR(_name, _format)					\
-static ssize_t								\
-_name##_show(struct device *dev,					\
-			       struct device_attribute *attr,		\
-			       char *page)				\
-{									\
-	BUILD_BUG_ON(sizeof(_format) >= PAGE_SIZE);			\
-	return sprintf(page, _format "\n");				\
-}									\
-									\
-static struct device_attribute format_attr_##_name = __ATTR_RO(_name)
-
-#endif /* _LINUX_PERF_EVENT_H */
diff --git a/src/include/linux/poison.h b/src/include/linux/poison.h
deleted file mode 100644
index 2110a81..0000000
--- a/src/include/linux/poison.h
+++ /dev/null
@@ -1,89 +0,0 @@
-#ifndef _LINUX_POISON_H
-#define _LINUX_POISON_H
-
-/********** include/linux/list.h **********/
-
-/*
- * Architectures might want to move the poison pointer offset
- * into some well-recognized area such as 0xdead000000000000,
- * that is also not mappable by user-space exploits:
- */
-#ifdef CONFIG_ILLEGAL_POINTER_VALUE
-# define POISON_POINTER_DELTA _AC(CONFIG_ILLEGAL_POINTER_VALUE, UL)
-#else
-# define POISON_POINTER_DELTA 0
-#endif
-
-/*
- * These are non-NULL pointers that will result in page faults
- * under normal circumstances, used to verify that nobody uses
- * non-initialized list entries.
- */
-#define LIST_POISON1  ((void *) 0x00100100 + POISON_POINTER_DELTA)
-#define LIST_POISON2  ((void *) 0x00200200 + POISON_POINTER_DELTA)
-
-/********** include/linux/timer.h **********/
-/*
- * Magic number "tsta" to indicate a static timer initializer
- * for the object debugging code.
- */
-#define TIMER_ENTRY_STATIC	((void *) 0x74737461)
-
-/********** mm/debug-pagealloc.c **********/
-#define PAGE_POISON 0xaa
-
-/********** mm/slab.c **********/
-/*
- * Magic nums for obj red zoning.
- * Placed in the first word before and the first word after an obj.
- */
-#define	RED_INACTIVE	0x09F911029D74E35BULL	/* when obj is inactive */
-#define	RED_ACTIVE	0xD84156C5635688C0ULL	/* when obj is active */
-
-#define SLUB_RED_INACTIVE	0xbb
-#define SLUB_RED_ACTIVE		0xcc
-
-/* ...and for poisoning */
-#define	POISON_INUSE	0x5a	/* for use-uninitialised poisoning */
-#define POISON_FREE	0x6b	/* for use-after-free poisoning */
-#define	POISON_END	0xa5	/* end-byte of poisoning */
-
-/********** arch/$ARCH/mm/init.c **********/
-#define POISON_FREE_INITMEM	0xcc
-
-/********** arch/ia64/hp/common/sba_iommu.c **********/
-/*
- * arch/ia64/hp/common/sba_iommu.c uses a 16-byte poison string with a
- * value of "SBAIOMMU POISON\0" for spill-over poisoning.
- */
-
-/********** fs/jbd/journal.c **********/
-#define JBD_POISON_FREE		0x5b
-#define JBD2_POISON_FREE	0x5c
-
-/********** drivers/base/dmapool.c **********/
-#define	POOL_POISON_FREED	0xa7	/* !inuse */
-#define	POOL_POISON_ALLOCATED	0xa9	/* !initted */
-
-/********** drivers/atm/ **********/
-#define ATM_POISON_FREE		0x12
-#define ATM_POISON		0xdeadbeef
-
-/********** net/ **********/
-#define NEIGHBOR_DEAD		0xdeadbeef
-#define NETFILTER_LINK_POISON	0xdead57ac
-
-/********** kernel/mutexes **********/
-#define MUTEX_DEBUG_INIT	0x11
-#define MUTEX_DEBUG_FREE	0x22
-
-/********** lib/flex_array.c **********/
-#define FLEX_ARRAY_FREE	0x6c	/* for use-after-free poisoning */
-
-/********** security/ **********/
-#define KEY_DESTROY		0xbd
-
-/********** sound/oss/ **********/
-#define OSS_POISON_FREE		0xAB
-
-#endif
diff --git a/src/include/linux/rbtree.h b/src/include/linux/rbtree.h
deleted file mode 100644
index aa870a4..0000000
--- a/src/include/linux/rbtree.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
-  Red Black Trees
-  (C) 1999  Andrea Arcangeli <andrea@suse.de>
-  
-  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, write to the Free Software
-  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-  linux/include/linux/rbtree.h
-
-  To use rbtrees you'll have to implement your own insert and search cores.
-  This will avoid us to use callbacks and to drop drammatically performances.
-  I know it's not the cleaner way,  but in C (not in C++) to get
-  performances and genericity...
-
-  See Documentation/rbtree.txt for documentation and samples.
-*/
-
-#ifndef	_LINUX_RBTREE_H
-#define	_LINUX_RBTREE_H
-
-#include <linux/kernel.h>
-#include <linux/stddef.h>
-
-struct rb_node {
-	unsigned long  __rb_parent_color;
-	struct rb_node *rb_right;
-	struct rb_node *rb_left;
-} __attribute__((aligned(sizeof(long))));
-    /* The alignment might seem pointless, but allegedly CRIS needs it */
-
-struct rb_root {
-	struct rb_node *rb_node;
-};
-
-
-#define rb_parent(r)   ((struct rb_node *)((r)->__rb_parent_color & ~3))
-
-#define RB_ROOT	(struct rb_root) { NULL, }
-#define	rb_entry(ptr, type, member) container_of(ptr, type, member)
-
-#define RB_EMPTY_ROOT(root)  ((root)->rb_node == NULL)
-
-/* 'empty' nodes are nodes that are known not to be inserted in an rbree */
-#define RB_EMPTY_NODE(node)  \
-	((node)->__rb_parent_color == (unsigned long)(node))
-#define RB_CLEAR_NODE(node)  \
-	((node)->__rb_parent_color = (unsigned long)(node))
-
-
-extern void rb_insert_color(struct rb_node *, struct rb_root *);
-extern void rb_erase(struct rb_node *, struct rb_root *);
-
-
-/* Find logical next and previous nodes in a tree */
-extern struct rb_node *rb_next(const struct rb_node *);
-extern struct rb_node *rb_prev(const struct rb_node *);
-extern struct rb_node *rb_first(const struct rb_root *);
-extern struct rb_node *rb_last(const struct rb_root *);
-
-/* Postorder iteration - always visit the parent after its children */
-extern struct rb_node *rb_first_postorder(const struct rb_root *);
-extern struct rb_node *rb_next_postorder(const struct rb_node *);
-
-/* Fast replacement of a single node without remove/rebalance/add/rebalance */
-extern void rb_replace_node(struct rb_node *victim, struct rb_node *new, 
-			    struct rb_root *root);
-
-static inline void rb_link_node(struct rb_node * node, struct rb_node * parent,
-				struct rb_node ** rb_link)
-{
-	node->__rb_parent_color = (unsigned long)parent;
-	node->rb_left = node->rb_right = NULL;
-
-	*rb_link = node;
-}
-
-/**
- * rbtree_postorder_for_each_entry_safe - iterate over rb_root in post order of
- * given type safe against removal of rb_node entry
- *
- * @pos:	the 'type *' to use as a loop cursor.
- * @n:		another 'type *' to use as temporary storage
- * @root:	'rb_root *' of the rbtree.
- * @field:	the name of the rb_node field within 'type'.
- */
-#define rbtree_postorder_for_each_entry_safe(pos, n, root, field) \
-	for (pos = rb_entry(rb_first_postorder(root), typeof(*pos), field),\
-		n = rb_entry(rb_next_postorder(&pos->field), \
-			typeof(*pos), field); \
-	     &pos->field; \
-	     pos = n, \
-		n = rb_entry(rb_next_postorder(&pos->field), \
-			typeof(*pos), field))
-
-#endif	/* _LINUX_RBTREE_H */
diff --git a/src/include/linux/rbtree_augmented.h b/src/include/linux/rbtree_augmented.h
deleted file mode 100644
index fea49b5..0000000
--- a/src/include/linux/rbtree_augmented.h
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
-  Red Black Trees
-  (C) 1999  Andrea Arcangeli <andrea@suse.de>
-  (C) 2002  David Woodhouse <dwmw2@infradead.org>
-  (C) 2012  Michel Lespinasse <walken@google.com>
-
-  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, write to the Free Software
-  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-  linux/include/linux/rbtree_augmented.h
-*/
-
-#ifndef _LINUX_RBTREE_AUGMENTED_H
-#define _LINUX_RBTREE_AUGMENTED_H
-
-#include <linux/compiler.h>
-#include <linux/rbtree.h>
-
-/*
- * Please note - only struct rb_augment_callbacks and the prototypes for
- * rb_insert_augmented() and rb_erase_augmented() are intended to be public.
- * The rest are implementation details you are not expected to depend on.
- *
- * See Documentation/rbtree.txt for documentation and samples.
- */
-
-struct rb_augment_callbacks {
-	void (*propagate)(struct rb_node *node, struct rb_node *stop);
-	void (*copy)(struct rb_node *old, struct rb_node *new);
-	void (*rotate)(struct rb_node *old, struct rb_node *new);
-};
-
-extern void __rb_insert_augmented(struct rb_node *node, struct rb_root *root,
-	void (*augment_rotate)(struct rb_node *old, struct rb_node *new));
-static inline void
-rb_insert_augmented(struct rb_node *node, struct rb_root *root,
-		    const struct rb_augment_callbacks *augment)
-{
-	__rb_insert_augmented(node, root, augment->rotate);
-}
-
-#define RB_DECLARE_CALLBACKS(rbstatic, rbname, rbstruct, rbfield,	\
-			     rbtype, rbaugmented, rbcompute)		\
-static inline void							\
-rbname ## _propagate(struct rb_node *rb, struct rb_node *stop)		\
-{									\
-	while (rb != stop) {						\
-		rbstruct *node = rb_entry(rb, rbstruct, rbfield);	\
-		rbtype augmented = rbcompute(node);			\
-		if (node->rbaugmented == augmented)			\
-			break;						\
-		node->rbaugmented = augmented;				\
-		rb = rb_parent(&node->rbfield);				\
-	}								\
-}									\
-static inline void							\
-rbname ## _copy(struct rb_node *rb_old, struct rb_node *rb_new)		\
-{									\
-	rbstruct *old = rb_entry(rb_old, rbstruct, rbfield);		\
-	rbstruct *new = rb_entry(rb_new, rbstruct, rbfield);		\
-	new->rbaugmented = old->rbaugmented;				\
-}									\
-static void								\
-rbname ## _rotate(struct rb_node *rb_old, struct rb_node *rb_new)	\
-{									\
-	rbstruct *old = rb_entry(rb_old, rbstruct, rbfield);		\
-	rbstruct *new = rb_entry(rb_new, rbstruct, rbfield);		\
-	new->rbaugmented = old->rbaugmented;				\
-	old->rbaugmented = rbcompute(old);				\
-}									\
-rbstatic const struct rb_augment_callbacks rbname = {			\
-	rbname ## _propagate, rbname ## _copy, rbname ## _rotate	\
-};
-
-
-#define	RB_RED		0
-#define	RB_BLACK	1
-
-#define __rb_parent(pc)    ((struct rb_node *)(pc & ~3))
-
-#define __rb_color(pc)     ((pc) & 1)
-#define __rb_is_black(pc)  __rb_color(pc)
-#define __rb_is_red(pc)    (!__rb_color(pc))
-#define rb_color(rb)       __rb_color((rb)->__rb_parent_color)
-#define rb_is_red(rb)      __rb_is_red((rb)->__rb_parent_color)
-#define rb_is_black(rb)    __rb_is_black((rb)->__rb_parent_color)
-
-static inline void rb_set_parent(struct rb_node *rb, struct rb_node *p)
-{
-	rb->__rb_parent_color = rb_color(rb) | (unsigned long)p;
-}
-
-static inline void rb_set_parent_color(struct rb_node *rb,
-				       struct rb_node *p, int color)
-{
-	rb->__rb_parent_color = (unsigned long)p | color;
-}
-
-static inline void
-__rb_change_child(struct rb_node *old, struct rb_node *new,
-		  struct rb_node *parent, struct rb_root *root)
-{
-	if (parent) {
-		if (parent->rb_left == old)
-			parent->rb_left = new;
-		else
-			parent->rb_right = new;
-	} else
-		root->rb_node = new;
-}
-
-extern void __rb_erase_color(struct rb_node *parent, struct rb_root *root,
-	void (*augment_rotate)(struct rb_node *old, struct rb_node *new));
-
-static __always_inline struct rb_node *
-__rb_erase_augmented(struct rb_node *node, struct rb_root *root,
-		     const struct rb_augment_callbacks *augment)
-{
-	struct rb_node *child = node->rb_right, *tmp = node->rb_left;
-	struct rb_node *parent, *rebalance;
-	unsigned long pc;
-
-	if (!tmp) {
-		/*
-		 * Case 1: node to erase has no more than 1 child (easy!)
-		 *
-		 * Note that if there is one child it must be red due to 5)
-		 * and node must be black due to 4). We adjust colors locally
-		 * so as to bypass __rb_erase_color() later on.
-		 */
-		pc = node->__rb_parent_color;
-		parent = __rb_parent(pc);
-		__rb_change_child(node, child, parent, root);
-		if (child) {
-			child->__rb_parent_color = pc;
-			rebalance = NULL;
-		} else
-			rebalance = __rb_is_black(pc) ? parent : NULL;
-		tmp = parent;
-	} else if (!child) {
-		/* Still case 1, but this time the child is node->rb_left */
-		tmp->__rb_parent_color = pc = node->__rb_parent_color;
-		parent = __rb_parent(pc);
-		__rb_change_child(node, tmp, parent, root);
-		rebalance = NULL;
-		tmp = parent;
-	} else {
-		struct rb_node *successor = child, *child2;
-		tmp = child->rb_left;
-		if (!tmp) {
-			/*
-			 * Case 2: node's successor is its right child
-			 *
-			 *    (n)          (s)
-			 *    / \          / \
-			 *  (x) (s)  ->  (x) (c)
-			 *        \
-			 *        (c)
-			 */
-			parent = successor;
-			child2 = successor->rb_right;
-			augment->copy(node, successor);
-		} else {
-			/*
-			 * Case 3: node's successor is leftmost under
-			 * node's right child subtree
-			 *
-			 *    (n)          (s)
-			 *    / \          / \
-			 *  (x) (y)  ->  (x) (y)
-			 *      /            /
-			 *    (p)          (p)
-			 *    /            /
-			 *  (s)          (c)
-			 *    \
-			 *    (c)
-			 */
-			do {
-				parent = successor;
-				successor = tmp;
-				tmp = tmp->rb_left;
-			} while (tmp);
-			parent->rb_left = child2 = successor->rb_right;
-			successor->rb_right = child;
-			rb_set_parent(child, successor);
-			augment->copy(node, successor);
-			augment->propagate(parent, successor);
-		}
-
-		successor->rb_left = tmp = node->rb_left;
-		rb_set_parent(tmp, successor);
-
-		pc = node->__rb_parent_color;
-		tmp = __rb_parent(pc);
-		__rb_change_child(node, successor, tmp, root);
-		if (child2) {
-			successor->__rb_parent_color = pc;
-			rb_set_parent_color(child2, parent, RB_BLACK);
-			rebalance = NULL;
-		} else {
-			unsigned long pc2 = successor->__rb_parent_color;
-			successor->__rb_parent_color = pc;
-			rebalance = __rb_is_black(pc2) ? parent : NULL;
-		}
-		tmp = successor;
-	}
-
-	augment->propagate(tmp, NULL);
-	return rebalance;
-}
-
-static __always_inline void
-rb_erase_augmented(struct rb_node *node, struct rb_root *root,
-		   const struct rb_augment_callbacks *augment)
-{
-	struct rb_node *rebalance = __rb_erase_augmented(node, root, augment);
-	if (rebalance)
-		__rb_erase_color(rebalance, root, augment->rotate);
-}
-
-#endif	/* _LINUX_RBTREE_AUGMENTED_H */
diff --git a/src/include/linux/stringify.h b/src/include/linux/stringify.h
deleted file mode 100644
index 841cec8..0000000
--- a/src/include/linux/stringify.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef __LINUX_STRINGIFY_H
-#define __LINUX_STRINGIFY_H
-
-/* Indirect stringification.  Doing two levels allows the parameter to be a
- * macro itself.  For example, compile with -DFOO=bar, __stringify(FOO)
- * converts to "bar".
- */
-
-#define __stringify_1(x...)	#x
-#define __stringify(x...)	__stringify_1(x)
-
-#endif	/* !__LINUX_STRINGIFY_H */
diff --git a/src/include/linux/swab.h b/src/include/linux/swab.h
deleted file mode 100644
index 9ad3c60..0000000
--- a/src/include/linux/swab.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef _LINUX_SWAB_H
-#define _LINUX_SWAB_H
-
-#include <uapi/linux/swab.h>
-
-# define swab16 __swab16
-# define swab32 __swab32
-# define swab64 __swab64
-# define swahw32 __swahw32
-# define swahb32 __swahb32
-# define swab16p __swab16p
-# define swab32p __swab32p
-# define swab64p __swab64p
-# define swahw32p __swahw32p
-# define swahb32p __swahb32p
-# define swab16s __swab16s
-# define swab32s __swab32s
-# define swab64s __swab64s
-# define swahw32s __swahw32s
-# define swahb32s __swahb32s
-#endif /* _LINUX_SWAB_H */
diff --git a/src/lib/rbtree.c b/src/lib/rbtree.c
deleted file mode 100644
index 65f4eff..0000000
--- a/src/lib/rbtree.c
+++ /dev/null
@@ -1,560 +0,0 @@
-/*
-  Red Black Trees
-  (C) 1999  Andrea Arcangeli <andrea@suse.de>
-  (C) 2002  David Woodhouse <dwmw2@infradead.org>
-  (C) 2012  Michel Lespinasse <walken@google.com>
-
-  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, write to the Free Software
-  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-  linux/lib/rbtree.c
-*/
-
-#include <linux/rbtree_augmented.h>
-#include <linux/export.h>
-
-/*
- * red-black trees properties:  http://en.wikipedia.org/wiki/Rbtree
- *
- *  1) A node is either red or black
- *  2) The root is black
- *  3) All leaves (NULL) are black
- *  4) Both children of every red node are black
- *  5) Every simple path from root to leaves contains the same number
- *     of black nodes.
- *
- *  4 and 5 give the O(log n) guarantee, since 4 implies you cannot have two
- *  consecutive red nodes in a path and every red node is therefore followed by
- *  a black. So if B is the number of black nodes on every simple path (as per
- *  5), then the longest possible path due to 4 is 2B.
- *
- *  We shall indicate color with case, where black nodes are uppercase and red
- *  nodes will be lowercase. Unknown color nodes shall be drawn as red within
- *  parentheses and have some accompanying text comment.
- */
-
-static inline void rb_set_black(struct rb_node *rb)
-{
-	rb->__rb_parent_color |= RB_BLACK;
-}
-
-static inline struct rb_node *rb_red_parent(struct rb_node *red)
-{
-	return (struct rb_node *)red->__rb_parent_color;
-}
-
-/*
- * Helper function for rotations:
- * - old's parent and color get assigned to new
- * - old gets assigned new as a parent and 'color' as a color.
- */
-static inline void
-__rb_rotate_set_parents(struct rb_node *old, struct rb_node *new,
-			struct rb_root *root, int color)
-{
-	struct rb_node *parent = rb_parent(old);
-	new->__rb_parent_color = old->__rb_parent_color;
-	rb_set_parent_color(old, new, color);
-	__rb_change_child(old, new, parent, root);
-}
-
-static __always_inline void
-__rb_insert(struct rb_node *node, struct rb_root *root,
-	    void (*augment_rotate)(struct rb_node *old, struct rb_node *new))
-{
-	struct rb_node *parent = rb_red_parent(node), *gparent, *tmp;
-
-	while (true) {
-		/*
-		 * Loop invariant: node is red
-		 *
-		 * If there is a black parent, we are done.
-		 * Otherwise, take some corrective action as we don't
-		 * want a red root or two consecutive red nodes.
-		 */
-		if (!parent) {
-			rb_set_parent_color(node, NULL, RB_BLACK);
-			break;
-		} else if (rb_is_black(parent))
-			break;
-
-		gparent = rb_red_parent(parent);
-
-		tmp = gparent->rb_right;
-		if (parent != tmp) {	/* parent == gparent->rb_left */
-			if (tmp && rb_is_red(tmp)) {
-				/*
-				 * Case 1 - color flips
-				 *
-				 *       G            g
-				 *      / \          / \
-				 *     p   u  -->   P   U
-				 *    /            /
-				 *   n            N
-				 *
-				 * However, since g's parent might be red, and
-				 * 4) does not allow this, we need to recurse
-				 * at g.
-				 */
-				rb_set_parent_color(tmp, gparent, RB_BLACK);
-				rb_set_parent_color(parent, gparent, RB_BLACK);
-				node = gparent;
-				parent = rb_parent(node);
-				rb_set_parent_color(node, parent, RB_RED);
-				continue;
-			}
-
-			tmp = parent->rb_right;
-			if (node == tmp) {
-				/*
-				 * Case 2 - left rotate at parent
-				 *
-				 *      G             G
-				 *     / \           / \
-				 *    p   U  -->    n   U
-				 *     \           /
-				 *      n         p
-				 *
-				 * This still leaves us in violation of 4), the
-				 * continuation into Case 3 will fix that.
-				 */
-				parent->rb_right = tmp = node->rb_left;
-				node->rb_left = parent;
-				if (tmp)
-					rb_set_parent_color(tmp, parent,
-							    RB_BLACK);
-				rb_set_parent_color(parent, node, RB_RED);
-				augment_rotate(parent, node);
-				parent = node;
-				tmp = node->rb_right;
-			}
-
-			/*
-			 * Case 3 - right rotate at gparent
-			 *
-			 *        G           P
-			 *       / \         / \
-			 *      p   U  -->  n   g
-			 *     /                 \
-			 *    n                   U
-			 */
-			gparent->rb_left = tmp;  /* == parent->rb_right */
-			parent->rb_right = gparent;
-			if (tmp)
-				rb_set_parent_color(tmp, gparent, RB_BLACK);
-			__rb_rotate_set_parents(gparent, parent, root, RB_RED);
-			augment_rotate(gparent, parent);
-			break;
-		} else {
-			tmp = gparent->rb_left;
-			if (tmp && rb_is_red(tmp)) {
-				/* Case 1 - color flips */
-				rb_set_parent_color(tmp, gparent, RB_BLACK);
-				rb_set_parent_color(parent, gparent, RB_BLACK);
-				node = gparent;
-				parent = rb_parent(node);
-				rb_set_parent_color(node, parent, RB_RED);
-				continue;
-			}
-
-			tmp = parent->rb_left;
-			if (node == tmp) {
-				/* Case 2 - right rotate at parent */
-				parent->rb_left = tmp = node->rb_right;
-				node->rb_right = parent;
-				if (tmp)
-					rb_set_parent_color(tmp, parent,
-							    RB_BLACK);
-				rb_set_parent_color(parent, node, RB_RED);
-				augment_rotate(parent, node);
-				parent = node;
-				tmp = node->rb_left;
-			}
-
-			/* Case 3 - left rotate at gparent */
-			gparent->rb_right = tmp;  /* == parent->rb_left */
-			parent->rb_left = gparent;
-			if (tmp)
-				rb_set_parent_color(tmp, gparent, RB_BLACK);
-			__rb_rotate_set_parents(gparent, parent, root, RB_RED);
-			augment_rotate(gparent, parent);
-			break;
-		}
-	}
-}
-
-/*
- * Inline version for rb_erase() use - we want to be able to inline
- * and eliminate the dummy_rotate callback there
- */
-static __always_inline void
-____rb_erase_color(struct rb_node *parent, struct rb_root *root,
-	void (*augment_rotate)(struct rb_node *old, struct rb_node *new))
-{
-	struct rb_node *node = NULL, *sibling, *tmp1, *tmp2;
-
-	while (true) {
-		/*
-		 * Loop invariants:
-		 * - node is black (or NULL on first iteration)
-		 * - node is not the root (parent is not NULL)
-		 * - All leaf paths going through parent and node have a
-		 *   black node count that is 1 lower than other leaf paths.
-		 */
-		sibling = parent->rb_right;
-		if (node != sibling) {	/* node == parent->rb_left */
-			if (rb_is_red(sibling)) {
-				/*
-				 * Case 1 - left rotate at parent
-				 *
-				 *     P               S
-				 *    / \             / \
-				 *   N   s    -->    p   Sr
-				 *      / \         / \
-				 *     Sl  Sr      N   Sl
-				 */
-				parent->rb_right = tmp1 = sibling->rb_left;
-				sibling->rb_left = parent;
-				rb_set_parent_color(tmp1, parent, RB_BLACK);
-				__rb_rotate_set_parents(parent, sibling, root,
-							RB_RED);
-				augment_rotate(parent, sibling);
-				sibling = tmp1;
-			}
-			tmp1 = sibling->rb_right;
-			if (!tmp1 || rb_is_black(tmp1)) {
-				tmp2 = sibling->rb_left;
-				if (!tmp2 || rb_is_black(tmp2)) {
-					/*
-					 * Case 2 - sibling color flip
-					 * (p could be either color here)
-					 *
-					 *    (p)           (p)
-					 *    / \           / \
-					 *   N   S    -->  N   s
-					 *      / \           / \
-					 *     Sl  Sr        Sl  Sr
-					 *
-					 * This leaves us violating 5) which
-					 * can be fixed by flipping p to black
-					 * if it was red, or by recursing at p.
-					 * p is red when coming from Case 1.
-					 */
-					rb_set_parent_color(sibling, parent,
-							    RB_RED);
-					if (rb_is_red(parent))
-						rb_set_black(parent);
-					else {
-						node = parent;
-						parent = rb_parent(node);
-						if (parent)
-							continue;
-					}
-					break;
-				}
-				/*
-				 * Case 3 - right rotate at sibling
-				 * (p could be either color here)
-				 *
-				 *   (p)           (p)
-				 *   / \           / \
-				 *  N   S    -->  N   Sl
-				 *     / \             \
-				 *    sl  Sr            s
-				 *                       \
-				 *                        Sr
-				 */
-				sibling->rb_left = tmp1 = tmp2->rb_right;
-				tmp2->rb_right = sibling;
-				parent->rb_right = tmp2;
-				if (tmp1)
-					rb_set_parent_color(tmp1, sibling,
-							    RB_BLACK);
-				augment_rotate(sibling, tmp2);
-				tmp1 = sibling;
-				sibling = tmp2;
-			}
-			/*
-			 * Case 4 - left rotate at parent + color flips
-			 * (p and sl could be either color here.
-			 *  After rotation, p becomes black, s acquires
-			 *  p's color, and sl keeps its color)
-			 *
-			 *      (p)             (s)
-			 *      / \             / \
-			 *     N   S     -->   P   Sr
-			 *        / \         / \
-			 *      (sl) sr      N  (sl)
-			 */
-			parent->rb_right = tmp2 = sibling->rb_left;
-			sibling->rb_left = parent;
-			rb_set_parent_color(tmp1, sibling, RB_BLACK);
-			if (tmp2)
-				rb_set_parent(tmp2, parent);
-			__rb_rotate_set_parents(parent, sibling, root,
-						RB_BLACK);
-			augment_rotate(parent, sibling);
-			break;
-		} else {
-			sibling = parent->rb_left;
-			if (rb_is_red(sibling)) {
-				/* Case 1 - right rotate at parent */
-				parent->rb_left = tmp1 = sibling->rb_right;
-				sibling->rb_right = parent;
-				rb_set_parent_color(tmp1, parent, RB_BLACK);
-				__rb_rotate_set_parents(parent, sibling, root,
-							RB_RED);
-				augment_rotate(parent, sibling);
-				sibling = tmp1;
-			}
-			tmp1 = sibling->rb_left;
-			if (!tmp1 || rb_is_black(tmp1)) {
-				tmp2 = sibling->rb_right;
-				if (!tmp2 || rb_is_black(tmp2)) {
-					/* Case 2 - sibling color flip */
-					rb_set_parent_color(sibling, parent,
-							    RB_RED);
-					if (rb_is_red(parent))
-						rb_set_black(parent);
-					else {
-						node = parent;
-						parent = rb_parent(node);
-						if (parent)
-							continue;
-					}
-					break;
-				}
-				/* Case 3 - right rotate at sibling */
-				sibling->rb_right = tmp1 = tmp2->rb_left;
-				tmp2->rb_left = sibling;
-				parent->rb_left = tmp2;
-				if (tmp1)
-					rb_set_parent_color(tmp1, sibling,
-							    RB_BLACK);
-				augment_rotate(sibling, tmp2);
-				tmp1 = sibling;
-				sibling = tmp2;
-			}
-			/* Case 4 - left rotate at parent + color flips */
-			parent->rb_left = tmp2 = sibling->rb_right;
-			sibling->rb_right = parent;
-			rb_set_parent_color(tmp1, sibling, RB_BLACK);
-			if (tmp2)
-				rb_set_parent(tmp2, parent);
-			__rb_rotate_set_parents(parent, sibling, root,
-						RB_BLACK);
-			augment_rotate(parent, sibling);
-			break;
-		}
-	}
-}
-
-/* Non-inline version for rb_erase_augmented() use */
-void __rb_erase_color(struct rb_node *parent, struct rb_root *root,
-	void (*augment_rotate)(struct rb_node *old, struct rb_node *new))
-{
-	____rb_erase_color(parent, root, augment_rotate);
-}
-EXPORT_SYMBOL(__rb_erase_color);
-
-/*
- * Non-augmented rbtree manipulation functions.
- *
- * We use dummy augmented callbacks here, and have the compiler optimize them
- * out of the rb_insert_color() and rb_erase() function definitions.
- */
-
-static inline void dummy_propagate(struct rb_node *node, struct rb_node *stop) {}
-static inline void dummy_copy(struct rb_node *old, struct rb_node *new) {}
-static inline void dummy_rotate(struct rb_node *old, struct rb_node *new) {}
-
-static const struct rb_augment_callbacks dummy_callbacks = {
-	dummy_propagate, dummy_copy, dummy_rotate
-};
-
-void rb_insert_color(struct rb_node *node, struct rb_root *root)
-{
-	__rb_insert(node, root, dummy_rotate);
-}
-EXPORT_SYMBOL(rb_insert_color);
-
-void rb_erase(struct rb_node *node, struct rb_root *root)
-{
-	struct rb_node *rebalance;
-	rebalance = __rb_erase_augmented(node, root, &dummy_callbacks);
-	if (rebalance)
-		____rb_erase_color(rebalance, root, dummy_rotate);
-}
-EXPORT_SYMBOL(rb_erase);
-
-/*
- * Augmented rbtree manipulation functions.
- *
- * This instantiates the same __always_inline functions as in the non-augmented
- * case, but this time with user-defined callbacks.
- */
-
-void __rb_insert_augmented(struct rb_node *node, struct rb_root *root,
-	void (*augment_rotate)(struct rb_node *old, struct rb_node *new))
-{
-	__rb_insert(node, root, augment_rotate);
-}
-EXPORT_SYMBOL(__rb_insert_augmented);
-
-/*
- * This function returns the first node (in sort order) of the tree.
- */
-struct rb_node *rb_first(const struct rb_root *root)
-{
-	struct rb_node	*n;
-
-	n = root->rb_node;
-	if (!n)
-		return NULL;
-	while (n->rb_left)
-		n = n->rb_left;
-	return n;
-}
-EXPORT_SYMBOL(rb_first);
-
-struct rb_node *rb_last(const struct rb_root *root)
-{
-	struct rb_node	*n;
-
-	n = root->rb_node;
-	if (!n)
-		return NULL;
-	while (n->rb_right)
-		n = n->rb_right;
-	return n;
-}
-EXPORT_SYMBOL(rb_last);
-
-struct rb_node *rb_next(const struct rb_node *node)
-{
-	struct rb_node *parent;
-
-	if (RB_EMPTY_NODE(node))
-		return NULL;
-
-	/*
-	 * If we have a right-hand child, go down and then left as far
-	 * as we can.
-	 */
-	if (node->rb_right) {
-		node = node->rb_right; 
-		while (node->rb_left)
-			node=node->rb_left;
-		return (struct rb_node *)node;
-	}
-
-	/*
-	 * No right-hand children. Everything down and left is smaller than us,
-	 * so any 'next' node must be in the general direction of our parent.
-	 * Go up the tree; any time the ancestor is a right-hand child of its
-	 * parent, keep going up. First time it's a left-hand child of its
-	 * parent, said parent is our 'next' node.
-	 */
-	while ((parent = rb_parent(node)) && node == parent->rb_right)
-		node = parent;
-
-	return parent;
-}
-EXPORT_SYMBOL(rb_next);
-
-struct rb_node *rb_prev(const struct rb_node *node)
-{
-	struct rb_node *parent;
-
-	if (RB_EMPTY_NODE(node))
-		return NULL;
-
-	/*
-	 * If we have a left-hand child, go down and then right as far
-	 * as we can.
-	 */
-	if (node->rb_left) {
-		node = node->rb_left; 
-		while (node->rb_right)
-			node=node->rb_right;
-		return (struct rb_node *)node;
-	}
-
-	/*
-	 * No left-hand children. Go up till we find an ancestor which
-	 * is a right-hand child of its parent.
-	 */
-	while ((parent = rb_parent(node)) && node == parent->rb_left)
-		node = parent;
-
-	return parent;
-}
-EXPORT_SYMBOL(rb_prev);
-
-void rb_replace_node(struct rb_node *victim, struct rb_node *new,
-		     struct rb_root *root)
-{
-	struct rb_node *parent = rb_parent(victim);
-
-	/* Set the surrounding nodes to point to the replacement */
-	__rb_change_child(victim, new, parent, root);
-	if (victim->rb_left)
-		rb_set_parent(victim->rb_left, new);
-	if (victim->rb_right)
-		rb_set_parent(victim->rb_right, new);
-
-	/* Copy the pointers/colour from the victim to the replacement */
-	*new = *victim;
-}
-EXPORT_SYMBOL(rb_replace_node);
-
-static struct rb_node *rb_left_deepest_node(const struct rb_node *node)
-{
-	for (;;) {
-		if (node->rb_left)
-			node = node->rb_left;
-		else if (node->rb_right)
-			node = node->rb_right;
-		else
-			return (struct rb_node *)node;
-	}
-}
-
-struct rb_node *rb_next_postorder(const struct rb_node *node)
-{
-	const struct rb_node *parent;
-	if (!node)
-		return NULL;
-	parent = rb_parent(node);
-
-	/* If we're sitting on node, we've already seen our children */
-	if (parent && node == parent->rb_left && parent->rb_right) {
-		/* If we are the parent's left node, go to the parent's right
-		 * node then all the way down to the left */
-		return rb_left_deepest_node(parent->rb_right);
-	} else
-		/* Otherwise we are the parent's right node, and the parent
-		 * should be next */
-		return (struct rb_node *)parent;
-}
-EXPORT_SYMBOL(rb_next_postorder);
-
-struct rb_node *rb_first_postorder(const struct rb_root *root)
-{
-	if (!root->rb_node)
-		return NULL;
-
-	return rb_left_deepest_node(root->rb_node);
-}
-EXPORT_SYMBOL(rb_first_postorder);
diff --git a/src/tools/lib/lk/Makefile b/src/tools/lib/lk/Makefile
deleted file mode 100644
index 3dba0a4..0000000
--- a/src/tools/lib/lk/Makefile
+++ /dev/null
@@ -1,38 +0,0 @@
-include ../../scripts/Makefile.include
-
-CC = $(CROSS_COMPILE)gcc
-AR = $(CROSS_COMPILE)ar
-
-# guard against environment variables
-LIB_H=
-LIB_OBJS=
-
-LIB_H += debugfs.h
-
-LIB_OBJS += $(OUTPUT)debugfs.o
-
-LIBFILE = liblk.a
-
-CFLAGS = -ggdb3 -Wall -Wextra -std=gnu99 -Werror -O6 -D_FORTIFY_SOURCE=2 $(EXTRA_WARNINGS) $(EXTRA_CFLAGS) -fPIC
-EXTLIBS = -lelf -lpthread -lrt -lm
-ALL_CFLAGS = $(CFLAGS) $(BASIC_CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
-ALL_LDFLAGS = $(LDFLAGS)
-
-RM = rm -f
-
-$(LIBFILE): $(LIB_OBJS)
-	$(QUIET_AR)$(RM) $@ && $(AR) rcs $(OUTPUT)$@ $(LIB_OBJS)
-
-$(LIB_OBJS): $(LIB_H)
-
-$(OUTPUT)%.o: %.c
-	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $<
-$(OUTPUT)%.s: %.c
-	$(QUIET_CC)$(CC) -S $(ALL_CFLAGS) $<
-$(OUTPUT)%.o: %.S
-	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $<
-
-clean:
-	$(RM) $(LIB_OBJS) $(LIBFILE)
-
-.PHONY: clean
diff --git a/src/tools/lib/lk/debugfs.c b/src/tools/lib/lk/debugfs.c
deleted file mode 100644
index a778add..0000000
--- a/src/tools/lib/lk/debugfs.c
+++ /dev/null
@@ -1,104 +0,0 @@
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdbool.h>
-#include <sys/vfs.h>
-#include <sys/mount.h>
-#include <linux/kernel.h>
-
-#include "debugfs.h"
-
-char debugfs_mountpoint[PATH_MAX + 1] = "/sys/kernel/debug";
-
-static const char * const debugfs_known_mountpoints[] = {
-	"/sys/kernel/debug/",
-	"/debug/",
-	0,
-};
-
-static bool debugfs_found;
-
-/* find the path to the mounted debugfs */
-const char *debugfs_find_mountpoint(void)
-{
-	const char * const *ptr;
-	char type[100];
-	FILE *fp;
-
-	if (debugfs_found)
-		return (const char *)debugfs_mountpoint;
-
-	ptr = debugfs_known_mountpoints;
-	while (*ptr) {
-		if (debugfs_valid_mountpoint(*ptr) == 0) {
-			debugfs_found = true;
-			strcpy(debugfs_mountpoint, *ptr);
-			return debugfs_mountpoint;
-		}
-		ptr++;
-	}
-
-	/* give up and parse /proc/mounts */
-	fp = fopen("/proc/mounts", "r");
-	if (fp == NULL)
-		return NULL;
-
-	while (fscanf(fp, "%*s %" STR(PATH_MAX) "s %99s %*s %*d %*d\n",
-		      debugfs_mountpoint, type) == 2) {
-		if (strcmp(type, "debugfs") == 0)
-			break;
-	}
-	fclose(fp);
-
-	if (strcmp(type, "debugfs") != 0)
-		return NULL;
-
-	debugfs_found = true;
-
-	return debugfs_mountpoint;
-}
-
-/* verify that a mountpoint is actually a debugfs instance */
-
-int debugfs_valid_mountpoint(const char *debugfs)
-{
-	struct statfs st_fs;
-
-	if (statfs(debugfs, &st_fs) < 0)
-		return -ENOENT;
-	else if (st_fs.f_type != (long) DEBUGFS_MAGIC)
-		return -ENOENT;
-
-	return 0;
-}
-
-/* mount the debugfs somewhere if it's not mounted */
-char *debugfs_mount(const char *mountpoint)
-{
-#ifdef __APPLE__
-	goto out;
-#else
-	/* see if it's already mounted */
-	if (debugfs_find_mountpoint())
-		goto out;
-
-	/* if not mounted and no argument */
-	if (mountpoint == NULL) {
-		/* see if environment variable set */
-		mountpoint = getenv(PERF_DEBUGFS_ENVIRONMENT);
-		/* if no environment variable, use default */
-		if (mountpoint == NULL)
-			mountpoint = "/sys/kernel/debug";
-	}
-
-	if (mount(NULL, mountpoint, "debugfs", 0, NULL) < 0)
-		return NULL;
-
-	/* save the mountpoint */
-	debugfs_found = true;
-	strncpy(debugfs_mountpoint, mountpoint, sizeof(debugfs_mountpoint));
-#endif
-out:
-	return debugfs_mountpoint;
-}
diff --git a/src/tools/lib/lk/debugfs.h b/src/tools/lib/lk/debugfs.h
deleted file mode 100644
index 935c59b..0000000
--- a/src/tools/lib/lk/debugfs.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef __LK_DEBUGFS_H__
-#define __LK_DEBUGFS_H__
-
-#define _STR(x) #x
-#define STR(x) _STR(x)
-
-/*
- * On most systems <limits.h> would have given us this, but  not on some systems
- * (e.g. GNU/Hurd).
- */
-#ifndef PATH_MAX
-#define PATH_MAX 4096
-#endif
-
-#ifndef DEBUGFS_MAGIC
-#define DEBUGFS_MAGIC          0x64626720
-#endif
-
-#ifndef PERF_DEBUGFS_ENVIRONMENT
-#define PERF_DEBUGFS_ENVIRONMENT "PERF_DEBUGFS_DIR"
-#endif
-
-const char *debugfs_find_mountpoint(void);
-int debugfs_valid_mountpoint(const char *debugfs);
-char *debugfs_mount(const char *mountpoint);
-
-extern char debugfs_mountpoint[];
-
-#endif /* __LK_DEBUGFS_H__ */
diff --git a/src/tools/lib/traceevent/Makefile b/src/tools/lib/traceevent/Makefile
deleted file mode 100644
index ca6cb77..0000000
--- a/src/tools/lib/traceevent/Makefile
+++ /dev/null
@@ -1,309 +0,0 @@
-# trace-cmd version
-EP_VERSION = 1
-EP_PATCHLEVEL = 1
-EP_EXTRAVERSION = 0
-
-# file format version
-FILE_VERSION = 6
-
-MAKEFLAGS += --no-print-directory
-
-
-# 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)
-
-EXT = -std=gnu99
-INSTALL = install
-
-# Use DESTDIR for installing into a different root directory.
-# This is useful for building a package. The program will be
-# installed in this directory as if it was the root directory.
-# Then the build tool can move it later.
-DESTDIR ?=
-DESTDIR_SQ = '$(subst ','\'',$(DESTDIR))'
-
-prefix ?= /usr/local
-bindir_relative = bin
-bindir = $(prefix)/$(bindir_relative)
-man_dir = $(prefix)/share/man
-man_dir_SQ = '$(subst ','\'',$(man_dir))'
-
-export man_dir man_dir_SQ INSTALL
-export DESTDIR DESTDIR_SQ
-
-# copy a bit from Linux kbuild
-
-ifeq ("$(origin V)", "command line")
-  VERBOSE = $(V)
-endif
-ifndef VERBOSE
-  VERBOSE = 0
-endif
-
-ifeq ("$(origin O)", "command line")
-  BUILD_OUTPUT := $(O)
-endif
-
-ifeq ($(BUILD_SRC),)
-ifneq ($(BUILD_OUTPUT),)
-
-define build_output
-	$(if $(VERBOSE:1=),@)+$(MAKE) -C $(BUILD_OUTPUT) 	\
-	BUILD_SRC=$(CURDIR) -f $(CURDIR)/Makefile $1
-endef
-
-saved-output := $(BUILD_OUTPUT)
-BUILD_OUTPUT := $(shell cd $(BUILD_OUTPUT) && /bin/pwd)
-$(if $(BUILD_OUTPUT),, \
-     $(error output directory "$(saved-output)" does not exist))
-
-all: sub-make
-
-$(MAKECMDGOALS): sub-make
-
-sub-make: force
-	$(call build_output, $(MAKECMDGOALS))
-
-
-# Leave processing to above invocation of make
-skip-makefile := 1
-
-endif # BUILD_OUTPUT
-endif # BUILD_SRC
-
-# We process the rest of the Makefile if this is the final invocation of make
-ifeq ($(skip-makefile),)
-
-srctree		:= $(if $(BUILD_SRC),$(BUILD_SRC),$(CURDIR))
-objtree		:= $(CURDIR)
-src		:= $(srctree)
-obj		:= $(objtree)
-
-export prefix bindir src obj
-
-# Shell quotes
-bindir_SQ = $(subst ','\'',$(bindir))
-bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
-
-LIB_FILE = libtraceevent.a libtraceevent.so
-
-CONFIG_INCLUDES = 
-CONFIG_LIBS	=
-CONFIG_FLAGS	=
-
-VERSION		= $(EP_VERSION)
-PATCHLEVEL	= $(EP_PATCHLEVEL)
-EXTRAVERSION	= $(EP_EXTRAVERSION)
-
-OBJ		= $@
-N		=
-
-export Q VERBOSE
-
-EVENT_PARSE_VERSION = $(EP_VERSION).$(EP_PATCHLEVEL).$(EP_EXTRAVERSION)
-
-INCLUDES = -I. $(CONFIG_INCLUDES)
-
-# Set compile option CFLAGS if not set elsewhere
-CFLAGS ?= -g -Wall
-
-# Append required CFLAGS
-override CFLAGS += $(CONFIG_FLAGS) $(INCLUDES) $(PLUGIN_DIR_SQ)
-override CFLAGS += $(udis86-flags) -D_GNU_SOURCE
-
-ifeq ($(VERBOSE),1)
-  Q =
-  print_compile =
-  print_app_build =
-  print_fpic_compile =
-  print_shared_lib_compile =
-  print_plugin_obj_compile =
-  print_plugin_build =
-  print_install =
-else
-  Q = @
-  print_compile =		echo '  CC                 '$(OBJ);
-  print_app_build =		echo '  BUILD              '$(OBJ);
-  print_fpic_compile =		echo '  CC FPIC            '$(OBJ);
-  print_shared_lib_compile =	echo '  BUILD SHARED LIB   '$(OBJ);
-  print_plugin_obj_compile =	echo '  CC PLUGIN OBJ      '$(OBJ);
-  print_plugin_build =		echo '  CC PLUGI           '$(OBJ);
-  print_static_lib_build =	echo '  BUILD STATIC LIB   '$(OBJ);
-  print_install =		echo '  INSTALL     '$1'	to	$(DESTDIR_SQ)$2';
-endif
-
-do_fpic_compile =					\
-	($(print_fpic_compile)				\
-	$(CC) -c $(CFLAGS) $(EXT) -fPIC $< -o $@)
-
-do_app_build =						\
-	($(print_app_build)				\
-	$(CC) $^ -rdynamic -o $@ $(CONFIG_LIBS) $(LIBS))
-
-do_compile_shared_library =			\
-	($(print_shared_lib_compile)		\
-	$(CC) --shared $^ -o $@)
-
-do_compile_plugin_obj =				\
-	($(print_plugin_obj_compile)		\
-	$(CC) -c $(CFLAGS) -fPIC -o $@ $<)
-
-do_plugin_build =				\
-	($(print_plugin_build)			\
-	$(CC) $(CFLAGS) -shared -nostartfiles -o $@ $<)
-
-do_build_static_lib =				\
-	($(print_static_lib_build)		\
-	$(RM) $@;  $(AR) rcs $@ $^)
-
-
-define do_compile
-	$(print_compile)						\
-	$(CC) -c $(CFLAGS) $(EXT) $< -o $(obj)/$@;
-endef
-
-$(obj)/%.o: $(src)/%.c
-	$(Q)$(call do_compile)
-
-%.o: $(src)/%.c
-	$(Q)$(call do_compile)
-
-PEVENT_LIB_OBJS = event-parse.o trace-seq.o parse-filter.o parse-utils.o
-PEVENT_LIB_OBJS += kbuffer-parse.o
-
-ALL_OBJS = $(PEVENT_LIB_OBJS)
-
-CMD_TARGETS = $(LIB_FILE)
-
-TARGETS = $(CMD_TARGETS)
-
-
-all: all_cmd
-
-all_cmd: $(CMD_TARGETS)
-
-libtraceevent.so: $(PEVENT_LIB_OBJS)
-	$(Q)$(do_compile_shared_library)
-
-libtraceevent.a: $(PEVENT_LIB_OBJS)
-	$(Q)$(do_build_static_lib)
-
-$(PEVENT_LIB_OBJS): %.o: $(src)/%.c TRACEEVENT-CFLAGS
-	$(Q)$(do_fpic_compile)
-
-define make_version.h
-	(echo '/* This file is automatically generated. Do not modify. */';		\
-	echo \#define VERSION_CODE $(shell						\
-	expr $(VERSION) \* 256 + $(PATCHLEVEL));					\
-	echo '#define EXTRAVERSION ' $(EXTRAVERSION);					\
-	echo '#define VERSION_STRING "'$(VERSION).$(PATCHLEVEL).$(EXTRAVERSION)'"';	\
-	echo '#define FILE_VERSION '$(FILE_VERSION);					\
-	) > $1
-endef
-
-define update_version.h
-	($(call make_version.h, $@.tmp);		\
-	if [ -r $@ ] && cmp -s $@ $@.tmp; then		\
-		rm -f $@.tmp;				\
-	else						\
-		echo '  UPDATE                 $@';	\
-		mv -f $@.tmp $@;			\
-	fi);
-endef
-
-ep_version.h: force
-	$(Q)$(N)$(call update_version.h)
-
-VERSION_FILES = ep_version.h
-
-define update_dir
-	(echo $1 > $@.tmp;	\
-	if [ -r $@ ] && cmp -s $@ $@.tmp; then		\
-		rm -f $@.tmp;				\
-	else						\
-		echo '  UPDATE                 $@';	\
-		mv -f $@.tmp $@;			\
-	fi);
-endef
-
-## make deps
-
-all_objs := $(sort $(ALL_OBJS))
-all_deps := $(all_objs:%.o=.%.d)
-
-# let .d file also depends on the source and header files
-define check_deps
-		@set -e; $(RM) $@; \
-		$(CC) -MM $(CFLAGS) $< > $@.$$$$; \
-		sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
-		$(RM) $@.$$$$
-endef
-
-$(all_deps): .%.d: $(src)/%.c
-	$(Q)$(call check_deps)
-
-$(all_objs) : %.o : .%.d
-
-dep_includes := $(wildcard $(all_deps))
-
-ifneq ($(dep_includes),)
- include $(dep_includes)
-endif
-
-### Detect environment changes
-TRACK_CFLAGS = $(subst ','\'',$(CFLAGS)):$(ARCH):$(CROSS_COMPILE)
-
-TRACEEVENT-CFLAGS: force
-	@FLAGS='$(TRACK_CFLAGS)'; \
-	    if test x"$$FLAGS" != x"`cat TRACEEVENT-CFLAGS 2>/dev/null`" ; then \
-		echo 1>&2 "    * new build flags or cross compiler"; \
-		echo "$$FLAGS" >TRACEEVENT-CFLAGS; \
-            fi
-
-tags:	force
-	$(RM) tags
-	find . -name '*.[ch]' | xargs ctags --extra=+f --c-kinds=+px \
-	--regex-c++='/_PE\(([^,)]*).*/PEVENT_ERRNO__\1/'
-
-TAGS:	force
-	$(RM) TAGS
-	find . -name '*.[ch]' | xargs etags \
-	--regex='/_PE(\([^,)]*\).*/PEVENT_ERRNO__\1/'
-
-define do_install
-	$(print_install)				\
-	if [ ! -d '$(DESTDIR_SQ)$2' ]; then		\
-		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$2';	\
-	fi;						\
-	$(INSTALL) $1 '$(DESTDIR_SQ)$2'
-endef
-
-install_lib: all_cmd
-	$(Q)$(call do_install,$(LIB_FILE),$(bindir_SQ))
-
-install: install_lib
-
-clean:
-	$(RM) *.o *~ $(TARGETS) *.a *.so $(VERSION_FILES) .*.d
-	$(RM) TRACEEVENT-CFLAGS tags TAGS
-
-endif # skip-makefile
-
-PHONY += force
-force:
-
-# Declare the contents of the .PHONY variable as phony.  We keep that
-# information in a variable so we can use it in if_changed and friends.
-.PHONY: $(PHONY)
diff --git a/src/tools/lib/traceevent/event-parse.c b/src/tools/lib/traceevent/event-parse.c
deleted file mode 100644
index d1c2a6a..0000000
--- a/src/tools/lib/traceevent/event-parse.c
+++ /dev/null
@@ -1,5653 +0,0 @@
-/*
- * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License (not later!)
- *
- * 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not,  see <http://www.gnu.org/licenses>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- *  The parts for function graph printing was taken and modified from the
- *  Linux Kernel that were written by
- *    - Copyright (C) 2009  Frederic Weisbecker,
- *  Frederic Weisbecker gave his permission to relicense the code to
- *  the Lesser General Public License.
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <ctype.h>
-#include <errno.h>
-#include <stdint.h>
-#include <limits.h>
-
-#include "event-parse.h"
-#include "event-utils.h"
-
-static const char *input_buf;
-static unsigned long long input_buf_ptr;
-static unsigned long long input_buf_siz;
-
-static int is_flag_field;
-static int is_symbolic_field;
-
-static int show_warning = 1;
-
-#define do_warning(fmt, ...)				\
-	do {						\
-		if (show_warning)			\
-			warning(fmt, ##__VA_ARGS__);	\
-	} while (0)
-
-static void init_input_buf(const char *buf, unsigned long long size)
-{
-	input_buf = buf;
-	input_buf_siz = size;
-	input_buf_ptr = 0;
-}
-
-const char *pevent_get_input_buf(void)
-{
-	return input_buf;
-}
-
-unsigned long long pevent_get_input_buf_ptr(void)
-{
-	return input_buf_ptr;
-}
-
-struct event_handler {
-	struct event_handler		*next;
-	int				id;
-	const char			*sys_name;
-	const char			*event_name;
-	pevent_event_handler_func	func;
-	void				*context;
-};
-
-struct pevent_func_params {
-	struct pevent_func_params	*next;
-	enum pevent_func_arg_type	type;
-};
-
-struct pevent_function_handler {
-	struct pevent_function_handler	*next;
-	enum pevent_func_arg_type	ret_type;
-	char				*name;
-	pevent_func_handler		func;
-	struct pevent_func_params	*params;
-	int				nr_args;
-};
-
-static unsigned long long
-process_defined_func(struct trace_seq *s, void *data, int size,
-		     struct event_format *event, struct print_arg *arg);
-
-static void free_func_handle(struct pevent_function_handler *func);
-
-/**
- * pevent_buffer_init - init buffer for parsing
- * @buf: buffer to parse
- * @size: the size of the buffer
- *
- * For use with pevent_read_token(), this initializes the internal
- * buffer that pevent_read_token() will parse.
- */
-void pevent_buffer_init(const char *buf, unsigned long long size)
-{
-	init_input_buf(buf, size);
-}
-
-void breakpoint(void)
-{
-	static int x;
-	x++;
-}
-
-struct print_arg *alloc_arg(void)
-{
-	return calloc(1, sizeof(struct print_arg));
-}
-
-struct cmdline {
-	char *comm;
-	int pid;
-};
-
-static int cmdline_cmp(const void *a, const void *b)
-{
-	const struct cmdline *ca = a;
-	const struct cmdline *cb = b;
-
-	if (ca->pid < cb->pid)
-		return -1;
-	if (ca->pid > cb->pid)
-		return 1;
-
-	return 0;
-}
-
-struct cmdline_list {
-	struct cmdline_list	*next;
-	char			*comm;
-	int			pid;
-};
-
-static int cmdline_init(struct pevent *pevent)
-{
-	struct cmdline_list *cmdlist = pevent->cmdlist;
-	struct cmdline_list *item;
-	struct cmdline *cmdlines;
-	int i;
-
-	cmdlines = malloc(sizeof(*cmdlines) * pevent->cmdline_count);
-	if (!cmdlines)
-		return -1;
-
-	i = 0;
-	while (cmdlist) {
-		cmdlines[i].pid = cmdlist->pid;
-		cmdlines[i].comm = cmdlist->comm;
-		i++;
-		item = cmdlist;
-		cmdlist = cmdlist->next;
-		free(item);
-	}
-
-	qsort(cmdlines, pevent->cmdline_count, sizeof(*cmdlines), cmdline_cmp);
-
-	pevent->cmdlines = cmdlines;
-	pevent->cmdlist = NULL;
-
-	return 0;
-}
-
-static const char *find_cmdline(struct pevent *pevent, int pid)
-{
-	const struct cmdline *comm;
-	struct cmdline key;
-
-	if (!pid)
-		return "<idle>";
-
-	if (!pevent->cmdlines && cmdline_init(pevent))
-		return "<not enough memory for cmdlines!>";
-
-	key.pid = pid;
-
-	comm = bsearch(&key, pevent->cmdlines, pevent->cmdline_count,
-		       sizeof(*pevent->cmdlines), cmdline_cmp);
-
-	if (comm)
-		return comm->comm;
-	return "<...>";
-}
-
-/**
- * pevent_pid_is_registered - return if a pid has a cmdline registered
- * @pevent: handle for the pevent
- * @pid: The pid to check if it has a cmdline registered with.
- *
- * Returns 1 if the pid has a cmdline mapped to it
- * 0 otherwise.
- */
-int pevent_pid_is_registered(struct pevent *pevent, int pid)
-{
-	const struct cmdline *comm;
-	struct cmdline key;
-
-	if (!pid)
-		return 1;
-
-	if (!pevent->cmdlines && cmdline_init(pevent))
-		return 0;
-
-	key.pid = pid;
-
-	comm = bsearch(&key, pevent->cmdlines, pevent->cmdline_count,
-		       sizeof(*pevent->cmdlines), cmdline_cmp);
-
-	if (comm)
-		return 1;
-	return 0;
-}
-
-/*
- * If the command lines have been converted to an array, then
- * we must add this pid. This is much slower than when cmdlines
- * are added before the array is initialized.
- */
-static int add_new_comm(struct pevent *pevent, const char *comm, int pid)
-{
-	struct cmdline *cmdlines = pevent->cmdlines;
-	const struct cmdline *cmdline;
-	struct cmdline key;
-
-	if (!pid)
-		return 0;
-
-	/* avoid duplicates */
-	key.pid = pid;
-
-	cmdline = bsearch(&key, pevent->cmdlines, pevent->cmdline_count,
-		       sizeof(*pevent->cmdlines), cmdline_cmp);
-	if (cmdline) {
-		errno = EEXIST;
-		return -1;
-	}
-
-	cmdlines = realloc(cmdlines, sizeof(*cmdlines) * (pevent->cmdline_count + 1));
-	if (!cmdlines) {
-		errno = ENOMEM;
-		return -1;
-	}
-
-	cmdlines[pevent->cmdline_count].comm = strdup(comm);
-	if (!cmdlines[pevent->cmdline_count].comm) {
-		free(cmdlines);
-		errno = ENOMEM;
-		return -1;
-	}
-
-	cmdlines[pevent->cmdline_count].pid = pid;
-		
-	if (cmdlines[pevent->cmdline_count].comm)
-		pevent->cmdline_count++;
-
-	qsort(cmdlines, pevent->cmdline_count, sizeof(*cmdlines), cmdline_cmp);
-	pevent->cmdlines = cmdlines;
-
-	return 0;
-}
-
-/**
- * pevent_register_comm - register a pid / comm mapping
- * @pevent: handle for the pevent
- * @comm: the command line to register
- * @pid: the pid to map the command line to
- *
- * This adds a mapping to search for command line names with
- * a given pid. The comm is duplicated.
- */
-int pevent_register_comm(struct pevent *pevent, const char *comm, int pid)
-{
-	struct cmdline_list *item;
-
-	if (pevent->cmdlines)
-		return add_new_comm(pevent, comm, pid);
-
-	item = malloc(sizeof(*item));
-	if (!item)
-		return -1;
-
-	item->comm = strdup(comm);
-	if (!item->comm) {
-		free(item);
-		return -1;
-	}
-	item->pid = pid;
-	item->next = pevent->cmdlist;
-
-	pevent->cmdlist = item;
-	pevent->cmdline_count++;
-
-	return 0;
-}
-
-struct func_map {
-	unsigned long long		addr;
-	char				*func;
-	char				*mod;
-};
-
-struct func_list {
-	struct func_list	*next;
-	unsigned long long	addr;
-	char			*func;
-	char			*mod;
-};
-
-static int func_cmp(const void *a, const void *b)
-{
-	const struct func_map *fa = a;
-	const struct func_map *fb = b;
-
-	if (fa->addr < fb->addr)
-		return -1;
-	if (fa->addr > fb->addr)
-		return 1;
-
-	return 0;
-}
-
-/*
- * We are searching for a record in between, not an exact
- * match.
- */
-static int func_bcmp(const void *a, const void *b)
-{
-	const struct func_map *fa = a;
-	const struct func_map *fb = b;
-
-	if ((fa->addr == fb->addr) ||
-
-	    (fa->addr > fb->addr &&
-	     fa->addr < (fb+1)->addr))
-		return 0;
-
-	if (fa->addr < fb->addr)
-		return -1;
-
-	return 1;
-}
-
-static int func_map_init(struct pevent *pevent)
-{
-	struct func_list *funclist;
-	struct func_list *item;
-	struct func_map *func_map;
-	int i;
-
-	func_map = malloc(sizeof(*func_map) * (pevent->func_count + 1));
-	if (!func_map)
-		return -1;
-
-	funclist = pevent->funclist;
-
-	i = 0;
-	while (funclist) {
-		func_map[i].func = funclist->func;
-		func_map[i].addr = funclist->addr;
-		func_map[i].mod = funclist->mod;
-		i++;
-		item = funclist;
-		funclist = funclist->next;
-		free(item);
-	}
-
-	qsort(func_map, pevent->func_count, sizeof(*func_map), func_cmp);
-
-	/*
-	 * Add a special record at the end.
-	 */
-	func_map[pevent->func_count].func = NULL;
-	func_map[pevent->func_count].addr = 0;
-	func_map[pevent->func_count].mod = NULL;
-
-	pevent->func_map = func_map;
-	pevent->funclist = NULL;
-
-	return 0;
-}
-
-static struct func_map *
-find_func(struct pevent *pevent, unsigned long long addr)
-{
-	struct func_map *func;
-	struct func_map key;
-
-	if (!pevent->func_map)
-		func_map_init(pevent);
-
-	key.addr = addr;
-
-	func = bsearch(&key, pevent->func_map, pevent->func_count,
-		       sizeof(*pevent->func_map), func_bcmp);
-
-	return func;
-}
-
-/**
- * pevent_find_function - find a function by a given address
- * @pevent: handle for the pevent
- * @addr: the address to find the function with
- *
- * Returns a pointer to the function stored that has the given
- * address. Note, the address does not have to be exact, it
- * will select the function that would contain the address.
- */
-const char *pevent_find_function(struct pevent *pevent, unsigned long long addr)
-{
-	struct func_map *map;
-
-	map = find_func(pevent, addr);
-	if (!map)
-		return NULL;
-
-	return map->func;
-}
-
-/**
- * pevent_find_function_address - find a function address by a given address
- * @pevent: handle for the pevent
- * @addr: the address to find the function with
- *
- * Returns the address the function starts at. This can be used in
- * conjunction with pevent_find_function to print both the function
- * name and the function offset.
- */
-unsigned long long
-pevent_find_function_address(struct pevent *pevent, unsigned long long addr)
-{
-	struct func_map *map;
-
-	map = find_func(pevent, addr);
-	if (!map)
-		return 0;
-
-	return map->addr;
-}
-
-/**
- * pevent_register_function - register a function with a given address
- * @pevent: handle for the pevent
- * @function: the function name to register
- * @addr: the address the function starts at
- * @mod: the kernel module the function may be in (NULL for none)
- *
- * This registers a function name with an address and module.
- * The @func passed in is duplicated.
- */
-int pevent_register_function(struct pevent *pevent, char *func,
-			     unsigned long long addr, char *mod)
-{
-	struct func_list *item = malloc(sizeof(*item));
-
-	if (!item)
-		return -1;
-
-	item->next = pevent->funclist;
-	item->func = strdup(func);
-	if (!item->func)
-		goto out_free;
-
-	if (mod) {
-		item->mod = strdup(mod);
-		if (!item->mod)
-			goto out_free_func;
-	} else
-		item->mod = NULL;
-	item->addr = addr;
-
-	pevent->funclist = item;
-	pevent->func_count++;
-
-	return 0;
-
-out_free_func:
-	free(item->func);
-	item->func = NULL;
-out_free:
-	free(item);
-	errno = ENOMEM;
-	return -1;
-}
-
-/**
- * pevent_print_funcs - print out the stored functions
- * @pevent: handle for the pevent
- *
- * This prints out the stored functions.
- */
-void pevent_print_funcs(struct pevent *pevent)
-{
-	int i;
-
-	if (!pevent->func_map)
-		func_map_init(pevent);
-
-	for (i = 0; i < (int)pevent->func_count; i++) {
-		printf("%016llx %s",
-		       pevent->func_map[i].addr,
-		       pevent->func_map[i].func);
-		if (pevent->func_map[i].mod)
-			printf(" [%s]\n", pevent->func_map[i].mod);
-		else
-			printf("\n");
-	}
-}
-
-struct printk_map {
-	unsigned long long		addr;
-	char				*printk;
-};
-
-struct printk_list {
-	struct printk_list	*next;
-	unsigned long long	addr;
-	char			*printk;
-};
-
-static int printk_cmp(const void *a, const void *b)
-{
-	const struct printk_map *pa = a;
-	const struct printk_map *pb = b;
-
-	if (pa->addr < pb->addr)
-		return -1;
-	if (pa->addr > pb->addr)
-		return 1;
-
-	return 0;
-}
-
-static int printk_map_init(struct pevent *pevent)
-{
-	struct printk_list *printklist;
-	struct printk_list *item;
-	struct printk_map *printk_map;
-	int i;
-
-	printk_map = malloc(sizeof(*printk_map) * (pevent->printk_count + 1));
-	if (!printk_map)
-		return -1;
-
-	printklist = pevent->printklist;
-
-	i = 0;
-	while (printklist) {
-		printk_map[i].printk = printklist->printk;
-		printk_map[i].addr = printklist->addr;
-		i++;
-		item = printklist;
-		printklist = printklist->next;
-		free(item);
-	}
-
-	qsort(printk_map, pevent->printk_count, sizeof(*printk_map), printk_cmp);
-
-	pevent->printk_map = printk_map;
-	pevent->printklist = NULL;
-
-	return 0;
-}
-
-static struct printk_map *
-find_printk(struct pevent *pevent, unsigned long long addr)
-{
-	struct printk_map *printk;
-	struct printk_map key;
-
-	if (!pevent->printk_map && printk_map_init(pevent))
-		return NULL;
-
-	key.addr = addr;
-
-	printk = bsearch(&key, pevent->printk_map, pevent->printk_count,
-			 sizeof(*pevent->printk_map), printk_cmp);
-
-	return printk;
-}
-
-/**
- * pevent_register_print_string - register a string by its address
- * @pevent: handle for the pevent
- * @fmt: the string format to register
- * @addr: the address the string was located at
- *
- * This registers a string by the address it was stored in the kernel.
- * The @fmt passed in is duplicated.
- */
-int pevent_register_print_string(struct pevent *pevent, char *fmt,
-				 unsigned long long addr)
-{
-	struct printk_list *item = malloc(sizeof(*item));
-
-	if (!item)
-		return -1;
-
-	item->next = pevent->printklist;
-	item->addr = addr;
-
-	item->printk = strdup(fmt);
-	if (!item->printk)
-		goto out_free;
-
-	pevent->printklist = item;
-	pevent->printk_count++;
-
-	return 0;
-
-out_free:
-	free(item);
-	errno = ENOMEM;
-	return -1;
-}
-
-/**
- * pevent_print_printk - print out the stored strings
- * @pevent: handle for the pevent
- *
- * This prints the string formats that were stored.
- */
-void pevent_print_printk(struct pevent *pevent)
-{
-	int i;
-
-	if (!pevent->printk_map)
-		printk_map_init(pevent);
-
-	for (i = 0; i < (int)pevent->printk_count; i++) {
-		printf("%016llx %s\n",
-		       pevent->printk_map[i].addr,
-		       pevent->printk_map[i].printk);
-	}
-}
-
-static struct event_format *alloc_event(void)
-{
-	return calloc(1, sizeof(struct event_format));
-}
-
-static int add_event(struct pevent *pevent, struct event_format *event)
-{
-	int i;
-	struct event_format **events = realloc(pevent->events, sizeof(event) *
-					       (pevent->nr_events + 1));
-	if (!events)
-		return -1;
-
-	pevent->events = events;
-
-	for (i = 0; i < pevent->nr_events; i++) {
-		if (pevent->events[i]->id > event->id)
-			break;
-	}
-	if (i < pevent->nr_events)
-		memmove(&pevent->events[i + 1],
-			&pevent->events[i],
-			sizeof(event) * (pevent->nr_events - i));
-
-	pevent->events[i] = event;
-	pevent->nr_events++;
-
-	event->pevent = pevent;
-
-	return 0;
-}
-
-static int event_item_type(enum event_type type)
-{
-	switch (type) {
-	case EVENT_ITEM ... EVENT_SQUOTE:
-		return 1;
-	case EVENT_ERROR ... EVENT_DELIM:
-	default:
-		return 0;
-	}
-}
-
-static void free_flag_sym(struct print_flag_sym *fsym)
-{
-	struct print_flag_sym *next;
-
-	while (fsym) {
-		next = fsym->next;
-		free(fsym->value);
-		free(fsym->str);
-		free(fsym);
-		fsym = next;
-	}
-}
-
-static void free_arg(struct print_arg *arg)
-{
-	struct print_arg *farg;
-
-	if (!arg)
-		return;
-
-	switch (arg->type) {
-	case PRINT_ATOM:
-		free(arg->atom.atom);
-		break;
-	case PRINT_FIELD:
-		free(arg->field.name);
-		break;
-	case PRINT_FLAGS:
-		free_arg(arg->flags.field);
-		free(arg->flags.delim);
-		free_flag_sym(arg->flags.flags);
-		break;
-	case PRINT_SYMBOL:
-		free_arg(arg->symbol.field);
-		free_flag_sym(arg->symbol.symbols);
-		break;
-	case PRINT_HEX:
-		free_arg(arg->hex.field);
-		free_arg(arg->hex.size);
-		break;
-	case PRINT_TYPE:
-		free(arg->typecast.type);
-		free_arg(arg->typecast.item);
-		break;
-	case PRINT_STRING:
-	case PRINT_BSTRING:
-		free(arg->string.string);
-		break;
-	case PRINT_DYNAMIC_ARRAY:
-		free(arg->dynarray.index);
-		break;
-	case PRINT_OP:
-		free(arg->op.op);
-		free_arg(arg->op.left);
-		free_arg(arg->op.right);
-		break;
-	case PRINT_FUNC:
-		while (arg->func.args) {
-			farg = arg->func.args;
-			arg->func.args = farg->next;
-			free_arg(farg);
-		}
-		break;
-
-	case PRINT_NULL:
-	default:
-		break;
-	}
-
-	free(arg);
-}
-
-static enum event_type get_type(int ch)
-{
-	if (ch == '\n')
-		return EVENT_NEWLINE;
-	if (isspace(ch))
-		return EVENT_SPACE;
-	if (isalnum(ch) || ch == '_')
-		return EVENT_ITEM;
-	if (ch == '\'')
-		return EVENT_SQUOTE;
-	if (ch == '"')
-		return EVENT_DQUOTE;
-	if (!isprint(ch))
-		return EVENT_NONE;
-	if (ch == '(' || ch == ')' || ch == ',')
-		return EVENT_DELIM;
-
-	return EVENT_OP;
-}
-
-static int __read_char(void)
-{
-	if (input_buf_ptr >= input_buf_siz)
-		return -1;
-
-	return input_buf[input_buf_ptr++];
-}
-
-static int __peek_char(void)
-{
-	if (input_buf_ptr >= input_buf_siz)
-		return -1;
-
-	return input_buf[input_buf_ptr];
-}
-
-/**
- * pevent_peek_char - peek at the next character that will be read
- *
- * Returns the next character read, or -1 if end of buffer.
- */
-int pevent_peek_char(void)
-{
-	return __peek_char();
-}
-
-static int extend_token(char **tok, char *buf, int size)
-{
-	char *newtok = realloc(*tok, size);
-
-	if (!newtok) {
-		free(*tok);
-		*tok = NULL;
-		return -1;
-	}
-
-	if (!*tok)
-		strcpy(newtok, buf);
-	else
-		strcat(newtok, buf);
-	*tok = newtok;
-
-	return 0;
-}
-
-static enum event_type force_token(const char *str, char **tok);
-
-static enum event_type __read_token(char **tok)
-{
-	char buf[BUFSIZ];
-	int ch, last_ch, quote_ch, next_ch;
-	int i = 0;
-	int tok_size = 0;
-	enum event_type type;
-
-	*tok = NULL;
-
-
-	ch = __read_char();
-	if (ch < 0)
-		return EVENT_NONE;
-
-	type = get_type(ch);
-	if (type == EVENT_NONE)
-		return type;
-
-	buf[i++] = ch;
-
-	switch (type) {
-	case EVENT_NEWLINE:
-	case EVENT_DELIM:
-		if (asprintf(tok, "%c", ch) < 0)
-			return EVENT_ERROR;
-
-		return type;
-
-	case EVENT_OP:
-		switch (ch) {
-		case '-':
-			next_ch = __peek_char();
-			if (next_ch == '>') {
-				buf[i++] = __read_char();
-				break;
-			}
-			/* fall through */
-		case '+':
-		case '|':
-		case '&':
-		case '>':
-		case '<':
-			last_ch = ch;
-			ch = __peek_char();
-			if (ch != last_ch)
-				goto test_equal;
-			buf[i++] = __read_char();
-			switch (last_ch) {
-			case '>':
-			case '<':
-				goto test_equal;
-			default:
-				break;
-			}
-			break;
-		case '!':
-		case '=':
-			goto test_equal;
-		default: /* what should we do instead? */
-			break;
-		}
-		buf[i] = 0;
-		*tok = strdup(buf);
-		return type;
-
- test_equal:
-		ch = __peek_char();
-		if (ch == '=')
-			buf[i++] = __read_char();
-		goto out;
-
-	case EVENT_DQUOTE:
-	case EVENT_SQUOTE:
-		/* don't keep quotes */
-		i--;
-		quote_ch = ch;
-		last_ch = 0;
- concat:
-		do {
-			if (i == (BUFSIZ - 1)) {
-				buf[i] = 0;
-				tok_size += BUFSIZ;
-
-				if (extend_token(tok, buf, tok_size) < 0)
-					return EVENT_NONE;
-				i = 0;
-			}
-			last_ch = ch;
-			ch = __read_char();
-			buf[i++] = ch;
-			/* the '\' '\' will cancel itself */
-			if (ch == '\\' && last_ch == '\\')
-				last_ch = 0;
-		} while (ch != quote_ch || last_ch == '\\');
-		/* remove the last quote */
-		i--;
-
-		/*
-		 * For strings (double quotes) check the next token.
-		 * If it is another string, concatinate the two.
-		 */
-		if (type == EVENT_DQUOTE) {
-			unsigned long long save_input_buf_ptr = input_buf_ptr;
-
-			do {
-				ch = __read_char();
-			} while (isspace(ch));
-			if (ch == '"')
-				goto concat;
-			input_buf_ptr = save_input_buf_ptr;
-		}
-
-		goto out;
-
-	case EVENT_ERROR ... EVENT_SPACE:
-	case EVENT_ITEM:
-	default:
-		break;
-	}
-
-	while (get_type(__peek_char()) == type) {
-		if (i == (BUFSIZ - 1)) {
-			buf[i] = 0;
-			tok_size += BUFSIZ;
-
-			if (extend_token(tok, buf, tok_size) < 0)
-				return EVENT_NONE;
-			i = 0;
-		}
-		ch = __read_char();
-		buf[i++] = ch;
-	}
-
- out:
-	buf[i] = 0;
-	if (extend_token(tok, buf, tok_size + i + 1) < 0)
-		return EVENT_NONE;
-
-	if (type == EVENT_ITEM) {
-		/*
-		 * Older versions of the kernel has a bug that
-		 * creates invalid symbols and will break the mac80211
-		 * parsing. This is a work around to that bug.
-		 *
-		 * See Linux kernel commit:
-		 *  811cb50baf63461ce0bdb234927046131fc7fa8b
-		 */
-		if (strcmp(*tok, "LOCAL_PR_FMT") == 0) {
-			free(*tok);
-			*tok = NULL;
-			return force_token("\"\%s\" ", tok);
-		} else if (strcmp(*tok, "STA_PR_FMT") == 0) {
-			free(*tok);
-			*tok = NULL;
-			return force_token("\" sta:%pM\" ", tok);
-		} else if (strcmp(*tok, "VIF_PR_FMT") == 0) {
-			free(*tok);
-			*tok = NULL;
-			return force_token("\" vif:%p(%d)\" ", tok);
-		}
-	}
-
-	return type;
-}
-
-static enum event_type force_token(const char *str, char **tok)
-{
-	const char *save_input_buf;
-	unsigned long long save_input_buf_ptr;
-	unsigned long long save_input_buf_siz;
-	enum event_type type;
-	
-	/* save off the current input pointers */
-	save_input_buf = input_buf;
-	save_input_buf_ptr = input_buf_ptr;
-	save_input_buf_siz = input_buf_siz;
-
-	init_input_buf(str, strlen(str));
-
-	type = __read_token(tok);
-
-	/* reset back to original token */
-	input_buf = save_input_buf;
-	input_buf_ptr = save_input_buf_ptr;
-	input_buf_siz = save_input_buf_siz;
-
-	return type;
-}
-
-static void free_token(char *tok)
-{
-	if (tok)
-		free(tok);
-}
-
-static enum event_type read_token(char **tok)
-{
-	enum event_type type;
-
-	for (;;) {
-		type = __read_token(tok);
-		if (type != EVENT_SPACE)
-			return type;
-
-		free_token(*tok);
-	}
-
-	/* not reached */
-	*tok = NULL;
-	return EVENT_NONE;
-}
-
-/**
- * pevent_read_token - access to utilites to use the pevent parser
- * @tok: The token to return
- *
- * This will parse tokens from the string given by
- * pevent_init_data().
- *
- * Returns the token type.
- */
-enum event_type pevent_read_token(char **tok)
-{
-	return read_token(tok);
-}
-
-/**
- * pevent_free_token - free a token returned by pevent_read_token
- * @token: the token to free
- */
-void pevent_free_token(char *token)
-{
-	free_token(token);
-}
-
-/* no newline */
-static enum event_type read_token_item(char **tok)
-{
-	enum event_type type;
-
-	for (;;) {
-		type = __read_token(tok);
-		if (type != EVENT_SPACE && type != EVENT_NEWLINE)
-			return type;
-		free_token(*tok);
-		*tok = NULL;
-	}
-
-	/* not reached */
-	*tok = NULL;
-	return EVENT_NONE;
-}
-
-static int test_type(enum event_type type, enum event_type expect)
-{
-	if (type != expect) {
-		do_warning("Error: expected type %d but read %d",
-		    expect, type);
-		return -1;
-	}
-	return 0;
-}
-
-static int test_type_token(enum event_type type, const char *token,
-		    enum event_type expect, const char *expect_tok)
-{
-	if (type != expect) {
-		do_warning("Error: expected type %d but read %d",
-		    expect, type);
-		return -1;
-	}
-
-	if (strcmp(token, expect_tok) != 0) {
-		do_warning("Error: expected '%s' but read '%s'",
-		    expect_tok, token);
-		return -1;
-	}
-	return 0;
-}
-
-static int __read_expect_type(enum event_type expect, char **tok, int newline_ok)
-{
-	enum event_type type;
-
-	if (newline_ok)
-		type = read_token(tok);
-	else
-		type = read_token_item(tok);
-	return test_type(type, expect);
-}
-
-static int read_expect_type(enum event_type expect, char **tok)
-{
-	return __read_expect_type(expect, tok, 1);
-}
-
-static int __read_expected(enum event_type expect, const char *str,
-			   int newline_ok)
-{
-	enum event_type type;
-	char *token;
-	int ret;
-
-	if (newline_ok)
-		type = read_token(&token);
-	else
-		type = read_token_item(&token);
-
-	ret = test_type_token(type, token, expect, str);
-
-	free_token(token);
-
-	return ret;
-}
-
-static int read_expected(enum event_type expect, const char *str)
-{
-	return __read_expected(expect, str, 1);
-}
-
-static int read_expected_item(enum event_type expect, const char *str)
-{
-	return __read_expected(expect, str, 0);
-}
-
-static char *event_read_name(void)
-{
-	char *token;
-
-	if (read_expected(EVENT_ITEM, "name") < 0)
-		return NULL;
-
-	if (read_expected(EVENT_OP, ":") < 0)
-		return NULL;
-
-	if (read_expect_type(EVENT_ITEM, &token) < 0)
-		goto fail;
-
-	return token;
-
- fail:
-	free_token(token);
-	return NULL;
-}
-
-static int event_read_id(void)
-{
-	char *token;
-	int id;
-
-	if (read_expected_item(EVENT_ITEM, "ID") < 0)
-		return -1;
-
-	if (read_expected(EVENT_OP, ":") < 0)
-		return -1;
-
-	if (read_expect_type(EVENT_ITEM, &token) < 0)
-		goto fail;
-
-	id = strtoul(token, NULL, 0);
-	free_token(token);
-	return id;
-
- fail:
-	free_token(token);
-	return -1;
-}
-
-static int field_is_string(struct format_field *field)
-{
-	if ((field->flags & FIELD_IS_ARRAY) &&
-	    (strstr(field->type, "char") || strstr(field->type, "u8") ||
-	     strstr(field->type, "s8")))
-		return 1;
-
-	return 0;
-}
-
-static int field_is_dynamic(struct format_field *field)
-{
-	if (strncmp(field->type, "__data_loc", 10) == 0)
-		return 1;
-
-	return 0;
-}
-
-static int field_is_long(struct format_field *field)
-{
-	/* includes long long */
-	if (strstr(field->type, "long"))
-		return 1;
-
-	return 0;
-}
-
-static unsigned int type_size(const char *name)
-{
-	/* This covers all FIELD_IS_STRING types. */
-	static struct {
-		const char *type;
-		unsigned int size;
-	} table[] = {
-		{ "u8",   1 },
-		{ "u16",  2 },
-		{ "u32",  4 },
-		{ "u64",  8 },
-		{ "s8",   1 },
-		{ "s16",  2 },
-		{ "s32",  4 },
-		{ "s64",  8 },
-		{ "char", 1 },
-		{ },
-	};
-	int i;
-
-	for (i = 0; table[i].type; i++) {
-		if (!strcmp(table[i].type, name))
-			return table[i].size;
-	}
-
-	return 0;
-}
-
-static int event_read_fields(struct event_format *event, struct format_field **fields)
-{
-	struct format_field *field = NULL;
-	enum event_type type;
-	char *token;
-	char *last_token;
-	int count = 0;
-
-	do {
-		unsigned int size_dynamic = 0;
-
-		type = read_token(&token);
-		if (type == EVENT_NEWLINE) {
-			free_token(token);
-			return count;
-		}
-
-		count++;
-
-		if (test_type_token(type, token, EVENT_ITEM, "field"))
-			goto fail;
-		free_token(token);
-
-		type = read_token(&token);
-		/*
-		 * The ftrace fields may still use the "special" name.
-		 * Just ignore it.
-		 */
-		if (event->flags & EVENT_FL_ISFTRACE &&
-		    type == EVENT_ITEM && strcmp(token, "special") == 0) {
-			free_token(token);
-			type = read_token(&token);
-		}
-
-		if (test_type_token(type, token, EVENT_OP, ":") < 0)
-			goto fail;
-
-		free_token(token);
-		if (read_expect_type(EVENT_ITEM, &token) < 0)
-			goto fail;
-
-		last_token = token;
-
-		field = calloc(1, sizeof(*field));
-		if (!field)
-			goto fail;
-
-		field->event = event;
-
-		/* read the rest of the type */
-		for (;;) {
-			type = read_token(&token);
-			if (type == EVENT_ITEM ||
-			    (type == EVENT_OP && strcmp(token, "*") == 0) ||
-			    /*
-			     * Some of the ftrace fields are broken and have
-			     * an illegal "." in them.
-			     */
-			    (event->flags & EVENT_FL_ISFTRACE &&
-			     type == EVENT_OP && strcmp(token, ".") == 0)) {
-
-				if (strcmp(token, "*") == 0)
-					field->flags |= FIELD_IS_POINTER;
-
-				if (field->type) {
-					char *new_type;
-					new_type = realloc(field->type,
-							   strlen(field->type) +
-							   strlen(last_token) + 2);
-					if (!new_type) {
-						free(last_token);
-						goto fail;
-					}
-					field->type = new_type;
-					strcat(field->type, " ");
-					strcat(field->type, last_token);
-					free(last_token);
-				} else
-					field->type = last_token;
-				last_token = token;
-				continue;
-			}
-
-			break;
-		}
-
-		if (!field->type) {
-			do_warning("%s: no type found", __func__);
-			goto fail;
-		}
-		field->name = last_token;
-
-		if (test_type(type, EVENT_OP))
-			goto fail;
-
-		if (strcmp(token, "[") == 0) {
-			enum event_type last_type = type;
-			char *brackets = token;
-			char *new_brackets;
-			int len;
-
-			field->flags |= FIELD_IS_ARRAY;
-
-			type = read_token(&token);
-
-			if (type == EVENT_ITEM)
-				field->arraylen = strtoul(token, NULL, 0);
-			else
-				field->arraylen = 0;
-
-		        while (strcmp(token, "]") != 0) {
-				if (last_type == EVENT_ITEM &&
-				    type == EVENT_ITEM)
-					len = 2;
-				else
-					len = 1;
-				last_type = type;
-
-				new_brackets = realloc(brackets,
-						       strlen(brackets) +
-						       strlen(token) + len);
-				if (!new_brackets) {
-					free(brackets);
-					goto fail;
-				}
-				brackets = new_brackets;
-				if (len == 2)
-					strcat(brackets, " ");
-				strcat(brackets, token);
-				/* We only care about the last token */
-				field->arraylen = strtoul(token, NULL, 0);
-				free_token(token);
-				type = read_token(&token);
-				if (type == EVENT_NONE) {
-					do_warning("failed to find token");
-					goto fail;
-				}
-			}
-
-			free_token(token);
-
-			new_brackets = realloc(brackets, strlen(brackets) + 2);
-			if (!new_brackets) {
-				free(brackets);
-				goto fail;
-			}
-			brackets = new_brackets;
-			strcat(brackets, "]");
-
-			/* add brackets to type */
-
-			type = read_token(&token);
-			/*
-			 * If the next token is not an OP, then it is of
-			 * the format: type [] item;
-			 */
-			if (type == EVENT_ITEM) {
-				char *new_type;
-				new_type = realloc(field->type,
-						   strlen(field->type) +
-						   strlen(field->name) +
-						   strlen(brackets) + 2);
-				if (!new_type) {
-					free(brackets);
-					goto fail;
-				}
-				field->type = new_type;
-				strcat(field->type, " ");
-				strcat(field->type, field->name);
-				size_dynamic = type_size(field->name);
-				free_token(field->name);
-				strcat(field->type, brackets);
-				field->name = token;
-				type = read_token(&token);
-			} else {
-				char *new_type;
-				new_type = realloc(field->type,
-						   strlen(field->type) +
-						   strlen(brackets) + 1);
-				if (!new_type) {
-					free(brackets);
-					goto fail;
-				}
-				field->type = new_type;
-				strcat(field->type, brackets);
-			}
-			free(brackets);
-		}
-
-		if (field_is_string(field))
-			field->flags |= FIELD_IS_STRING;
-		if (field_is_dynamic(field))
-			field->flags |= FIELD_IS_DYNAMIC;
-		if (field_is_long(field))
-			field->flags |= FIELD_IS_LONG;
-
-		if (test_type_token(type, token,  EVENT_OP, ";"))
-			goto fail;
-		free_token(token);
-
-		if (read_expected(EVENT_ITEM, "offset") < 0)
-			goto fail_expect;
-
-		if (read_expected(EVENT_OP, ":") < 0)
-			goto fail_expect;
-
-		if (read_expect_type(EVENT_ITEM, &token))
-			goto fail;
-		field->offset = strtoul(token, NULL, 0);
-		free_token(token);
-
-		if (read_expected(EVENT_OP, ";") < 0)
-			goto fail_expect;
-
-		if (read_expected(EVENT_ITEM, "size") < 0)
-			goto fail_expect;
-
-		if (read_expected(EVENT_OP, ":") < 0)
-			goto fail_expect;
-
-		if (read_expect_type(EVENT_ITEM, &token))
-			goto fail;
-		field->size = strtoul(token, NULL, 0);
-		free_token(token);
-
-		if (read_expected(EVENT_OP, ";") < 0)
-			goto fail_expect;
-
-		type = read_token(&token);
-		if (type != EVENT_NEWLINE) {
-			/* newer versions of the kernel have a "signed" type */
-			if (test_type_token(type, token, EVENT_ITEM, "signed"))
-				goto fail;
-
-			free_token(token);
-
-			if (read_expected(EVENT_OP, ":") < 0)
-				goto fail_expect;
-
-			if (read_expect_type(EVENT_ITEM, &token))
-				goto fail;
-
-			if (strtoul(token, NULL, 0))
-				field->flags |= FIELD_IS_SIGNED;
-
-			free_token(token);
-			if (read_expected(EVENT_OP, ";") < 0)
-				goto fail_expect;
-
-			if (read_expect_type(EVENT_NEWLINE, &token))
-				goto fail;
-		}
-
-		free_token(token);
-
-		if (field->flags & FIELD_IS_ARRAY) {
-			if (field->arraylen)
-				field->elementsize = field->size / field->arraylen;
-			else if (field->flags & FIELD_IS_DYNAMIC)
-				field->elementsize = size_dynamic;
-			else if (field->flags & FIELD_IS_STRING)
-				field->elementsize = 1;
-			else if (field->flags & FIELD_IS_LONG)
-				field->elementsize = event->pevent ?
-						     event->pevent->long_size :
-						     sizeof(long);
-		} else
-			field->elementsize = field->size;
-
-		*fields = field;
-		fields = &field->next;
-
-	} while (1);
-
-	return 0;
-
-fail:
-	free_token(token);
-fail_expect:
-	if (field) {
-		free(field->type);
-		free(field->name);
-		free(field);
-	}
-	return -1;
-}
-
-static int event_read_format(struct event_format *event)
-{
-	char *token;
-	int ret;
-
-	if (read_expected_item(EVENT_ITEM, "format") < 0)
-		return -1;
-
-	if (read_expected(EVENT_OP, ":") < 0)
-		return -1;
-
-	if (read_expect_type(EVENT_NEWLINE, &token))
-		goto fail;
-	free_token(token);
-
-	ret = event_read_fields(event, &event->format.common_fields);
-	if (ret < 0)
-		return ret;
-	event->format.nr_common = ret;
-
-	ret = event_read_fields(event, &event->format.fields);
-	if (ret < 0)
-		return ret;
-	event->format.nr_fields = ret;
-
-	return 0;
-
- fail:
-	free_token(token);
-	return -1;
-}
-
-static enum event_type
-process_arg_token(struct event_format *event, struct print_arg *arg,
-		  char **tok, enum event_type type);
-
-static enum event_type
-process_arg(struct event_format *event, struct print_arg *arg, char **tok)
-{
-	enum event_type type;
-	char *token;
-
-	type = read_token(&token);
-	*tok = token;
-
-	return process_arg_token(event, arg, tok, type);
-}
-
-static enum event_type
-process_op(struct event_format *event, struct print_arg *arg, char **tok);
-
-static enum event_type
-process_cond(struct event_format *event, struct print_arg *top, char **tok)
-{
-	struct print_arg *arg, *left, *right;
-	enum event_type type;
-	char *token = NULL;
-
-	arg = alloc_arg();
-	left = alloc_arg();
-	right = alloc_arg();
-
-	if (!arg || !left || !right) {
-		do_warning("%s: not enough memory!", __func__);
-		/* arg will be freed at out_free */
-		free_arg(left);
-		free_arg(right);
-		goto out_free;
-	}
-
-	arg->type = PRINT_OP;
-	arg->op.left = left;
-	arg->op.right = right;
-
-	*tok = NULL;
-	type = process_arg(event, left, &token);
-
- again:
-	/* Handle other operations in the arguments */
-	if (type == EVENT_OP && strcmp(token, ":") != 0) {
-		type = process_op(event, left, &token);
-		goto again;
-	}
-
-	if (test_type_token(type, token, EVENT_OP, ":"))
-		goto out_free;
-
-	arg->op.op = token;
-
-	type = process_arg(event, right, &token);
-
-	top->op.right = arg;
-
-	*tok = token;
-	return type;
-
-out_free:
-	/* Top may point to itself */
-	top->op.right = NULL;
-	free_token(token);
-	free_arg(arg);
-	return EVENT_ERROR;
-}
-
-static enum event_type
-process_array(struct event_format *event, struct print_arg *top, char **tok)
-{
-	struct print_arg *arg;
-	enum event_type type;
-	char *token = NULL;
-
-	arg = alloc_arg();
-	if (!arg) {
-		do_warning("%s: not enough memory!", __func__);
-		/* '*tok' is set to top->op.op.  No need to free. */
-		*tok = NULL;
-		return EVENT_ERROR;
-	}
-
-	*tok = NULL;
-	type = process_arg(event, arg, &token);
-	if (test_type_token(type, token, EVENT_OP, "]"))
-		goto out_free;
-
-	top->op.right = arg;
-
-	free_token(token);
-	type = read_token_item(&token);
-	*tok = token;
-
-	return type;
-
-out_free:
-	free_token(token);
-	free_arg(arg);
-	return EVENT_ERROR;
-}
-
-static int get_op_prio(char *op)
-{
-	if (!op[1]) {
-		switch (op[0]) {
-		case '~':
-		case '!':
-			return 4;
-		case '*':
-		case '/':
-		case '%':
-			return 6;
-		case '+':
-		case '-':
-			return 7;
-			/* '>>' and '<<' are 8 */
-		case '<':
-		case '>':
-			return 9;
-			/* '==' and '!=' are 10 */
-		case '&':
-			return 11;
-		case '^':
-			return 12;
-		case '|':
-			return 13;
-		case '?':
-			return 16;
-		default:
-			do_warning("unknown op '%c'", op[0]);
-			return -1;
-		}
-	} else {
-		if (strcmp(op, "++") == 0 ||
-		    strcmp(op, "--") == 0) {
-			return 3;
-		} else if (strcmp(op, ">>") == 0 ||
-			   strcmp(op, "<<") == 0) {
-			return 8;
-		} else if (strcmp(op, ">=") == 0 ||
-			   strcmp(op, "<=") == 0) {
-			return 9;
-		} else if (strcmp(op, "==") == 0 ||
-			   strcmp(op, "!=") == 0) {
-			return 10;
-		} else if (strcmp(op, "&&") == 0) {
-			return 14;
-		} else if (strcmp(op, "||") == 0) {
-			return 15;
-		} else {
-			do_warning("unknown op '%s'", op);
-			return -1;
-		}
-	}
-}
-
-static int set_op_prio(struct print_arg *arg)
-{
-
-	/* single ops are the greatest */
-	if (!arg->op.left || arg->op.left->type == PRINT_NULL)
-		arg->op.prio = 0;
-	else
-		arg->op.prio = get_op_prio(arg->op.op);
-
-	return arg->op.prio;
-}
-
-/* Note, *tok does not get freed, but will most likely be saved */
-static enum event_type
-process_op(struct event_format *event, struct print_arg *arg, char **tok)
-{
-	struct print_arg *left, *right = NULL;
-	enum event_type type;
-	char *token;
-
-	/* the op is passed in via tok */
-	token = *tok;
-
-	if (arg->type == PRINT_OP && !arg->op.left) {
-		/* handle single op */
-		if (token[1]) {
-			do_warning("bad op token %s", token);
-			goto out_free;
-		}
-		switch (token[0]) {
-		case '~':
-		case '!':
-		case '+':
-		case '-':
-			break;
-		default:
-			do_warning("bad op token %s", token);
-			goto out_free;
-
-		}
-
-		/* make an empty left */
-		left = alloc_arg();
-		if (!left)
-			goto out_warn_free;
-
-		left->type = PRINT_NULL;
-		arg->op.left = left;
-
-		right = alloc_arg();
-		if (!right)
-			goto out_warn_free;
-
-		arg->op.right = right;
-
-		/* do not free the token, it belongs to an op */
-		*tok = NULL;
-		type = process_arg(event, right, tok);
-
-	} else if (strcmp(token, "?") == 0) {
-
-		left = alloc_arg();
-		if (!left)
-			goto out_warn_free;
-
-		/* copy the top arg to the left */
-		*left = *arg;
-
-		arg->type = PRINT_OP;
-		arg->op.op = token;
-		arg->op.left = left;
-		arg->op.prio = 0;
-
-		/* it will set arg->op.right */
-		type = process_cond(event, arg, tok);
-
-	} else if (strcmp(token, ">>") == 0 ||
-		   strcmp(token, "<<") == 0 ||
-		   strcmp(token, "&") == 0 ||
-		   strcmp(token, "|") == 0 ||
-		   strcmp(token, "&&") == 0 ||
-		   strcmp(token, "||") == 0 ||
-		   strcmp(token, "-") == 0 ||
-		   strcmp(token, "+") == 0 ||
-		   strcmp(token, "*") == 0 ||
-		   strcmp(token, "^") == 0 ||
-		   strcmp(token, "/") == 0 ||
-		   strcmp(token, "<") == 0 ||
-		   strcmp(token, ">") == 0 ||
-		   strcmp(token, "<=") == 0 ||
-		   strcmp(token, ">=") == 0 ||
-		   strcmp(token, "==") == 0 ||
-		   strcmp(token, "!=") == 0) {
-
-		left = alloc_arg();
-		if (!left)
-			goto out_warn_free;
-
-		/* copy the top arg to the left */
-		*left = *arg;
-
-		arg->type = PRINT_OP;
-		arg->op.op = token;
-		arg->op.left = left;
-		arg->op.right = NULL;
-
-		if (set_op_prio(arg) == -1) {
-			event->flags |= EVENT_FL_FAILED;
-			/* arg->op.op (= token) will be freed at out_free */
-			arg->op.op = NULL;
-			goto out_free;
-		}
-
-		type = read_token_item(&token);
-		*tok = token;
-
-		/* could just be a type pointer */
-		if ((strcmp(arg->op.op, "*") == 0) &&
-		    type == EVENT_DELIM && (strcmp(token, ")") == 0)) {
-			char *new_atom;
-
-			if (left->type != PRINT_ATOM) {
-				do_warning("bad pointer type");
-				goto out_free;
-			}
-			new_atom = realloc(left->atom.atom,
-					    strlen(left->atom.atom) + 3);
-			if (!new_atom)
-				goto out_warn_free;
-
-			left->atom.atom = new_atom;
-			strcat(left->atom.atom, " *");
-			free(arg->op.op);
-			*arg = *left;
-			free(left);
-
-			return type;
-		}
-
-		right = alloc_arg();
-		if (!right)
-			goto out_warn_free;
-
-		type = process_arg_token(event, right, tok, type);
-		arg->op.right = right;
-
-	} else if (strcmp(token, "[") == 0) {
-
-		left = alloc_arg();
-		if (!left)
-			goto out_warn_free;
-
-		*left = *arg;
-
-		arg->type = PRINT_OP;
-		arg->op.op = token;
-		arg->op.left = left;
-
-		arg->op.prio = 0;
-
-		/* it will set arg->op.right */
-		type = process_array(event, arg, tok);
-
-	} else {
-		do_warning("unknown op '%s'", token);
-		event->flags |= EVENT_FL_FAILED;
-		/* the arg is now the left side */
-		goto out_free;
-	}
-
-	if (type == EVENT_OP && strcmp(*tok, ":") != 0) {
-		int prio;
-
-		/* higher prios need to be closer to the root */
-		prio = get_op_prio(*tok);
-
-		if (prio > arg->op.prio)
-			return process_op(event, arg, tok);
-
-		return process_op(event, right, tok);
-	}
-
-	return type;
-
-out_warn_free:
-	do_warning("%s: not enough memory!", __func__);
-out_free:
-	free_token(token);
-	*tok = NULL;
-	return EVENT_ERROR;
-}
-
-static enum event_type
-process_entry(struct event_format *event __maybe_unused, struct print_arg *arg,
-	      char **tok)
-{
-	enum event_type type;
-	char *field;
-	char *token;
-
-	if (read_expected(EVENT_OP, "->") < 0)
-		goto out_err;
-
-	if (read_expect_type(EVENT_ITEM, &token) < 0)
-		goto out_free;
-	field = token;
-
-	arg->type = PRINT_FIELD;
-	arg->field.name = field;
-
-	if (is_flag_field) {
-		arg->field.field = pevent_find_any_field(event, arg->field.name);
-		arg->field.field->flags |= FIELD_IS_FLAG;
-		is_flag_field = 0;
-	} else if (is_symbolic_field) {
-		arg->field.field = pevent_find_any_field(event, arg->field.name);
-		arg->field.field->flags |= FIELD_IS_SYMBOLIC;
-		is_symbolic_field = 0;
-	}
-
-	type = read_token(&token);
-	*tok = token;
-
-	return type;
-
- out_free:
-	free_token(token);
- out_err:
-	*tok = NULL;
-	return EVENT_ERROR;
-}
-
-static char *arg_eval (struct print_arg *arg);
-
-static unsigned long long
-eval_type_str(unsigned long long val, const char *type, int pointer)
-{
-	int sign = 0;
-	char *ref;
-	int len;
-
-	len = strlen(type);
-
-	if (pointer) {
-
-		if (type[len-1] != '*') {
-			do_warning("pointer expected with non pointer type");
-			return val;
-		}
-
-		ref = malloc(len);
-		if (!ref) {
-			do_warning("%s: not enough memory!", __func__);
-			return val;
-		}
-		memcpy(ref, type, len);
-
-		/* chop off the " *" */
-		ref[len - 2] = 0;
-
-		val = eval_type_str(val, ref, 0);
-		free(ref);
-		return val;
-	}
-
-	/* check if this is a pointer */
-	if (type[len - 1] == '*')
-		return val;
-
-	/* Try to figure out the arg size*/
-	if (strncmp(type, "struct", 6) == 0)
-		/* all bets off */
-		return val;
-
-	if (strcmp(type, "u8") == 0)
-		return val & 0xff;
-
-	if (strcmp(type, "u16") == 0)
-		return val & 0xffff;
-
-	if (strcmp(type, "u32") == 0)
-		return val & 0xffffffff;
-
-	if (strcmp(type, "u64") == 0 ||
-	    strcmp(type, "s64"))
-		return val;
-
-	if (strcmp(type, "s8") == 0)
-		return (unsigned long long)(char)val & 0xff;
-
-	if (strcmp(type, "s16") == 0)
-		return (unsigned long long)(short)val & 0xffff;
-
-	if (strcmp(type, "s32") == 0)
-		return (unsigned long long)(int)val & 0xffffffff;
-
-	if (strncmp(type, "unsigned ", 9) == 0) {
-		sign = 0;
-		type += 9;
-	}
-
-	if (strcmp(type, "char") == 0) {
-		if (sign)
-			return (unsigned long long)(char)val & 0xff;
-		else
-			return val & 0xff;
-	}
-
-	if (strcmp(type, "short") == 0) {
-		if (sign)
-			return (unsigned long long)(short)val & 0xffff;
-		else
-			return val & 0xffff;
-	}
-
-	if (strcmp(type, "int") == 0) {
-		if (sign)
-			return (unsigned long long)(int)val & 0xffffffff;
-		else
-			return val & 0xffffffff;
-	}
-
-	return val;
-}
-
-/*
- * Try to figure out the type.
- */
-static unsigned long long
-eval_type(unsigned long long val, struct print_arg *arg, int pointer)
-{
-	if (arg->type != PRINT_TYPE) {
-		do_warning("expected type argument");
-		return 0;
-	}
-
-	return eval_type_str(val, arg->typecast.type, pointer);
-}
-
-static int arg_num_eval(struct print_arg *arg, long long *val)
-{
-	long long left, right;
-	int ret = 1;
-
-	switch (arg->type) {
-	case PRINT_ATOM:
-		*val = strtoll(arg->atom.atom, NULL, 0);
-		break;
-	case PRINT_TYPE:
-		ret = arg_num_eval(arg->typecast.item, val);
-		if (!ret)
-			break;
-		*val = eval_type(*val, arg, 0);
-		break;
-	case PRINT_OP:
-		switch (arg->op.op[0]) {
-		case '|':
-			ret = arg_num_eval(arg->op.left, &left);
-			if (!ret)
-				break;
-			ret = arg_num_eval(arg->op.right, &right);
-			if (!ret)
-				break;
-			if (arg->op.op[1])
-				*val = left || right;
-			else
-				*val = left | right;
-			break;
-		case '&':
-			ret = arg_num_eval(arg->op.left, &left);
-			if (!ret)
-				break;
-			ret = arg_num_eval(arg->op.right, &right);
-			if (!ret)
-				break;
-			if (arg->op.op[1])
-				*val = left && right;
-			else
-				*val = left & right;
-			break;
-		case '<':
-			ret = arg_num_eval(arg->op.left, &left);
-			if (!ret)
-				break;
-			ret = arg_num_eval(arg->op.right, &right);
-			if (!ret)
-				break;
-			switch (arg->op.op[1]) {
-			case 0:
-				*val = left < right;
-				break;
-			case '<':
-				*val = left << right;
-				break;
-			case '=':
-				*val = left <= right;
-				break;
-			default:
-				do_warning("unknown op '%s'", arg->op.op);
-				ret = 0;
-			}
-			break;
-		case '>':
-			ret = arg_num_eval(arg->op.left, &left);
-			if (!ret)
-				break;
-			ret = arg_num_eval(arg->op.right, &right);
-			if (!ret)
-				break;
-			switch (arg->op.op[1]) {
-			case 0:
-				*val = left > right;
-				break;
-			case '>':
-				*val = left >> right;
-				break;
-			case '=':
-				*val = left >= right;
-				break;
-			default:
-				do_warning("unknown op '%s'", arg->op.op);
-				ret = 0;
-			}
-			break;
-		case '=':
-			ret = arg_num_eval(arg->op.left, &left);
-			if (!ret)
-				break;
-			ret = arg_num_eval(arg->op.right, &right);
-			if (!ret)
-				break;
-
-			if (arg->op.op[1] != '=') {
-				do_warning("unknown op '%s'", arg->op.op);
-				ret = 0;
-			} else
-				*val = left == right;
-			break;
-		case '!':
-			ret = arg_num_eval(arg->op.left, &left);
-			if (!ret)
-				break;
-			ret = arg_num_eval(arg->op.right, &right);
-			if (!ret)
-				break;
-
-			switch (arg->op.op[1]) {
-			case '=':
-				*val = left != right;
-				break;
-			default:
-				do_warning("unknown op '%s'", arg->op.op);
-				ret = 0;
-			}
-			break;
-		case '-':
-			/* check for negative */
-			if (arg->op.left->type == PRINT_NULL)
-				left = 0;
-			else
-				ret = arg_num_eval(arg->op.left, &left);
-			if (!ret)
-				break;
-			ret = arg_num_eval(arg->op.right, &right);
-			if (!ret)
-				break;
-			*val = left - right;
-			break;
-		case '+':
-			if (arg->op.left->type == PRINT_NULL)
-				left = 0;
-			else
-				ret = arg_num_eval(arg->op.left, &left);
-			if (!ret)
-				break;
-			ret = arg_num_eval(arg->op.right, &right);
-			if (!ret)
-				break;
-			*val = left + right;
-			break;
-		default:
-			do_warning("unknown op '%s'", arg->op.op);
-			ret = 0;
-		}
-		break;
-
-	case PRINT_NULL:
-	case PRINT_FIELD ... PRINT_SYMBOL:
-	case PRINT_STRING:
-	case PRINT_BSTRING:
-	default:
-		do_warning("invalid eval type %d", arg->type);
-		ret = 0;
-
-	}
-	return ret;
-}
-
-static char *arg_eval (struct print_arg *arg)
-{
-	long long val;
-	static char buf[20];
-
-	switch (arg->type) {
-	case PRINT_ATOM:
-		return arg->atom.atom;
-	case PRINT_TYPE:
-		return arg_eval(arg->typecast.item);
-	case PRINT_OP:
-		if (!arg_num_eval(arg, &val))
-			break;
-		sprintf(buf, "%lld", val);
-		return buf;
-
-	case PRINT_NULL:
-	case PRINT_FIELD ... PRINT_SYMBOL:
-	case PRINT_STRING:
-	case PRINT_BSTRING:
-	default:
-		do_warning("invalid eval type %d", arg->type);
-		break;
-	}
-
-	return NULL;
-}
-
-static enum event_type
-process_fields(struct event_format *event, struct print_flag_sym **list, char **tok)
-{
-	enum event_type type;
-	struct print_arg *arg = NULL;
-	struct print_flag_sym *field;
-	char *token = *tok;
-	char *value;
-
-	do {
-		free_token(token);
-		type = read_token_item(&token);
-		if (test_type_token(type, token, EVENT_OP, "{"))
-			break;
-
-		arg = alloc_arg();
-		if (!arg)
-			goto out_free;
-
-		free_token(token);
-		type = process_arg(event, arg, &token);
-
-		if (type == EVENT_OP)
-			type = process_op(event, arg, &token);
-
-		if (type == EVENT_ERROR)
-			goto out_free;
-
-		if (test_type_token(type, token, EVENT_DELIM, ","))
-			goto out_free;
-
-		field = calloc(1, sizeof(*field));
-		if (!field)
-			goto out_free;
-
-		value = arg_eval(arg);
-		if (value == NULL)
-			goto out_free_field;
-		field->value = strdup(value);
-		if (field->value == NULL)
-			goto out_free_field;
-
-		free_arg(arg);
-		arg = alloc_arg();
-		if (!arg)
-			goto out_free;
-
-		free_token(token);
-		type = process_arg(event, arg, &token);
-		if (test_type_token(type, token, EVENT_OP, "}"))
-			goto out_free_field;
-
-		value = arg_eval(arg);
-		if (value == NULL)
-			goto out_free_field;
-		field->str = strdup(value);
-		if (field->str == NULL)
-			goto out_free_field;
-		free_arg(arg);
-		arg = NULL;
-
-		*list = field;
-		list = &field->next;
-
-		free_token(token);
-		type = read_token_item(&token);
-	} while (type == EVENT_DELIM && strcmp(token, ",") == 0);
-
-	*tok = token;
-	return type;
-
-out_free_field:
-	free_flag_sym(field);
-out_free:
-	free_arg(arg);
-	free_token(token);
-	*tok = NULL;
-
-	return EVENT_ERROR;
-}
-
-static enum event_type
-process_flags(struct event_format *event, struct print_arg *arg, char **tok)
-{
-	struct print_arg *field;
-	enum event_type type;
-	char *token;
-
-	memset(arg, 0, sizeof(*arg));
-	arg->type = PRINT_FLAGS;
-
-	field = alloc_arg();
-	if (!field) {
-		do_warning("%s: not enough memory!", __func__);
-		goto out_free;
-	}
-
-	type = process_arg(event, field, &token);
-
-	/* Handle operations in the first argument */
-	while (type == EVENT_OP)
-		type = process_op(event, field, &token);
-
-	if (test_type_token(type, token, EVENT_DELIM, ","))
-		goto out_free_field;
-	free_token(token);
-
-	arg->flags.field = field;
-
-	type = read_token_item(&token);
-	if (event_item_type(type)) {
-		arg->flags.delim = token;
-		type = read_token_item(&token);
-	}
-
-	if (test_type_token(type, token, EVENT_DELIM, ","))
-		goto out_free;
-
-	type = process_fields(event, &arg->flags.flags, &token);
-	if (test_type_token(type, token, EVENT_DELIM, ")"))
-		goto out_free;
-
-	free_token(token);
-	type = read_token_item(tok);
-	return type;
-
-out_free_field:
-	free_arg(field);
-out_free:
-	free_token(token);
-	*tok = NULL;
-	return EVENT_ERROR;
-}
-
-static enum event_type
-process_symbols(struct event_format *event, struct print_arg *arg, char **tok)
-{
-	struct print_arg *field;
-	enum event_type type;
-	char *token;
-
-	memset(arg, 0, sizeof(*arg));
-	arg->type = PRINT_SYMBOL;
-
-	field = alloc_arg();
-	if (!field) {
-		do_warning("%s: not enough memory!", __func__);
-		goto out_free;
-	}
-
-	type = process_arg(event, field, &token);
-	if (test_type_token(type, token, EVENT_DELIM, ","))
-		goto out_free_field;
-
-	arg->symbol.field = field;
-
-	type = process_fields(event, &arg->symbol.symbols, &token);
-	if (test_type_token(type, token, EVENT_DELIM, ")"))
-		goto out_free;
-
-	free_token(token);
-	type = read_token_item(tok);
-	return type;
-
-out_free_field:
-	free_arg(field);
-out_free:
-	free_token(token);
-	*tok = NULL;
-	return EVENT_ERROR;
-}
-
-static enum event_type
-process_hex(struct event_format *event, struct print_arg *arg, char **tok)
-{
-	struct print_arg *field;
-	enum event_type type;
-	char *token;
-
-	memset(arg, 0, sizeof(*arg));
-	arg->type = PRINT_HEX;
-
-	field = alloc_arg();
-	if (!field) {
-		do_warning("%s: not enough memory!", __func__);
-		goto out_free;
-	}
-
-	type = process_arg(event, field, &token);
-
-	if (test_type_token(type, token, EVENT_DELIM, ","))
-		goto out_free;
-
-	arg->hex.field = field;
-
-	free_token(token);
-
-	field = alloc_arg();
-	if (!field) {
-		do_warning("%s: not enough memory!", __func__);
-		*tok = NULL;
-		return EVENT_ERROR;
-	}
-
-	type = process_arg(event, field, &token);
-
-	if (test_type_token(type, token, EVENT_DELIM, ")"))
-		goto out_free;
-
-	arg->hex.size = field;
-
-	free_token(token);
-	type = read_token_item(tok);
-	return type;
-
- out_free:
-	free_arg(field);
-	free_token(token);
-	*tok = NULL;
-	return EVENT_ERROR;
-}
-
-static enum event_type
-process_dynamic_array(struct event_format *event, struct print_arg *arg, char **tok)
-{
-	struct format_field *field;
-	enum event_type type;
-	char *token;
-
-	memset(arg, 0, sizeof(*arg));
-	arg->type = PRINT_DYNAMIC_ARRAY;
-
-	/*
-	 * The item within the parenthesis is another field that holds
-	 * the index into where the array starts.
-	 */
-	type = read_token(&token);
-	*tok = token;
-	if (type != EVENT_ITEM)
-		goto out_free;
-
-	/* Find the field */
-
-	field = pevent_find_field(event, token);
-	if (!field)
-		goto out_free;
-
-	arg->dynarray.field = field;
-	arg->dynarray.index = 0;
-
-	if (read_expected(EVENT_DELIM, ")") < 0)
-		goto out_free;
-
-	free_token(token);
-	type = read_token_item(&token);
-	*tok = token;
-	if (type != EVENT_OP || strcmp(token, "[") != 0)
-		return type;
-
-	free_token(token);
-	arg = alloc_arg();
-	if (!arg) {
-		do_warning("%s: not enough memory!", __func__);
-		*tok = NULL;
-		return EVENT_ERROR;
-	}
-
-	type = process_arg(event, arg, &token);
-	if (type == EVENT_ERROR)
-		goto out_free_arg;
-
-	if (!test_type_token(type, token, EVENT_OP, "]"))
-		goto out_free_arg;
-
-	free_token(token);
-	type = read_token_item(tok);
-	return type;
-
- out_free_arg:
-	free_arg(arg);
- out_free:
-	free_token(token);
-	*tok = NULL;
-	return EVENT_ERROR;
-}
-
-static enum event_type
-process_paren(struct event_format *event, struct print_arg *arg, char **tok)
-{
-	struct print_arg *item_arg;
-	enum event_type type;
-	char *token;
-
-	type = process_arg(event, arg, &token);
-
-	if (type == EVENT_ERROR)
-		goto out_free;
-
-	if (type == EVENT_OP)
-		type = process_op(event, arg, &token);
-
-	if (type == EVENT_ERROR)
-		goto out_free;
-
-	if (test_type_token(type, token, EVENT_DELIM, ")"))
-		goto out_free;
-
-	free_token(token);
-	type = read_token_item(&token);
-
-	/*
-	 * If the next token is an item or another open paren, then
-	 * this was a typecast.
-	 */
-	if (event_item_type(type) ||
-	    (type == EVENT_DELIM && strcmp(token, "(") == 0)) {
-
-		/* make this a typecast and contine */
-
-		/* prevous must be an atom */
-		if (arg->type != PRINT_ATOM) {
-			do_warning("previous needed to be PRINT_ATOM");
-			goto out_free;
-		}
-
-		item_arg = alloc_arg();
-		if (!item_arg) {
-			do_warning("%s: not enough memory!", __func__);
-			goto out_free;
-		}
-
-		arg->type = PRINT_TYPE;
-		arg->typecast.type = arg->atom.atom;
-		arg->typecast.item = item_arg;
-		type = process_arg_token(event, item_arg, &token, type);
-
-	}
-
-	*tok = token;
-	return type;
-
- out_free:
-	free_token(token);
-	*tok = NULL;
-	return EVENT_ERROR;
-}
-
-
-static enum event_type
-process_str(struct event_format *event __maybe_unused, struct print_arg *arg,
-	    char **tok)
-{
-	enum event_type type;
-	char *token;
-
-	if (read_expect_type(EVENT_ITEM, &token) < 0)
-		goto out_free;
-
-	arg->type = PRINT_STRING;
-	arg->string.string = token;
-	arg->string.offset = -1;
-
-	if (read_expected(EVENT_DELIM, ")") < 0)
-		goto out_err;
-
-	type = read_token(&token);
-	*tok = token;
-
-	return type;
-
- out_free:
-	free_token(token);
- out_err:
-	*tok = NULL;
-	return EVENT_ERROR;
-}
-
-static struct pevent_function_handler *
-find_func_handler(struct pevent *pevent, char *func_name)
-{
-	struct pevent_function_handler *func;
-
-	if (!pevent)
-		return NULL;
-
-	for (func = pevent->func_handlers; func; func = func->next) {
-		if (strcmp(func->name, func_name) == 0)
-			break;
-	}
-
-	return func;
-}
-
-static void remove_func_handler(struct pevent *pevent, char *func_name)
-{
-	struct pevent_function_handler *func;
-	struct pevent_function_handler **next;
-
-	next = &pevent->func_handlers;
-	while ((func = *next)) {
-		if (strcmp(func->name, func_name) == 0) {
-			*next = func->next;
-			free_func_handle(func);
-			break;
-		}
-		next = &func->next;
-	}
-}
-
-static enum event_type
-process_func_handler(struct event_format *event, struct pevent_function_handler *func,
-		     struct print_arg *arg, char **tok)
-{
-	struct print_arg **next_arg;
-	struct print_arg *farg;
-	enum event_type type;
-	char *token;
-	const char *test;
-	int i;
-
-	arg->type = PRINT_FUNC;
-	arg->func.func = func;
-
-	*tok = NULL;
-
-	next_arg = &(arg->func.args);
-	for (i = 0; i < func->nr_args; i++) {
-		farg = alloc_arg();
-		if (!farg) {
-			do_warning("%s: not enough memory!", __func__);
-			return EVENT_ERROR;
-		}
-
-		type = process_arg(event, farg, &token);
-		if (i < (func->nr_args - 1))
-			test = ",";
-		else
-			test = ")";
-
-		if (test_type_token(type, token, EVENT_DELIM, test)) {
-			free_arg(farg);
-			free_token(token);
-			return EVENT_ERROR;
-		}
-
-		*next_arg = farg;
-		next_arg = &(farg->next);
-		free_token(token);
-	}
-
-	type = read_token(&token);
-	*tok = token;
-
-	return type;
-}
-
-static enum event_type
-process_function(struct event_format *event, struct print_arg *arg,
-		 char *token, char **tok)
-{
-	struct pevent_function_handler *func;
-
-	if (strcmp(token, "__print_flags") == 0) {
-		free_token(token);
-		is_flag_field = 1;
-		return process_flags(event, arg, tok);
-	}
-	if (strcmp(token, "__print_symbolic") == 0) {
-		free_token(token);
-		is_symbolic_field = 1;
-		return process_symbols(event, arg, tok);
-	}
-	if (strcmp(token, "__print_hex") == 0) {
-		free_token(token);
-		return process_hex(event, arg, tok);
-	}
-	if (strcmp(token, "__get_str") == 0) {
-		free_token(token);
-		return process_str(event, arg, tok);
-	}
-	if (strcmp(token, "__get_dynamic_array") == 0) {
-		free_token(token);
-		return process_dynamic_array(event, arg, tok);
-	}
-
-	func = find_func_handler(event->pevent, token);
-	if (func) {
-		free_token(token);
-		return process_func_handler(event, func, arg, tok);
-	}
-
-	do_warning("function %s not defined", token);
-	free_token(token);
-	return EVENT_ERROR;
-}
-
-static enum event_type
-process_arg_token(struct event_format *event, struct print_arg *arg,
-		  char **tok, enum event_type type)
-{
-	char *token;
-	char *atom;
-
-	token = *tok;
-
-	switch (type) {
-	case EVENT_ITEM:
-		if (strcmp(token, "REC") == 0) {
-			free_token(token);
-			type = process_entry(event, arg, &token);
-			break;
-		}
-		atom = token;
-		/* test the next token */
-		type = read_token_item(&token);
-
-		/*
-		 * If the next token is a parenthesis, then this
-		 * is a function.
-		 */
-		if (type == EVENT_DELIM && strcmp(token, "(") == 0) {
-			free_token(token);
-			token = NULL;
-			/* this will free atom. */
-			type = process_function(event, arg, atom, &token);
-			break;
-		}
-		/* atoms can be more than one token long */
-		while (type == EVENT_ITEM) {
-			char *new_atom;
-			new_atom = realloc(atom,
-					   strlen(atom) + strlen(token) + 2);
-			if (!new_atom) {
-				free(atom);
-				*tok = NULL;
-				free_token(token);
-				return EVENT_ERROR;
-			}
-			atom = new_atom;
-			strcat(atom, " ");
-			strcat(atom, token);
-			free_token(token);
-			type = read_token_item(&token);
-		}
-
-		arg->type = PRINT_ATOM;
-		arg->atom.atom = atom;
-		break;
-
-	case EVENT_DQUOTE:
-	case EVENT_SQUOTE:
-		arg->type = PRINT_ATOM;
-		arg->atom.atom = token;
-		type = read_token_item(&token);
-		break;
-	case EVENT_DELIM:
-		if (strcmp(token, "(") == 0) {
-			free_token(token);
-			type = process_paren(event, arg, &token);
-			break;
-		}
-	case EVENT_OP:
-		/* handle single ops */
-		arg->type = PRINT_OP;
-		arg->op.op = token;
-		arg->op.left = NULL;
-		type = process_op(event, arg, &token);
-
-		/* On error, the op is freed */
-		if (type == EVENT_ERROR)
-			arg->op.op = NULL;
-
-		/* return error type if errored */
-		break;
-
-	case EVENT_ERROR ... EVENT_NEWLINE:
-	default:
-		do_warning("unexpected type %d", type);
-		return EVENT_ERROR;
-	}
-	*tok = token;
-
-	return type;
-}
-
-static int event_read_print_args(struct event_format *event, struct print_arg **list)
-{
-	enum event_type type = EVENT_ERROR;
-	struct print_arg *arg;
-	char *token;
-	int args = 0;
-
-	do {
-		if (type == EVENT_NEWLINE) {
-			type = read_token_item(&token);
-			continue;
-		}
-
-		arg = alloc_arg();
-		if (!arg) {
-			do_warning("%s: not enough memory!", __func__);
-			return -1;
-		}
-
-		type = process_arg(event, arg, &token);
-
-		if (type == EVENT_ERROR) {
-			free_token(token);
-			free_arg(arg);
-			return -1;
-		}
-
-		*list = arg;
-		args++;
-
-		if (type == EVENT_OP) {
-			type = process_op(event, arg, &token);
-			free_token(token);
-			if (type == EVENT_ERROR) {
-				*list = NULL;
-				free_arg(arg);
-				return -1;
-			}
-			list = &arg->next;
-			continue;
-		}
-
-		if (type == EVENT_DELIM && strcmp(token, ",") == 0) {
-			free_token(token);
-			*list = arg;
-			list = &arg->next;
-			continue;
-		}
-		break;
-	} while (type != EVENT_NONE);
-
-	if (type != EVENT_NONE && type != EVENT_ERROR)
-		free_token(token);
-
-	return args;
-}
-
-static int event_read_print(struct event_format *event)
-{
-	enum event_type type;
-	char *token;
-	int ret;
-
-	if (read_expected_item(EVENT_ITEM, "print") < 0)
-		return -1;
-
-	if (read_expected(EVENT_ITEM, "fmt") < 0)
-		return -1;
-
-	if (read_expected(EVENT_OP, ":") < 0)
-		return -1;
-
-	if (read_expect_type(EVENT_DQUOTE, &token) < 0)
-		goto fail;
-
- concat:
-	event->print_fmt.format = token;
-	event->print_fmt.args = NULL;
-
-	/* ok to have no arg */
-	type = read_token_item(&token);
-
-	if (type == EVENT_NONE)
-		return 0;
-
-	/* Handle concatenation of print lines */
-	if (type == EVENT_DQUOTE) {
-		char *cat;
-
-		if (asprintf(&cat, "%s%s", event->print_fmt.format, token) < 0)
-			goto fail;
-		free_token(token);
-		free_token(event->print_fmt.format);
-		event->print_fmt.format = NULL;
-		token = cat;
-		goto concat;
-	}
-			     
-	if (test_type_token(type, token, EVENT_DELIM, ","))
-		goto fail;
-
-	free_token(token);
-
-	ret = event_read_print_args(event, &event->print_fmt.args);
-	if (ret < 0)
-		return -1;
-
-	return ret;
-
- fail:
-	free_token(token);
-	return -1;
-}
-
-/**
- * pevent_find_common_field - return a common field by event
- * @event: handle for the event
- * @name: the name of the common field to return
- *
- * Returns a common field from the event by the given @name.
- * This only searchs the common fields and not all field.
- */
-struct format_field *
-pevent_find_common_field(struct event_format *event, const char *name)
-{
-	struct format_field *format;
-
-	for (format = event->format.common_fields;
-	     format; format = format->next) {
-		if (strcmp(format->name, name) == 0)
-			break;
-	}
-
-	return format;
-}
-
-/**
- * pevent_find_field - find a non-common field
- * @event: handle for the event
- * @name: the name of the non-common field
- *
- * Returns a non-common field by the given @name.
- * This does not search common fields.
- */
-struct format_field *
-pevent_find_field(struct event_format *event, const char *name)
-{
-	struct format_field *format;
-
-	for (format = event->format.fields;
-	     format; format = format->next) {
-		if (strcmp(format->name, name) == 0)
-			break;
-	}
-
-	return format;
-}
-
-/**
- * pevent_find_any_field - find any field by name
- * @event: handle for the event
- * @name: the name of the field
- *
- * Returns a field by the given @name.
- * This searchs the common field names first, then
- * the non-common ones if a common one was not found.
- */
-struct format_field *
-pevent_find_any_field(struct event_format *event, const char *name)
-{
-	struct format_field *format;
-
-	format = pevent_find_common_field(event, name);
-	if (format)
-		return format;
-	return pevent_find_field(event, name);
-}
-
-/**
- * pevent_read_number - read a number from data
- * @pevent: handle for the pevent
- * @ptr: the raw data
- * @size: the size of the data that holds the number
- *
- * Returns the number (converted to host) from the
- * raw data.
- */
-unsigned long long pevent_read_number(struct pevent *pevent,
-				      const void *ptr, int size)
-{
-	switch (size) {
-	case 1:
-		return *(unsigned char *)ptr;
-	case 2:
-		return data2host2(pevent, ptr);
-	case 4:
-		return data2host4(pevent, ptr);
-	case 8:
-		return data2host8(pevent, ptr);
-	default:
-		/* BUG! */
-		return 0;
-	}
-}
-
-/**
- * pevent_read_number_field - read a number from data
- * @field: a handle to the field
- * @data: the raw data to read
- * @value: the value to place the number in
- *
- * Reads raw data according to a field offset and size,
- * and translates it into @value.
- *
- * Returns 0 on success, -1 otherwise.
- */
-int pevent_read_number_field(struct format_field *field, const void *data,
-			     unsigned long long *value)
-{
-	if (!field)
-		return -1;
-	switch (field->size) {
-	case 1:
-	case 2:
-	case 4:
-	case 8:
-		*value = pevent_read_number(field->event->pevent,
-					    data + field->offset, field->size);
-		return 0;
-	default:
-		return -1;
-	}
-}
-
-static int get_common_info(struct pevent *pevent,
-			   const char *type, int *offset, int *size)
-{
-	struct event_format *event;
-	struct format_field *field;
-
-	/*
-	 * All events should have the same common elements.
-	 * Pick any event to find where the type is;
-	 */
-	if (!pevent->events) {
-		do_warning("no event_list!");
-		return -1;
-	}
-
-	event = pevent->events[0];
-	field = pevent_find_common_field(event, type);
-	if (!field)
-		return -1;
-
-	*offset = field->offset;
-	*size = field->size;
-
-	return 0;
-}
-
-static int __parse_common(struct pevent *pevent, void *data,
-			  int *size, int *offset, const char *name)
-{
-	int ret;
-
-	if (!*size) {
-		ret = get_common_info(pevent, name, offset, size);
-		if (ret < 0)
-			return ret;
-	}
-	return pevent_read_number(pevent, data + *offset, *size);
-}
-
-static int trace_parse_common_type(struct pevent *pevent, void *data)
-{
-	return __parse_common(pevent, data,
-			      &pevent->type_size, &pevent->type_offset,
-			      "common_type");
-}
-
-static int parse_common_pid(struct pevent *pevent, void *data)
-{
-	return __parse_common(pevent, data,
-			      &pevent->pid_size, &pevent->pid_offset,
-			      "common_pid");
-}
-
-static int parse_common_pc(struct pevent *pevent, void *data)
-{
-	return __parse_common(pevent, data,
-			      &pevent->pc_size, &pevent->pc_offset,
-			      "common_preempt_count");
-}
-
-static int parse_common_flags(struct pevent *pevent, void *data)
-{
-	return __parse_common(pevent, data,
-			      &pevent->flags_size, &pevent->flags_offset,
-			      "common_flags");
-}
-
-static int parse_common_lock_depth(struct pevent *pevent, void *data)
-{
-	return __parse_common(pevent, data,
-			      &pevent->ld_size, &pevent->ld_offset,
-			      "common_lock_depth");
-}
-
-static int parse_common_migrate_disable(struct pevent *pevent, void *data)
-{
-	return __parse_common(pevent, data,
-			      &pevent->ld_size, &pevent->ld_offset,
-			      "common_migrate_disable");
-}
-
-static int events_id_cmp(const void *a, const void *b);
-
-/**
- * pevent_find_event - find an event by given id
- * @pevent: a handle to the pevent
- * @id: the id of the event
- *
- * Returns an event that has a given @id.
- */
-struct event_format *pevent_find_event(struct pevent *pevent, int id)
-{
-	struct event_format **eventptr;
-	struct event_format key;
-	struct event_format *pkey = &key;
-
-	/* Check cache first */
-	if (pevent->last_event && pevent->last_event->id == id)
-		return pevent->last_event;
-
-	key.id = id;
-
-	eventptr = bsearch(&pkey, pevent->events, pevent->nr_events,
-			   sizeof(*pevent->events), events_id_cmp);
-
-	if (eventptr) {
-		pevent->last_event = *eventptr;
-		return *eventptr;
-	}
-
-	return NULL;
-}
-
-/**
- * pevent_find_event_by_name - find an event by given name
- * @pevent: a handle to the pevent
- * @sys: the system name to search for
- * @name: the name of the event to search for
- *
- * This returns an event with a given @name and under the system
- * @sys. If @sys is NULL the first event with @name is returned.
- */
-struct event_format *
-pevent_find_event_by_name(struct pevent *pevent,
-			  const char *sys, const char *name)
-{
-	struct event_format *event;
-	int i;
-
-	if (pevent->last_event &&
-	    strcmp(pevent->last_event->name, name) == 0 &&
-	    (!sys || strcmp(pevent->last_event->system, sys) == 0))
-		return pevent->last_event;
-
-	for (i = 0; i < pevent->nr_events; i++) {
-		event = pevent->events[i];
-		if (strcmp(event->name, name) == 0) {
-			if (!sys)
-				break;
-			if (strcmp(event->system, sys) == 0)
-				break;
-		}
-	}
-	if (i == pevent->nr_events)
-		event = NULL;
-
-	pevent->last_event = event;
-	return event;
-}
-
-static unsigned long long
-eval_num_arg(void *data, int size, struct event_format *event, struct print_arg *arg)
-{
-	struct pevent *pevent = event->pevent;
-	unsigned long long val = 0;
-	unsigned long long left, right;
-	struct print_arg *typearg = NULL;
-	struct print_arg *larg;
-	unsigned long offset;
-	unsigned int field_size;
-
-	switch (arg->type) {
-	case PRINT_NULL:
-		/* ?? */
-		return 0;
-	case PRINT_ATOM:
-		return strtoull(arg->atom.atom, NULL, 0);
-	case PRINT_FIELD:
-		if (!arg->field.field) {
-			arg->field.field = pevent_find_any_field(event, arg->field.name);
-			if (!arg->field.field)
-				goto out_warning_field;
-			
-		}
-		/* must be a number */
-		val = pevent_read_number(pevent, data + arg->field.field->offset,
-				arg->field.field->size);
-		break;
-	case PRINT_FLAGS:
-	case PRINT_SYMBOL:
-	case PRINT_HEX:
-		break;
-	case PRINT_TYPE:
-		val = eval_num_arg(data, size, event, arg->typecast.item);
-		return eval_type(val, arg, 0);
-	case PRINT_STRING:
-	case PRINT_BSTRING:
-		return 0;
-	case PRINT_FUNC: {
-		struct trace_seq s;
-		trace_seq_init(&s);
-		val = process_defined_func(&s, data, size, event, arg);
-		trace_seq_destroy(&s);
-		return val;
-	}
-	case PRINT_OP:
-		if (strcmp(arg->op.op, "[") == 0) {
-			/*
-			 * Arrays are special, since we don't want
-			 * to read the arg as is.
-			 */
-			right = eval_num_arg(data, size, event, arg->op.right);
-
-			/* handle typecasts */
-			larg = arg->op.left;
-			while (larg->type == PRINT_TYPE) {
-				if (!typearg)
-					typearg = larg;
-				larg = larg->typecast.item;
-			}
-
-			/* Default to long size */
-			field_size = pevent->long_size;
-
-			switch (larg->type) {
-			case PRINT_DYNAMIC_ARRAY:
-				offset = pevent_read_number(pevent,
-						   data + larg->dynarray.field->offset,
-						   larg->dynarray.field->size);
-				if (larg->dynarray.field->elementsize)
-					field_size = larg->dynarray.field->elementsize;
-				/*
-				 * The actual length of the dynamic array is stored
-				 * in the top half of the field, and the offset
-				 * is in the bottom half of the 32 bit field.
-				 */
-				offset &= 0xffff;
-				offset += right;
-				break;
-			case PRINT_FIELD:
-				if (!larg->field.field) {
-					larg->field.field =
-						pevent_find_any_field(event, larg->field.name);
-					if (!larg->field.field) {
-						arg = larg;
-						goto out_warning_field;
-					}
-				}
-				field_size = larg->field.field->elementsize;
-				offset = larg->field.field->offset +
-					right * larg->field.field->elementsize;
-				break;
-			default:
-				goto default_op; /* oops, all bets off */
-			}
-			val = pevent_read_number(pevent,
-						 data + offset, field_size);
-			if (typearg)
-				val = eval_type(val, typearg, 1);
-			break;
-		} else if (strcmp(arg->op.op, "?") == 0) {
-			left = eval_num_arg(data, size, event, arg->op.left);
-			arg = arg->op.right;
-			if (left)
-				val = eval_num_arg(data, size, event, arg->op.left);
-			else
-				val = eval_num_arg(data, size, event, arg->op.right);
-			break;
-		}
- default_op:
-		left = eval_num_arg(data, size, event, arg->op.left);
-		right = eval_num_arg(data, size, event, arg->op.right);
-		switch (arg->op.op[0]) {
-		case '!':
-			switch (arg->op.op[1]) {
-			case 0:
-				val = !right;
-				break;
-			case '=':
-				val = left != right;
-				break;
-			default:
-				goto out_warning_op;
-			}
-			break;
-		case '~':
-			val = ~right;
-			break;
-		case '|':
-			if (arg->op.op[1])
-				val = left || right;
-			else
-				val = left | right;
-			break;
-		case '&':
-			if (arg->op.op[1])
-				val = left && right;
-			else
-				val = left & right;
-			break;
-		case '<':
-			switch (arg->op.op[1]) {
-			case 0:
-				val = left < right;
-				break;
-			case '<':
-				val = left << right;
-				break;
-			case '=':
-				val = left <= right;
-				break;
-			default:
-				goto out_warning_op;
-			}
-			break;
-		case '>':
-			switch (arg->op.op[1]) {
-			case 0:
-				val = left > right;
-				break;
-			case '>':
-				val = left >> right;
-				break;
-			case '=':
-				val = left >= right;
-				break;
-			default:
-				goto out_warning_op;
-			}
-			break;
-		case '=':
-			if (arg->op.op[1] != '=')
-				goto out_warning_op;
-
-			val = left == right;
-			break;
-		case '-':
-			val = left - right;
-			break;
-		case '+':
-			val = left + right;
-			break;
-		case '/':
-			val = left / right;
-			break;
-		case '*':
-			val = left * right;
-			break;
-		default:
-			goto out_warning_op;
-		}
-		break;
-	default: /* not sure what to do there */
-		return 0;
-	}
-	return val;
-
-out_warning_op:
-	do_warning("%s: unknown op '%s'", __func__, arg->op.op);
-	return 0;
-
-out_warning_field:
-	do_warning("%s: field %s not found", __func__, arg->field.name);
-	return 0;
-}
-
-struct flag {
-	const char *name;
-	unsigned long long value;
-};
-
-static const struct flag flags[] = {
-	{ "HI_SOFTIRQ", 0 },
-	{ "TIMER_SOFTIRQ", 1 },
-	{ "NET_TX_SOFTIRQ", 2 },
-	{ "NET_RX_SOFTIRQ", 3 },
-	{ "BLOCK_SOFTIRQ", 4 },
-	{ "BLOCK_IOPOLL_SOFTIRQ", 5 },
-	{ "TASKLET_SOFTIRQ", 6 },
-	{ "SCHED_SOFTIRQ", 7 },
-	{ "HRTIMER_SOFTIRQ", 8 },
-	{ "RCU_SOFTIRQ", 9 },
-
-	{ "HRTIMER_NORESTART", 0 },
-	{ "HRTIMER_RESTART", 1 },
-};
-
-static unsigned long long eval_flag(const char *flag)
-{
-	int i;
-
-	/*
-	 * Some flags in the format files do not get converted.
-	 * If the flag is not numeric, see if it is something that
-	 * we already know about.
-	 */
-	if (isdigit(flag[0]))
-		return strtoull(flag, NULL, 0);
-
-	for (i = 0; i < (int)(sizeof(flags)/sizeof(flags[0])); i++)
-		if (strcmp(flags[i].name, flag) == 0)
-			return flags[i].value;
-
-	return 0;
-}
-
-static void print_str_to_seq(struct trace_seq *s, const char *format,
-			     int len_arg, const char *str)
-{
-	if (len_arg >= 0)
-		trace_seq_printf(s, format, len_arg, str);
-	else
-		trace_seq_printf(s, format, str);
-}
-
-static void print_str_arg(struct trace_seq *s, void *data, int size,
-			  struct event_format *event, const char *format,
-			  int len_arg, struct print_arg *arg)
-{
-	struct pevent *pevent = event->pevent;
-	struct print_flag_sym *flag;
-	struct format_field *field;
-	unsigned long long val, fval;
-	unsigned long addr;
-	char *str;
-	unsigned char *hex;
-	int print;
-	int i, len;
-
-	switch (arg->type) {
-	case PRINT_NULL:
-		/* ?? */
-		return;
-	case PRINT_ATOM:
-		print_str_to_seq(s, format, len_arg, arg->atom.atom);
-		return;
-	case PRINT_FIELD:
-		field = arg->field.field;
-		if (!field) {
-			field = pevent_find_any_field(event, arg->field.name);
-			if (!field) {
-				str = arg->field.name;
-				goto out_warning_field;
-			}
-			arg->field.field = field;
-		}
-		/* Zero sized fields, mean the rest of the data */
-		len = field->size ? : size - field->offset;
-
-		/*
-		 * Some events pass in pointers. If this is not an array
-		 * and the size is the same as long_size, assume that it
-		 * is a pointer.
-		 */
-		if (!(field->flags & FIELD_IS_ARRAY) &&
-		    field->size == pevent->long_size) {
-			addr = *(unsigned long *)(data + field->offset);
-			trace_seq_printf(s, "%lx", addr);
-			break;
-		}
-		str = malloc(len + 1);
-		if (!str) {
-			do_warning("%s: not enough memory!", __func__);
-			return;
-		}
-		memcpy(str, data + field->offset, len);
-		str[len] = 0;
-		print_str_to_seq(s, format, len_arg, str);
-		free(str);
-		break;
-	case PRINT_FLAGS:
-		val = eval_num_arg(data, size, event, arg->flags.field);
-		print = 0;
-		for (flag = arg->flags.flags; flag; flag = flag->next) {
-			fval = eval_flag(flag->value);
-			if (!val && !fval) {
-				print_str_to_seq(s, format, len_arg, flag->str);
-				break;
-			}
-			if (fval && (val & fval) == fval) {
-				if (print && arg->flags.delim)
-					trace_seq_puts(s, arg->flags.delim);
-				print_str_to_seq(s, format, len_arg, flag->str);
-				print = 1;
-				val &= ~fval;
-			}
-		}
-		break;
-	case PRINT_SYMBOL:
-		val = eval_num_arg(data, size, event, arg->symbol.field);
-		for (flag = arg->symbol.symbols; flag; flag = flag->next) {
-			fval = eval_flag(flag->value);
-			if (val == fval) {
-				print_str_to_seq(s, format, len_arg, flag->str);
-				break;
-			}
-		}
-		break;
-	case PRINT_HEX:
-		field = arg->hex.field->field.field;
-		if (!field) {
-			str = arg->hex.field->field.name;
-			field = pevent_find_any_field(event, str);
-			if (!field)
-				goto out_warning_field;
-			arg->hex.field->field.field = field;
-		}
-		hex = data + field->offset;
-		len = eval_num_arg(data, size, event, arg->hex.size);
-		for (i = 0; i < len; i++) {
-			if (i)
-				trace_seq_putc(s, ' ');
-			trace_seq_printf(s, "%02x", hex[i]);
-		}
-		break;
-
-	case PRINT_TYPE:
-		break;
-	case PRINT_STRING: {
-		int str_offset;
-
-		if (arg->string.offset == -1) {
-			struct format_field *f;
-
-			f = pevent_find_any_field(event, arg->string.string);
-			arg->string.offset = f->offset;
-		}
-		str_offset = data2host4(pevent, data + arg->string.offset);
-		str_offset &= 0xffff;
-		print_str_to_seq(s, format, len_arg, ((char *)data) + str_offset);
-		break;
-	}
-	case PRINT_BSTRING:
-		print_str_to_seq(s, format, len_arg, arg->string.string);
-		break;
-	case PRINT_OP:
-		/*
-		 * The only op for string should be ? :
-		 */
-		if (arg->op.op[0] != '?')
-			return;
-		val = eval_num_arg(data, size, event, arg->op.left);
-		if (val)
-			print_str_arg(s, data, size, event,
-				      format, len_arg, arg->op.right->op.left);
-		else
-			print_str_arg(s, data, size, event,
-				      format, len_arg, arg->op.right->op.right);
-		break;
-	case PRINT_FUNC:
-		process_defined_func(s, data, size, event, arg);
-		break;
-	default:
-		/* well... */
-		break;
-	}
-
-	return;
-
-out_warning_field:
-	do_warning("%s: field %s not found", __func__, arg->field.name);
-}
-
-static unsigned long long
-process_defined_func(struct trace_seq *s, void *data, int size,
-		     struct event_format *event, struct print_arg *arg)
-{
-	struct pevent_function_handler *func_handle = arg->func.func;
-	struct pevent_func_params *param;
-	unsigned long long *args;
-	unsigned long long ret;
-	struct print_arg *farg;
-	struct trace_seq str;
-	struct save_str {
-		struct save_str *next;
-		char *str;
-	} *strings = NULL, *string;
-	int i;
-
-	if (!func_handle->nr_args) {
-		ret = (*func_handle->func)(s, NULL);
-		goto out;
-	}
-
-	farg = arg->func.args;
-	param = func_handle->params;
-
-	ret = ULLONG_MAX;
-	args = malloc(sizeof(*args) * func_handle->nr_args);
-	if (!args)
-		goto out;
-
-	for (i = 0; i < func_handle->nr_args; i++) {
-		switch (param->type) {
-		case PEVENT_FUNC_ARG_INT:
-		case PEVENT_FUNC_ARG_LONG:
-		case PEVENT_FUNC_ARG_PTR:
-			args[i] = eval_num_arg(data, size, event, farg);
-			break;
-		case PEVENT_FUNC_ARG_STRING:
-			trace_seq_init(&str);
-			print_str_arg(&str, data, size, event, "%s", -1, farg);
-			trace_seq_terminate(&str);
-			string = malloc(sizeof(*string));
-			if (!string) {
-				do_warning("%s(%d): malloc str", __func__, __LINE__);
-				goto out_free;
-			}
-			string->next = strings;
-			string->str = strdup(str.buffer);
-			if (!string->str) {
-				free(string);
-				do_warning("%s(%d): malloc str", __func__, __LINE__);
-				goto out_free;
-			}
-			args[i] = (uintptr_t)string->str;
-			strings = string;
-			trace_seq_destroy(&str);
-			break;
-		default:
-			/*
-			 * Something went totally wrong, this is not
-			 * an input error, something in this code broke.
-			 */
-			do_warning("Unexpected end of arguments\n");
-			goto out_free;
-		}
-		farg = farg->next;
-		param = param->next;
-	}
-
-	ret = (*func_handle->func)(s, args);
-out_free:
-	free(args);
-	while (strings) {
-		string = strings;
-		strings = string->next;
-		free(string->str);
-		free(string);
-	}
-
- out:
-	/* TBD : handle return type here */
-	return ret;
-}
-
-static void free_args(struct print_arg *args)
-{
-	struct print_arg *next;
-
-	while (args) {
-		next = args->next;
-
-		free_arg(args);
-		args = next;
-	}
-}
-
-static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struct event_format *event)
-{
-	struct pevent *pevent = event->pevent;
-	struct format_field *field, *ip_field;
-	struct print_arg *args, *arg, **next;
-	unsigned long long ip, val;
-	char *ptr;
-	void *bptr;
-	int vsize;
-
-	field = pevent->bprint_buf_field;
-	ip_field = pevent->bprint_ip_field;
-
-	if (!field) {
-		field = pevent_find_field(event, "buf");
-		if (!field) {
-			do_warning("can't find buffer field for binary printk");
-			return NULL;
-		}
-		ip_field = pevent_find_field(event, "ip");
-		if (!ip_field) {
-			do_warning("can't find ip field for binary printk");
-			return NULL;
-		}
-		pevent->bprint_buf_field = field;
-		pevent->bprint_ip_field = ip_field;
-	}
-
-	ip = pevent_read_number(pevent, data + ip_field->offset, ip_field->size);
-
-	/*
-	 * The first arg is the IP pointer.
-	 */
-	args = alloc_arg();
-	if (!args) {
-		do_warning("%s(%d): not enough memory!", __func__, __LINE__);
-		return NULL;
-	}
-	arg = args;
-	arg->next = NULL;
-	next = &arg->next;
-
-	arg->type = PRINT_ATOM;
-		
-	if (asprintf(&arg->atom.atom, "%lld", ip) < 0)
-		goto out_free;
-
-	/* skip the first "%pf : " */
-	for (ptr = fmt + 6, bptr = data + field->offset;
-	     bptr < data + size && *ptr; ptr++) {
-		int ls = 0;
-
-		if (*ptr == '%') {
- process_again:
-			ptr++;
-			switch (*ptr) {
-			case '%':
-				break;
-			case 'l':
-				ls++;
-				goto process_again;
-			case 'L':
-				ls = 2;
-				goto process_again;
-			case '0' ... '9':
-				goto process_again;
-			case '.':
-				goto process_again;
-			case 'p':
-				ls = 1;
-				/* fall through */
-			case 'd':
-			case 'u':
-			case 'x':
-			case 'i':
-				switch (ls) {
-				case 0:
-					vsize = 4;
-					break;
-				case 1:
-					vsize = pevent->long_size;
-					break;
-				case 2:
-					vsize = 8;
-					break;
-				default:
-					vsize = ls; /* ? */
-					break;
-				}
-			/* fall through */
-			case '*':
-				if (*ptr == '*')
-					vsize = 4;
-
-				/* the pointers are always 4 bytes aligned */
-				bptr = (void *)(((unsigned long)bptr + 3) &
-						~3);
-				val = pevent_read_number(pevent, bptr, vsize);
-				bptr += vsize;
-				arg = alloc_arg();
-				if (!arg) {
-					do_warning("%s(%d): not enough memory!",
-						   __func__, __LINE__);
-					goto out_free;
-				}
-				arg->next = NULL;
-				arg->type = PRINT_ATOM;
-				if (asprintf(&arg->atom.atom, "%lld", val) < 0) {
-					free(arg);
-					goto out_free;
-				}
-				*next = arg;
-				next = &arg->next;
-				/*
-				 * The '*' case means that an arg is used as the length.
-				 * We need to continue to figure out for what.
-				 */
-				if (*ptr == '*')
-					goto process_again;
-
-				break;
-			case 's':
-				arg = alloc_arg();
-				if (!arg) {
-					do_warning("%s(%d): not enough memory!",
-						   __func__, __LINE__);
-					goto out_free;
-				}
-				arg->next = NULL;
-				arg->type = PRINT_BSTRING;
-				arg->string.string = strdup(bptr);
-				if (!arg->string.string)
-					goto out_free;
-				bptr += strlen(bptr) + 1;
-				*next = arg;
-				next = &arg->next;
-			default:
-				break;
-			}
-		}
-	}
-
-	return args;
-
-out_free:
-	free_args(args);
-	return NULL;
-}
-
-static char *
-get_bprint_format(void *data, int size __maybe_unused,
-		  struct event_format *event)
-{
-	struct pevent *pevent = event->pevent;
-	unsigned long long addr;
-	struct format_field *field;
-	struct printk_map *printk;
-	char *format;
-	char *p;
-
-	field = pevent->bprint_fmt_field;
-
-	if (!field) {
-		field = pevent_find_field(event, "fmt");
-		if (!field) {
-			do_warning("can't find format field for binary printk");
-			return NULL;
-		}
-		pevent->bprint_fmt_field = field;
-	}
-
-	addr = pevent_read_number(pevent, data + field->offset, field->size);
-
-	printk = find_printk(pevent, addr);
-	if (!printk) {
-		if (asprintf(&format, "%%pf : (NO FORMAT FOUND at %llx)\n", addr) < 0)
-			return NULL;
-		return format;
-	}
-
-	p = printk->printk;
-	/* Remove any quotes. */
-	if (*p == '"')
-		p++;
-	if (asprintf(&format, "%s : %s", "%pf", p) < 0)
-		return NULL;
-	/* remove ending quotes and new line since we will add one too */
-	p = format + strlen(format) - 1;
-	if (*p == '"')
-		*p = 0;
-
-	p -= 2;
-	if (strcmp(p, "\\n") == 0)
-		*p = 0;
-
-	return format;
-}
-
-static void print_mac_arg(struct trace_seq *s, int mac, void *data, int size,
-			  struct event_format *event, struct print_arg *arg)
-{
-	unsigned char *buf;
-	const char *fmt = "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x";
-
-	if (arg->type == PRINT_FUNC) {
-		process_defined_func(s, data, size, event, arg);
-		return;
-	}
-
-	if (arg->type != PRINT_FIELD) {
-		trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d",
-				 arg->type);
-		return;
-	}
-
-	if (mac == 'm')
-		fmt = "%.2x%.2x%.2x%.2x%.2x%.2x";
-	if (!arg->field.field) {
-		arg->field.field =
-			pevent_find_any_field(event, arg->field.name);
-		if (!arg->field.field) {
-			do_warning("%s: field %s not found",
-				   __func__, arg->field.name);
-			return;
-		}
-	}
-	if (arg->field.field->size != 6) {
-		trace_seq_printf(s, "INVALIDMAC");
-		return;
-	}
-	buf = data + arg->field.field->offset;
-	trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
-}
-
-static int is_printable_array(char *p, unsigned int len)
-{
-	unsigned int i;
-
-	for (i = 0; i < len && p[i]; i++)
-		if (!isprint(p[i]))
-		    return 0;
-	return 1;
-}
-
-static void print_event_fields(struct trace_seq *s, void *data,
-			       int size __maybe_unused,
-			       struct event_format *event)
-{
-	struct format_field *field;
-	unsigned long long val;
-	unsigned int offset, len, i;
-
-	field = event->format.fields;
-	while (field) {
-		trace_seq_printf(s, " %s=", field->name);
-		if (field->flags & FIELD_IS_ARRAY) {
-			offset = field->offset;
-			len = field->size;
-			if (field->flags & FIELD_IS_DYNAMIC) {
-				val = pevent_read_number(event->pevent, data + offset, len);
-				offset = val;
-				len = offset >> 16;
-				offset &= 0xffff;
-			}
-			if (field->flags & FIELD_IS_STRING &&
-			    is_printable_array(data + offset, len)) {
-				trace_seq_printf(s, "%s", (char *)data + offset);
-			} else {
-				trace_seq_puts(s, "ARRAY[");
-				for (i = 0; i < len; i++) {
-					if (i)
-						trace_seq_puts(s, ", ");
-					trace_seq_printf(s, "%02x",
-							 *((unsigned char *)data + offset + i));
-				}
-				trace_seq_putc(s, ']');
-				field->flags &= ~FIELD_IS_STRING;
-			}
-		} else {
-			val = pevent_read_number(event->pevent, data + field->offset,
-						 field->size);
-			if (field->flags & FIELD_IS_POINTER) {
-				trace_seq_printf(s, "0x%llx", val);
-			} else if (field->flags & FIELD_IS_SIGNED) {
-				switch (field->size) {
-				case 4:
-					/*
-					 * If field is long then print it in hex.
-					 * A long usually stores pointers.
-					 */
-					if (field->flags & FIELD_IS_LONG)
-						trace_seq_printf(s, "0x%x", (int)val);
-					else
-						trace_seq_printf(s, "%d", (int)val);
-					break;
-				case 2:
-					trace_seq_printf(s, "%2d", (short)val);
-					break;
-				case 1:
-					trace_seq_printf(s, "%1d", (char)val);
-					break;
-				default:
-					trace_seq_printf(s, "%lld", val);
-				}
-			} else {
-				if (field->flags & FIELD_IS_LONG)
-					trace_seq_printf(s, "0x%llx", val);
-				else
-					trace_seq_printf(s, "%llu", val);
-			}
-		}
-		field = field->next;
-	}
-}
-
-static void pretty_print(struct trace_seq *s, void *data, int size, struct event_format *event)
-{
-	struct pevent *pevent = event->pevent;
-	struct print_fmt *print_fmt = &event->print_fmt;
-	struct print_arg *arg = print_fmt->args;
-	struct print_arg *args = NULL;
-	const char *ptr = print_fmt->format;
-	unsigned long long val;
-	struct func_map *func;
-	const char *saveptr;
-	char *bprint_fmt = NULL;
-	char format[32];
-	int show_func;
-	int len_as_arg;
-	int len_arg;
-	int len;
-	int ls;
-
-	if (event->flags & EVENT_FL_FAILED) {
-		trace_seq_printf(s, "[FAILED TO PARSE]");
-		print_event_fields(s, data, size, event);
-		return;
-	}
-
-	if (event->flags & EVENT_FL_ISBPRINT) {
-		bprint_fmt = get_bprint_format(data, size, event);
-		args = make_bprint_args(bprint_fmt, data, size, event);
-		arg = args;
-		ptr = bprint_fmt;
-	}
-
-	for (; *ptr; ptr++) {
-		ls = 0;
-		if (*ptr == '\\') {
-			ptr++;
-			switch (*ptr) {
-			case 'n':
-				trace_seq_putc(s, '\n');
-				break;
-			case 't':
-				trace_seq_putc(s, '\t');
-				break;
-			case 'r':
-				trace_seq_putc(s, '\r');
-				break;
-			case '\\':
-				trace_seq_putc(s, '\\');
-				break;
-			default:
-				trace_seq_putc(s, *ptr);
-				break;
-			}
-
-		} else if (*ptr == '%') {
-			saveptr = ptr;
-			show_func = 0;
-			len_as_arg = 0;
- cont_process:
-			ptr++;
-			switch (*ptr) {
-			case '%':
-				trace_seq_putc(s, '%');
-				break;
-			case '#':
-				/* FIXME: need to handle properly */
-				goto cont_process;
-			case 'h':
-				ls--;
-				goto cont_process;
-			case 'l':
-				ls++;
-				goto cont_process;
-			case 'L':
-				ls = 2;
-				goto cont_process;
-			case '*':
-				/* The argument is the length. */
-				if (!arg) {
-					do_warning("no argument match");
-					event->flags |= EVENT_FL_FAILED;
-					goto out_failed;
-				}
-				len_arg = eval_num_arg(data, size, event, arg);
-				len_as_arg = 1;
-				arg = arg->next;
-				goto cont_process;
-			case '.':
-			case 'z':
-			case 'Z':
-			case '0' ... '9':
-				goto cont_process;
-			case 'p':
-				if (pevent->long_size == 4)
-					ls = 1;
-				else
-					ls = 2;
-
-				if (*(ptr+1) == 'F' ||
-				    *(ptr+1) == 'f') {
-					ptr++;
-					show_func = *ptr;
-				} else if (*(ptr+1) == 'M' || *(ptr+1) == 'm') {
-					print_mac_arg(s, *(ptr+1), data, size, event, arg);
-					ptr++;
-					arg = arg->next;
-					break;
-				}
-
-				/* fall through */
-			case 'd':
-			case 'i':
-			case 'x':
-			case 'X':
-			case 'u':
-				if (!arg) {
-					do_warning("no argument match");
-					event->flags |= EVENT_FL_FAILED;
-					goto out_failed;
-				}
-
-				len = ((unsigned long)ptr + 1) -
-					(unsigned long)saveptr;
-
-				/* should never happen */
-				if (len > 31) {
-					do_warning("bad format!");
-					event->flags |= EVENT_FL_FAILED;
-					len = 31;
-				}
-
-				memcpy(format, saveptr, len);
-				format[len] = 0;
-
-				val = eval_num_arg(data, size, event, arg);
-				arg = arg->next;
-
-				if (show_func) {
-					func = find_func(pevent, val);
-					if (func) {
-						trace_seq_puts(s, func->func);
-						if (show_func == 'F')
-							trace_seq_printf(s,
-							       "+0x%llx",
-							       val - func->addr);
-						break;
-					}
-				}
-				if (pevent->long_size == 8 && ls &&
-				    sizeof(long) != 8) {
-					char *p;
-
-					ls = 2;
-					/* make %l into %ll */
-					p = strchr(format, 'l');
-					if (p)
-						memmove(p+1, p, strlen(p)+1);
-					else if (strcmp(format, "%p") == 0)
-						strcpy(format, "0x%llx");
-				}
-				switch (ls) {
-				case -2:
-					if (len_as_arg)
-						trace_seq_printf(s, format, len_arg, (char)val);
-					else
-						trace_seq_printf(s, format, (char)val);
-					break;
-				case -1:
-					if (len_as_arg)
-						trace_seq_printf(s, format, len_arg, (short)val);
-					else
-						trace_seq_printf(s, format, (short)val);
-					break;
-				case 0:
-					if (len_as_arg)
-						trace_seq_printf(s, format, len_arg, (int)val);
-					else
-						trace_seq_printf(s, format, (int)val);
-					break;
-				case 1:
-					if (len_as_arg)
-						trace_seq_printf(s, format, len_arg, (long)val);
-					else
-						trace_seq_printf(s, format, (long)val);
-					break;
-				case 2:
-					if (len_as_arg)
-						trace_seq_printf(s, format, len_arg,
-								 (long long)val);
-					else
-						trace_seq_printf(s, format, (long long)val);
-					break;
-				default:
-					do_warning("bad count (%d)", ls);
-					event->flags |= EVENT_FL_FAILED;
-				}
-				break;
-			case 's':
-				if (!arg) {
-					do_warning("no matching argument");
-					event->flags |= EVENT_FL_FAILED;
-					goto out_failed;
-				}
-
-				len = ((unsigned long)ptr + 1) -
-					(unsigned long)saveptr;
-
-				/* should never happen */
-				if (len > 31) {
-					do_warning("bad format!");
-					event->flags |= EVENT_FL_FAILED;
-					len = 31;
-				}
-
-				memcpy(format, saveptr, len);
-				format[len] = 0;
-				if (!len_as_arg)
-					len_arg = -1;
-				print_str_arg(s, data, size, event,
-					      format, len_arg, arg);
-				arg = arg->next;
-				break;
-			default:
-				trace_seq_printf(s, ">%c<", *ptr);
-
-			}
-		} else
-			trace_seq_putc(s, *ptr);
-	}
-
-	if (event->flags & EVENT_FL_FAILED) {
-out_failed:
-		trace_seq_printf(s, "[FAILED TO PARSE]");
-	}
-
-	if (args) {
-		free_args(args);
-		free(bprint_fmt);
-	}
-}
-
-/**
- * pevent_data_lat_fmt - parse the data for the latency format
- * @pevent: a handle to the pevent
- * @s: the trace_seq to write to
- * @record: the record to read from
- *
- * This parses out the Latency format (interrupts disabled,
- * need rescheduling, in hard/soft interrupt, preempt count
- * and lock depth) and places it into the trace_seq.
- */
-void pevent_data_lat_fmt(struct pevent *pevent,
-			 struct trace_seq *s, struct pevent_record *record)
-{
-	static int check_lock_depth = 1;
-	static int check_migrate_disable = 1;
-	static int lock_depth_exists;
-	static int migrate_disable_exists;
-	unsigned int lat_flags;
-	unsigned int pc;
-	int lock_depth;
-	int migrate_disable;
-	int hardirq;
-	int softirq;
-	void *data = record->data;
-
-	lat_flags = parse_common_flags(pevent, data);
-	pc = parse_common_pc(pevent, data);
-	/* lock_depth may not always exist */
-	if (lock_depth_exists)
-		lock_depth = parse_common_lock_depth(pevent, data);
-	else if (check_lock_depth) {
-		lock_depth = parse_common_lock_depth(pevent, data);
-		if (lock_depth < 0)
-			check_lock_depth = 0;
-		else
-			lock_depth_exists = 1;
-	}
-
-	/* migrate_disable may not always exist */
-	if (migrate_disable_exists)
-		migrate_disable = parse_common_migrate_disable(pevent, data);
-	else if (check_migrate_disable) {
-		migrate_disable = parse_common_migrate_disable(pevent, data);
-		if (migrate_disable < 0)
-			check_migrate_disable = 0;
-		else
-			migrate_disable_exists = 1;
-	}
-
-	hardirq = lat_flags & TRACE_FLAG_HARDIRQ;
-	softirq = lat_flags & TRACE_FLAG_SOFTIRQ;
-
-	trace_seq_printf(s, "%c%c%c",
-	       (lat_flags & TRACE_FLAG_IRQS_OFF) ? 'd' :
-	       (lat_flags & TRACE_FLAG_IRQS_NOSUPPORT) ?
-	       'X' : '.',
-	       (lat_flags & TRACE_FLAG_NEED_RESCHED) ?
-	       'N' : '.',
-	       (hardirq && softirq) ? 'H' :
-	       hardirq ? 'h' : softirq ? 's' : '.');
-
-	if (pc)
-		trace_seq_printf(s, "%x", pc);
-	else
-		trace_seq_putc(s, '.');
-
-	if (migrate_disable_exists) {
-		if (migrate_disable < 0)
-			trace_seq_putc(s, '.');
-		else
-			trace_seq_printf(s, "%d", migrate_disable);
-	}
-
-	if (lock_depth_exists) {
-		if (lock_depth < 0)
-			trace_seq_putc(s, '.');
-		else
-			trace_seq_printf(s, "%d", lock_depth);
-	}
-
-	trace_seq_terminate(s);
-}
-
-/**
- * pevent_data_type - parse out the given event type
- * @pevent: a handle to the pevent
- * @rec: the record to read from
- *
- * This returns the event id from the @rec.
- */
-int pevent_data_type(struct pevent *pevent, struct pevent_record *rec)
-{
-	return trace_parse_common_type(pevent, rec->data);
-}
-
-/**
- * pevent_data_event_from_type - find the event by a given type
- * @pevent: a handle to the pevent
- * @type: the type of the event.
- *
- * This returns the event form a given @type;
- */
-struct event_format *pevent_data_event_from_type(struct pevent *pevent, int type)
-{
-	return pevent_find_event(pevent, type);
-}
-
-/**
- * pevent_data_pid - parse the PID from raw data
- * @pevent: a handle to the pevent
- * @rec: the record to parse
- *
- * This returns the PID from a raw data.
- */
-int pevent_data_pid(struct pevent *pevent, struct pevent_record *rec)
-{
-	return parse_common_pid(pevent, rec->data);
-}
-
-/**
- * pevent_data_comm_from_pid - return the command line from PID
- * @pevent: a handle to the pevent
- * @pid: the PID of the task to search for
- *
- * This returns a pointer to the command line that has the given
- * @pid.
- */
-const char *pevent_data_comm_from_pid(struct pevent *pevent, int pid)
-{
-	const char *comm;
-
-	comm = find_cmdline(pevent, pid);
-	return comm;
-}
-
-/**
- * pevent_data_comm_from_pid - parse the data into the print format
- * @s: the trace_seq to write to
- * @event: the handle to the event
- * @record: the record to read from
- *
- * This parses the raw @data using the given @event information and
- * writes the print format into the trace_seq.
- */
-void pevent_event_info(struct trace_seq *s, struct event_format *event,
-		       struct pevent_record *record)
-{
-	int print_pretty = 1;
-
-	if (event->pevent->print_raw)
-		print_event_fields(s, record->data, record->size, event);
-	else {
-
-		if (event->handler)
-			print_pretty = event->handler(s, record, event,
-						      event->context);
-
-		if (print_pretty)
-			pretty_print(s, record->data, record->size, event);
-	}
-
-	trace_seq_terminate(s);
-}
-
-void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
-			struct pevent_record *record)
-{
-	static const char *spaces = "                    "; /* 20 spaces */
-	struct event_format *event;
-	unsigned long secs;
-	unsigned long usecs;
-	unsigned long nsecs;
-	const char *comm;
-	void *data = record->data;
-	int type;
-	int pid;
-	int len;
-	int p;
-
-	secs = record->ts / NSECS_PER_SEC;
-	nsecs = record->ts - secs * NSECS_PER_SEC;
-
-	if (record->size < 0) {
-		do_warning("ug! negative record size %d", record->size);
-		return;
-	}
-
-	type = trace_parse_common_type(pevent, data);
-
-	event = pevent_find_event(pevent, type);
-	if (!event) {
-		do_warning("ug! no event found for type %d", type);
-		return;
-	}
-
-	pid = parse_common_pid(pevent, data);
-	comm = find_cmdline(pevent, pid);
-
-	if (pevent->latency_format) {
-		trace_seq_printf(s, "%8.8s-%-5d %3d",
-		       comm, pid, record->cpu);
-		pevent_data_lat_fmt(pevent, s, record);
-	} else
-		trace_seq_printf(s, "%16s-%-5d [%03d]", comm, pid, record->cpu);
-
-	if (pevent->flags & PEVENT_NSEC_OUTPUT) {
-		usecs = nsecs;
-		p = 9;
-	} else {
-		usecs = (nsecs + 500) / NSECS_PER_USEC;
-		p = 6;
-	}
-
-	trace_seq_printf(s, " %5lu.%0*lu: %s: ", secs, p, usecs, event->name);
-
-	/* Space out the event names evenly. */
-	len = strlen(event->name);
-	if (len < 20)
-		trace_seq_printf(s, "%.*s", 20 - len, spaces);
-
-	pevent_event_info(s, event, record);
-}
-
-static int events_id_cmp(const void *a, const void *b)
-{
-	struct event_format * const * ea = a;
-	struct event_format * const * eb = b;
-
-	if ((*ea)->id < (*eb)->id)
-		return -1;
-
-	if ((*ea)->id > (*eb)->id)
-		return 1;
-
-	return 0;
-}
-
-static int events_name_cmp(const void *a, const void *b)
-{
-	struct event_format * const * ea = a;
-	struct event_format * const * eb = b;
-	int res;
-
-	res = strcmp((*ea)->name, (*eb)->name);
-	if (res)
-		return res;
-
-	res = strcmp((*ea)->system, (*eb)->system);
-	if (res)
-		return res;
-
-	return events_id_cmp(a, b);
-}
-
-static int events_system_cmp(const void *a, const void *b)
-{
-	struct event_format * const * ea = a;
-	struct event_format * const * eb = b;
-	int res;
-
-	res = strcmp((*ea)->system, (*eb)->system);
-	if (res)
-		return res;
-
-	res = strcmp((*ea)->name, (*eb)->name);
-	if (res)
-		return res;
-
-	return events_id_cmp(a, b);
-}
-
-struct event_format **pevent_list_events(struct pevent *pevent, enum event_sort_type sort_type)
-{
-	struct event_format **events;
-	int (*sort)(const void *a, const void *b);
-
-	events = pevent->sort_events;
-
-	if (events && pevent->last_type == sort_type)
-		return events;
-
-	if (!events) {
-		events = malloc(sizeof(*events) * (pevent->nr_events + 1));
-		if (!events)
-			return NULL;
-
-		memcpy(events, pevent->events, sizeof(*events) * pevent->nr_events);
-		events[pevent->nr_events] = NULL;
-
-		pevent->sort_events = events;
-
-		/* the internal events are sorted by id */
-		if (sort_type == EVENT_SORT_ID) {
-			pevent->last_type = sort_type;
-			return events;
-		}
-	}
-
-	switch (sort_type) {
-	case EVENT_SORT_ID:
-		sort = events_id_cmp;
-		break;
-	case EVENT_SORT_NAME:
-		sort = events_name_cmp;
-		break;
-	case EVENT_SORT_SYSTEM:
-		sort = events_system_cmp;
-		break;
-	default:
-		return events;
-	}
-
-	qsort(events, pevent->nr_events, sizeof(*events), sort);
-	pevent->last_type = sort_type;
-
-	return events;
-}
-
-static struct format_field **
-get_event_fields(const char *type, const char *name,
-		 int count, struct format_field *list)
-{
-	struct format_field **fields;
-	struct format_field *field;
-	int i = 0;
-
-	fields = malloc(sizeof(*fields) * (count + 1));
-	if (!fields)
-		return NULL;
-
-	for (field = list; field; field = field->next) {
-		fields[i++] = field;
-		if (i == count + 1) {
-			do_warning("event %s has more %s fields than specified",
-				name, type);
-			i--;
-			break;
-		}
-	}
-
-	if (i != count)
-		do_warning("event %s has less %s fields than specified",
-			name, type);
-
-	fields[i] = NULL;
-
-	return fields;
-}
-
-/**
- * pevent_event_common_fields - return a list of common fields for an event
- * @event: the event to return the common fields of.
- *
- * Returns an allocated array of fields. The last item in the array is NULL.
- * The array must be freed with free().
- */
-struct format_field **pevent_event_common_fields(struct event_format *event)
-{
-	return get_event_fields("common", event->name,
-				event->format.nr_common,
-				event->format.common_fields);
-}
-
-/**
- * pevent_event_fields - return a list of event specific fields for an event
- * @event: the event to return the fields of.
- *
- * Returns an allocated array of fields. The last item in the array is NULL.
- * The array must be freed with free().
- */
-struct format_field **pevent_event_fields(struct event_format *event)
-{
-	return get_event_fields("event", event->name,
-				event->format.nr_fields,
-				event->format.fields);
-}
-
-static void print_fields(struct trace_seq *s, struct print_flag_sym *field)
-{
-	trace_seq_printf(s, "{ %s, %s }", field->value, field->str);
-	if (field->next) {
-		trace_seq_puts(s, ", ");
-		print_fields(s, field->next);
-	}
-}
-
-/* for debugging */
-static void print_args(struct print_arg *args)
-{
-	int print_paren = 1;
-	struct trace_seq s;
-
-	switch (args->type) {
-	case PRINT_NULL:
-		printf("null");
-		break;
-	case PRINT_ATOM:
-		printf("%s", args->atom.atom);
-		break;
-	case PRINT_FIELD:
-		printf("REC->%s", args->field.name);
-		break;
-	case PRINT_FLAGS:
-		printf("__print_flags(");
-		print_args(args->flags.field);
-		printf(", %s, ", args->flags.delim);
-		trace_seq_init(&s);
-		print_fields(&s, args->flags.flags);
-		trace_seq_do_printf(&s);
-		trace_seq_destroy(&s);
-		printf(")");
-		break;
-	case PRINT_SYMBOL:
-		printf("__print_symbolic(");
-		print_args(args->symbol.field);
-		printf(", ");
-		trace_seq_init(&s);
-		print_fields(&s, args->symbol.symbols);
-		trace_seq_do_printf(&s);
-		trace_seq_destroy(&s);
-		printf(")");
-		break;
-	case PRINT_HEX:
-		printf("__print_hex(");
-		print_args(args->hex.field);
-		printf(", ");
-		print_args(args->hex.size);
-		printf(")");
-		break;
-	case PRINT_STRING:
-	case PRINT_BSTRING:
-		printf("__get_str(%s)", args->string.string);
-		break;
-	case PRINT_TYPE:
-		printf("(%s)", args->typecast.type);
-		print_args(args->typecast.item);
-		break;
-	case PRINT_OP:
-		if (strcmp(args->op.op, ":") == 0)
-			print_paren = 0;
-		if (print_paren)
-			printf("(");
-		print_args(args->op.left);
-		printf(" %s ", args->op.op);
-		print_args(args->op.right);
-		if (print_paren)
-			printf(")");
-		break;
-	default:
-		/* we should warn... */
-		return;
-	}
-	if (args->next) {
-		printf("\n");
-		print_args(args->next);
-	}
-}
-
-static void parse_header_field(const char *field,
-			       int *offset, int *size, int mandatory)
-{
-	unsigned long long save_input_buf_ptr;
-	unsigned long long save_input_buf_siz;
-	char *token;
-	int type;
-
-	save_input_buf_ptr = input_buf_ptr;
-	save_input_buf_siz = input_buf_siz;
-
-	if (read_expected(EVENT_ITEM, "field") < 0)
-		return;
-	if (read_expected(EVENT_OP, ":") < 0)
-		return;
-
-	/* type */
-	if (read_expect_type(EVENT_ITEM, &token) < 0)
-		goto fail;
-	free_token(token);
-
-	/*
-	 * If this is not a mandatory field, then test it first.
-	 */
-	if (mandatory) {
-		if (read_expected(EVENT_ITEM, field) < 0)
-			return;
-	} else {
-		if (read_expect_type(EVENT_ITEM, &token) < 0)
-			goto fail;
-		if (strcmp(token, field) != 0)
-			goto discard;
-		free_token(token);
-	}
-
-	if (read_expected(EVENT_OP, ";") < 0)
-		return;
-	if (read_expected(EVENT_ITEM, "offset") < 0)
-		return;
-	if (read_expected(EVENT_OP, ":") < 0)
-		return;
-	if (read_expect_type(EVENT_ITEM, &token) < 0)
-		goto fail;
-	*offset = atoi(token);
-	free_token(token);
-	if (read_expected(EVENT_OP, ";") < 0)
-		return;
-	if (read_expected(EVENT_ITEM, "size") < 0)
-		return;
-	if (read_expected(EVENT_OP, ":") < 0)
-		return;
-	if (read_expect_type(EVENT_ITEM, &token) < 0)
-		goto fail;
-	*size = atoi(token);
-	free_token(token);
-	if (read_expected(EVENT_OP, ";") < 0)
-		return;
-	type = read_token(&token);
-	if (type != EVENT_NEWLINE) {
-		/* newer versions of the kernel have a "signed" type */
-		if (type != EVENT_ITEM)
-			goto fail;
-
-		if (strcmp(token, "signed") != 0)
-			goto fail;
-
-		free_token(token);
-
-		if (read_expected(EVENT_OP, ":") < 0)
-			return;
-
-		if (read_expect_type(EVENT_ITEM, &token))
-			goto fail;
-
-		free_token(token);
-		if (read_expected(EVENT_OP, ";") < 0)
-			return;
-
-		if (read_expect_type(EVENT_NEWLINE, &token))
-			goto fail;
-	}
- fail:
-	free_token(token);
-	return;
-
- discard:
-	input_buf_ptr = save_input_buf_ptr;
-	input_buf_siz = save_input_buf_siz;
-	*offset = 0;
-	*size = 0;
-	free_token(token);
-}
-
-/**
- * pevent_parse_header_page - parse the data stored in the header page
- * @pevent: the handle to the pevent
- * @buf: the buffer storing the header page format string
- * @size: the size of @buf
- * @long_size: the long size to use if there is no header
- *
- * This parses the header page format for information on the
- * ring buffer used. The @buf should be copied from
- *
- * /sys/kernel/debug/tracing/events/header_page
- */
-int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size,
-			     int long_size)
-{
-	int ignore;
-
-	if (!size) {
-		/*
-		 * Old kernels did not have header page info.
-		 * Sorry but we just use what we find here in user space.
-		 */
-		pevent->header_page_ts_size = sizeof(long long);
-		pevent->header_page_size_size = long_size;
-		pevent->header_page_data_offset = sizeof(long long) + long_size;
-		pevent->old_format = 1;
-		return -1;
-	}
-	init_input_buf(buf, size);
-
-	parse_header_field("timestamp", &pevent->header_page_ts_offset,
-			   &pevent->header_page_ts_size, 1);
-	parse_header_field("commit", &pevent->header_page_size_offset,
-			   &pevent->header_page_size_size, 1);
-	parse_header_field("overwrite", &pevent->header_page_overwrite,
-			   &ignore, 0);
-	parse_header_field("data", &pevent->header_page_data_offset,
-			   &pevent->header_page_data_size, 1);
-
-	return 0;
-}
-
-static int event_matches(struct event_format *event,
-			 int id, const char *sys_name,
-			 const char *event_name)
-{
-	if (id >= 0 && id != event->id)
-		return 0;
-
-	if (event_name && (strcmp(event_name, event->name) != 0))
-		return 0;
-
-	if (sys_name && (strcmp(sys_name, event->system) != 0))
-		return 0;
-
-	return 1;
-}
-
-static void free_handler(struct event_handler *handle)
-{
-	free((void *)handle->sys_name);
-	free((void *)handle->event_name);
-	free(handle);
-}
-
-static int find_event_handle(struct pevent *pevent, struct event_format *event)
-{
-	struct event_handler *handle, **next;
-
-	for (next = &pevent->handlers; *next;
-	     next = &(*next)->next) {
-		handle = *next;
-		if (event_matches(event, handle->id,
-				  handle->sys_name,
-				  handle->event_name))
-			break;
-	}
-
-	if (!(*next))
-		return 0;
-
-	pr_stat("overriding event (%d) %s:%s with new print handler",
-		event->id, event->system, event->name);
-
-	event->handler = handle->func;
-	event->context = handle->context;
-
-	*next = handle->next;
-	free_handler(handle);
-
-	return 1;
-}
-
-/**
- * __pevent_parse_format - parse the event format
- * @buf: the buffer storing the event format string
- * @size: the size of @buf
- * @sys: the system the event belongs to
- *
- * This parses the event format and creates an event structure
- * to quickly parse raw data for a given event.
- *
- * These files currently come from:
- *
- * /sys/kernel/debug/tracing/events/.../.../format
- */
-enum pevent_errno __pevent_parse_format(struct event_format **eventp,
-					struct pevent *pevent, const char *buf,
-					unsigned long size, const char *sys)
-{
-	struct event_format *event;
-	int ret;
-
-	init_input_buf(buf, size);
-
-	*eventp = event = alloc_event();
-	if (!event)
-		return PEVENT_ERRNO__MEM_ALLOC_FAILED;
-
-	event->name = event_read_name();
-	if (!event->name) {
-		/* Bad event? */
-		ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
-		goto event_alloc_failed;
-	}
-
-	if (strcmp(sys, "ftrace") == 0) {
-		event->flags |= EVENT_FL_ISFTRACE;
-
-		if (strcmp(event->name, "bprint") == 0)
-			event->flags |= EVENT_FL_ISBPRINT;
-	}
-		
-	event->id = event_read_id();
-	if (event->id < 0) {
-		ret = PEVENT_ERRNO__READ_ID_FAILED;
-		/*
-		 * This isn't an allocation error actually.
-		 * But as the ID is critical, just bail out.
-		 */
-		goto event_alloc_failed;
-	}
-
-	event->system = strdup(sys);
-	if (!event->system) {
-		ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
-		goto event_alloc_failed;
-	}
-
-	/* Add pevent to event so that it can be referenced */
-	event->pevent = pevent;
-
-	ret = event_read_format(event);
-	if (ret < 0) {
-		ret = PEVENT_ERRNO__READ_FORMAT_FAILED;
-		goto event_parse_failed;
-	}
-
-	/*
-	 * If the event has an override, don't print warnings if the event
-	 * print format fails to parse.
-	 */
-	if (pevent && find_event_handle(pevent, event))
-		show_warning = 0;
-
-	ret = event_read_print(event);
-	show_warning = 1;
-
-	if (ret < 0) {
-		ret = PEVENT_ERRNO__READ_PRINT_FAILED;
-		goto event_parse_failed;
-	}
-
-	if (!ret && (event->flags & EVENT_FL_ISFTRACE)) {
-		struct format_field *field;
-		struct print_arg *arg, **list;
-
-		/* old ftrace had no args */
-		list = &event->print_fmt.args;
-		for (field = event->format.fields; field; field = field->next) {
-			arg = alloc_arg();
-			if (!arg) {
-				event->flags |= EVENT_FL_FAILED;
-				return PEVENT_ERRNO__OLD_FTRACE_ARG_FAILED;
-			}
-			arg->type = PRINT_FIELD;
-			arg->field.name = strdup(field->name);
-			if (!arg->field.name) {
-				event->flags |= EVENT_FL_FAILED;
-				free_arg(arg);
-				return PEVENT_ERRNO__OLD_FTRACE_ARG_FAILED;
-			}
-			arg->field.field = field;
-			*list = arg;
-			list = &arg->next;
-		}
-		return 0;
-	}
-
-	return 0;
-
- event_parse_failed:
-	event->flags |= EVENT_FL_FAILED;
-	return ret;
-
- event_alloc_failed:
-	free(event->system);
-	free(event->name);
-	free(event);
-	*eventp = NULL;
-	return ret;
-}
-
-/**
- * pevent_parse_format - parse the event format
- * @buf: the buffer storing the event format string
- * @size: the size of @buf
- * @sys: the system the event belongs to
- *
- * This parses the event format and creates an event structure
- * to quickly parse raw data for a given event.
- *
- * These files currently come from:
- *
- * /sys/kernel/debug/tracing/events/.../.../format
- */
-enum pevent_errno pevent_parse_format(struct event_format **eventp, const char *buf,
-				      unsigned long size, const char *sys)
-{
-	return __pevent_parse_format(eventp, NULL, buf, size, sys);
-}
-
-/**
- * pevent_parse_event - parse the event format
- * @pevent: the handle to the pevent
- * @buf: the buffer storing the event format string
- * @size: the size of @buf
- * @sys: the system the event belongs to
- *
- * This parses the event format and creates an event structure
- * to quickly parse raw data for a given event.
- *
- * These files currently come from:
- *
- * /sys/kernel/debug/tracing/events/.../.../format
- */
-enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
-				     unsigned long size, const char *sys)
-{
-	struct event_format *event = NULL;
-	int ret = __pevent_parse_format(&event, pevent, buf, size, sys);
-
-	if (event == NULL)
-		return ret;
-
-	if (add_event(pevent, event)) {
-		ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
-		goto event_add_failed;
-	}
-
-#define PRINT_ARGS 0
-	if (PRINT_ARGS && event->print_fmt.args)
-		print_args(event->print_fmt.args);
-
-	return 0;
-
-event_add_failed:
-	pevent_free_format(event);
-	return ret;
-}
-
-#undef _PE
-#define _PE(code, str) str
-static const char * const pevent_error_str[] = {
-	PEVENT_ERRORS
-};
-#undef _PE
-
-int pevent_strerror(struct pevent *pevent __maybe_unused,
-		    enum pevent_errno errnum, char *buf, size_t buflen)
-{
-	int idx;
-	const char *msg;
-
-	if (errnum >= 0) {
-		msg = strerror_r(errnum, buf, buflen);
-		if (msg != buf) {
-			size_t len = strlen(msg);
-			memcpy(buf, msg, min(buflen - 1, len));
-			*(buf + min(buflen - 1, len)) = '\0';
-		}
-		return 0;
-	}
-
-	if (errnum <= __PEVENT_ERRNO__START ||
-	    errnum >= __PEVENT_ERRNO__END)
-		return -1;
-
-	idx = errnum - __PEVENT_ERRNO__START - 1;
-	msg = pevent_error_str[idx];
-
-	switch (errnum) {
-	case PEVENT_ERRNO__MEM_ALLOC_FAILED:
-	case PEVENT_ERRNO__PARSE_EVENT_FAILED:
-	case PEVENT_ERRNO__READ_ID_FAILED:
-	case PEVENT_ERRNO__READ_FORMAT_FAILED:
-	case PEVENT_ERRNO__READ_PRINT_FAILED:
-	case PEVENT_ERRNO__OLD_FTRACE_ARG_FAILED:
-	case PEVENT_ERRNO__INVALID_ARG_TYPE:
-		snprintf(buf, buflen, "%s", msg);
-		break;
-
-	default:
-		/* cannot reach here */
-		break;
-	}
-
-	return 0;
-}
-
-int get_field_val(struct trace_seq *s, struct format_field *field,
-		  const char *name, struct pevent_record *record,
-		  unsigned long long *val, int err)
-{
-	if (!field) {
-		if (err)
-			trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
-		return -1;
-	}
-
-	if (pevent_read_number_field(field, record->data, val)) {
-		if (err)
-			trace_seq_printf(s, " %s=INVALID", name);
-		return -1;
-	}
-
-	return 0;
-}
-
-/**
- * pevent_get_field_raw - return the raw pointer into the data field
- * @s: The seq to print to on error
- * @event: the event that the field is for
- * @name: The name of the field
- * @record: The record with the field name.
- * @len: place to store the field length.
- * @err: print default error if failed.
- *
- * Returns a pointer into record->data of the field and places
- * the length of the field in @len.
- *
- * On failure, it returns NULL.
- */
-void *pevent_get_field_raw(struct trace_seq *s, struct event_format *event,
-			   const char *name, struct pevent_record *record,
-			   int *len, int err)
-{
-	struct format_field *field;
-	void *data = record->data;
-	unsigned offset;
-	int dummy;
-
-	if (!event)
-		return NULL;
-
-	field = pevent_find_field(event, name);
-
-	if (!field) {
-		if (err)
-			trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
-		return NULL;
-	}
-
-	/* Allow @len to be NULL */
-	if (!len)
-		len = &dummy;
-
-	offset = field->offset;
-	if (field->flags & FIELD_IS_DYNAMIC) {
-		offset = pevent_read_number(event->pevent,
-					    data + offset, field->size);
-		*len = offset >> 16;
-		offset &= 0xffff;
-	} else
-		*len = field->size;
-
-	return data + offset;
-}
-
-/**
- * pevent_get_field_val - find a field and return its value
- * @s: The seq to print to on error
- * @event: the event that the field is for
- * @name: The name of the field
- * @record: The record with the field name.
- * @val: place to store the value of the field.
- * @err: print default error if failed.
- *
- * Returns 0 on success -1 on field not found.
- */
-int pevent_get_field_val(struct trace_seq *s, struct event_format *event,
-			 const char *name, struct pevent_record *record,
-			 unsigned long long *val, int err)
-{
-	struct format_field *field;
-
-	if (!event)
-		return -1;
-
-	field = pevent_find_field(event, name);
-
-	return get_field_val(s, field, name, record, val, err);
-}
-
-/**
- * pevent_get_common_field_val - find a common field and return its value
- * @s: The seq to print to on error
- * @event: the event that the field is for
- * @name: The name of the field
- * @record: The record with the field name.
- * @val: place to store the value of the field.
- * @err: print default error if failed.
- *
- * Returns 0 on success -1 on field not found.
- */
-int pevent_get_common_field_val(struct trace_seq *s, struct event_format *event,
-				const char *name, struct pevent_record *record,
-				unsigned long long *val, int err)
-{
-	struct format_field *field;
-
-	if (!event)
-		return -1;
-
-	field = pevent_find_common_field(event, name);
-
-	return get_field_val(s, field, name, record, val, err);
-}
-
-/**
- * pevent_get_any_field_val - find a any field and return its value
- * @s: The seq to print to on error
- * @event: the event that the field is for
- * @name: The name of the field
- * @record: The record with the field name.
- * @val: place to store the value of the field.
- * @err: print default error if failed.
- *
- * Returns 0 on success -1 on field not found.
- */
-int pevent_get_any_field_val(struct trace_seq *s, struct event_format *event,
-			     const char *name, struct pevent_record *record,
-			     unsigned long long *val, int err)
-{
-	struct format_field *field;
-
-	if (!event)
-		return -1;
-
-	field = pevent_find_any_field(event, name);
-
-	return get_field_val(s, field, name, record, val, err);
-}
-
-/**
- * pevent_print_num_field - print a field and a format
- * @s: The seq to print to
- * @fmt: The printf format to print the field with.
- * @event: the event that the field is for
- * @name: The name of the field
- * @record: The record with the field name.
- * @err: print default error if failed.
- *
- * Returns: 0 on success, -1 field not found, or 1 if buffer is full.
- */
-int pevent_print_num_field(struct trace_seq *s, const char *fmt,
-			   struct event_format *event, const char *name,
-			   struct pevent_record *record, int err)
-{
-	struct format_field *field = pevent_find_field(event, name);
-	unsigned long long val;
-
-	if (!field)
-		goto failed;
-
-	if (pevent_read_number_field(field, record->data, &val))
-		goto failed;
-
-	return trace_seq_printf(s, fmt, val);
-
- failed:
-	if (err)
-		trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name);
-	return -1;
-}
-
-static void free_func_handle(struct pevent_function_handler *func)
-{
-	struct pevent_func_params *params;
-
-	free(func->name);
-
-	while (func->params) {
-		params = func->params;
-		func->params = params->next;
-		free(params);
-	}
-
-	free(func);
-}
-
-/**
- * pevent_register_print_function - register a helper function
- * @pevent: the handle to the pevent
- * @func: the function to process the helper function
- * @ret_type: the return type of the helper function
- * @name: the name of the helper function
- * @parameters: A list of enum pevent_func_arg_type
- *
- * Some events may have helper functions in the print format arguments.
- * This allows a plugin to dynamically create a way to process one
- * of these functions.
- *
- * The @parameters is a variable list of pevent_func_arg_type enums that
- * must end with PEVENT_FUNC_ARG_VOID.
- */
-int pevent_register_print_function(struct pevent *pevent,
-				   pevent_func_handler func,
-				   enum pevent_func_arg_type ret_type,
-				   char *name, ...)
-{
-	struct pevent_function_handler *func_handle;
-	struct pevent_func_params **next_param;
-	struct pevent_func_params *param;
-	enum pevent_func_arg_type type;
-	va_list ap;
-	int ret;
-
-	func_handle = find_func_handler(pevent, name);
-	if (func_handle) {
-		/*
-		 * This is most like caused by the users own
-		 * plugins updating the function. This overrides the
-		 * system defaults.
-		 */
-		pr_stat("override of function helper '%s'", name);
-		remove_func_handler(pevent, name);
-	}
-
-	func_handle = calloc(1, sizeof(*func_handle));
-	if (!func_handle) {
-		do_warning("Failed to allocate function handler");
-		return PEVENT_ERRNO__MEM_ALLOC_FAILED;
-	}
-
-	func_handle->ret_type = ret_type;
-	func_handle->name = strdup(name);
-	func_handle->func = func;
-	if (!func_handle->name) {
-		do_warning("Failed to allocate function name");
-		free(func_handle);
-		return PEVENT_ERRNO__MEM_ALLOC_FAILED;
-	}
-
-	next_param = &(func_handle->params);
-	va_start(ap, name);
-	for (;;) {
-		type = va_arg(ap, enum pevent_func_arg_type);
-		if (type == PEVENT_FUNC_ARG_VOID)
-			break;
-
-		if (type >= PEVENT_FUNC_ARG_MAX_TYPES) {
-			do_warning("Invalid argument type %d", type);
-			ret = PEVENT_ERRNO__INVALID_ARG_TYPE;
-			goto out_free;
-		}
-
-		param = malloc(sizeof(*param));
-		if (!param) {
-			do_warning("Failed to allocate function param");
-			ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
-			goto out_free;
-		}
-		param->type = type;
-		param->next = NULL;
-
-		*next_param = param;
-		next_param = &(param->next);
-
-		func_handle->nr_args++;
-	}
-	va_end(ap);
-
-	func_handle->next = pevent->func_handlers;
-	pevent->func_handlers = func_handle;
-
-	return 0;
- out_free:
-	va_end(ap);
-	free_func_handle(func_handle);
-	return ret;
-}
-
-/**
- * pevent_register_event_handler - register a way to parse an event
- * @pevent: the handle to the pevent
- * @id: the id of the event to register
- * @sys_name: the system name the event belongs to
- * @event_name: the name of the event
- * @func: the function to call to parse the event information
- * @context: the data to be passed to @func
- *
- * This function allows a developer to override the parsing of
- * a given event. If for some reason the default print format
- * is not sufficient, this function will register a function
- * for an event to be used to parse the data instead.
- *
- * If @id is >= 0, then it is used to find the event.
- * else @sys_name and @event_name are used.
- */
-int pevent_register_event_handler(struct pevent *pevent, int id,
-				  const char *sys_name, const char *event_name,
-				  pevent_event_handler_func func, void *context)
-{
-	struct event_format *event;
-	struct event_handler *handle;
-
-	if (id >= 0) {
-		/* search by id */
-		event = pevent_find_event(pevent, id);
-		if (!event)
-			goto not_found;
-		if (event_name && (strcmp(event_name, event->name) != 0))
-			goto not_found;
-		if (sys_name && (strcmp(sys_name, event->system) != 0))
-			goto not_found;
-	} else {
-		event = pevent_find_event_by_name(pevent, sys_name, event_name);
-		if (!event)
-			goto not_found;
-	}
-
-	pr_stat("overriding event (%d) %s:%s with new print handler",
-		event->id, event->system, event->name);
-
-	event->handler = func;
-	event->context = context;
-	return 0;
-
- not_found:
-	/* Save for later use. */
-	handle = calloc(1, sizeof(*handle));
-	if (!handle) {
-		do_warning("Failed to allocate event handler");
-		return PEVENT_ERRNO__MEM_ALLOC_FAILED;
-	}
-
-	handle->id = id;
-	if (event_name)
-		handle->event_name = strdup(event_name);
-	if (sys_name)
-		handle->sys_name = strdup(sys_name);
-
-	if ((event_name && !handle->event_name) ||
-	    (sys_name && !handle->sys_name)) {
-		do_warning("Failed to allocate event/sys name");
-		free((void *)handle->event_name);
-		free((void *)handle->sys_name);
-		free(handle);
-		return PEVENT_ERRNO__MEM_ALLOC_FAILED;
-	}
-
-	handle->func = func;
-	handle->next = pevent->handlers;
-	pevent->handlers = handle;
-	handle->context = context;
-
-	return -1;
-}
-
-/**
- * pevent_alloc - create a pevent handle
- */
-struct pevent *pevent_alloc(void)
-{
-	struct pevent *pevent = calloc(1, sizeof(*pevent));
-
-	if (pevent)
-		pevent->ref_count = 1;
-
-	return pevent;
-}
-
-void pevent_ref(struct pevent *pevent)
-{
-	pevent->ref_count++;
-}
-
-static void free_format_fields(struct format_field *field)
-{
-	struct format_field *next;
-
-	while (field) {
-		next = field->next;
-		free(field->type);
-		free(field->name);
-		free(field);
-		field = next;
-	}
-}
-
-static void free_formats(struct format *format)
-{
-	free_format_fields(format->common_fields);
-	free_format_fields(format->fields);
-}
-
-void pevent_free_format(struct event_format *event)
-{
-	free(event->name);
-	free(event->system);
-
-	free_formats(&event->format);
-
-	free(event->print_fmt.format);
-	free_args(event->print_fmt.args);
-
-	free(event);
-}
-
-/**
- * pevent_free - free a pevent handle
- * @pevent: the pevent handle to free
- */
-void pevent_free(struct pevent *pevent)
-{
-	struct cmdline_list *cmdlist, *cmdnext;
-	struct func_list *funclist, *funcnext;
-	struct printk_list *printklist, *printknext;
-	struct pevent_function_handler *func_handler;
-	struct event_handler *handle;
-	int i;
-
-	if (!pevent)
-		return;
-
-	cmdlist = pevent->cmdlist;
-	funclist = pevent->funclist;
-	printklist = pevent->printklist;
-
-	pevent->ref_count--;
-	if (pevent->ref_count)
-		return;
-
-	if (pevent->cmdlines) {
-		for (i = 0; i < pevent->cmdline_count; i++)
-			free(pevent->cmdlines[i].comm);
-		free(pevent->cmdlines);
-	}
-
-	while (cmdlist) {
-		cmdnext = cmdlist->next;
-		free(cmdlist->comm);
-		free(cmdlist);
-		cmdlist = cmdnext;
-	}
-
-	if (pevent->func_map) {
-		for (i = 0; i < (int)pevent->func_count; i++) {
-			free(pevent->func_map[i].func);
-			free(pevent->func_map[i].mod);
-		}
-		free(pevent->func_map);
-	}
-
-	while (funclist) {
-		funcnext = funclist->next;
-		free(funclist->func);
-		free(funclist->mod);
-		free(funclist);
-		funclist = funcnext;
-	}
-
-	while (pevent->func_handlers) {
-		func_handler = pevent->func_handlers;
-		pevent->func_handlers = func_handler->next;
-		free_func_handle(func_handler);
-	}
-
-	if (pevent->printk_map) {
-		for (i = 0; i < (int)pevent->printk_count; i++)
-			free(pevent->printk_map[i].printk);
-		free(pevent->printk_map);
-	}
-
-	while (printklist) {
-		printknext = printklist->next;
-		free(printklist->printk);
-		free(printklist);
-		printklist = printknext;
-	}
-
-	for (i = 0; i < pevent->nr_events; i++)
-		pevent_free_format(pevent->events[i]);
-
-	while (pevent->handlers) {
-		handle = pevent->handlers;
-		pevent->handlers = handle->next;
-		free_handler(handle);
-	}
-
-	free(pevent->events);
-	free(pevent->sort_events);
-
-	free(pevent);
-}
-
-void pevent_unref(struct pevent *pevent)
-{
-	pevent_free(pevent);
-}
diff --git a/src/tools/lib/traceevent/event-parse.h b/src/tools/lib/traceevent/event-parse.h
deleted file mode 100644
index c37b202..0000000
--- a/src/tools/lib/traceevent/event-parse.h
+++ /dev/null
@@ -1,857 +0,0 @@
-/*
- * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License (not later!)
- *
- * 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not,  see <http://www.gnu.org/licenses>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
-#ifndef _PARSE_EVENTS_H
-#define _PARSE_EVENTS_H
-
-#include <stdarg.h>
-#include <regex.h>
-
-#ifndef __maybe_unused
-#define __maybe_unused __attribute__((unused))
-#endif
-
-/* ----------------------- trace_seq ----------------------- */
-
-
-#ifndef TRACE_SEQ_BUF_SIZE
-#define TRACE_SEQ_BUF_SIZE 4096
-#endif
-
-#ifndef DEBUG_RECORD
-#define DEBUG_RECORD 0
-#endif
-
-struct pevent_record {
-	unsigned long long	ts;
-	unsigned long long	offset;
-	long long		missed_events;	/* buffer dropped events before */
-	int			record_size;	/* size of binary record */
-	int			size;		/* size of data */
-	void			*data;
-	int			cpu;
-	int			ref_count;
-	int			locked;		/* Do not free, even if ref_count is zero */
-	void			*priv;
-#if DEBUG_RECORD
-	struct pevent_record	*prev;
-	struct pevent_record	*next;
-	long			alloc_addr;
-#endif
-};
-
-/*
- * Trace sequences are used to allow a function to call several other functions
- * to create a string of data to use (up to a max of PAGE_SIZE).
- */
-
-struct trace_seq {
-	char			*buffer;
-	unsigned int		buffer_size;
-	unsigned int		len;
-	unsigned int		readpos;
-};
-
-void trace_seq_init(struct trace_seq *s);
-void trace_seq_reset(struct trace_seq *s);
-void trace_seq_destroy(struct trace_seq *s);
-
-extern int trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
-	__attribute__ ((format (printf, 2, 3)));
-extern int trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args)
-	__attribute__ ((format (printf, 2, 0)));
-
-extern int trace_seq_puts(struct trace_seq *s, const char *str);
-extern int trace_seq_putc(struct trace_seq *s, unsigned char c);
-
-extern void trace_seq_terminate(struct trace_seq *s);
-
-extern int trace_seq_do_printf(struct trace_seq *s);
-
-
-/* ----------------------- pevent ----------------------- */
-
-struct pevent;
-struct event_format;
-
-typedef int (*pevent_event_handler_func)(struct trace_seq *s,
-					 struct pevent_record *record,
-					 struct event_format *event,
-					 void *context);
-
-typedef int (*pevent_plugin_load_func)(struct pevent *pevent);
-typedef int (*pevent_plugin_unload_func)(void);
-
-struct plugin_option {
-	struct plugin_option		*next;
-	void				*handle;
-	char				*file;
-	char				*name;
-	char				*plugin_alias;
-	char				*description;
-	char				*value;
-	void				*priv;
-	int				set;
-};
-
-/*
- * Plugin hooks that can be called:
- *
- * PEVENT_PLUGIN_LOADER:  (required)
- *   The function name to initialized the plugin.
- *
- *   int PEVENT_PLUGIN_LOADER(struct pevent *pevent)
- *
- * PEVENT_PLUGIN_UNLOADER:  (optional)
- *   The function called just before unloading
- *
- *   int PEVENT_PLUGIN_UNLOADER(void)
- *
- * PEVENT_PLUGIN_OPTIONS:  (optional)
- *   Plugin options that can be set before loading
- *
- *   struct plugin_option PEVENT_PLUGIN_OPTIONS[] = {
- *	{
- *		.name = "option-name",
- *		.plugin_alias = "overide-file-name", (optional)
- *		.description = "description of option to show users",
- *	},
- *	{
- *		.name = NULL,
- *	},
- *   };
- *
- *   Array must end with .name = NULL;
- *
- *
- *   .plugin_alias is used to give a shorter name to access
- *   the vairable. Useful if a plugin handles more than one event.
- *
- * PEVENT_PLUGIN_ALIAS: (optional)
- *   The name to use for finding options (uses filename if not defined)
- */
-#define PEVENT_PLUGIN_LOADER pevent_plugin_loader
-#define PEVENT_PLUGIN_UNLOADER pevent_plugin_unloader
-#define PEVENT_PLUGIN_OPTIONS pevent_plugin_options
-#define PEVENT_PLUGIN_ALIAS pevent_plugin_alias
-#define _MAKE_STR(x)	#x
-#define MAKE_STR(x)	_MAKE_STR(x)
-#define PEVENT_PLUGIN_LOADER_NAME MAKE_STR(PEVENT_PLUGIN_LOADER)
-#define PEVENT_PLUGIN_UNLOADER_NAME MAKE_STR(PEVENT_PLUGIN_UNLOADER)
-#define PEVENT_PLUGIN_OPTIONS_NAME MAKE_STR(PEVENT_PLUGIN_OPTIONS)
-#define PEVENT_PLUGIN_ALIAS_NAME MAKE_STR(PEVENT_PLUGIN_ALIAS)
-
-#define NSECS_PER_SEC		1000000000ULL
-#define NSECS_PER_USEC		1000ULL
-
-enum format_flags {
-	FIELD_IS_ARRAY		= 1,
-	FIELD_IS_POINTER	= 2,
-	FIELD_IS_SIGNED		= 4,
-	FIELD_IS_STRING		= 8,
-	FIELD_IS_DYNAMIC	= 16,
-	FIELD_IS_LONG		= 32,
-	FIELD_IS_FLAG		= 64,
-	FIELD_IS_SYMBOLIC	= 128,
-};
-
-struct format_field {
-	struct format_field	*next;
-	struct event_format	*event;
-	char			*type;
-	char			*name;
-	int			offset;
-	int			size;
-	unsigned int		arraylen;
-	unsigned int		elementsize;
-	unsigned long		flags;
-};
-
-struct format {
-	int			nr_common;
-	int			nr_fields;
-	struct format_field	*common_fields;
-	struct format_field	*fields;
-};
-
-struct print_arg_atom {
-	char			*atom;
-};
-
-struct print_arg_string {
-	char			*string;
-	int			offset;
-};
-
-struct print_arg_field {
-	char			*name;
-	struct format_field	*field;
-};
-
-struct print_flag_sym {
-	struct print_flag_sym	*next;
-	char			*value;
-	char			*str;
-};
-
-struct print_arg_typecast {
-	char 			*type;
-	struct print_arg	*item;
-};
-
-struct print_arg_flags {
-	struct print_arg	*field;
-	char			*delim;
-	struct print_flag_sym	*flags;
-};
-
-struct print_arg_symbol {
-	struct print_arg	*field;
-	struct print_flag_sym	*symbols;
-};
-
-struct print_arg_hex {
-	struct print_arg	*field;
-	struct print_arg	*size;
-};
-
-struct print_arg_dynarray {
-	struct format_field	*field;
-	struct print_arg	*index;
-};
-
-struct print_arg;
-
-struct print_arg_op {
-	char			*op;
-	int			prio;
-	struct print_arg	*left;
-	struct print_arg	*right;
-};
-
-struct pevent_function_handler;
-
-struct print_arg_func {
-	struct pevent_function_handler	*func;
-	struct print_arg		*args;
-};
-
-enum print_arg_type {
-	PRINT_NULL,
-	PRINT_ATOM,
-	PRINT_FIELD,
-	PRINT_FLAGS,
-	PRINT_SYMBOL,
-	PRINT_HEX,
-	PRINT_TYPE,
-	PRINT_STRING,
-	PRINT_BSTRING,
-	PRINT_DYNAMIC_ARRAY,
-	PRINT_OP,
-	PRINT_FUNC,
-};
-
-struct print_arg {
-	struct print_arg		*next;
-	enum print_arg_type		type;
-	union {
-		struct print_arg_atom		atom;
-		struct print_arg_field		field;
-		struct print_arg_typecast	typecast;
-		struct print_arg_flags		flags;
-		struct print_arg_symbol		symbol;
-		struct print_arg_hex		hex;
-		struct print_arg_func		func;
-		struct print_arg_string		string;
-		struct print_arg_op		op;
-		struct print_arg_dynarray	dynarray;
-	};
-};
-
-struct print_fmt {
-	char			*format;
-	struct print_arg	*args;
-};
-
-struct event_format {
-	struct pevent		*pevent;
-	char			*name;
-	int			id;
-	int			flags;
-	struct format		format;
-	struct print_fmt	print_fmt;
-	char			*system;
-	pevent_event_handler_func handler;
-	void			*context;
-};
-
-enum {
-	EVENT_FL_ISFTRACE	= 0x01,
-	EVENT_FL_ISPRINT	= 0x02,
-	EVENT_FL_ISBPRINT	= 0x04,
-	EVENT_FL_ISFUNCENT	= 0x10,
-	EVENT_FL_ISFUNCRET	= 0x20,
-
-	EVENT_FL_FAILED		= 0x80000000
-};
-
-enum event_sort_type {
-	EVENT_SORT_ID,
-	EVENT_SORT_NAME,
-	EVENT_SORT_SYSTEM,
-};
-
-enum event_type {
-	EVENT_ERROR,
-	EVENT_NONE,
-	EVENT_SPACE,
-	EVENT_NEWLINE,
-	EVENT_OP,
-	EVENT_DELIM,
-	EVENT_ITEM,
-	EVENT_DQUOTE,
-	EVENT_SQUOTE,
-};
-
-typedef unsigned long long (*pevent_func_handler)(struct trace_seq *s,
-					     unsigned long long *args);
-
-enum pevent_func_arg_type {
-	PEVENT_FUNC_ARG_VOID,
-	PEVENT_FUNC_ARG_INT,
-	PEVENT_FUNC_ARG_LONG,
-	PEVENT_FUNC_ARG_STRING,
-	PEVENT_FUNC_ARG_PTR,
-	PEVENT_FUNC_ARG_MAX_TYPES
-};
-
-enum pevent_flag {
-	PEVENT_NSEC_OUTPUT		= 1,	/* output in NSECS */
-};
-
-#define PEVENT_ERRORS 							      \
-	_PE(MEM_ALLOC_FAILED,	"failed to allocate memory"),		      \
-	_PE(PARSE_EVENT_FAILED,	"failed to parse event"),		      \
-	_PE(READ_ID_FAILED,	"failed to read event id"),		      \
-	_PE(READ_FORMAT_FAILED,	"failed to read event format"),		      \
-	_PE(READ_PRINT_FAILED,	"failed to read event print fmt"), 	      \
-	_PE(OLD_FTRACE_ARG_FAILED,"failed to allocate field name for ftrace"),\
-	_PE(INVALID_ARG_TYPE,	"invalid argument type")
-
-#undef _PE
-#define _PE(__code, __str) PEVENT_ERRNO__ ## __code
-enum pevent_errno {
-	PEVENT_ERRNO__SUCCESS			= 0,
-
-	/*
-	 * Choose an arbitrary negative big number not to clash with standard
-	 * errno since SUS requires the errno has distinct positive values.
-	 * See 'Issue 6' in the link below.
-	 *
-	 * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
-	 */
-	__PEVENT_ERRNO__START			= -100000,
-
-	PEVENT_ERRORS,
-
-	__PEVENT_ERRNO__END,
-};
-#undef _PE
-
-struct cmdline;
-struct cmdline_list;
-struct func_map;
-struct func_list;
-struct event_handler;
-
-struct pevent {
-	int ref_count;
-
-	int header_page_ts_offset;
-	int header_page_ts_size;
-	int header_page_size_offset;
-	int header_page_size_size;
-	int header_page_data_offset;
-	int header_page_data_size;
-	int header_page_overwrite;
-
-	int file_bigendian;
-	int host_bigendian;
-
-	int latency_format;
-
-	int old_format;
-
-	int cpus;
-	int long_size;
-	int page_size;
-
-	struct cmdline *cmdlines;
-	struct cmdline_list *cmdlist;
-	int cmdline_count;
-
-	struct func_map *func_map;
-	struct func_list *funclist;
-	unsigned int func_count;
-
-	struct printk_map *printk_map;
-	struct printk_list *printklist;
-	unsigned int printk_count;
-
-
-	struct event_format **events;
-	int nr_events;
-	struct event_format **sort_events;
-	enum event_sort_type last_type;
-
-	int type_offset;
-	int type_size;
-
-	int pid_offset;
-	int pid_size;
-
- 	int pc_offset;
-	int pc_size;
-
-	int flags_offset;
-	int flags_size;
-
-	int ld_offset;
-	int ld_size;
-
-	int print_raw;
-
-	int test_filters;
-
-	int flags;
-
-	struct format_field *bprint_ip_field;
-	struct format_field *bprint_fmt_field;
-	struct format_field *bprint_buf_field;
-
-	struct event_handler *handlers;
-	struct pevent_function_handler *func_handlers;
-
-	/* cache */
-	struct event_format *last_event;
-};
-
-static inline void pevent_set_flag(struct pevent *pevent, int flag)
-{
-	pevent->flags |= flag;
-}
-
-static inline unsigned short
-__data2host2(struct pevent *pevent, unsigned short data)
-{
-	unsigned short swap;
-
-	if (pevent->host_bigendian == pevent->file_bigendian)
-		return data;
-
-	swap = ((data & 0xffULL) << 8) |
-		((data & (0xffULL << 8)) >> 8);
-
-	return swap;
-}
-
-static inline unsigned int
-__data2host4(struct pevent *pevent, unsigned int data)
-{
-	unsigned int swap;
-
-	if (pevent->host_bigendian == pevent->file_bigendian)
-		return data;
-
-	swap = ((data & 0xffULL) << 24) |
-		((data & (0xffULL << 8)) << 8) |
-		((data & (0xffULL << 16)) >> 8) |
-		((data & (0xffULL << 24)) >> 24);
-
-	return swap;
-}
-
-static inline unsigned long long
-__data2host8(struct pevent *pevent, unsigned long long data)
-{
-	unsigned long long swap;
-
-	if (pevent->host_bigendian == pevent->file_bigendian)
-		return data;
-
-	swap = ((data & 0xffULL) << 56) |
-		((data & (0xffULL << 8)) << 40) |
-		((data & (0xffULL << 16)) << 24) |
-		((data & (0xffULL << 24)) << 8) |
-		((data & (0xffULL << 32)) >> 8) |
-		((data & (0xffULL << 40)) >> 24) |
-		((data & (0xffULL << 48)) >> 40) |
-		((data & (0xffULL << 56)) >> 56);
-
-	return swap;
-}
-
-#define data2host2(pevent, ptr)		__data2host2(pevent, *(unsigned short *)(ptr))
-#define data2host4(pevent, ptr)		__data2host4(pevent, *(unsigned int *)(ptr))
-#define data2host8(pevent, ptr)					\
-({								\
-	unsigned long long __val;				\
-								\
-	memcpy(&__val, (ptr), sizeof(unsigned long long));	\
-	__data2host8(pevent, __val);				\
-})
-
-/* taken from kernel/trace/trace.h */
-enum trace_flag_type {
-	TRACE_FLAG_IRQS_OFF		= 0x01,
-	TRACE_FLAG_IRQS_NOSUPPORT	= 0x02,
-	TRACE_FLAG_NEED_RESCHED		= 0x04,
-	TRACE_FLAG_HARDIRQ		= 0x08,
-	TRACE_FLAG_SOFTIRQ		= 0x10,
-};
-
-int pevent_register_comm(struct pevent *pevent, const char *comm, int pid);
-int pevent_register_function(struct pevent *pevent, char *name,
-			     unsigned long long addr, char *mod);
-int pevent_register_print_string(struct pevent *pevent, char *fmt,
-				 unsigned long long addr);
-int pevent_pid_is_registered(struct pevent *pevent, int pid);
-
-void pevent_print_event(struct pevent *pevent, struct trace_seq *s,
-			struct pevent_record *record);
-
-int pevent_parse_header_page(struct pevent *pevent, char *buf, unsigned long size,
-			     int long_size);
-
-enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
-				     unsigned long size, const char *sys);
-enum pevent_errno pevent_parse_format(struct event_format **eventp, const char *buf,
-				      unsigned long size, const char *sys);
-void pevent_free_format(struct event_format *event);
-
-void *pevent_get_field_raw(struct trace_seq *s, struct event_format *event,
-			   const char *name, struct pevent_record *record,
-			   int *len, int err);
-
-int pevent_get_field_val(struct trace_seq *s, struct event_format *event,
-			 const char *name, struct pevent_record *record,
-			 unsigned long long *val, int err);
-int pevent_get_common_field_val(struct trace_seq *s, struct event_format *event,
-				const char *name, struct pevent_record *record,
-				unsigned long long *val, int err);
-int pevent_get_any_field_val(struct trace_seq *s, struct event_format *event,
-			     const char *name, struct pevent_record *record,
-			     unsigned long long *val, int err);
-
-int pevent_print_num_field(struct trace_seq *s, const char *fmt,
-			   struct event_format *event, const char *name,
-			   struct pevent_record *record, int err);
-
-int pevent_register_event_handler(struct pevent *pevent, int id,
-				  const char *sys_name, const char *event_name,
-				  pevent_event_handler_func func, void *context);
-int pevent_register_print_function(struct pevent *pevent,
-				   pevent_func_handler func,
-				   enum pevent_func_arg_type ret_type,
-				   char *name, ...);
-
-struct format_field *pevent_find_common_field(struct event_format *event, const char *name);
-struct format_field *pevent_find_field(struct event_format *event, const char *name);
-struct format_field *pevent_find_any_field(struct event_format *event, const char *name);
-
-const char *pevent_find_function(struct pevent *pevent, unsigned long long addr);
-unsigned long long
-pevent_find_function_address(struct pevent *pevent, unsigned long long addr);
-unsigned long long pevent_read_number(struct pevent *pevent, const void *ptr, int size);
-int pevent_read_number_field(struct format_field *field, const void *data,
-			     unsigned long long *value);
-
-struct event_format *pevent_find_event(struct pevent *pevent, int id);
-
-struct event_format *
-pevent_find_event_by_name(struct pevent *pevent, const char *sys, const char *name);
-
-void pevent_data_lat_fmt(struct pevent *pevent,
-			 struct trace_seq *s, struct pevent_record *record);
-int pevent_data_type(struct pevent *pevent, struct pevent_record *rec);
-struct event_format *pevent_data_event_from_type(struct pevent *pevent, int type);
-int pevent_data_pid(struct pevent *pevent, struct pevent_record *rec);
-const char *pevent_data_comm_from_pid(struct pevent *pevent, int pid);
-void pevent_event_info(struct trace_seq *s, struct event_format *event,
-		       struct pevent_record *record);
-int pevent_strerror(struct pevent *pevent, enum pevent_errno errnum,
-		    char *buf, size_t buflen);
-
-struct event_format **pevent_list_events(struct pevent *pevent, enum event_sort_type);
-struct format_field **pevent_event_common_fields(struct event_format *event);
-struct format_field **pevent_event_fields(struct event_format *event);
-
-static inline int pevent_get_cpus(struct pevent *pevent)
-{
-	return pevent->cpus;
-}
-
-static inline void pevent_set_cpus(struct pevent *pevent, int cpus)
-{
-	pevent->cpus = cpus;
-}
-
-static inline int pevent_get_long_size(struct pevent *pevent)
-{
-	return pevent->long_size;
-}
-
-static inline void pevent_set_long_size(struct pevent *pevent, int long_size)
-{
-	pevent->long_size = long_size;
-}
-
-static inline int pevent_get_page_size(struct pevent *pevent)
-{
-	return pevent->page_size;
-}
-
-static inline void pevent_set_page_size(struct pevent *pevent, int _page_size)
-{
-	pevent->page_size = _page_size;
-}
-
-static inline int pevent_is_file_bigendian(struct pevent *pevent)
-{
-	return pevent->file_bigendian;
-}
-
-static inline void pevent_set_file_bigendian(struct pevent *pevent, int endian)
-{
-	pevent->file_bigendian = endian;
-}
-
-static inline int pevent_is_host_bigendian(struct pevent *pevent)
-{
-	return pevent->host_bigendian;
-}
-
-static inline void pevent_set_host_bigendian(struct pevent *pevent, int endian)
-{
-	pevent->host_bigendian = endian;
-}
-
-static inline int pevent_is_latency_format(struct pevent *pevent)
-{
-	return pevent->latency_format;
-}
-
-static inline void pevent_set_latency_format(struct pevent *pevent, int lat)
-{
-	pevent->latency_format = lat;
-}
-
-struct pevent *pevent_alloc(void);
-void pevent_free(struct pevent *pevent);
-void pevent_ref(struct pevent *pevent);
-void pevent_unref(struct pevent *pevent);
-
-/* access to the internal parser */
-void pevent_buffer_init(const char *buf, unsigned long long size);
-enum event_type pevent_read_token(char **tok);
-void pevent_free_token(char *token);
-int pevent_peek_char(void);
-const char *pevent_get_input_buf(void);
-unsigned long long pevent_get_input_buf_ptr(void);
-
-/* for debugging */
-void pevent_print_funcs(struct pevent *pevent);
-void pevent_print_printk(struct pevent *pevent);
-
-/* ----------------------- filtering ----------------------- */
-
-enum filter_boolean_type {
-	FILTER_FALSE,
-	FILTER_TRUE,
-};
-
-enum filter_op_type {
-	FILTER_OP_AND = 1,
-	FILTER_OP_OR,
-	FILTER_OP_NOT,
-};
-
-enum filter_cmp_type {
-	FILTER_CMP_NONE,
-	FILTER_CMP_EQ,
-	FILTER_CMP_NE,
-	FILTER_CMP_GT,
-	FILTER_CMP_LT,
-	FILTER_CMP_GE,
-	FILTER_CMP_LE,
-	FILTER_CMP_MATCH,
-	FILTER_CMP_NOT_MATCH,
-	FILTER_CMP_REGEX,
-	FILTER_CMP_NOT_REGEX,
-};
-
-enum filter_exp_type {
-	FILTER_EXP_NONE,
-	FILTER_EXP_ADD,
-	FILTER_EXP_SUB,
-	FILTER_EXP_MUL,
-	FILTER_EXP_DIV,
-	FILTER_EXP_MOD,
-	FILTER_EXP_RSHIFT,
-	FILTER_EXP_LSHIFT,
-	FILTER_EXP_AND,
-	FILTER_EXP_OR,
-	FILTER_EXP_XOR,
-	FILTER_EXP_NOT,
-};
-
-enum filter_arg_type {
-	FILTER_ARG_NONE,
-	FILTER_ARG_BOOLEAN,
-	FILTER_ARG_VALUE,
-	FILTER_ARG_FIELD,
-	FILTER_ARG_EXP,
-	FILTER_ARG_OP,
-	FILTER_ARG_NUM,
-	FILTER_ARG_STR,
-};
-
-enum filter_value_type {
-	FILTER_NUMBER,
-	FILTER_STRING,
-	FILTER_CHAR
-};
-
-struct fliter_arg;
-
-struct filter_arg_boolean {
-	enum filter_boolean_type	value;
-};
-
-struct filter_arg_field {
-	struct format_field	*field;
-};
-
-struct filter_arg_value {
-	enum filter_value_type	type;
-	union {
-		char			*str;
-		unsigned long long	val;
-	};
-};
-
-struct filter_arg_op {
-	enum filter_op_type	type;
-	struct filter_arg	*left;
-	struct filter_arg	*right;
-};
-
-struct filter_arg_exp {
-	enum filter_exp_type	type;
-	struct filter_arg	*left;
-	struct filter_arg	*right;
-};
-
-struct filter_arg_num {
-	enum filter_cmp_type	type;
-	struct filter_arg	*left;
-	struct filter_arg	*right;
-};
-
-struct filter_arg_str {
-	enum filter_cmp_type	type;
-	struct format_field	*field;
-	char			*val;
-	char			*buffer;
-	regex_t			reg;
-};
-
-struct filter_arg {
-	enum filter_arg_type	type;
-	union {
-		struct filter_arg_boolean	boolean;
-		struct filter_arg_field		field;
-		struct filter_arg_value		value;
-		struct filter_arg_op		op;
-		struct filter_arg_exp		exp;
-		struct filter_arg_num		num;
-		struct filter_arg_str		str;
-	};
-};
-
-struct filter_type {
-	int			event_id;
-	struct event_format	*event;
-	struct filter_arg	*filter;
-};
-
-struct event_filter {
-	struct pevent		*pevent;
-	int			filters;
-	struct filter_type	*event_filters;
-};
-
-struct event_filter *pevent_filter_alloc(struct pevent *pevent);
-
-#define FILTER_NONE		-2
-#define FILTER_NOEXIST		-1
-#define FILTER_MISS		0
-#define FILTER_MATCH		1
-
-enum filter_trivial_type {
-	FILTER_TRIVIAL_FALSE,
-	FILTER_TRIVIAL_TRUE,
-	FILTER_TRIVIAL_BOTH,
-};
-
-int pevent_filter_add_filter_str(struct event_filter *filter,
-				 const char *filter_str,
-				 char **error_str);
-
-
-int pevent_filter_match(struct event_filter *filter,
-			struct pevent_record *record);
-
-int pevent_event_filtered(struct event_filter *filter,
-			  int event_id);
-
-void pevent_filter_reset(struct event_filter *filter);
-
-void pevent_filter_clear_trivial(struct event_filter *filter,
-				 enum filter_trivial_type type);
-
-void pevent_filter_free(struct event_filter *filter);
-
-char *pevent_filter_make_string(struct event_filter *filter, int event_id);
-
-int pevent_filter_remove_event(struct event_filter *filter,
-			       int event_id);
-
-int pevent_filter_event_has_trivial(struct event_filter *filter,
-				    int event_id,
-				    enum filter_trivial_type type);
-
-int pevent_filter_copy(struct event_filter *dest, struct event_filter *source);
-
-int pevent_update_trivial(struct event_filter *dest, struct event_filter *source,
-			  enum filter_trivial_type type);
-
-int pevent_filter_compare(struct event_filter *filter1, struct event_filter *filter2);
-
-#endif /* _PARSE_EVENTS_H */
diff --git a/src/tools/lib/traceevent/event-utils.h b/src/tools/lib/traceevent/event-utils.h
deleted file mode 100644
index e76c9ac..0000000
--- a/src/tools/lib/traceevent/event-utils.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License (not later!)
- *
- * 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not,  see <http://www.gnu.org/licenses>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
-#ifndef __UTIL_H
-#define __UTIL_H
-
-#include <ctype.h>
-
-/* Can be overridden */
-void die(const char *fmt, ...);
-void *malloc_or_die(unsigned int size);
-void warning(const char *fmt, ...);
-void pr_stat(const char *fmt, ...);
-void vpr_stat(const char *fmt, va_list ap);
-
-/* Always available */
-void __die(const char *fmt, ...);
-void __warning(const char *fmt, ...);
-void __pr_stat(const char *fmt, ...);
-
-void __vdie(const char *fmt, ...);
-void __vwarning(const char *fmt, ...);
-void __vpr_stat(const char *fmt, ...);
-
-#define min(x, y) ({				\
-	typeof(x) _min1 = (x);			\
-	typeof(y) _min2 = (y);			\
-	(void) (&_min1 == &_min2);		\
-	_min1 < _min2 ? _min1 : _min2; })
-
-static inline char *strim(char *string)
-{
-	char *ret;
-
-	if (!string)
-		return NULL;
-	while (*string) {
-		if (!isspace(*string))
-			break;
-		string++;
-	}
-	ret = string;
-
-	string = ret + strlen(ret) - 1;
-	while (string > ret) {
-		if (!isspace(*string))
-			break;
-		string--;
-	}
-	string[1] = 0;
-
-	return ret;
-}
-
-static inline int has_text(const char *text)
-{
-	if (!text)
-		return 0;
-
-	while (*text) {
-		if (!isspace(*text))
-			return 1;
-		text++;
-	}
-
-	return 0;
-}
-
-#endif
diff --git a/src/tools/lib/traceevent/kbuffer-parse.c b/src/tools/lib/traceevent/kbuffer-parse.c
deleted file mode 100644
index dcc6652..0000000
--- a/src/tools/lib/traceevent/kbuffer-parse.c
+++ /dev/null
@@ -1,732 +0,0 @@
-/*
- * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License (not later!)
- *
- * 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "kbuffer.h"
-
-#define MISSING_EVENTS (1 << 31)
-#define MISSING_STORED (1 << 30)
-
-#define COMMIT_MASK ((1 << 27) - 1)
-
-enum {
-	KBUFFER_FL_HOST_BIG_ENDIAN	= (1<<0),
-	KBUFFER_FL_BIG_ENDIAN		= (1<<1),
-	KBUFFER_FL_LONG_8		= (1<<2),
-	KBUFFER_FL_OLD_FORMAT		= (1<<3),
-};
-
-#define ENDIAN_MASK (KBUFFER_FL_HOST_BIG_ENDIAN | KBUFFER_FL_BIG_ENDIAN)
-
-/** kbuffer
- * @timestamp		- timestamp of current event
- * @lost_events		- # of lost events between this subbuffer and previous
- * @flags		- special flags of the kbuffer
- * @subbuffer		- pointer to the sub-buffer page
- * @data		- pointer to the start of data on the sub-buffer page
- * @index		- index from @data to the @curr event data
- * @curr		- offset from @data to the start of current event
- *			   (includes metadata)
- * @next		- offset from @data to the start of next event
- * @size		- The size of data on @data
- * @start		- The offset from @subbuffer where @data lives
- *
- * @read_4		- Function to read 4 raw bytes (may swap)
- * @read_8		- Function to read 8 raw bytes (may swap)
- * @read_long		- Function to read a long word (4 or 8 bytes with needed swap)
- */
-struct kbuffer {
-	unsigned long long 	timestamp;
-	long long		lost_events;
-	unsigned long		flags;
-	void			*subbuffer;
-	void			*data;
-	unsigned int		index;
-	unsigned int		curr;
-	unsigned int		next;
-	unsigned int		size;
-	unsigned int		start;
-
-	unsigned int (*read_4)(void *ptr);
-	unsigned long long (*read_8)(void *ptr);
-	unsigned long long (*read_long)(struct kbuffer *kbuf, void *ptr);
-	int (*next_event)(struct kbuffer *kbuf);
-};
-
-static void *zmalloc(size_t size)
-{
-	return calloc(1, size);
-}
-
-static int host_is_bigendian(void)
-{
-	unsigned char str[] = { 0x1, 0x2, 0x3, 0x4 };
-	unsigned int *ptr;
-
-	ptr = (unsigned int *)str;
-	return *ptr == 0x01020304;
-}
-
-static int do_swap(struct kbuffer *kbuf)
-{
-	return ((kbuf->flags & KBUFFER_FL_HOST_BIG_ENDIAN) + kbuf->flags) &
-		ENDIAN_MASK;
-}
-
-static unsigned long long __read_8(void *ptr)
-{
-	unsigned long long data = *(unsigned long long *)ptr;
-
-	return data;
-}
-
-static unsigned long long __read_8_sw(void *ptr)
-{
-	unsigned long long data = *(unsigned long long *)ptr;
-	unsigned long long swap;
-
-	swap = ((data & 0xffULL) << 56) |
-		((data & (0xffULL << 8)) << 40) |
-		((data & (0xffULL << 16)) << 24) |
-		((data & (0xffULL << 24)) << 8) |
-		((data & (0xffULL << 32)) >> 8) |
-		((data & (0xffULL << 40)) >> 24) |
-		((data & (0xffULL << 48)) >> 40) |
-		((data & (0xffULL << 56)) >> 56);
-
-	return swap;
-}
-
-static unsigned int __read_4(void *ptr)
-{
-	unsigned int data = *(unsigned int *)ptr;
-
-	return data;
-}
-
-static unsigned int __read_4_sw(void *ptr)
-{
-	unsigned int data = *(unsigned int *)ptr;
-	unsigned int swap;
-
-	swap = ((data & 0xffULL) << 24) |
-		((data & (0xffULL << 8)) << 8) |
-		((data & (0xffULL << 16)) >> 8) |
-		((data & (0xffULL << 24)) >> 24);
-
-	return swap;
-}
-
-static unsigned long long read_8(struct kbuffer *kbuf, void *ptr)
-{
-	return kbuf->read_8(ptr);
-}
-
-static unsigned int read_4(struct kbuffer *kbuf, void *ptr)
-{
-	return kbuf->read_4(ptr);
-}
-
-static unsigned long long __read_long_8(struct kbuffer *kbuf, void *ptr)
-{
-	return kbuf->read_8(ptr);
-}
-
-static unsigned long long __read_long_4(struct kbuffer *kbuf, void *ptr)
-{
-	return kbuf->read_4(ptr);
-}
-
-static unsigned long long read_long(struct kbuffer *kbuf, void *ptr)
-{
-	return kbuf->read_long(kbuf, ptr);
-}
-
-static int calc_index(struct kbuffer *kbuf, void *ptr)
-{
-	return (unsigned long)ptr - (unsigned long)kbuf->data;
-}
-
-static int __next_event(struct kbuffer *kbuf);
-
-/**
- * kbuffer_alloc - allocat a new kbuffer
- * @size;	enum to denote size of word
- * @endian:	enum to denote endianness
- *
- * Allocates and returns a new kbuffer.
- */
-struct kbuffer *
-kbuffer_alloc(enum kbuffer_long_size size, enum kbuffer_endian endian)
-{
-	struct kbuffer *kbuf;
-	int flags = 0;
-
-	switch (size) {
-	case KBUFFER_LSIZE_4:
-		break;
-	case KBUFFER_LSIZE_8:
-		flags |= KBUFFER_FL_LONG_8;
-		break;
-	default:
-		return NULL;
-	}
-
-	switch (endian) {
-	case KBUFFER_ENDIAN_LITTLE:
-		break;
-	case KBUFFER_ENDIAN_BIG:
-		flags |= KBUFFER_FL_BIG_ENDIAN;
-		break;
-	default:
-		return NULL;
-	}
-
-	kbuf = zmalloc(sizeof(*kbuf));
-	if (!kbuf)
-		return NULL;
-
-	kbuf->flags = flags;
-
-	if (host_is_bigendian())
-		kbuf->flags |= KBUFFER_FL_HOST_BIG_ENDIAN;
-
-	if (do_swap(kbuf)) {
-		kbuf->read_8 = __read_8_sw;
-		kbuf->read_4 = __read_4_sw;
-	} else {
-		kbuf->read_8 = __read_8;
-		kbuf->read_4 = __read_4;
-	}
-
-	if (kbuf->flags & KBUFFER_FL_LONG_8)
-		kbuf->read_long = __read_long_8;
-	else
-		kbuf->read_long = __read_long_4;
-
-	/* May be changed by kbuffer_set_old_format() */
-	kbuf->next_event = __next_event;
-
-	return kbuf;
-}
-
-/** kbuffer_free - free an allocated kbuffer
- * @kbuf:	The kbuffer to free
- *
- * Can take NULL as a parameter.
- */
-void kbuffer_free(struct kbuffer *kbuf)
-{
-	free(kbuf);
-}
-
-static unsigned int type4host(struct kbuffer *kbuf,
-			      unsigned int type_len_ts)
-{
-	if (kbuf->flags & KBUFFER_FL_BIG_ENDIAN)
-		return (type_len_ts >> 29) & 3;
-	else
-		return type_len_ts & 3;
-}
-
-static unsigned int len4host(struct kbuffer *kbuf,
-			     unsigned int type_len_ts)
-{
-	if (kbuf->flags & KBUFFER_FL_BIG_ENDIAN)
-		return (type_len_ts >> 27) & 7;
-	else
-		return (type_len_ts >> 2) & 7;
-}
-
-static unsigned int type_len4host(struct kbuffer *kbuf,
-				  unsigned int type_len_ts)
-{
-	if (kbuf->flags & KBUFFER_FL_BIG_ENDIAN)
-		return (type_len_ts >> 27) & ((1 << 5) - 1);
-	else
-		return type_len_ts & ((1 << 5) - 1);
-}
-
-static unsigned int ts4host(struct kbuffer *kbuf,
-			    unsigned int type_len_ts)
-{
-	if (kbuf->flags & KBUFFER_FL_BIG_ENDIAN)
-		return type_len_ts & ((1 << 27) - 1);
-	else
-		return type_len_ts >> 5;
-}
-
-/*
- * Linux 2.6.30 and earlier (not much ealier) had a different
- * ring buffer format. It should be obsolete, but we handle it anyway.
- */
-enum old_ring_buffer_type {
-	OLD_RINGBUF_TYPE_PADDING,
-	OLD_RINGBUF_TYPE_TIME_EXTEND,
-	OLD_RINGBUF_TYPE_TIME_STAMP,
-	OLD_RINGBUF_TYPE_DATA,
-};
-
-static unsigned int old_update_pointers(struct kbuffer *kbuf)
-{
-	unsigned long long extend;
-	unsigned int type_len_ts;
-	unsigned int type;
-	unsigned int len;
-	unsigned int delta;
-	unsigned int length;
-	void *ptr = kbuf->data + kbuf->curr;
-
-	type_len_ts = read_4(kbuf, ptr);
-	ptr += 4;
-
-	type = type4host(kbuf, type_len_ts);
-	len = len4host(kbuf, type_len_ts);
-	delta = ts4host(kbuf, type_len_ts);
-
-	switch (type) {
-	case OLD_RINGBUF_TYPE_PADDING:
-		kbuf->next = kbuf->size;
-		return 0;
-
-	case OLD_RINGBUF_TYPE_TIME_EXTEND:
-		extend = read_4(kbuf, ptr);
-		extend <<= TS_SHIFT;
-		extend += delta;
-		delta = extend;
-		ptr += 4;
-		break;
-
-	case OLD_RINGBUF_TYPE_TIME_STAMP:
-		/* should never happen! */
-		kbuf->curr = kbuf->size;
-		kbuf->next = kbuf->size;
-		kbuf->index = kbuf->size;
-		return -1;
-	default:
-		if (len)
-			length = len * 4;
-		else {
-			length = read_4(kbuf, ptr);
-			length -= 4;
-			ptr += 4;
-		}
-		break;
-	}
-
-	kbuf->timestamp += delta;
-	kbuf->index = calc_index(kbuf, ptr);
-	kbuf->next = kbuf->index + length;
-
-	return type;
-}
-
-static int __old_next_event(struct kbuffer *kbuf)
-{
-	int type;
-
-	do {
-		kbuf->curr = kbuf->next;
-		if (kbuf->next >= kbuf->size)
-			return -1;
-		type = old_update_pointers(kbuf);
-	} while (type == OLD_RINGBUF_TYPE_TIME_EXTEND || type == OLD_RINGBUF_TYPE_PADDING);
-
-	return 0;
-}
-
-static unsigned int
-translate_data(struct kbuffer *kbuf, void *data, void **rptr,
-	       unsigned long long *delta, int *length)
-{
-	unsigned long long extend;
-	unsigned int type_len_ts;
-	unsigned int type_len;
-
-	type_len_ts = read_4(kbuf, data);
-	data += 4;
-
-	type_len = type_len4host(kbuf, type_len_ts);
-	*delta = ts4host(kbuf, type_len_ts);
-
-	switch (type_len) {
-	case KBUFFER_TYPE_PADDING:
-		*length = read_4(kbuf, data);
-		data += *length;
-		break;
-
-	case KBUFFER_TYPE_TIME_EXTEND:
-		extend = read_4(kbuf, data);
-		data += 4;
-		extend <<= TS_SHIFT;
-		extend += *delta;
-		*delta = extend;
-		*length = 0;
-		break;
-
-	case KBUFFER_TYPE_TIME_STAMP:
-		data += 12;
-		*length = 0;
-		break;
-	case 0:
-		*length = read_4(kbuf, data) - 4;
-		*length = (*length + 3) & ~3;
-		data += 4;
-		break;
-	default:
-		*length = type_len * 4;
-		break;
-	}
-
-	*rptr = data;
-
-	return type_len;
-}
-
-static unsigned int update_pointers(struct kbuffer *kbuf)
-{
-	unsigned long long delta;
-	unsigned int type_len;
-	int length;
-	void *ptr = kbuf->data + kbuf->curr;
-
-	type_len = translate_data(kbuf, ptr, &ptr, &delta, &length);
-
-	kbuf->timestamp += delta;
-	kbuf->index = calc_index(kbuf, ptr);
-	kbuf->next = kbuf->index + length;
-
-	return type_len;
-}
-
-/**
- * kbuffer_translate_data - read raw data to get a record
- * @swap:	Set to 1 if bytes in words need to be swapped when read
- * @data:	The raw data to read
- * @size:	Address to store the size of the event data.
- *
- * Returns a pointer to the event data. To determine the entire
- * record size (record metadata + data) just add the difference between
- * @data and the returned value to @size.
- */
-void *kbuffer_translate_data(int swap, void *data, unsigned int *size)
-{
-	unsigned long long delta;
-	struct kbuffer kbuf;
-	int type_len;
-	int length;
-	void *ptr;
-
-	if (swap) {
-		kbuf.read_8 = __read_8_sw;
-		kbuf.read_4 = __read_4_sw;
-		kbuf.flags = host_is_bigendian() ? 0 : KBUFFER_FL_BIG_ENDIAN;
-	} else {
-		kbuf.read_8 = __read_8;
-		kbuf.read_4 = __read_4;
-		kbuf.flags = host_is_bigendian() ? KBUFFER_FL_BIG_ENDIAN: 0;
-	}
-
-	type_len = translate_data(&kbuf, data, &ptr, &delta, &length);
-	switch (type_len) {
-	case KBUFFER_TYPE_PADDING:
-	case KBUFFER_TYPE_TIME_EXTEND:
-	case KBUFFER_TYPE_TIME_STAMP:
-		return NULL;
-	};
-
-	*size = length;
-
-	return ptr;
-}
-
-static int __next_event(struct kbuffer *kbuf)
-{
-	int type;
-
-	do {
-		kbuf->curr = kbuf->next;
-		if (kbuf->next >= kbuf->size)
-			return -1;
-		type = update_pointers(kbuf);
-	} while (type == KBUFFER_TYPE_TIME_EXTEND || type == KBUFFER_TYPE_PADDING);
-
-	return 0;
-}
-
-static int next_event(struct kbuffer *kbuf)
-{
-	return kbuf->next_event(kbuf);
-}
-
-/**
- * kbuffer_next_event - increment the current pointer
- * @kbuf:	The kbuffer to read
- * @ts:		Address to store the next record's timestamp (may be NULL to ignore)
- *
- * Increments the pointers into the subbuffer of the kbuffer to point to the
- * next event so that the next kbuffer_read_event() will return a
- * new event.
- *
- * Returns the data of the next event if a new event exists on the subbuffer,
- * NULL otherwise.
- */
-void *kbuffer_next_event(struct kbuffer *kbuf, unsigned long long *ts)
-{
-	int ret;
-
-	if (!kbuf || !kbuf->subbuffer)
-		return NULL;
-
-	ret = next_event(kbuf);
-	if (ret < 0)
-		return NULL;
-
-	if (ts)
-		*ts = kbuf->timestamp;
-
-	return kbuf->data + kbuf->index;
-}
-
-/**
- * kbuffer_load_subbuffer - load a new subbuffer into the kbuffer
- * @kbuf:	The kbuffer to load
- * @subbuffer:	The subbuffer to load into @kbuf.
- *
- * Load a new subbuffer (page) into @kbuf. This will reset all
- * the pointers and update the @kbuf timestamp. The next read will
- * return the first event on @subbuffer.
- *
- * Returns 0 on succes, -1 otherwise.
- */
-int kbuffer_load_subbuffer(struct kbuffer *kbuf, void *subbuffer)
-{
-	unsigned long long flags;
-	void *ptr = subbuffer;
-
-	if (!kbuf || !subbuffer)
-		return -1;
-
-	kbuf->subbuffer = subbuffer;
-
-	kbuf->timestamp = read_8(kbuf, ptr);
-	ptr += 8;
-
-	kbuf->curr = 0;
-
-	if (kbuf->flags & KBUFFER_FL_LONG_8)
-		kbuf->start = 16;
-	else
-		kbuf->start = 12;
-
-	kbuf->data = subbuffer + kbuf->start;
-
-	flags = read_long(kbuf, ptr);
-	kbuf->size = (unsigned int)flags & COMMIT_MASK;
-
-	if (flags & MISSING_EVENTS) {
-		if (flags & MISSING_STORED) {
-			ptr = kbuf->data + kbuf->size;
-			kbuf->lost_events = read_long(kbuf, ptr);
-		} else
-			kbuf->lost_events = -1;
-	} else
-		kbuf->lost_events = 0;
-
-	kbuf->index = 0;
-	kbuf->next = 0;
-
-	next_event(kbuf);
-
-	return 0;
-}
-
-/**
- * kbuffer_read_event - read the next event in the kbuffer subbuffer
- * @kbuf:	The kbuffer to read from
- * @ts:		The address to store the timestamp of the event (may be NULL to ignore)
- *
- * Returns a pointer to the data part of the current event.
- * NULL if no event is left on the subbuffer.
- */
-void *kbuffer_read_event(struct kbuffer *kbuf, unsigned long long *ts)
-{
-	if (!kbuf || !kbuf->subbuffer)
-		return NULL;
-
-	if (kbuf->curr >= kbuf->size)
-		return NULL;
-
-	if (ts)
-		*ts = kbuf->timestamp;
-	return kbuf->data + kbuf->index;
-}
-
-/**
- * kbuffer_timestamp - Return the timestamp of the current event
- * @kbuf:	The kbuffer to read from
- *
- * Returns the timestamp of the current (next) event.
- */
-unsigned long long kbuffer_timestamp(struct kbuffer *kbuf)
-{
-	return kbuf->timestamp;
-}
-
-/**
- * kbuffer_read_at_offset - read the event that is at offset
- * @kbuf:	The kbuffer to read from
- * @offset:	The offset into the subbuffer
- * @ts:		The address to store the timestamp of the event (may be NULL to ignore)
- *
- * The @offset must be an index from the @kbuf subbuffer beginning.
- * If @offset is bigger than the stored subbuffer, NULL will be returned.
- *
- * Returns the data of the record that is at @offset. Note, @offset does
- * not need to be the start of the record, the offset just needs to be
- * in the record (or beginning of it).
- *
- * Note, the kbuf timestamp and pointers are updated to the
- * returned record. That is, kbuffer_read_event() will return the same
- * data and timestamp, and kbuffer_next_event() will increment from
- * this record.
- */
-void *kbuffer_read_at_offset(struct kbuffer *kbuf, int offset,
-			     unsigned long long *ts)
-{
-	void *data;
-
-	if (offset < kbuf->start)
-		offset = 0;
-	else
-		offset -= kbuf->start;
-
-	/* Reset the buffer */
-	kbuffer_load_subbuffer(kbuf, kbuf->subbuffer);
-
-	while (kbuf->curr < offset) {
-		data = kbuffer_next_event(kbuf, ts);
-		if (!data)
-			break;
-	}
-
-	return data;
-}
-
-/**
- * kbuffer_subbuffer_size - the size of the loaded subbuffer
- * @kbuf:	The kbuffer to read from
- *
- * Returns the size of the subbuffer. Note, this size is
- * where the last event resides. The stored subbuffer may actually be
- * bigger due to padding and such.
- */
-int kbuffer_subbuffer_size(struct kbuffer *kbuf)
-{
-	return kbuf->size;
-}
-
-/**
- * kbuffer_curr_index - Return the index of the record
- * @kbuf:	The kbuffer to read from
- *
- * Returns the index from the start of the data part of
- * the subbuffer to the current location. Note this is not
- * from the start of the subbuffer. An index of zero will
- * point to the first record. Use kbuffer_curr_offset() for
- * the actually offset (that can be used by kbuffer_read_at_offset())
- */
-int kbuffer_curr_index(struct kbuffer *kbuf)
-{
-	return kbuf->curr;
-}
-
-/**
- * kbuffer_curr_offset - Return the offset of the record
- * @kbuf:	The kbuffer to read from
- *
- * Returns the offset from the start of the subbuffer to the
- * current location.
- */
-int kbuffer_curr_offset(struct kbuffer *kbuf)
-{
-	return kbuf->curr + kbuf->start;
-}
-
-/**
- * kbuffer_event_size - return the size of the event data
- * @kbuf:	The kbuffer to read
- *
- * Returns the size of the event data (the payload not counting
- * the meta data of the record) of the current event.
- */
-int kbuffer_event_size(struct kbuffer *kbuf)
-{
-	return kbuf->next - kbuf->index;
-}
-
-/**
- * kbuffer_curr_size - return the size of the entire record
- * @kbuf:	The kbuffer to read
- *
- * Returns the size of the entire record (meta data and payload)
- * of the current event.
- */
-int kbuffer_curr_size(struct kbuffer *kbuf)
-{
-	return kbuf->next - kbuf->curr;
-}
-
-/**
- * kbuffer_missed_events - return the # of missed events from last event.
- * @kbuf: 	The kbuffer to read from
- *
- * Returns the # of missed events (if recorded) before the current
- * event. Note, only events on the beginning of a subbuffer can
- * have missed events, all other events within the buffer will be
- * zero.
- */
-int kbuffer_missed_events(struct kbuffer *kbuf)
-{
-	/* Only the first event can have missed events */
-	if (kbuf->curr)
-		return 0;
-
-	return kbuf->lost_events;
-}
-
-/**
- * kbuffer_set_old_forma - set the kbuffer to use the old format parsing
- * @kbuf:	The kbuffer to set
- *
- * This is obsolete (or should be). The first kernels to use the
- * new ring buffer had a slightly different ring buffer format
- * (2.6.30 and earlier). It is still somewhat supported by kbuffer,
- * but should not be counted on in the future.
- */
-void kbuffer_set_old_format(struct kbuffer *kbuf)
-{
-	kbuf->flags |= KBUFFER_FL_OLD_FORMAT;
-
-	kbuf->next_event = __old_next_event;
-}
diff --git a/src/tools/lib/traceevent/kbuffer.h b/src/tools/lib/traceevent/kbuffer.h
deleted file mode 100644
index c831f64..0000000
--- a/src/tools/lib/traceevent/kbuffer.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2012 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License (not later!)
- *
- * 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
-#ifndef _KBUFFER_H
-#define _KBUFFER_H
-
-#ifndef TS_SHIFT
-#define TS_SHIFT		27
-#endif
-
-enum kbuffer_endian {
-	KBUFFER_ENDIAN_BIG,
-	KBUFFER_ENDIAN_LITTLE,
-};
-
-enum kbuffer_long_size {
-	KBUFFER_LSIZE_4,
-	KBUFFER_LSIZE_8,
-};
-
-enum {
-	KBUFFER_TYPE_PADDING		= 29,
-	KBUFFER_TYPE_TIME_EXTEND	= 30,
-	KBUFFER_TYPE_TIME_STAMP		= 31,
-};
-
-struct kbuffer;
-
-struct kbuffer *kbuffer_alloc(enum kbuffer_long_size size, enum kbuffer_endian endian);
-void kbuffer_free(struct kbuffer *kbuf);
-int kbuffer_load_subbuffer(struct kbuffer *kbuf, void *subbuffer);
-void *kbuffer_read_event(struct kbuffer *kbuf, unsigned long long *ts);
-void *kbuffer_next_event(struct kbuffer *kbuf, unsigned long long *ts);
-unsigned long long kbuffer_timestamp(struct kbuffer *kbuf);
-
-void *kbuffer_translate_data(int swap, void *data, unsigned int *size);
-
-void *kbuffer_read_at_offset(struct kbuffer *kbuf, int offset, unsigned long long *ts);
-
-int kbuffer_curr_index(struct kbuffer *kbuf);
-
-int kbuffer_curr_offset(struct kbuffer *kbuf);
-int kbuffer_curr_size(struct kbuffer *kbuf);
-int kbuffer_event_size(struct kbuffer *kbuf);
-int kbuffer_missed_events(struct kbuffer *kbuf);
-int kbuffer_subbuffer_size(struct kbuffer *kbuf);
-
-void kbuffer_set_old_format(struct kbuffer *kbuf);
-
-#endif /* _K_BUFFER_H */
diff --git a/src/tools/lib/traceevent/parse-filter.c b/src/tools/lib/traceevent/parse-filter.c
deleted file mode 100644
index 2500e75..0000000
--- a/src/tools/lib/traceevent/parse-filter.c
+++ /dev/null
@@ -1,2303 +0,0 @@
-/*
- * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License (not later!)
- *
- * 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not,  see <http://www.gnu.org/licenses>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <errno.h>
-#include <sys/types.h>
-
-#include "event-parse.h"
-#include "event-utils.h"
-
-#define COMM "COMM"
-
-static struct format_field comm = {
-	.name = "COMM",
-};
-
-struct event_list {
-	struct event_list	*next;
-	struct event_format	*event;
-};
-
-#define MAX_ERR_STR_SIZE 256
-
-static void show_error(char **error_str, const char *fmt, ...)
-{
-	unsigned long long index;
-	const char *input;
-	char *error;
-	va_list ap;
-	int len;
-	int i;
-
-	if (!error_str)
-		return;
-
-	input = pevent_get_input_buf();
-	index = pevent_get_input_buf_ptr();
-	len = input ? strlen(input) : 0;
-
-	error = malloc_or_die(MAX_ERR_STR_SIZE + (len*2) + 3);
-
-	if (len) {
-		strcpy(error, input);
-		error[len] = '\n';
-		for (i = 1; i < len && i < index; i++)
-			error[len+i] = ' ';
-		error[len + i] = '^';
-		error[len + i + 1] = '\n';
-		len += i+2;
-	}
-
-	va_start(ap, fmt);
-	vsnprintf(error + len, MAX_ERR_STR_SIZE, fmt, ap);
-	va_end(ap);
-
-	*error_str = error;
-}
-
-static void free_token(char *token)
-{
-	pevent_free_token(token);
-}
-
-static enum event_type read_token(char **tok)
-{
-	enum event_type type;
-	char *token = NULL;
-
-	do {
-		free_token(token);
-		type = pevent_read_token(&token);
-	} while (type == EVENT_NEWLINE || type == EVENT_SPACE);
-
-	/* If token is = or ! check to see if the next char is ~ */
-	if (token &&
-	    (strcmp(token, "=") == 0 || strcmp(token, "!") == 0) &&
-	    pevent_peek_char() == '~') {
-		/* append it */
-		*tok = malloc_or_die(3);
-		sprintf(*tok, "%c%c", *token, '~');
-		free_token(token);
-		/* Now remove the '~' from the buffer */
-		pevent_read_token(&token);
-		free_token(token);
-	} else
-		*tok = token;
-
-	return type;
-}
-
-static int filter_cmp(const void *a, const void *b)
-{
-	const struct filter_type *ea = a;
-	const struct filter_type *eb = b;
-
-	if (ea->event_id < eb->event_id)
-		return -1;
-
-	if (ea->event_id > eb->event_id)
-		return 1;
-
-	return 0;
-}
-
-static struct filter_type *
-find_filter_type(struct event_filter *filter, int id)
-{
-	struct filter_type *filter_type;
-	struct filter_type key;
-
-	key.event_id = id;
-
-	filter_type = bsearch(&key, filter->event_filters,
-			      filter->filters,
-			      sizeof(*filter->event_filters),
-			      filter_cmp);
-
-	return filter_type;
-}
-
-static struct filter_type *
-add_filter_type(struct event_filter *filter, int id)
-{
-	struct filter_type *filter_type;
-	int i;
-
-	filter_type = find_filter_type(filter, id);
-	if (filter_type)
-		return filter_type;
-
-	filter->event_filters =	realloc(filter->event_filters,
-					sizeof(*filter->event_filters) *
-					(filter->filters + 1));
-	if (!filter->event_filters)
-		die("Could not allocate filter");
-
-	for (i = 0; i < filter->filters; i++) {
-		if (filter->event_filters[i].event_id > id)
-			break;
-	}
-
-	if (i < filter->filters)
-		memmove(&filter->event_filters[i+1],
-			&filter->event_filters[i],
-			sizeof(*filter->event_filters) *
-			(filter->filters - i));
-
-	filter_type = &filter->event_filters[i];
-	filter_type->event_id = id;
-	filter_type->event = pevent_find_event(filter->pevent, id);
-	filter_type->filter = NULL;
-
-	filter->filters++;
-
-	return filter_type;
-}
-
-/**
- * pevent_filter_alloc - create a new event filter
- * @pevent: The pevent that this filter is associated with
- */
-struct event_filter *pevent_filter_alloc(struct pevent *pevent)
-{
-	struct event_filter *filter;
-
-	filter = malloc_or_die(sizeof(*filter));
-	memset(filter, 0, sizeof(*filter));
-	filter->pevent = pevent;
-	pevent_ref(pevent);
-
-	return filter;
-}
-
-static struct filter_arg *allocate_arg(void)
-{
-	struct filter_arg *arg;
-
-	arg = malloc_or_die(sizeof(*arg));
-	memset(arg, 0, sizeof(*arg));
-
-	return arg;
-}
-
-static void free_arg(struct filter_arg *arg)
-{
-	if (!arg)
-		return;
-
-	switch (arg->type) {
-	case FILTER_ARG_NONE:
-	case FILTER_ARG_BOOLEAN:
-		break;
-
-	case FILTER_ARG_NUM:
-		free_arg(arg->num.left);
-		free_arg(arg->num.right);
-		break;
-
-	case FILTER_ARG_EXP:
-		free_arg(arg->exp.left);
-		free_arg(arg->exp.right);
-		break;
-
-	case FILTER_ARG_STR:
-		free(arg->str.val);
-		regfree(&arg->str.reg);
-		free(arg->str.buffer);
-		break;
-
-	case FILTER_ARG_VALUE:
-		if (arg->value.type == FILTER_STRING ||
-		    arg->value.type == FILTER_CHAR)
-			free(arg->value.str);
-		break;
-
-	case FILTER_ARG_OP:
-		free_arg(arg->op.left);
-		free_arg(arg->op.right);
-	default:
-		break;
-	}
-
-	free(arg);
-}
-
-static void add_event(struct event_list **events,
-		      struct event_format *event)
-{
-	struct event_list *list;
-
-	list = malloc_or_die(sizeof(*list));
-	list->next = *events;
-	*events = list;
-	list->event = event;
-}
-
-static int event_match(struct event_format *event,
-		       regex_t *sreg, regex_t *ereg)
-{
-	if (sreg) {
-		return !regexec(sreg, event->system, 0, NULL, 0) &&
-			!regexec(ereg, event->name, 0, NULL, 0);
-	}
-
-	return !regexec(ereg, event->system, 0, NULL, 0) ||
-		!regexec(ereg, event->name, 0, NULL, 0);
-}
-
-static int
-find_event(struct pevent *pevent, struct event_list **events,
-	   char *sys_name, char *event_name)
-{
-	struct event_format *event;
-	regex_t ereg;
-	regex_t sreg;
-	int match = 0;
-	char *reg;
-	int ret;
-	int i;
-
-	if (!event_name) {
-		/* if no name is given, then swap sys and name */
-		event_name = sys_name;
-		sys_name = NULL;
-	}
-
-	reg = malloc_or_die(strlen(event_name) + 3);
-	sprintf(reg, "^%s$", event_name);
-
-	ret = regcomp(&ereg, reg, REG_ICASE|REG_NOSUB);
-	free(reg);
-
-	if (ret)
-		return -1;
-
-	if (sys_name) {
-		reg = malloc_or_die(strlen(sys_name) + 3);
-		sprintf(reg, "^%s$", sys_name);
-		ret = regcomp(&sreg, reg, REG_ICASE|REG_NOSUB);
-		free(reg);
-		if (ret) {
-			regfree(&ereg);
-			return -1;
-		}
-	}
-
-	for (i = 0; i < pevent->nr_events; i++) {
-		event = pevent->events[i];
-		if (event_match(event, sys_name ? &sreg : NULL, &ereg)) {
-			match = 1;
-			add_event(events, event);
-		}
-	}
-
-	regfree(&ereg);
-	if (sys_name)
-		regfree(&sreg);
-
-	if (!match)
-		return -1;
-
-	return 0;
-}
-
-static void free_events(struct event_list *events)
-{
-	struct event_list *event;
-
-	while (events) {
-		event = events;
-		events = events->next;
-		free(event);
-	}
-}
-
-static struct filter_arg *
-create_arg_item(struct event_format *event, const char *token,
-		enum event_type type, char **error_str)
-{
-	struct format_field *field;
-	struct filter_arg *arg;
-
-	arg = allocate_arg();
-
-	switch (type) {
-
-	case EVENT_SQUOTE:
-	case EVENT_DQUOTE:
-		arg->type = FILTER_ARG_VALUE;
-		arg->value.type =
-			type == EVENT_DQUOTE ? FILTER_STRING : FILTER_CHAR;
-		arg->value.str = strdup(token);
-		if (!arg->value.str)
-			die("malloc string");
-		break;
-	case EVENT_ITEM:
-		/* if it is a number, then convert it */
-		if (isdigit(token[0])) {
-			arg->type = FILTER_ARG_VALUE;
-			arg->value.type = FILTER_NUMBER;
-			arg->value.val = strtoull(token, NULL, 0);
-			break;
-		}
-		/* Consider this a field */
-		field = pevent_find_any_field(event, token);
-		if (!field) {
-			if (strcmp(token, COMM) != 0) {
-				/* not a field, Make it false */
-				arg->type = FILTER_ARG_BOOLEAN;
-				arg->boolean.value = FILTER_FALSE;
-				break;
-			}
-			/* If token is 'COMM' then it is special */
-			field = &comm;
-		}
-		arg->type = FILTER_ARG_FIELD;
-		arg->field.field = field;
-		break;
-	default:
-		free_arg(arg);
-		show_error(error_str, "expected a value but found %s",
-			   token);
-		return NULL;
-	}
-	return arg;
-}
-
-static struct filter_arg *
-create_arg_op(enum filter_op_type btype)
-{
-	struct filter_arg *arg;
-
-	arg = allocate_arg();
-	arg->type = FILTER_ARG_OP;
-	arg->op.type = btype;
-
-	return arg;
-}
-
-static struct filter_arg *
-create_arg_exp(enum filter_exp_type etype)
-{
-	struct filter_arg *arg;
-
-	arg = allocate_arg();
-	arg->type = FILTER_ARG_EXP;
-	arg->op.type = etype;
-
-	return arg;
-}
-
-static struct filter_arg *
-create_arg_cmp(enum filter_exp_type etype)
-{
-	struct filter_arg *arg;
-
-	arg = allocate_arg();
-	/* Use NUM and change if necessary */
-	arg->type = FILTER_ARG_NUM;
-	arg->op.type = etype;
-
-	return arg;
-}
-
-static int add_right(struct filter_arg *op, struct filter_arg *arg,
-		     char **error_str)
-{
-	struct filter_arg *left;
-	char *str;
-	int op_type;
-	int ret;
-
-	switch (op->type) {
-	case FILTER_ARG_EXP:
-		if (op->exp.right)
-			goto out_fail;
-		op->exp.right = arg;
-		break;
-
-	case FILTER_ARG_OP:
-		if (op->op.right)
-			goto out_fail;
-		op->op.right = arg;
-		break;
-
-	case FILTER_ARG_NUM:
-		if (op->op.right)
-			goto out_fail;
-		/*
-		 * The arg must be num, str, or field
-		 */
-		switch (arg->type) {
-		case FILTER_ARG_VALUE:
-		case FILTER_ARG_FIELD:
-			break;
-		default:
-			show_error(error_str,
-				   "Illegal rvalue");
-			return -1;
-		}
-
-		/*
-		 * Depending on the type, we may need to
-		 * convert this to a string or regex.
-		 */
-		switch (arg->value.type) {
-		case FILTER_CHAR:
-			/*
-			 * A char should be converted to number if
-			 * the string is 1 byte, and the compare
-			 * is not a REGEX.
-			 */
-			if (strlen(arg->value.str) == 1 &&
-			    op->num.type != FILTER_CMP_REGEX &&
-			    op->num.type != FILTER_CMP_NOT_REGEX) {
-				arg->value.type = FILTER_NUMBER;
-				goto do_int;
-			}
-			/* fall through */
-		case FILTER_STRING:
-
-			/* convert op to a string arg */
-			op_type = op->num.type;
-			left = op->num.left;
-			str = arg->value.str;
-
-			/* reset the op for the new field */
-			memset(op, 0, sizeof(*op));
-
-			/*
-			 * If left arg was a field not found then
-			 * NULL the entire op.
-			 */
-			if (left->type == FILTER_ARG_BOOLEAN) {
-				free_arg(left);
-				free_arg(arg);
-				op->type = FILTER_ARG_BOOLEAN;
-				op->boolean.value = FILTER_FALSE;
-				break;
-			}
-
-			/* Left arg must be a field */
-			if (left->type != FILTER_ARG_FIELD) {
-				show_error(error_str,
-					   "Illegal lvalue for string comparison");
-				return -1;
-			}
-
-			/* Make sure this is a valid string compare */
-			switch (op_type) {
-			case FILTER_CMP_EQ:
-				op_type = FILTER_CMP_MATCH;
-				break;
-			case FILTER_CMP_NE:
-				op_type = FILTER_CMP_NOT_MATCH;
-				break;
-
-			case FILTER_CMP_REGEX:
-			case FILTER_CMP_NOT_REGEX:
-				ret = regcomp(&op->str.reg, str, REG_ICASE|REG_NOSUB);
-				if (ret) {
-					show_error(error_str,
-						   "RegEx '%s' did not compute",
-						   str);
-					return -1;
-				}
-				break;
-			default:
-				show_error(error_str,
-					   "Illegal comparison for string");
-				return -1;
-			}
-
-			op->type = FILTER_ARG_STR;
-			op->str.type = op_type;
-			op->str.field = left->field.field;
-			op->str.val = strdup(str);
-			if (!op->str.val)
-				die("malloc string");
-			/*
-			 * Need a buffer to copy data for tests
-			 */
-			op->str.buffer = malloc_or_die(op->str.field->size + 1);
-			/* Null terminate this buffer */
-			op->str.buffer[op->str.field->size] = 0;
-
-			/* We no longer have left or right args */
-			free_arg(arg);
-			free_arg(left);
-
-			break;
-
-		case FILTER_NUMBER:
-
- do_int:
-			switch (op->num.type) {
-			case FILTER_CMP_REGEX:
-			case FILTER_CMP_NOT_REGEX:
-				show_error(error_str,
-					   "Op not allowed with integers");
-				return -1;
-
-			default:
-				break;
-			}
-
-			/* numeric compare */
-			op->num.right = arg;
-			break;
-		default:
-			goto out_fail;
-		}
-		break;
-	default:
-		goto out_fail;
-	}
-
-	return 0;
-
- out_fail:
-	show_error(error_str,
-		   "Syntax error");
-	return -1;
-}
-
-static struct filter_arg *
-rotate_op_right(struct filter_arg *a, struct filter_arg *b)
-{
-	struct filter_arg *arg;
-
-	arg = a->op.right;
-	a->op.right = b;
-	return arg;
-}
-
-static int add_left(struct filter_arg *op, struct filter_arg *arg)
-{
-	switch (op->type) {
-	case FILTER_ARG_EXP:
-		if (arg->type == FILTER_ARG_OP)
-			arg = rotate_op_right(arg, op);
-		op->exp.left = arg;
-		break;
-
-	case FILTER_ARG_OP:
-		op->op.left = arg;
-		break;
-	case FILTER_ARG_NUM:
-		if (arg->type == FILTER_ARG_OP)
-			arg = rotate_op_right(arg, op);
-
-		/* left arg of compares must be a field */
-		if (arg->type != FILTER_ARG_FIELD &&
-		    arg->type != FILTER_ARG_BOOLEAN)
-			return -1;
-		op->num.left = arg;
-		break;
-	default:
-		return -1;
-	}
-	return 0;
-}
-
-enum op_type {
-	OP_NONE,
-	OP_BOOL,
-	OP_NOT,
-	OP_EXP,
-	OP_CMP,
-};
-
-static enum op_type process_op(const char *token,
-			       enum filter_op_type *btype,
-			       enum filter_cmp_type *ctype,
-			       enum filter_exp_type *etype)
-{
-	*btype = FILTER_OP_NOT;
-	*etype = FILTER_EXP_NONE;
-	*ctype = FILTER_CMP_NONE;
-
-	if (strcmp(token, "&&") == 0)
-		*btype = FILTER_OP_AND;
-	else if (strcmp(token, "||") == 0)
-		*btype = FILTER_OP_OR;
-	else if (strcmp(token, "!") == 0)
-		return OP_NOT;
-
-	if (*btype != FILTER_OP_NOT)
-		return OP_BOOL;
-
-	/* Check for value expressions */
-	if (strcmp(token, "+") == 0) {
-		*etype = FILTER_EXP_ADD;
-	} else if (strcmp(token, "-") == 0) {
-		*etype = FILTER_EXP_SUB;
-	} else if (strcmp(token, "*") == 0) {
-		*etype = FILTER_EXP_MUL;
-	} else if (strcmp(token, "/") == 0) {
-		*etype = FILTER_EXP_DIV;
-	} else if (strcmp(token, "%") == 0) {
-		*etype = FILTER_EXP_MOD;
-	} else if (strcmp(token, ">>") == 0) {
-		*etype = FILTER_EXP_RSHIFT;
-	} else if (strcmp(token, "<<") == 0) {
-		*etype = FILTER_EXP_LSHIFT;
-	} else if (strcmp(token, "&") == 0) {
-		*etype = FILTER_EXP_AND;
-	} else if (strcmp(token, "|") == 0) {
-		*etype = FILTER_EXP_OR;
-	} else if (strcmp(token, "^") == 0) {
-		*etype = FILTER_EXP_XOR;
-	} else if (strcmp(token, "~") == 0)
-		*etype = FILTER_EXP_NOT;
-
-	if (*etype != FILTER_EXP_NONE)
-		return OP_EXP;
-
-	/* Check for compares */
-	if (strcmp(token, "==") == 0)
-		*ctype = FILTER_CMP_EQ;
-	else if (strcmp(token, "!=") == 0)
-		*ctype = FILTER_CMP_NE;
-	else if (strcmp(token, "<") == 0)
-		*ctype = FILTER_CMP_LT;
-	else if (strcmp(token, ">") == 0)
-		*ctype = FILTER_CMP_GT;
-	else if (strcmp(token, "<=") == 0)
-		*ctype = FILTER_CMP_LE;
-	else if (strcmp(token, ">=") == 0)
-		*ctype = FILTER_CMP_GE;
-	else if (strcmp(token, "=~") == 0)
-		*ctype = FILTER_CMP_REGEX;
-	else if (strcmp(token, "!~") == 0)
-		*ctype = FILTER_CMP_NOT_REGEX;
-	else
-		return OP_NONE;
-
-	return OP_CMP;
-}
-
-static int check_op_done(struct filter_arg *arg)
-{
-	switch (arg->type) {
-	case FILTER_ARG_EXP:
-		return arg->exp.right != NULL;
-
-	case FILTER_ARG_OP:
-		return arg->op.right != NULL;
-
-	case FILTER_ARG_NUM:
-		return arg->num.right != NULL;
-
-	case FILTER_ARG_STR:
-		/* A string conversion is always done */
-		return 1;
-
-	case FILTER_ARG_BOOLEAN:
-		/* field not found, is ok */
-		return 1;
-
-	default:
-		return 0;
-	}
-}
-
-enum filter_vals {
-	FILTER_VAL_NORM,
-	FILTER_VAL_FALSE,
-	FILTER_VAL_TRUE,
-};
-
-void reparent_op_arg(struct filter_arg *parent, struct filter_arg *old_child,
-		  struct filter_arg *arg)
-{
-	struct filter_arg *other_child;
-	struct filter_arg **ptr;
-
-	if (parent->type != FILTER_ARG_OP &&
-	    arg->type != FILTER_ARG_OP)
-		die("can not reparent other than OP");
-
-	/* Get the sibling */
-	if (old_child->op.right == arg) {
-		ptr = &old_child->op.right;
-		other_child = old_child->op.left;
-	} else if (old_child->op.left == arg) {
-		ptr = &old_child->op.left;
-		other_child = old_child->op.right;
-	} else
-		die("Error in reparent op, find other child");
-
-	/* Detach arg from old_child */
-	*ptr = NULL;
-
-	/* Check for root */
-	if (parent == old_child) {
-		free_arg(other_child);
-		*parent = *arg;
-		/* Free arg without recussion */
-		free(arg);
-		return;
-	}
-
-	if (parent->op.right == old_child)
-		ptr = &parent->op.right;
-	else if (parent->op.left == old_child)
-		ptr = &parent->op.left;
-	else
-		die("Error in reparent op");
-	*ptr = arg;
-
-	free_arg(old_child);
-}
-
-enum filter_vals test_arg(struct filter_arg *parent, struct filter_arg *arg)
-{
-	enum filter_vals lval, rval;
-
-	switch (arg->type) {
-
-		/* bad case */
-	case FILTER_ARG_BOOLEAN:
-		return FILTER_VAL_FALSE + arg->boolean.value;
-
-		/* good cases: */
-	case FILTER_ARG_STR:
-	case FILTER_ARG_VALUE:
-	case FILTER_ARG_FIELD:
-		return FILTER_VAL_NORM;
-
-	case FILTER_ARG_EXP:
-		lval = test_arg(arg, arg->exp.left);
-		if (lval != FILTER_VAL_NORM)
-			return lval;
-		rval = test_arg(arg, arg->exp.right);
-		if (rval != FILTER_VAL_NORM)
-			return rval;
-		return FILTER_VAL_NORM;
-
-	case FILTER_ARG_NUM:
-		lval = test_arg(arg, arg->num.left);
-		if (lval != FILTER_VAL_NORM)
-			return lval;
-		rval = test_arg(arg, arg->num.right);
-		if (rval != FILTER_VAL_NORM)
-			return rval;
-		return FILTER_VAL_NORM;
-
-	case FILTER_ARG_OP:
-		if (arg->op.type != FILTER_OP_NOT) {
-			lval = test_arg(arg, arg->op.left);
-			switch (lval) {
-			case FILTER_VAL_NORM:
-				break;
-			case FILTER_VAL_TRUE:
-				if (arg->op.type == FILTER_OP_OR)
-					return FILTER_VAL_TRUE;
-				rval = test_arg(arg, arg->op.right);
-				if (rval != FILTER_VAL_NORM)
-					return rval;
-
-				reparent_op_arg(parent, arg, arg->op.right);
-				return FILTER_VAL_NORM;
-
-			case FILTER_VAL_FALSE:
-				if (arg->op.type == FILTER_OP_AND)
-					return FILTER_VAL_FALSE;
-				rval = test_arg(arg, arg->op.right);
-				if (rval != FILTER_VAL_NORM)
-					return rval;
-
-				reparent_op_arg(parent, arg, arg->op.right);
-				return FILTER_VAL_NORM;
-			}
-		}
-
-		rval = test_arg(arg, arg->op.right);
-		switch (rval) {
-		case FILTER_VAL_NORM:
-			break;
-		case FILTER_VAL_TRUE:
-			if (arg->op.type == FILTER_OP_OR)
-				return FILTER_VAL_TRUE;
-			if (arg->op.type == FILTER_OP_NOT)
-				return FILTER_VAL_FALSE;
-
-			reparent_op_arg(parent, arg, arg->op.left);
-			return FILTER_VAL_NORM;
-
-		case FILTER_VAL_FALSE:
-			if (arg->op.type == FILTER_OP_AND)
-				return FILTER_VAL_FALSE;
-			if (arg->op.type == FILTER_OP_NOT)
-				return FILTER_VAL_TRUE;
-
-			reparent_op_arg(parent, arg, arg->op.left);
-			return FILTER_VAL_NORM;
-		}
-
-		return FILTER_VAL_NORM;
-	default:
-		die("bad arg in filter tree");
-	}
-	return FILTER_VAL_NORM;
-}
-
-/* Remove any unknown event fields */
-static struct filter_arg *collapse_tree(struct filter_arg *arg)
-{
-	enum filter_vals ret;
-
-	ret = test_arg(arg, arg);
-	switch (ret) {
-	case FILTER_VAL_NORM:
-		return arg;
-
-	case FILTER_VAL_TRUE:
-	case FILTER_VAL_FALSE:
-		free_arg(arg);
-		arg = allocate_arg();
-		arg->type = FILTER_ARG_BOOLEAN;
-		arg->boolean.value = ret == FILTER_VAL_TRUE;
-	}
-
-	return arg;
-}
-
-static int
-process_filter(struct event_format *event, struct filter_arg **parg,
-	       char **error_str, int not)
-{
-	enum event_type type;
-	char *token = NULL;
-	struct filter_arg *current_op = NULL;
-	struct filter_arg *current_exp = NULL;
-	struct filter_arg *left_item = NULL;
-	struct filter_arg *arg = NULL;
-	enum op_type op_type;
-	enum filter_op_type btype;
-	enum filter_exp_type etype;
-	enum filter_cmp_type ctype;
-	int ret;
-
-	*parg = NULL;
-
-	do {
-		free(token);
-		type = read_token(&token);
-		switch (type) {
-		case EVENT_SQUOTE:
-		case EVENT_DQUOTE:
-		case EVENT_ITEM:
-			arg = create_arg_item(event, token, type, error_str);
-			if (!arg)
-				goto fail;
-			if (!left_item)
-				left_item = arg;
-			else if (current_exp) {
-				ret = add_right(current_exp, arg, error_str);
-				if (ret < 0)
-					goto fail;
-				left_item = NULL;
-				/* Not's only one one expression */
-				if (not) {
-					arg = NULL;
-					if (current_op)
-						goto fail_print;
-					free(token);
-					*parg = current_exp;
-					return 0;
-				}
-			} else
-				goto fail_print;
-			arg = NULL;
-			break;
-
-		case EVENT_DELIM:
-			if (*token == ',') {
-				show_error(error_str,
-					   "Illegal token ','");
-				goto fail;
-			}
-
-			if (*token == '(') {
-				if (left_item) {
-					show_error(error_str,
-						   "Open paren can not come after item");
-					goto fail;
-				}
-				if (current_exp) {
-					show_error(error_str,
-						   "Open paren can not come after expression");
-					goto fail;
-				}
-
-				ret = process_filter(event, &arg, error_str, 0);
-				if (ret != 1) {
-					if (ret == 0)
-						show_error(error_str,
-							   "Unbalanced number of '('");
-					goto fail;
-				}
-				ret = 0;
-
-				/* A not wants just one expression */
-				if (not) {
-					if (current_op)
-						goto fail_print;
-					*parg = arg;
-					return 0;
-				}
-
-				if (current_op)
-					ret = add_right(current_op, arg, error_str);
-				else
-					current_exp = arg;
-
-				if (ret < 0)
-					goto fail;
-
-			} else { /* ')' */
-				if (!current_op && !current_exp)
-					goto fail_print;
-
-				/* Make sure everything is finished at this level */
-				if (current_exp && !check_op_done(current_exp))
-					goto fail_print;
-				if (current_op && !check_op_done(current_op))
-					goto fail_print;
-
-				if (current_op)
-					*parg = current_op;
-				else
-					*parg = current_exp;
-				return 1;
-			}
-			break;
-
-		case EVENT_OP:
-			op_type = process_op(token, &btype, &ctype, &etype);
-
-			/* All expect a left arg except for NOT */
-			switch (op_type) {
-			case OP_BOOL:
-				/* Logic ops need a left expression */
-				if (!current_exp && !current_op)
-					goto fail_print;
-				/* fall through */
-			case OP_NOT:
-				/* logic only processes ops and exp */
-				if (left_item)
-					goto fail_print;
-				break;
-			case OP_EXP:
-			case OP_CMP:
-				if (!left_item)
-					goto fail_print;
-				break;
-			case OP_NONE:
-				show_error(error_str,
-					   "Unknown op token %s", token);
-				goto fail;
-			}
-
-			ret = 0;
-			switch (op_type) {
-			case OP_BOOL:
-				arg = create_arg_op(btype);
-				if (current_op)
-					ret = add_left(arg, current_op);
-				else
-					ret = add_left(arg, current_exp);
-				current_op = arg;
-				current_exp = NULL;
-				break;
-
-			case OP_NOT:
-				arg = create_arg_op(btype);
-				if (current_op)
-					ret = add_right(current_op, arg, error_str);
-				if (ret < 0)
-					goto fail;
-				current_exp = arg;
-				ret = process_filter(event, &arg, error_str, 1);
-				if (ret < 0)
-					goto fail;
-				ret = add_right(current_exp, arg, error_str);
-				if (ret < 0)
-					goto fail;
-				break;
-
-			case OP_EXP:
-			case OP_CMP:
-				if (op_type == OP_EXP)
-					arg = create_arg_exp(etype);
-				else
-					arg = create_arg_cmp(ctype);
-
-				if (current_op)
-					ret = add_right(current_op, arg, error_str);
-				if (ret < 0)
-					goto fail;
-				ret = add_left(arg, left_item);
-				if (ret < 0) {
-					arg = NULL;
-					goto fail_print;
-				}
-				current_exp = arg;
-				break;
-			default:
-				break;
-			}
-			arg = NULL;
-			if (ret < 0)
-				goto fail_print;
-			break;
-		case EVENT_NONE:
-			break;
-		default:
-			goto fail_print;
-		}
-	} while (type != EVENT_NONE);
-
-	if (!current_op && !current_exp)
-		goto fail_print;
-
-	if (!current_op)
-		current_op = current_exp;
-
-	current_op = collapse_tree(current_op);
-
-	*parg = current_op;
-
-	return 0;
-
- fail_print:
-	show_error(error_str, "Syntax error");
- fail:
-	free_arg(current_op);
-	free_arg(current_exp);
-	free_arg(arg);
-	free(token);
-	return -1;
-}
-
-static int
-process_event(struct event_format *event, const char *filter_str,
-	      struct filter_arg **parg, char **error_str)
-{
-	int ret;
-
-	pevent_buffer_init(filter_str, strlen(filter_str));
-
-	ret = process_filter(event, parg, error_str, 0);
-	if (ret == 1) {
-		show_error(error_str,
-			   "Unbalanced number of ')'");
-		return -1;
-	}
-	if (ret < 0)
-		return ret;
-
-	/* If parg is NULL, then make it into FALSE */
-	if (!*parg) {
-		*parg = allocate_arg();
-		(*parg)->type = FILTER_ARG_BOOLEAN;
-		(*parg)->boolean.value = FILTER_FALSE;
-	}
-
-	return 0;
-}
-
-static int filter_event(struct event_filter *filter,
-			struct event_format *event,
-			const char *filter_str, char **error_str)
-{
-	struct filter_type *filter_type;
-	struct filter_arg *arg;
-	int ret;
-
-	if (filter_str) {
-		ret = process_event(event, filter_str, &arg, error_str);
-		if (ret < 0)
-			return ret;
-
-	} else {
-		/* just add a TRUE arg */
-		arg = allocate_arg();
-		arg->type = FILTER_ARG_BOOLEAN;
-		arg->boolean.value = FILTER_TRUE;
-	}
-
-	filter_type = add_filter_type(filter, event->id);
-	if (filter_type->filter)
-		free_arg(filter_type->filter);
-	filter_type->filter = arg;
-
-	return 0;
-}
-
-/**
- * pevent_filter_add_filter_str - add a new filter
- * @filter: the event filter to add to
- * @filter_str: the filter string that contains the filter
- * @error_str: string containing reason for failed filter
- *
- * Returns 0 if the filter was successfully added
- *   -1 if there was an error.
- *
- * On error, if @error_str points to a string pointer,
- * it is set to the reason that the filter failed.
- * This string must be freed with "free".
- */
-int pevent_filter_add_filter_str(struct event_filter *filter,
-				 const char *filter_str,
-				 char **error_str)
-{
-	struct pevent *pevent = filter->pevent;
-	struct event_list *event;
-	struct event_list *events = NULL;
-	const char *filter_start;
-	const char *next_event;
-	char *this_event;
-	char *event_name = NULL;
-	char *sys_name = NULL;
-	char *sp;
-	int rtn = 0;
-	int len;
-	int ret;
-
-	/* clear buffer to reset show error */
-	pevent_buffer_init("", 0);
-
-	if (error_str)
-		*error_str = NULL;
-
-	filter_start = strchr(filter_str, ':');
-	if (filter_start)
-		len = filter_start - filter_str;
-	else
-		len = strlen(filter_str);
-
-
-	do {
-		next_event = strchr(filter_str, ',');
-		if (next_event &&
-		    (!filter_start || next_event < filter_start))
-			len = next_event - filter_str;
-		else if (filter_start)
-			len = filter_start - filter_str;
-		else
-			len = strlen(filter_str);
-
-		this_event = malloc_or_die(len + 1);
-		memcpy(this_event, filter_str, len);
-		this_event[len] = 0;
-
-		if (next_event)
-			next_event++;
-
-		filter_str = next_event;
-
-		sys_name = strtok_r(this_event, "/", &sp);
-		event_name = strtok_r(NULL, "/", &sp);
-
-		if (!sys_name) {
-			show_error(error_str, "No filter found");
-			/* This can only happen when events is NULL, but still */
-			free_events(events);
-			free(this_event);
-			return -1;
-		}
-
-		/* Find this event */
-		ret = find_event(pevent, &events, strim(sys_name), strim(event_name));
-		if (ret < 0) {
-			if (event_name)
-				show_error(error_str,
-					   "No event found under '%s.%s'",
-					   sys_name, event_name);
-			else
-				show_error(error_str,
-					   "No event found under '%s'",
-					   sys_name);
-			free_events(events);
-			free(this_event);
-			return -1;
-		}
-		free(this_event);
-	} while (filter_str);
-
-	/* Skip the ':' */
-	if (filter_start)
-		filter_start++;
-
-	/* filter starts here */
-	for (event = events; event; event = event->next) {
-		ret = filter_event(filter, event->event, filter_start,
-				   error_str);
-		/* Failures are returned if a parse error happened */
-		if (ret < 0)
-			rtn = ret;
-
-		if (ret >= 0 && pevent->test_filters) {
-			char *test;
-			test = pevent_filter_make_string(filter, event->event->id);
-			printf(" '%s: %s'\n", event->event->name, test);
-			free(test);
-		}
-	}
-
-	free_events(events);
-
-	if (rtn >= 0 && pevent->test_filters)
-		exit(0);
-
-	return rtn;
-}
-
-static void free_filter_type(struct filter_type *filter_type)
-{
-	free_arg(filter_type->filter);
-}
-
-/**
- * pevent_filter_remove_event - remove a filter for an event
- * @filter: the event filter to remove from
- * @event_id: the event to remove a filter for
- *
- * Removes the filter saved for an event defined by @event_id
- * from the @filter.
- *
- * Returns 1: if an event was removed
- *   0: if the event was not found
- */
-int pevent_filter_remove_event(struct event_filter *filter,
-			       int event_id)
-{
-	struct filter_type *filter_type;
-	unsigned long len;
-
-	if (!filter->filters)
-		return 0;
-
-	filter_type = find_filter_type(filter, event_id);
-
-	if (!filter_type)
-		return 0;
-
-	free_filter_type(filter_type);
-
-	/* The filter_type points into the event_filters array */
-	len = (unsigned long)(filter->event_filters + filter->filters) -
-		(unsigned long)(filter_type + 1);
-
-	memmove(filter_type, filter_type + 1, len);
-	filter->filters--;
-
-	memset(&filter->event_filters[filter->filters], 0,
-	       sizeof(*filter_type));
-
-	return 1;
-}
-
-/**
- * pevent_filter_reset - clear all filters in a filter
- * @filter: the event filter to reset
- *
- * Removes all filters from a filter and resets it.
- */
-void pevent_filter_reset(struct event_filter *filter)
-{
-	int i;
-
-	for (i = 0; i < filter->filters; i++)
-		free_filter_type(&filter->event_filters[i]);
-
-	free(filter->event_filters);
-	filter->filters = 0;
-	filter->event_filters = NULL;
-}
-
-void pevent_filter_free(struct event_filter *filter)
-{
-	pevent_unref(filter->pevent);
-
-	pevent_filter_reset(filter);
-
-	free(filter);
-}
-
-static char *arg_to_str(struct event_filter *filter, struct filter_arg *arg);
-
-static int copy_filter_type(struct event_filter *filter,
-			     struct event_filter *source,
-			     struct filter_type *filter_type)
-{
-	struct filter_arg *arg;
-	struct event_format *event;
-	const char *sys;
-	const char *name;
-	char *str;
-
-	/* Can't assume that the pevent's are the same */
-	sys = filter_type->event->system;
-	name = filter_type->event->name;
-	event = pevent_find_event_by_name(filter->pevent, sys, name);
-	if (!event)
-		return -1;
-
-	str = arg_to_str(source, filter_type->filter);
-	if (!str)
-		return -1;
-
-	if (strcmp(str, "TRUE") == 0 || strcmp(str, "FALSE") == 0) {
-		/* Add trivial event */
-		arg = allocate_arg();
-		arg->type = FILTER_ARG_BOOLEAN;
-		if (strcmp(str, "TRUE") == 0)
-			arg->boolean.value = 1;
-		else
-			arg->boolean.value = 0;
-
-		filter_type = add_filter_type(filter, event->id);
-		filter_type->filter = arg;
-
-		free(str);
-		return 0;
-	}
-
-	filter_event(filter, event, str, NULL);
-	free(str);
-
-	return 0;
-}
-
-/**
- * pevent_filter_copy - copy a filter using another filter
- * @dest - the filter to copy to
- * @source - the filter to copy from
- *
- * Returns 0 on success and -1 if not all filters were copied
- */
-int pevent_filter_copy(struct event_filter *dest, struct event_filter *source)
-{
-	int ret = 0;
-	int i;
-
-	pevent_filter_reset(dest);
-
-	for (i = 0; i < source->filters; i++) {
-		if (copy_filter_type(dest, source, &source->event_filters[i]))
-			ret = -1;
-	}
-	return ret;
-}
-
-
-/**
- * pevent_update_trivial - update the trivial filters with the given filter
- * @dest - the filter to update
- * @source - the filter as the source of the update
- * @type - the type of trivial filter to update.
- *
- * Scan dest for trivial events matching @type to replace with the source.
- *
- * Returns 0 on success and -1 if there was a problem updating, but
- *   events may have still been updated on error.
- */
-int pevent_update_trivial(struct event_filter *dest, struct event_filter *source,
-			  enum filter_trivial_type type)
-{
-	struct pevent *src_pevent;
-	struct pevent *dest_pevent;
-	struct event_format *event;
-	struct filter_type *filter_type;
-	struct filter_arg *arg;
-	char *str;
-	int i;
-
-	src_pevent = source->pevent;
-	dest_pevent = dest->pevent;
-
-	/* Do nothing if either of the filters has nothing to filter */
-	if (!dest->filters || !source->filters)
-		return 0;
-
-	for (i = 0; i < dest->filters; i++) {
-		filter_type = &dest->event_filters[i];
-		arg = filter_type->filter;
-		if (arg->type != FILTER_ARG_BOOLEAN)
-			continue;
-		if ((arg->boolean.value && type == FILTER_TRIVIAL_FALSE) ||
-		    (!arg->boolean.value && type == FILTER_TRIVIAL_TRUE))
-			continue;
-
-		event = filter_type->event;
-
-		if (src_pevent != dest_pevent) {
-			/* do a look up */
-			event = pevent_find_event_by_name(src_pevent,
-							  event->system,
-							  event->name);
-			if (!event)
-				return -1;
-		}
-
-		str = pevent_filter_make_string(source, event->id);
-		if (!str)
-			continue;
-
-		/* Don't bother if the filter is trivial too */
-		if (strcmp(str, "TRUE") != 0 && strcmp(str, "FALSE") != 0)
-			filter_event(dest, event, str, NULL);
-		free(str);
-	}
-	return 0;
-}
-
-/**
- * pevent_filter_clear_trivial - clear TRUE and FALSE filters
- * @filter: the filter to remove trivial filters from
- * @type: remove only true, false, or both
- *
- * Removes filters that only contain a TRUE or FALES boolean arg.
- */
-void pevent_filter_clear_trivial(struct event_filter *filter,
-				 enum filter_trivial_type type)
-{
-	struct filter_type *filter_type;
-	int count = 0;
-	int *ids = NULL;
-	int i;
-
-	if (!filter->filters)
-		return;
-
-	/*
-	 * Two steps, first get all ids with trivial filters.
-	 *  then remove those ids.
-	 */
-	for (i = 0; i < filter->filters; i++) {
-		filter_type = &filter->event_filters[i];
-		if (filter_type->filter->type != FILTER_ARG_BOOLEAN)
-			continue;
-		switch (type) {
-		case FILTER_TRIVIAL_FALSE:
-			if (filter_type->filter->boolean.value)
-				continue;
-		case FILTER_TRIVIAL_TRUE:
-			if (!filter_type->filter->boolean.value)
-				continue;
-		default:
-			break;
-		}
-
-		ids = realloc(ids, sizeof(*ids) * (count + 1));
-		if (!ids)
-			die("Can't allocate ids");
-		ids[count++] = filter_type->event_id;
-	}
-
-	if (!count)
-		return;
-
-	for (i = 0; i < count; i++)
-		pevent_filter_remove_event(filter, ids[i]);
-
-	free(ids);
-}
-
-/**
- * pevent_filter_event_has_trivial - return true event contains trivial filter
- * @filter: the filter with the information
- * @event_id: the id of the event to test
- * @type: trivial type to test for (TRUE, FALSE, EITHER)
- *
- * Returns 1 if the event contains a matching trivial type
- *  otherwise 0.
- */
-int pevent_filter_event_has_trivial(struct event_filter *filter,
-				    int event_id,
-				    enum filter_trivial_type type)
-{
-	struct filter_type *filter_type;
-
-	if (!filter->filters)
-		return 0;
-
-	filter_type = find_filter_type(filter, event_id);
-
-	if (!filter_type)
-		return 0;
-
-	if (filter_type->filter->type != FILTER_ARG_BOOLEAN)
-		return 0;
-
-	switch (type) {
-	case FILTER_TRIVIAL_FALSE:
-		return !filter_type->filter->boolean.value;
-
-	case FILTER_TRIVIAL_TRUE:
-		return filter_type->filter->boolean.value;
-	default:
-		return 1;
-	}
-}
-
-static int test_filter(struct event_format *event,
-		       struct filter_arg *arg, struct pevent_record *record);
-
-static const char *
-get_comm(struct event_format *event, struct pevent_record *record)
-{
-	const char *comm;
-	int pid;
-
-	pid = pevent_data_pid(event->pevent, record);
-	comm = pevent_data_comm_from_pid(event->pevent, pid);
-	return comm;
-}
-
-static unsigned long long
-get_value(struct event_format *event,
-	  struct format_field *field, struct pevent_record *record)
-{
-	unsigned long long val;
-
-	/* Handle our dummy "comm" field */
-	if (field == &comm) {
-		const char *name;
-
-		name = get_comm(event, record);
-		return (unsigned long)name;
-	}
-
-	pevent_read_number_field(field, record->data, &val);
-
-	if (!(field->flags & FIELD_IS_SIGNED))
-		return val;
-
-	switch (field->size) {
-	case 1:
-		return (char)val;
-	case 2:
-		return (short)val;
-	case 4:
-		return (int)val;
-	case 8:
-		return (long long)val;
-	}
-	return val;
-}
-
-static unsigned long long
-get_arg_value(struct event_format *event, struct filter_arg *arg, struct pevent_record *record);
-
-static unsigned long long
-get_exp_value(struct event_format *event, struct filter_arg *arg, struct pevent_record *record)
-{
-	unsigned long long lval, rval;
-
-	lval = get_arg_value(event, arg->exp.left, record);
-	rval = get_arg_value(event, arg->exp.right, record);
-
-	switch (arg->exp.type) {
-	case FILTER_EXP_ADD:
-		return lval + rval;
-
-	case FILTER_EXP_SUB:
-		return lval - rval;
-
-	case FILTER_EXP_MUL:
-		return lval * rval;
-
-	case FILTER_EXP_DIV:
-		return lval / rval;
-
-	case FILTER_EXP_MOD:
-		return lval % rval;
-
-	case FILTER_EXP_RSHIFT:
-		return lval >> rval;
-
-	case FILTER_EXP_LSHIFT:
-		return lval << rval;
-
-	case FILTER_EXP_AND:
-		return lval & rval;
-
-	case FILTER_EXP_OR:
-		return lval | rval;
-
-	case FILTER_EXP_XOR:
-		return lval ^ rval;
-
-	case FILTER_EXP_NOT:
-	default:
-		die("error in exp");
-	}
-	return 0;
-}
-
-static unsigned long long
-get_arg_value(struct event_format *event, struct filter_arg *arg, struct pevent_record *record)
-{
-	switch (arg->type) {
-	case FILTER_ARG_FIELD:
-		return get_value(event, arg->field.field, record);
-
-	case FILTER_ARG_VALUE:
-		if (arg->value.type != FILTER_NUMBER)
-			die("must have number field!");
-		return arg->value.val;
-
-	case FILTER_ARG_EXP:
-		return get_exp_value(event, arg, record);
-
-	default:
-		die("oops in filter");
-	}
-	return 0;
-}
-
-static int test_num(struct event_format *event,
-		    struct filter_arg *arg, struct pevent_record *record)
-{
-	unsigned long long lval, rval;
-
-	lval = get_arg_value(event, arg->num.left, record);
-	rval = get_arg_value(event, arg->num.right, record);
-
-	switch (arg->num.type) {
-	case FILTER_CMP_EQ:
-		return lval == rval;
-
-	case FILTER_CMP_NE:
-		return lval != rval;
-
-	case FILTER_CMP_GT:
-		return lval > rval;
-
-	case FILTER_CMP_LT:
-		return lval < rval;
-
-	case FILTER_CMP_GE:
-		return lval >= rval;
-
-	case FILTER_CMP_LE:
-		return lval <= rval;
-
-	default:
-		/* ?? */
-		return 0;
-	}
-}
-
-static const char *get_field_str(struct filter_arg *arg, struct pevent_record *record)
-{
-	struct event_format *event;
-	struct pevent *pevent;
-	unsigned long long addr;
-	const char *val = NULL;
-	char hex[64];
-
-	/* If the field is not a string convert it */
-	if (arg->str.field->flags & FIELD_IS_STRING) {
-		val = record->data + arg->str.field->offset;
-
-		/*
-		 * We need to copy the data since we can't be sure the field
-		 * is null terminated.
-		 */
-		if (*(val + arg->str.field->size - 1)) {
-			/* copy it */
-			memcpy(arg->str.buffer, val, arg->str.field->size);
-			/* the buffer is already NULL terminated */
-			val = arg->str.buffer;
-		}
-
-	} else {
-		event = arg->str.field->event;
-		pevent = event->pevent;
-		addr = get_value(event, arg->str.field, record);
-
-		if (arg->str.field->flags & (FIELD_IS_POINTER | FIELD_IS_LONG))
-			/* convert to a kernel symbol */
-			val = pevent_find_function(pevent, addr);
-
-		if (val == NULL) {
-			/* just use the hex of the string name */
-			snprintf(hex, 64, "0x%llx", addr);
-			val = hex;
-		}
-	}
-
-	return val;
-}
-
-static int test_str(struct event_format *event,
-		    struct filter_arg *arg, struct pevent_record *record)
-{
-	const char *val;
-
-	if (arg->str.field == &comm)
-		val = get_comm(event, record);
-	else
-		val = get_field_str(arg, record);
-
-	switch (arg->str.type) {
-	case FILTER_CMP_MATCH:
-		return strcmp(val, arg->str.val) == 0;
-
-	case FILTER_CMP_NOT_MATCH:
-		return strcmp(val, arg->str.val) != 0;
-
-	case FILTER_CMP_REGEX:
-		/* Returns zero on match */
-		return !regexec(&arg->str.reg, val, 0, NULL, 0);
-
-	case FILTER_CMP_NOT_REGEX:
-		return regexec(&arg->str.reg, val, 0, NULL, 0);
-
-	default:
-		/* ?? */
-		return 0;
-	}
-}
-
-static int test_op(struct event_format *event,
-		   struct filter_arg *arg, struct pevent_record *record)
-{
-	switch (arg->op.type) {
-	case FILTER_OP_AND:
-		return test_filter(event, arg->op.left, record) &&
-			test_filter(event, arg->op.right, record);
-
-	case FILTER_OP_OR:
-		return test_filter(event, arg->op.left, record) ||
-			test_filter(event, arg->op.right, record);
-
-	case FILTER_OP_NOT:
-		return !test_filter(event, arg->op.right, record);
-
-	default:
-		/* ?? */
-		return 0;
-	}
-}
-
-static int test_filter(struct event_format *event,
-		       struct filter_arg *arg, struct pevent_record *record)
-{
-	switch (arg->type) {
-	case FILTER_ARG_BOOLEAN:
-		/* easy case */
-		return arg->boolean.value;
-
-	case FILTER_ARG_OP:
-		return test_op(event, arg, record);
-
-	case FILTER_ARG_NUM:
-		return test_num(event, arg, record);
-
-	case FILTER_ARG_STR:
-		return test_str(event, arg, record);
-
-	case FILTER_ARG_EXP:
-	case FILTER_ARG_VALUE:
-	case FILTER_ARG_FIELD:
-		/*
-		 * Expressions, fields and values evaluate
-		 * to true if they return non zero
-		 */
-		return !!get_arg_value(event, arg, record);
-
-	default:
-		die("oops!");
-		/* ?? */
-		return 0;
-	}
-}
-
-/**
- * pevent_event_filtered - return true if event has filter
- * @filter: filter struct with filter information
- * @event_id: event id to test if filter exists
- *
- * Returns 1 if filter found for @event_id
- *   otherwise 0;
- */
-int pevent_event_filtered(struct event_filter *filter,
-			  int event_id)
-{
-	struct filter_type *filter_type;
-
-	if (!filter->filters)
-		return 0;
-
-	filter_type = find_filter_type(filter, event_id);
-
-	return filter_type ? 1 : 0;
-}
-
-/**
- * pevent_filter_match - test if a record matches a filter
- * @filter: filter struct with filter information
- * @record: the record to test against the filter
- *
- * Returns:
- *  1 - filter found for event and @record matches
- *  0 - filter found for event and @record does not match
- * -1 - no filter found for @record's event
- * -2 - if no filters exist
- */
-int pevent_filter_match(struct event_filter *filter,
-			struct pevent_record *record)
-{
-	struct pevent *pevent = filter->pevent;
-	struct filter_type *filter_type;
-	int event_id;
-
-	if (!filter->filters)
-		return FILTER_NONE;
-
-	event_id = pevent_data_type(pevent, record);
-
-	filter_type = find_filter_type(filter, event_id);
-
-	if (!filter_type)
-		return FILTER_NOEXIST;
-
-	return test_filter(filter_type->event, filter_type->filter, record) ?
-		FILTER_MATCH : FILTER_MISS;
-}
-
-static char *op_to_str(struct event_filter *filter, struct filter_arg *arg)
-{
-	char *str = NULL;
-	char *left = NULL;
-	char *right = NULL;
-	char *op = NULL;
-	int left_val = -1;
-	int right_val = -1;
-	int val;
-	int len;
-
-	switch (arg->op.type) {
-	case FILTER_OP_AND:
-		op = "&&";
-		/* fall through */
-	case FILTER_OP_OR:
-		if (!op)
-			op = "||";
-
-		left = arg_to_str(filter, arg->op.left);
-		right = arg_to_str(filter, arg->op.right);
-		if (!left || !right)
-			break;
-
-		/* Try to consolidate boolean values */
-		if (strcmp(left, "TRUE") == 0)
-			left_val = 1;
-		else if (strcmp(left, "FALSE") == 0)
-			left_val = 0;
-
-		if (strcmp(right, "TRUE") == 0)
-			right_val = 1;
-		else if (strcmp(right, "FALSE") == 0)
-			right_val = 0;
-
-		if (left_val >= 0) {
-			if ((arg->op.type == FILTER_OP_AND && !left_val) ||
-			    (arg->op.type == FILTER_OP_OR && left_val)) {
-				/* Just return left value */
-				str = left;
-				left = NULL;
-				break;
-			}
-			if (right_val >= 0) {
-				/* just evaluate this. */
-				val = 0;
-				switch (arg->op.type) {
-				case FILTER_OP_AND:
-					val = left_val && right_val;
-					break;
-				case FILTER_OP_OR:
-					val = left_val || right_val;
-					break;
-				default:
-					break;
-				}
-				str = malloc_or_die(6);
-				if (val)
-					strcpy(str, "TRUE");
-				else
-					strcpy(str, "FALSE");
-				break;
-			}
-		}
-		if (right_val >= 0) {
-			if ((arg->op.type == FILTER_OP_AND && !right_val) ||
-			    (arg->op.type == FILTER_OP_OR && right_val)) {
-				/* Just return right value */
-				str = right;
-				right = NULL;
-				break;
-			}
-			/* The right value is meaningless */
-			str = left;
-			left = NULL;
-			break;
-		}
-
-		len = strlen(left) + strlen(right) + strlen(op) + 10;
-		str = malloc_or_die(len);
-		snprintf(str, len, "(%s) %s (%s)",
-			 left, op, right);
-		break;
-
-	case FILTER_OP_NOT:
-		op = "!";
-		right = arg_to_str(filter, arg->op.right);
-		if (!right)
-			break;
-
-		/* See if we can consolidate */
-		if (strcmp(right, "TRUE") == 0)
-			right_val = 1;
-		else if (strcmp(right, "FALSE") == 0)
-			right_val = 0;
-		if (right_val >= 0) {
-			/* just return the opposite */
-			str = malloc_or_die(6);
-			if (right_val)
-				strcpy(str, "FALSE");
-			else
-				strcpy(str, "TRUE");
-			break;
-		}
-		len = strlen(right) + strlen(op) + 3;
-		str = malloc_or_die(len);
-		snprintf(str, len, "%s(%s)", op, right);
-		break;
-
-	default:
-		/* ?? */
-		break;
-	}
-	free(left);
-	free(right);
-	return str;
-}
-
-static char *val_to_str(struct event_filter *filter, struct filter_arg *arg)
-{
-	char *str;
-
-	str = malloc_or_die(30);
-
-	snprintf(str, 30, "%lld", arg->value.val);
-
-	return str;
-}
-
-static char *field_to_str(struct event_filter *filter, struct filter_arg *arg)
-{
-	return strdup(arg->field.field->name);
-}
-
-static char *exp_to_str(struct event_filter *filter, struct filter_arg *arg)
-{
-	char *lstr;
-	char *rstr;
-	char *op;
-	char *str = NULL;
-	int len;
-
-	lstr = arg_to_str(filter, arg->exp.left);
-	rstr = arg_to_str(filter, arg->exp.right);
-	if (!lstr || !rstr)
-		goto out;
-
-	switch (arg->exp.type) {
-	case FILTER_EXP_ADD:
-		op = "+";
-		break;
-	case FILTER_EXP_SUB:
-		op = "-";
-		break;
-	case FILTER_EXP_MUL:
-		op = "*";
-		break;
-	case FILTER_EXP_DIV:
-		op = "/";
-		break;
-	case FILTER_EXP_MOD:
-		op = "%";
-		break;
-	case FILTER_EXP_RSHIFT:
-		op = ">>";
-		break;
-	case FILTER_EXP_LSHIFT:
-		op = "<<";
-		break;
-	case FILTER_EXP_AND:
-		op = "&";
-		break;
-	case FILTER_EXP_OR:
-		op = "|";
-		break;
-	case FILTER_EXP_XOR:
-		op = "^";
-		break;
-	default:
-		die("oops in exp");
-	}
-
-	len = strlen(op) + strlen(lstr) + strlen(rstr) + 4;
-	str = malloc_or_die(len);
-	snprintf(str, len, "%s %s %s", lstr, op, rstr);
-out:
-	free(lstr);
-	free(rstr);
-
-	return str;
-}
-
-static char *num_to_str(struct event_filter *filter, struct filter_arg *arg)
-{
-	char *lstr;
-	char *rstr;
-	char *str = NULL;
-	char *op = NULL;
-	int len;
-
-	lstr = arg_to_str(filter, arg->num.left);
-	rstr = arg_to_str(filter, arg->num.right);
-	if (!lstr || !rstr)
-		goto out;
-
-	switch (arg->num.type) {
-	case FILTER_CMP_EQ:
-		op = "==";
-		/* fall through */
-	case FILTER_CMP_NE:
-		if (!op)
-			op = "!=";
-		/* fall through */
-	case FILTER_CMP_GT:
-		if (!op)
-			op = ">";
-		/* fall through */
-	case FILTER_CMP_LT:
-		if (!op)
-			op = "<";
-		/* fall through */
-	case FILTER_CMP_GE:
-		if (!op)
-			op = ">=";
-		/* fall through */
-	case FILTER_CMP_LE:
-		if (!op)
-			op = "<=";
-
-		len = strlen(lstr) + strlen(op) + strlen(rstr) + 4;
-		str = malloc_or_die(len);
-		sprintf(str, "%s %s %s", lstr, op, rstr);
-
-		break;
-
-	default:
-		/* ?? */
-		break;
-	}
-
-out:
-	free(lstr);
-	free(rstr);
-	return str;
-}
-
-static char *str_to_str(struct event_filter *filter, struct filter_arg *arg)
-{
-	char *str = NULL;
-	char *op = NULL;
-	int len;
-
-	switch (arg->str.type) {
-	case FILTER_CMP_MATCH:
-		op = "==";
-		/* fall through */
-	case FILTER_CMP_NOT_MATCH:
-		if (!op)
-			op = "!=";
-		/* fall through */
-	case FILTER_CMP_REGEX:
-		if (!op)
-			op = "=~";
-		/* fall through */
-	case FILTER_CMP_NOT_REGEX:
-		if (!op)
-			op = "!~";
-
-		len = strlen(arg->str.field->name) + strlen(op) +
-			strlen(arg->str.val) + 6;
-		str = malloc_or_die(len);
-		snprintf(str, len, "%s %s \"%s\"",
-			 arg->str.field->name,
-			 op, arg->str.val);
-		break;
-
-	default:
-		/* ?? */
-		break;
-	}
-	return str;
-}
-
-static char *arg_to_str(struct event_filter *filter, struct filter_arg *arg)
-{
-	char *str;
-
-	switch (arg->type) {
-	case FILTER_ARG_BOOLEAN:
-		str = malloc_or_die(6);
-		if (arg->boolean.value)
-			strcpy(str, "TRUE");
-		else
-			strcpy(str, "FALSE");
-		return str;
-
-	case FILTER_ARG_OP:
-		return op_to_str(filter, arg);
-
-	case FILTER_ARG_NUM:
-		return num_to_str(filter, arg);
-
-	case FILTER_ARG_STR:
-		return str_to_str(filter, arg);
-
-	case FILTER_ARG_VALUE:
-		return val_to_str(filter, arg);
-
-	case FILTER_ARG_FIELD:
-		return field_to_str(filter, arg);
-
-	case FILTER_ARG_EXP:
-		return exp_to_str(filter, arg);
-
-	default:
-		/* ?? */
-		return NULL;
-	}
-
-}
-
-/**
- * pevent_filter_make_string - return a string showing the filter
- * @filter: filter struct with filter information
- * @event_id: the event id to return the filter string with
- *
- * Returns a string that displays the filter contents.
- *  This string must be freed with free(str).
- *  NULL is returned if no filter is found.
- */
-char *
-pevent_filter_make_string(struct event_filter *filter, int event_id)
-{
-	struct filter_type *filter_type;
-
-	if (!filter->filters)
-		return NULL;
-
-	filter_type = find_filter_type(filter, event_id);
-
-	if (!filter_type)
-		return NULL;
-
-	return arg_to_str(filter, filter_type->filter);
-}
-
-/**
- * pevent_filter_compare - compare two filters and return if they are the same
- * @filter1: Filter to compare with @filter2
- * @filter2: Filter to compare with @filter1
- *
- * Returns:
- *  1 if the two filters hold the same content.
- *  0 if they do not.
- */
-int pevent_filter_compare(struct event_filter *filter1, struct event_filter *filter2)
-{
-	struct filter_type *filter_type1;
-	struct filter_type *filter_type2;
-	char *str1, *str2;
-	int result;
-	int i;
-
-	/* Do the easy checks first */
-	if (filter1->filters != filter2->filters)
-		return 0;
-	if (!filter1->filters && !filter2->filters)
-		return 1;
-
-	/*
-	 * Now take a look at each of the events to see if they have the same
-	 * filters to them.
-	 */
-	for (i = 0; i < filter1->filters; i++) {
-		filter_type1 = &filter1->event_filters[i];
-		filter_type2 = find_filter_type(filter2, filter_type1->event_id);
-		if (!filter_type2)
-			break;
-		if (filter_type1->filter->type != filter_type2->filter->type)
-			break;
-		switch (filter_type1->filter->type) {
-		case FILTER_TRIVIAL_FALSE:
-		case FILTER_TRIVIAL_TRUE:
-			/* trivial types just need the type compared */
-			continue;
-		default:
-			break;
-		}
-		/* The best way to compare complex filters is with strings */
-		str1 = arg_to_str(filter1, filter_type1->filter);
-		str2 = arg_to_str(filter2, filter_type2->filter);
-		if (str1 && str2)
-			result = strcmp(str1, str2) != 0;
-		else
-			/* bail out if allocation fails */
-			result = 1;
-
-		free(str1);
-		free(str2);
-		if (result)
-			break;
-	}
-
-	if (i < filter1->filters)
-		return 0;
-	return 1;
-}
-
diff --git a/src/tools/lib/traceevent/parse-utils.c b/src/tools/lib/traceevent/parse-utils.c
deleted file mode 100644
index bba701c..0000000
--- a/src/tools/lib/traceevent/parse-utils.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License (not later!)
- *
- * 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not,  see <http://www.gnu.org/licenses>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <errno.h>
-
-#define __weak __attribute__((weak))
-
-void __vdie(const char *fmt, va_list ap)
-{
-	int ret = errno;
-
-	if (errno)
-		perror("trace-cmd");
-	else
-		ret = -1;
-
-	fprintf(stderr, "  ");
-	vfprintf(stderr, fmt, ap);
-
-	fprintf(stderr, "\n");
-	exit(ret);
-}
-
-void __die(const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	__vdie(fmt, ap);
-	va_end(ap);
-}
-
-void __weak die(const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	__vdie(fmt, ap);
-	va_end(ap);
-}
-
-void __vwarning(const char *fmt, va_list ap)
-{
-	if (errno)
-		perror("trace-cmd");
-	errno = 0;
-
-	fprintf(stderr, "  ");
-	vfprintf(stderr, fmt, ap);
-
-	fprintf(stderr, "\n");
-}
-
-void __warning(const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	__vwarning(fmt, ap);
-	va_end(ap);
-}
-
-void __weak warning(const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	__vwarning(fmt, ap);
-	va_end(ap);
-}
-
-void __vpr_stat(const char *fmt, va_list ap)
-{
-	vprintf(fmt, ap);
-	printf("\n");
-}
-
-void __pr_stat(const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	__vpr_stat(fmt, ap);
-	va_end(ap);
-}
-
-void __weak vpr_stat(const char *fmt, va_list ap)
-{
-	__vpr_stat(fmt, ap);
-}
-
-void __weak pr_stat(const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	__vpr_stat(fmt, ap);
-	va_end(ap);
-}
-
-void __weak *malloc_or_die(unsigned int size)
-{
-	void *data;
-
-	data = malloc(size);
-	if (!data)
-		die("malloc");
-	return data;
-}
diff --git a/src/tools/lib/traceevent/trace-seq.c b/src/tools/lib/traceevent/trace-seq.c
deleted file mode 100644
index d7f2e68..0000000
--- a/src/tools/lib/traceevent/trace-seq.c
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License (not later!)
- *
- * 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not,  see <http://www.gnu.org/licenses>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-#include "event-parse.h"
-#include "event-utils.h"
-
-/*
- * The TRACE_SEQ_POISON is to catch the use of using
- * a trace_seq structure after it was destroyed.
- */
-#define TRACE_SEQ_POISON	((void *)0xdeadbeef)
-#define TRACE_SEQ_CHECK(s)						\
-do {									\
-	if ((s)->buffer == TRACE_SEQ_POISON)			\
-		die("Usage of trace_seq after it was destroyed");	\
-} while (0)
-
-/**
- * trace_seq_init - initialize the trace_seq structure
- * @s: a pointer to the trace_seq structure to initialize
- */
-void trace_seq_init(struct trace_seq *s)
-{
-	s->len = 0;
-	s->readpos = 0;
-	s->buffer_size = TRACE_SEQ_BUF_SIZE;
-	s->buffer = malloc_or_die(s->buffer_size);
-}
-
-/**
- * trace_seq_reset - re-initialize the trace_seq structure
- * @s: a pointer to the trace_seq structure to reset
- */
-void trace_seq_reset(struct trace_seq *s)
-{
-	if (!s)
-		return;
-	TRACE_SEQ_CHECK(s);
-	s->len = 0;
-	s->readpos = 0;
-}
-
-/**
- * trace_seq_destroy - free up memory of a trace_seq
- * @s: a pointer to the trace_seq to free the buffer
- *
- * Only frees the buffer, not the trace_seq struct itself.
- */
-void trace_seq_destroy(struct trace_seq *s)
-{
-	if (!s)
-		return;
-	TRACE_SEQ_CHECK(s);
-	free(s->buffer);
-	s->buffer = TRACE_SEQ_POISON;
-}
-
-static void expand_buffer(struct trace_seq *s)
-{
-	s->buffer_size += TRACE_SEQ_BUF_SIZE;
-	s->buffer = realloc(s->buffer, s->buffer_size);
-	if (!s->buffer)
-		die("Can't allocate trace_seq buffer memory");
-}
-
-/**
- * trace_seq_printf - sequence printing of trace information
- * @s: trace sequence descriptor
- * @fmt: printf format string
- *
- * It returns 0 if the trace oversizes the buffer's free
- * space, 1 otherwise.
- *
- * The tracer may use either sequence operations or its own
- * copy to user routines. To simplify formating of a trace
- * trace_seq_printf is used to store strings into a special
- * buffer (@s). Then the output may be either used by
- * the sequencer or pulled into another buffer.
- */
-int
-trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
-{
-	va_list ap;
-	int len;
-	int ret;
-
-	TRACE_SEQ_CHECK(s);
-
- try_again:
-	len = (s->buffer_size - 1) - s->len;
-
-	va_start(ap, fmt);
-	ret = vsnprintf(s->buffer + s->len, len, fmt, ap);
-	va_end(ap);
-
-	if (ret >= len) {
-		expand_buffer(s);
-		goto try_again;
-	}
-
-	s->len += ret;
-
-	return 1;
-}
-
-/**
- * trace_seq_vprintf - sequence printing of trace information
- * @s: trace sequence descriptor
- * @fmt: printf format string
- *
- * The tracer may use either sequence operations or its own
- * copy to user routines. To simplify formating of a trace
- * trace_seq_printf is used to store strings into a special
- * buffer (@s). Then the output may be either used by
- * the sequencer or pulled into another buffer.
- */
-int
-trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args)
-{
-	int len;
-	int ret;
-
-	TRACE_SEQ_CHECK(s);
-
- try_again:
-	len = (s->buffer_size - 1) - s->len;
-
-	ret = vsnprintf(s->buffer + s->len, len, fmt, args);
-
-	if (ret >= len) {
-		expand_buffer(s);
-		goto try_again;
-	}
-
-	s->len += ret;
-
-	return len;
-}
-
-/**
- * trace_seq_puts - trace sequence printing of simple string
- * @s: trace sequence descriptor
- * @str: simple string to record
- *
- * The tracer may use either the sequence operations or its own
- * copy to user routines. This function records a simple string
- * into a special buffer (@s) for later retrieval by a sequencer
- * or other mechanism.
- */
-int trace_seq_puts(struct trace_seq *s, const char *str)
-{
-	int len;
-
-	TRACE_SEQ_CHECK(s);
-
-	len = strlen(str);
-
-	while (len > ((s->buffer_size - 1) - s->len))
-		expand_buffer(s);
-
-	memcpy(s->buffer + s->len, str, len);
-	s->len += len;
-
-	return len;
-}
-
-int trace_seq_putc(struct trace_seq *s, unsigned char c)
-{
-	TRACE_SEQ_CHECK(s);
-
-	while (s->len >= (s->buffer_size - 1))
-		expand_buffer(s);
-
-	s->buffer[s->len++] = c;
-
-	return 1;
-}
-
-void trace_seq_terminate(struct trace_seq *s)
-{
-	TRACE_SEQ_CHECK(s);
-
-	/* There's always one character left on the buffer */
-	s->buffer[s->len] = 0;
-}
-
-int trace_seq_do_printf(struct trace_seq *s)
-{
-	TRACE_SEQ_CHECK(s);
-	return printf("%.*s", s->len, s->buffer);
-}
diff --git a/src/tools/perf/Android.mk b/src/tools/perf/Android.mk
deleted file mode 100644
index 0b81231..0000000
--- a/src/tools/perf/Android.mk
+++ /dev/null
@@ -1,258 +0,0 @@
-# Copyright (C) 2013 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH := $(call my-dir)
-
-ifeq ($(TARGET_PRODUCT),sdk)
-supported_platforms := none
-else
-supported_platforms := linux
-endif
-
-cur_platform := $(filter $(HOST_OS),$(supported_platforms))
-
-ifdef cur_platform
-
-perf_arch := $(TARGET_ARCH)
-ifeq ($(TARGET_ARCH), x86_64)
-perf_arch := x86
-endif
-
-ifeq ($(TARGET_ARCH), mips64)
-perf_arch := mips
-endif
-
-perf_src_files := \
-    perf.c \
-    arch/common.c \
-    arch/$(perf_arch)/util/dwarf-regs.c \
-    bench/mem-memcpy.c \
-    bench/mem-memset.c \
-    bench/sched-messaging.c \
-    bench/sched-pipe.c \
-    builtin-annotate.c \
-    builtin-bench.c \
-    builtin-buildid-cache.c \
-    builtin-buildid-list.c \
-    builtin-diff.c \
-    builtin-evlist.c \
-    builtin-help.c \
-    builtin-inject.c \
-    builtin-kmem.c \
-    builtin-kvm.c \
-    builtin-list.c \
-    builtin-lock.c \
-    builtin-mem.c \
-    builtin-probe.c \
-    builtin-record.c \
-    builtin-report.c \
-    builtin-sched.c \
-    builtin-script.c \
-    builtin-stat.c \
-    builtin-timechart.c \
-    builtin-top.c \
-    tests/attr.c \
-    tests/bp_signal.c \
-    tests/bp_signal_overflow.c \
-    tests/builtin-test.c \
-    tests/code-reading.c \
-    tests/dso-data.c \
-    tests/evsel-roundtrip-name.c \
-    tests/evsel-tp-sched.c \
-    tests/hists_link.c \
-    tests/keep-tracking.c \
-    tests/mmap-basic.c \
-    tests/open-syscall-all-cpus.c \
-    tests/open-syscall.c \
-    tests/open-syscall-tp-fields.c \
-    tests/parse-events.c \
-    tests/parse-no-sample-id-all.c \
-    tests/perf-record.c \
-    tests/pmu.c \
-    tests/python-use.c \
-    tests/rdpmc.c \
-    tests/sample-parsing.c \
-    tests/sw-clock.c \
-    tests/task-exit.c \
-    tests/vmlinux-kallsyms.c \
-    ui/helpline.c \
-    ui/hist.c \
-    ui/progress.c \
-    ui/setup.c \
-    ui/stdio/hist.c \
-    ui/util.c \
-    util/abspath.c \
-    util/alias.c \
-    util/annotate.c \
-    util/bitmap.c \
-    util/build-id.c \
-    util/callchain.c \
-    util/cgroup.c \
-    util/color.c \
-    util/config.c \
-    util/cpumap.c \
-    util/ctype.c \
-    util/debug.c \
-    util/dso.c \
-    util/dwarf-aux.c \
-    util/environment.c \
-    util/event.c \
-    util/evlist.c \
-    util/evsel.c \
-    util/exec_cmd.c \
-    util/header.c \
-    util/help.c \
-    util/hist.c \
-    util/hweight.c \
-    util/intlist.c \
-    util/levenshtein.c \
-    util/machine.c \
-    util/map.c \
-    util/pager.c \
-    util/parse-events.c \
-    util/parse-events-bison.c \
-    util/parse-events-flex.c \
-    util/parse-options.c \
-    util/path.c \
-    util/pmu.c \
-    util/pmu-bison.c \
-    util/pmu-flex.c \
-    util/probe-event.c \
-    util/probe-finder.c \
-    util/quote.c \
-    util/rblist.c \
-    util/record.c \
-    util/run-command.c \
-    util/sigchain.c \
-    util/session.c \
-    util/sort.c \
-    util/stat.c \
-    util/strbuf.c \
-    util/string.c \
-    util/strfilter.c \
-    util/strlist.c \
-    util/svghelper.c \
-    util/symbol.c \
-    util/symbol-elf.c \
-    util/sysfs.c \
-    util/target.c \
-    util/thread.c \
-    util/thread_map.c \
-    util/top.c \
-    util/trace-event-info.c \
-    util/trace-event-parse.c \
-    util/trace-event-read.c \
-    util/trace-event-scripting.c \
-    util/usage.c \
-    util/util.c \
-    util/values.c \
-    util/vdso.c \
-    util/wrapper.c \
-    util/xyarray.c \
-    ../lib/lk/debugfs.c \
-    ../lib/traceevent/event-parse.c \
-    ../lib/traceevent/parse-utils.c \
-    ../lib/traceevent/trace-seq.c \
-    ../../lib/rbtree.c
-
-perf_src_files_x86 = \
-    arch/x86/util/tsc.c \
-    tests/perf-time-to-tsc.c \
-
-common_perf_headers := \
-    $(LOCAL_PATH)/../lib \
-    $(LOCAL_PATH)/util/include \
-    $(LOCAL_PATH)/util \
-
-common_clang_compiler_flags := \
-    -Wno-int-conversion \
-    -Wno-tautological-pointer-compare \
-    -Wno-tautological-constant-out-of-range-compare \
-    -Wno-pointer-bool-conversion \
-
-common_compiler_flags := \
-    -include external/linux-tools-perf/android-fixes.h \
-    -Wno-error \
-    -std=gnu99 \
-    -Wno-attributes \
-    -Wno-implicit-function-declaration \
-    -Wno-maybe-uninitialized \
-    -Wno-missing-field-initializers \
-    -Wno-pointer-arith \
-    -Wno-pointer-sign \
-    -Wno-return-type \
-    -Wno-sign-compare \
-    -Wno-unused-parameter \
-
-common_predefined_macros := \
-    -D_GNU_SOURCE \
-    -DDWARF_SUPPORT \
-    -DPYTHON='""' \
-    -DPYTHONPATH='""' \
-    -DBINDIR='""' \
-    -DETC_PERFCONFIG='""' \
-    -DPREFIX='""' \
-    -DPERF_EXEC_PATH='""' \
-    -DPERF_HTML_PATH='""' \
-    -DPERF_MAN_PATH='""' \
-    -DPERF_INFO_PATH='""' \
-    -DPERF_VERSION='"perf.3.12_android"' \
-    -DHAVE_ELF_GETPHDRNUM \
-    -DHAVE_CPLUS_DEMANGLE \
-    -DHAVE_STRLCPY \
-    -DLIBELF_SUPPORT \
-    -DLIBELF_MMAP \
-    -DNO_NEWT_SUPPORT \
-    -DNO_LIBPERL \
-    -DNO_LIBPYTHON \
-    -DNO_GTK2 \
-    -DNO_LIBNUMA \
-    -DNO_LIBAUDIT \
-
-include $(CLEAR_VARS)
-
-# b/17167262, builtin-report.c and builtin-top.c have undefined __aeabi_read_tp
-# when compiled with clang -fpie.
-#
-# Aside from that, this code is not -Wreturn-type safe. Rather than rewriting
-# the bison generated code, just use GCC.
-LOCAL_CLANG := false
-
-LOCAL_SRC_FILES := $(perf_src_files)
-LOCAL_SRC_FILES_x86 := $(perf_src_files_x86)
-LOCAL_SRC_FILES_x86_64 := $(perf_src_files_x86)
-
-# TODO: this is only needed because of libebl below, which seems like a mistake on the target.
-LOCAL_SHARED_LIBRARIES := libdl
-
-# TODO: there's probably more stuff here than is strictly necessary on the target.
-LOCAL_STATIC_LIBRARIES := \
-    libdwfl \
-    libdw \
-    libdwelf \
-    libebl \
-    libelf \
-    libz \
-
-LOCAL_CFLAGS += $(common_predefined_macros)
-LOCAL_CFLAGS += $(common_compiler_flags)
-LOCAL_CLANG_CFLAGS += $(common_clang_compiler_flags)
-LOCAL_C_INCLUDES := $(common_perf_headers) external/elfutils/include/
-
-LOCAL_MODULE := perf
-LOCAL_MODULE_TAGS := eng
-
-include $(BUILD_EXECUTABLE)
-
-endif #cur_platform
diff --git a/src/tools/perf/CREDITS b/src/tools/perf/CREDITS
deleted file mode 100644
index c2ddcb3..0000000
--- a/src/tools/perf/CREDITS
+++ /dev/null
@@ -1,30 +0,0 @@
-Most of the infrastructure that 'perf' uses here has been reused
-from the Git project, as of version:
-
-    66996ec: Sync with 1.6.2.4
-
-Here is an (incomplete!) list of main contributors to those files
-in util/* and elsewhere:
-
- Alex Riesen
- Christian Couder
- Dmitry Potapov
- Jeff King
- Johannes Schindelin
- Johannes Sixt
- Junio C Hamano
- Linus Torvalds
- Matthias Kestenholz
- Michal Ostrowski
- Miklos Vajna
- Petr Baudis
- Pierre Habouzit
- René Scharfe
- Samuel Tardieu
- Shawn O. Pearce
- Steffen Prohaska
- Steve Haslam
-
-Thanks guys!
-
-The full history of the files can be found in the upstream Git commits.
diff --git a/src/tools/perf/Documentation/Makefile b/src/tools/perf/Documentation/Makefile
deleted file mode 100644
index 5a37a7c..0000000
--- a/src/tools/perf/Documentation/Makefile
+++ /dev/null
@@ -1,346 +0,0 @@
-include ../../scripts/Makefile.include
-include ../config/utilities.mak
-
-MAN1_TXT= \
-	$(filter-out $(addsuffix .txt, $(ARTICLES) $(SP_ARTICLES)), \
-		$(wildcard perf-*.txt)) \
-	perf.txt
-MAN5_TXT=
-MAN7_TXT=
-
-MAN_TXT = $(MAN1_TXT) $(MAN5_TXT) $(MAN7_TXT)
-_MAN_XML=$(patsubst %.txt,%.xml,$(MAN_TXT))
-_MAN_HTML=$(patsubst %.txt,%.html,$(MAN_TXT))
-
-MAN_XML=$(addprefix $(OUTPUT),$(_MAN_XML))
-MAN_HTML=$(addprefix $(OUTPUT),$(_MAN_HTML))
-
-ARTICLES =
-# with their own formatting rules.
-SP_ARTICLES =
-API_DOCS = $(patsubst %.txt,%,$(filter-out technical/api-index-skel.txt technical/api-index.txt, $(wildcard technical/api-*.txt)))
-SP_ARTICLES += $(API_DOCS)
-SP_ARTICLES += technical/api-index
-
-_DOC_HTML = $(_MAN_HTML)
-_DOC_HTML+=$(patsubst %,%.html,$(ARTICLES) $(SP_ARTICLES))
-DOC_HTML=$(addprefix $(OUTPUT),$(_DOC_HTML))
-
-_DOC_MAN1=$(patsubst %.txt,%.1,$(MAN1_TXT))
-_DOC_MAN5=$(patsubst %.txt,%.5,$(MAN5_TXT))
-_DOC_MAN7=$(patsubst %.txt,%.7,$(MAN7_TXT))
-
-DOC_MAN1=$(addprefix $(OUTPUT),$(_DOC_MAN1))
-DOC_MAN5=$(addprefix $(OUTPUT),$(_DOC_MAN5))
-DOC_MAN7=$(addprefix $(OUTPUT),$(_DOC_MAN7))
-
-# Make the path relative to DESTDIR, not prefix
-ifndef DESTDIR
-prefix?=$(HOME)
-endif
-bindir?=$(prefix)/bin
-htmldir?=$(prefix)/share/doc/perf-doc
-pdfdir?=$(prefix)/share/doc/perf-doc
-mandir?=$(prefix)/share/man
-man1dir=$(mandir)/man1
-man5dir=$(mandir)/man5
-man7dir=$(mandir)/man7
-
-ASCIIDOC=asciidoc
-ASCIIDOC_EXTRA = --unsafe
-MANPAGE_XSL = manpage-normal.xsl
-XMLTO_EXTRA =
-INSTALL?=install
-RM ?= rm -f
-DOC_REF = origin/man
-HTML_REF = origin/html
-
-infodir?=$(prefix)/share/info
-MAKEINFO=makeinfo
-INSTALL_INFO=install-info
-DOCBOOK2X_TEXI=docbook2x-texi
-DBLATEX=dblatex
-XMLTO=xmlto
-ifndef PERL_PATH
-	PERL_PATH = /usr/bin/perl
-endif
-
--include ../config.mak.autogen
--include ../config.mak
-
-_tmp_tool_path := $(call get-executable,$(ASCIIDOC))
-ifeq ($(_tmp_tool_path),)
-	missing_tools = $(ASCIIDOC)
-endif
-
-_tmp_tool_path := $(call get-executable,$(XMLTO))
-ifeq ($(_tmp_tool_path),)
-	missing_tools += $(XMLTO)
-endif
-
-#
-# For asciidoc ...
-#	-7.1.2,	no extra settings are needed.
-#	8.0-,	set ASCIIDOC8.
-#
-
-#
-# For docbook-xsl ...
-#	-1.68.1,	set ASCIIDOC_NO_ROFF? (based on changelog from 1.73.0)
-#	1.69.0,		no extra settings are needed?
-#	1.69.1-1.71.0,	set DOCBOOK_SUPPRESS_SP?
-#	1.71.1,		no extra settings are needed?
-#	1.72.0,		set DOCBOOK_XSL_172.
-#	1.73.0-,	set ASCIIDOC_NO_ROFF
-#
-
-#
-# If you had been using DOCBOOK_XSL_172 in an attempt to get rid
-# of 'the ".ft C" problem' in your generated manpages, and you
-# instead ended up with weird characters around callouts, try
-# using ASCIIDOC_NO_ROFF instead (it works fine with ASCIIDOC8).
-#
-
-ifdef ASCIIDOC8
-ASCIIDOC_EXTRA += -a asciidoc7compatible
-endif
-ifdef DOCBOOK_XSL_172
-ASCIIDOC_EXTRA += -a perf-asciidoc-no-roff
-MANPAGE_XSL = manpage-1.72.xsl
-else
-	ifdef ASCIIDOC_NO_ROFF
-	# docbook-xsl after 1.72 needs the regular XSL, but will not
-	# pass-thru raw roff codes from asciidoc.conf, so turn them off.
-	ASCIIDOC_EXTRA += -a perf-asciidoc-no-roff
-	endif
-endif
-ifdef MAN_BOLD_LITERAL
-XMLTO_EXTRA += -m manpage-bold-literal.xsl
-endif
-ifdef DOCBOOK_SUPPRESS_SP
-XMLTO_EXTRA += -m manpage-suppress-sp.xsl
-endif
-
-SHELL_PATH ?= $(SHELL)
-# Shell quote;
-SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
-
-#
-# Please note that there is a minor bug in asciidoc.
-# The version after 6.0.3 _will_ include the patch found here:
-#   http://marc.theaimsgroup.com/?l=perf&m=111558757202243&w=2
-#
-# Until that version is released you may have to apply the patch
-# yourself - yes, all 6 characters of it!
-#
-
-QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
-QUIET_SUBDIR1  =
-
-ifneq ($(findstring $(MAKEFLAGS),w),w)
-PRINT_DIR = --no-print-directory
-else # "make -w"
-NO_SUBDIR = :
-endif
-
-ifneq ($(findstring $(MAKEFLAGS),s),s)
-ifneq ($(V),1)
-	QUIET_ASCIIDOC	= @echo '   ' ASCIIDOC $@;
-	QUIET_XMLTO	= @echo '   ' XMLTO $@;
-	QUIET_DB2TEXI	= @echo '   ' DB2TEXI $@;
-	QUIET_MAKEINFO	= @echo '   ' MAKEINFO $@;
-	QUIET_DBLATEX	= @echo '   ' DBLATEX $@;
-	QUIET_XSLTPROC	= @echo '   ' XSLTPROC $@;
-	QUIET_GEN	= @echo '   ' GEN $@;
-	QUIET_STDERR	= 2> /dev/null
-	QUIET_SUBDIR0	= +@subdir=
-	QUIET_SUBDIR1	= ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
-			  $(MAKE) $(PRINT_DIR) -C $$subdir
-	export V
-endif
-endif
-
-all: html man
-
-html: $(DOC_HTML)
-
-$(DOC_HTML) $(DOC_MAN1) $(DOC_MAN5) $(DOC_MAN7): asciidoc.conf
-
-man: man1 man5 man7
-man1: $(DOC_MAN1)
-man5: $(DOC_MAN5)
-man7: $(DOC_MAN7)
-
-info: $(OUTPUT)perf.info $(OUTPUT)perfman.info
-
-pdf: $(OUTPUT)user-manual.pdf
-
-install: install-man
-
-check-man-tools:
-ifdef missing_tools
-	$(error "You need to install $(missing_tools) for man pages")
-endif
-
-do-install-man: man
-	$(INSTALL) -d -m 755 $(DESTDIR)$(man1dir)
-#	$(INSTALL) -d -m 755 $(DESTDIR)$(man5dir)
-#	$(INSTALL) -d -m 755 $(DESTDIR)$(man7dir)
-	$(INSTALL) -m 644 $(DOC_MAN1) $(DESTDIR)$(man1dir)
-#	$(INSTALL) -m 644 $(DOC_MAN5) $(DESTDIR)$(man5dir)
-#	$(INSTALL) -m 644 $(DOC_MAN7) $(DESTDIR)$(man7dir)
-
-install-man: check-man-tools man
-
-try-install-man:
-ifdef missing_tools
-	$(warning Please install $(missing_tools) to have the man pages installed)
-else
-	$(MAKE) do-install-man
-endif
-
-install-info: info
-	$(INSTALL) -d -m 755 $(DESTDIR)$(infodir)
-	$(INSTALL) -m 644 $(OUTPUT)perf.info $(OUTPUT)perfman.info $(DESTDIR)$(infodir)
-	if test -r $(DESTDIR)$(infodir)/dir; then \
-	  $(INSTALL_INFO) --info-dir=$(DESTDIR)$(infodir) perf.info ;\
-	  $(INSTALL_INFO) --info-dir=$(DESTDIR)$(infodir) perfman.info ;\
-	else \
-	  echo "No directory found in $(DESTDIR)$(infodir)" >&2 ; \
-	fi
-
-install-pdf: pdf
-	$(INSTALL) -d -m 755 $(DESTDIR)$(pdfdir)
-	$(INSTALL) -m 644 $(OUTPUT)user-manual.pdf $(DESTDIR)$(pdfdir)
-
-#install-html: html
-#	'$(SHELL_PATH_SQ)' ./install-webdoc.sh $(DESTDIR)$(htmldir)
-
-ifneq ($(MAKECMDGOALS),clean)
-ifneq ($(MAKECMDGOALS),tags)
-$(OUTPUT)PERF-VERSION-FILE: .FORCE-PERF-VERSION-FILE
-	$(QUIET_SUBDIR0)../ $(QUIET_SUBDIR1) $(OUTPUT)PERF-VERSION-FILE
-
--include $(OUTPUT)PERF-VERSION-FILE
-endif
-endif
-
-#
-# Determine "include::" file references in asciidoc files.
-#
-$(OUTPUT)doc.dep : $(wildcard *.txt) build-docdep.perl
-	$(QUIET_GEN)$(RM) $@+ $@ && \
-	$(PERL_PATH) ./build-docdep.perl >$@+ $(QUIET_STDERR) && \
-	mv $@+ $@
-
--include $(OUPTUT)doc.dep
-
-_cmds_txt = cmds-ancillaryinterrogators.txt \
-	cmds-ancillarymanipulators.txt \
-	cmds-mainporcelain.txt \
-	cmds-plumbinginterrogators.txt \
-	cmds-plumbingmanipulators.txt \
-	cmds-synchingrepositories.txt \
-	cmds-synchelpers.txt \
-	cmds-purehelpers.txt \
-	cmds-foreignscminterface.txt
-cmds_txt=$(addprefix $(OUTPUT),$(_cmds_txt))
-
-$(cmds_txt): $(OUTPUT)cmd-list.made
-
-$(OUTPUT)cmd-list.made: cmd-list.perl ../command-list.txt $(MAN1_TXT)
-	$(QUIET_GEN)$(RM) $@ && \
-	$(PERL_PATH) ./cmd-list.perl ../command-list.txt $(QUIET_STDERR) && \
-	date >$@
-
-clean:
-	$(RM) $(MAN_XML) $(addsuffix +,$(MAN_XML))
-	$(RM) $(MAN_HTML) $(addsuffix +,$(MAN_HTML))
-	$(RM) $(DOC_HTML) $(DOC_MAN1) $(DOC_MAN5) $(DOC_MAN7)
-	$(RM) $(OUTPUT)*.texi $(OUTPUT)*.texi+ $(OUTPUT)*.texi++
-	$(RM) $(OUTPUT)perf.info $(OUTPUT)perfman.info
-	$(RM) $(OUTPUT)howto-index.txt $(OUTPUT)howto/*.html $(OUTPUT)doc.dep
-	$(RM) $(OUTPUT)technical/api-*.html $(OUTPUT)technical/api-index.txt
-	$(RM) $(cmds_txt) $(OUTPUT)*.made
-
-$(MAN_HTML): $(OUTPUT)%.html : %.txt
-	$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
-	$(ASCIIDOC) -b xhtml11 -d manpage -f asciidoc.conf \
-		$(ASCIIDOC_EXTRA) -aperf_version=$(PERF_VERSION) -o $@+ $< && \
-	mv $@+ $@
-
-$(OUTPUT)%.1 $(OUTPUT)%.5 $(OUTPUT)%.7 : $(OUTPUT)%.xml
-	$(QUIET_XMLTO)$(RM) $@ && \
-	$(XMLTO) -o $(OUTPUT). -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $<
-
-$(OUTPUT)%.xml : %.txt
-	$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
-	$(ASCIIDOC) -b docbook -d manpage -f asciidoc.conf \
-		$(ASCIIDOC_EXTRA) -aperf_version=$(PERF_VERSION) -o $@+ $< && \
-	mv $@+ $@
-
-XSLT = docbook.xsl
-XSLTOPTS = --xinclude --stringparam html.stylesheet docbook-xsl.css
-
-$(OUTPUT)user-manual.html: $(OUTPUT)user-manual.xml
-	$(QUIET_XSLTPROC)xsltproc $(XSLTOPTS) -o $@ $(XSLT) $<
-
-$(OUTPUT)perf.info: $(OUTPUT)user-manual.texi
-	$(QUIET_MAKEINFO)$(MAKEINFO) --no-split -o $@ $(OUTPUT)user-manual.texi
-
-$(OUTPUT)user-manual.texi: $(OUTPUT)user-manual.xml
-	$(QUIET_DB2TEXI)$(RM) $@+ $@ && \
-	$(DOCBOOK2X_TEXI) $(OUTPUT)user-manual.xml --encoding=UTF-8 --to-stdout >$@++ && \
-	$(PERL_PATH) fix-texi.perl <$@++ >$@+ && \
-	rm $@++ && \
-	mv $@+ $@
-
-$(OUTPUT)user-manual.pdf: $(OUTPUT)user-manual.xml
-	$(QUIET_DBLATEX)$(RM) $@+ $@ && \
-	$(DBLATEX) -o $@+ -p /etc/asciidoc/dblatex/asciidoc-dblatex.xsl -s /etc/asciidoc/dblatex/asciidoc-dblatex.sty $< && \
-	mv $@+ $@
-
-$(OUTPUT)perfman.texi: $(MAN_XML) cat-texi.perl
-	$(QUIET_DB2TEXI)$(RM) $@+ $@ && \
-	($(foreach xml,$(MAN_XML),$(DOCBOOK2X_TEXI) --encoding=UTF-8 \
-		--to-stdout $(xml) &&) true) > $@++ && \
-	$(PERL_PATH) cat-texi.perl $@ <$@++ >$@+ && \
-	rm $@++ && \
-	mv $@+ $@
-
-$(OUTPUT)perfman.info: $(OUTPUT)perfman.texi
-	$(QUIET_MAKEINFO)$(MAKEINFO) --no-split --no-validate $*.texi
-
-$(patsubst %.txt,%.texi,$(MAN_TXT)): %.texi : %.xml
-	$(QUIET_DB2TEXI)$(RM) $@+ $@ && \
-	$(DOCBOOK2X_TEXI) --to-stdout $*.xml >$@+ && \
-	mv $@+ $@
-
-howto-index.txt: howto-index.sh $(wildcard howto/*.txt)
-	$(QUIET_GEN)$(RM) $@+ $@ && \
-	'$(SHELL_PATH_SQ)' ./howto-index.sh $(wildcard howto/*.txt) >$@+ && \
-	mv $@+ $@
-
-$(patsubst %,%.html,$(ARTICLES)) : %.html : %.txt
-	$(QUIET_ASCIIDOC)$(ASCIIDOC) -b xhtml11 $*.txt
-
-WEBDOC_DEST = /pub/software/tools/perf/docs
-
-$(patsubst %.txt,%.html,$(wildcard howto/*.txt)): %.html : %.txt
-	$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
-	sed -e '1,/^$$/d' $< | $(ASCIIDOC) -b xhtml11 - >$@+ && \
-	mv $@+ $@
-
-# UNIMPLEMENTED
-#install-webdoc : html
-#	'$(SHELL_PATH_SQ)' ./install-webdoc.sh $(WEBDOC_DEST)
-
-# quick-install: quick-install-man
-
-# quick-install-man:
-#	'$(SHELL_PATH_SQ)' ./install-doc-quick.sh $(DOC_REF) $(DESTDIR)$(mandir)
-
-#quick-install-html:
-#	'$(SHELL_PATH_SQ)' ./install-doc-quick.sh $(HTML_REF) $(DESTDIR)$(htmldir)
-
-.PHONY: .FORCE-PERF-VERSION-FILE
diff --git a/src/tools/perf/Documentation/android.txt b/src/tools/perf/Documentation/android.txt
deleted file mode 100644
index 8484c3a..0000000
--- a/src/tools/perf/Documentation/android.txt
+++ /dev/null
@@ -1,78 +0,0 @@
-How to compile perf for Android
-=========================================
-
-I. Set the Android NDK environment
-------------------------------------------------
-
-(a). Use the Android NDK
-------------------------------------------------
-1. You need to download and install the Android Native Development Kit (NDK).
-Set the NDK variable to point to the path where you installed the NDK:
-  export NDK=/path/to/android-ndk
-
-2. Set cross-compiling environment variables for NDK toolchain and sysroot.
-For arm:
-  export NDK_TOOLCHAIN=${NDK}/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-
-  export NDK_SYSROOT=${NDK}/platforms/android-9/arch-arm
-For x86:
-  export NDK_TOOLCHAIN=${NDK}/toolchains/x86-4.6/prebuilt/linux-x86/bin/i686-linux-android-
-  export NDK_SYSROOT=${NDK}/platforms/android-9/arch-x86
-
-This method is not working for Android NDK versions up to Revision 8b.
-perf uses some bionic enhancements that are not included in these NDK versions.
-You can use method (b) described below instead.
-
-(b). Use the Android source tree
------------------------------------------------
-1. Download the master branch of the Android source tree.
-Set the environment for the target you want using:
-  source build/envsetup.sh
-  lunch
-
-2. Build your own NDK sysroot to contain latest bionic changes and set the
-NDK sysroot environment variable.
-  cd ${ANDROID_BUILD_TOP}/ndk
-For arm:
-  ./build/tools/build-ndk-sysroot.sh --abi=arm
-  export NDK_SYSROOT=${ANDROID_BUILD_TOP}/ndk/build/platforms/android-3/arch-arm
-For x86:
-  ./build/tools/build-ndk-sysroot.sh --abi=x86
-  export NDK_SYSROOT=${ANDROID_BUILD_TOP}/ndk/build/platforms/android-3/arch-x86
-
-3. Set the NDK toolchain environment variable.
-For arm:
-  export NDK_TOOLCHAIN=${ANDROID_TOOLCHAIN}/arm-linux-androideabi-
-For x86:
-  export NDK_TOOLCHAIN=${ANDROID_TOOLCHAIN}/i686-linux-android-
-
-II. Compile perf for Android
-------------------------------------------------
-You need to run make with the NDK toolchain and sysroot defined above:
-For arm:
-  make ARCH=arm CROSS_COMPILE=${NDK_TOOLCHAIN} CFLAGS="--sysroot=${NDK_SYSROOT}"
-For x86:
-  make ARCH=x86 CROSS_COMPILE=${NDK_TOOLCHAIN} CFLAGS="--sysroot=${NDK_SYSROOT}"
-
-III. Install perf
------------------------------------------------
-You need to connect to your Android device/emulator using adb.
-Install perf using:
-  adb push perf /data/perf
-
-If you also want to use perf-archive you need busybox tools for Android.
-For installing perf-archive, you first need to replace #!/bin/bash with #!/system/bin/sh:
-  sed 's/#!\/bin\/bash/#!\/system\/bin\/sh/g' perf-archive >> /tmp/perf-archive
-  chmod +x /tmp/perf-archive
-  adb push /tmp/perf-archive /data/perf-archive
-
-IV. Environment settings for running perf
-------------------------------------------------
-Some perf features need environment variables to run properly.
-You need to set these before running perf on the target:
-  adb shell
-  # PERF_PAGER=cat
-
-IV. Run perf
-------------------------------------------------
-Run perf on your device/emulator to which you previously connected using adb:
-  # ./data/perf
diff --git a/src/tools/perf/Documentation/asciidoc.conf b/src/tools/perf/Documentation/asciidoc.conf
deleted file mode 100644
index 356b23a..0000000
--- a/src/tools/perf/Documentation/asciidoc.conf
+++ /dev/null
@@ -1,91 +0,0 @@
-## linkperf: macro
-#
-# Usage: linkperf:command[manpage-section]
-#
-# Note, {0} is the manpage section, while {target} is the command.
-#
-# Show PERF link as: <command>(<section>); if section is defined, else just show
-# the command.
-
-[macros]
-(?su)[\\]?(?P<name>linkperf):(?P<target>\S*?)\[(?P<attrlist>.*?)\]=
-
-[attributes]
-asterisk=&#42;
-plus=&#43;
-caret=&#94;
-startsb=&#91;
-endsb=&#93;
-tilde=&#126;
-
-ifdef::backend-docbook[]
-[linkperf-inlinemacro]
-{0%{target}}
-{0#<citerefentry>}
-{0#<refentrytitle>{target}</refentrytitle><manvolnum>{0}</manvolnum>}
-{0#</citerefentry>}
-endif::backend-docbook[]
-
-ifdef::backend-docbook[]
-ifndef::perf-asciidoc-no-roff[]
-# "unbreak" docbook-xsl v1.68 for manpages. v1.69 works with or without this.
-# v1.72 breaks with this because it replaces dots not in roff requests.
-[listingblock]
-<example><title>{title}</title>
-<literallayout>
-ifdef::doctype-manpage[]
-&#10;.ft C&#10;
-endif::doctype-manpage[]
-|
-ifdef::doctype-manpage[]
-&#10;.ft&#10;
-endif::doctype-manpage[]
-</literallayout>
-{title#}</example>
-endif::perf-asciidoc-no-roff[]
-
-ifdef::perf-asciidoc-no-roff[]
-ifdef::doctype-manpage[]
-# The following two small workarounds insert a simple paragraph after screen
-[listingblock]
-<example><title>{title}</title>
-<literallayout>
-|
-</literallayout><simpara></simpara>
-{title#}</example>
-
-[verseblock]
-<formalpara{id? id="{id}"}><title>{title}</title><para>
-{title%}<literallayout{id? id="{id}"}>
-{title#}<literallayout>
-|
-</literallayout>
-{title#}</para></formalpara>
-{title%}<simpara></simpara>
-endif::doctype-manpage[]
-endif::perf-asciidoc-no-roff[]
-endif::backend-docbook[]
-
-ifdef::doctype-manpage[]
-ifdef::backend-docbook[]
-[header]
-template::[header-declarations]
-<refentry>
-<refmeta>
-<refentrytitle>{mantitle}</refentrytitle>
-<manvolnum>{manvolnum}</manvolnum>
-<refmiscinfo class="source">perf</refmiscinfo>
-<refmiscinfo class="version">{perf_version}</refmiscinfo>
-<refmiscinfo class="manual">perf Manual</refmiscinfo>
-</refmeta>
-<refnamediv>
-  <refname>{manname}</refname>
-  <refpurpose>{manpurpose}</refpurpose>
-</refnamediv>
-endif::backend-docbook[]
-endif::doctype-manpage[]
-
-ifdef::backend-xhtml11[]
-[linkperf-inlinemacro]
-<a href="{target}.html">{target}{0?({0})}</a>
-endif::backend-xhtml11[]
diff --git a/src/tools/perf/Documentation/examples.txt b/src/tools/perf/Documentation/examples.txt
deleted file mode 100644
index a4e3921..0000000
--- a/src/tools/perf/Documentation/examples.txt
+++ /dev/null
@@ -1,225 +0,0 @@
-
-		------------------------------
-		****** perf by examples ******
-		------------------------------
-
-[ From an e-mail by Ingo Molnar, http://lkml.org/lkml/2009/8/4/346 ]
-
-
-First, discovery/enumeration of available counters can be done via
-'perf list':
-
-titan:~> perf list
-  [...]
-  kmem:kmalloc                             [Tracepoint event]
-  kmem:kmem_cache_alloc                    [Tracepoint event]
-  kmem:kmalloc_node                        [Tracepoint event]
-  kmem:kmem_cache_alloc_node               [Tracepoint event]
-  kmem:kfree                               [Tracepoint event]
-  kmem:kmem_cache_free                     [Tracepoint event]
-  kmem:mm_page_free                        [Tracepoint event]
-  kmem:mm_page_free_batched                [Tracepoint event]
-  kmem:mm_page_alloc                       [Tracepoint event]
-  kmem:mm_page_alloc_zone_locked           [Tracepoint event]
-  kmem:mm_page_pcpu_drain                  [Tracepoint event]
-  kmem:mm_page_alloc_extfrag               [Tracepoint event]
-
-Then any (or all) of the above event sources can be activated and
-measured. For example the page alloc/free properties of a 'hackbench
-run' are:
-
- titan:~> perf stat -e kmem:mm_page_pcpu_drain -e kmem:mm_page_alloc
- -e kmem:mm_page_free_batched -e kmem:mm_page_free ./hackbench 10
- Time: 0.575
-
- Performance counter stats for './hackbench 10':
-
-          13857  kmem:mm_page_pcpu_drain
-          27576  kmem:mm_page_alloc
-           6025  kmem:mm_page_free_batched
-          20934  kmem:mm_page_free
-
-    0.613972165  seconds time elapsed
-
-You can observe the statistical properties as well, by using the
-'repeat the workload N times' feature of perf stat:
-
- titan:~> perf stat --repeat 5 -e kmem:mm_page_pcpu_drain -e
-   kmem:mm_page_alloc -e kmem:mm_page_free_batched -e
-   kmem:mm_page_free ./hackbench 10
- Time: 0.627
- Time: 0.644
- Time: 0.564
- Time: 0.559
- Time: 0.626
-
- Performance counter stats for './hackbench 10' (5 runs):
-
-          12920  kmem:mm_page_pcpu_drain    ( +-   3.359% )
-          25035  kmem:mm_page_alloc         ( +-   3.783% )
-           6104  kmem:mm_page_free_batched  ( +-   0.934% )
-          18376  kmem:mm_page_free	    ( +-   4.941% )
-
-    0.643954516  seconds time elapsed   ( +-   2.363% )
-
-Furthermore, these tracepoints can be used to sample the workload as
-well. For example the page allocations done by a 'git gc' can be
-captured the following way:
-
- titan:~/git> perf record -e kmem:mm_page_alloc -c 1 ./git gc
- Counting objects: 1148, done.
- Delta compression using up to 2 threads.
- Compressing objects: 100% (450/450), done.
- Writing objects: 100% (1148/1148), done.
- Total 1148 (delta 690), reused 1148 (delta 690)
- [ perf record: Captured and wrote 0.267 MB perf.data (~11679 samples) ]
-
-To check which functions generated page allocations:
-
- titan:~/git> perf report
- # Samples: 10646
- #
- # Overhead          Command               Shared Object
- # ........  ...............  ..........................
- #
-    23.57%       git-repack  /lib64/libc-2.5.so
-    21.81%              git  /lib64/libc-2.5.so
-    14.59%              git  ./git
-    11.79%       git-repack  ./git
-     7.12%              git  /lib64/ld-2.5.so
-     3.16%       git-repack  /lib64/libpthread-2.5.so
-     2.09%       git-repack  /bin/bash
-     1.97%               rm  /lib64/libc-2.5.so
-     1.39%               mv  /lib64/ld-2.5.so
-     1.37%               mv  /lib64/libc-2.5.so
-     1.12%       git-repack  /lib64/ld-2.5.so
-     0.95%               rm  /lib64/ld-2.5.so
-     0.90%  git-update-serv  /lib64/libc-2.5.so
-     0.73%  git-update-serv  /lib64/ld-2.5.so
-     0.68%             perf  /lib64/libpthread-2.5.so
-     0.64%       git-repack  /usr/lib64/libz.so.1.2.3
-
-Or to see it on a more finegrained level:
-
-titan:~/git> perf report --sort comm,dso,symbol
-# Samples: 10646
-#
-# Overhead          Command               Shared Object  Symbol
-# ........  ...............  ..........................  ......
-#
-     9.35%       git-repack  ./git                       [.] insert_obj_hash
-     9.12%              git  ./git                       [.] insert_obj_hash
-     7.31%              git  /lib64/libc-2.5.so          [.] memcpy
-     6.34%       git-repack  /lib64/libc-2.5.so          [.] _int_malloc
-     6.24%       git-repack  /lib64/libc-2.5.so          [.] memcpy
-     5.82%       git-repack  /lib64/libc-2.5.so          [.] __GI___fork
-     5.47%              git  /lib64/libc-2.5.so          [.] _int_malloc
-     2.99%              git  /lib64/libc-2.5.so          [.] memset
-
-Furthermore, call-graph sampling can be done too, of page
-allocations - to see precisely what kind of page allocations there
-are:
-
- titan:~/git> perf record -g -e kmem:mm_page_alloc -c 1 ./git gc
- Counting objects: 1148, done.
- Delta compression using up to 2 threads.
- Compressing objects: 100% (450/450), done.
- Writing objects: 100% (1148/1148), done.
- Total 1148 (delta 690), reused 1148 (delta 690)
- [ perf record: Captured and wrote 0.963 MB perf.data (~42069 samples) ]
-
- titan:~/git> perf report -g
- # Samples: 10686
- #
- # Overhead          Command               Shared Object
- # ........  ...............  ..........................
- #
-    23.25%       git-repack  /lib64/libc-2.5.so
-                |
-                |--50.00%-- _int_free
-                |
-                |--37.50%-- __GI___fork
-                |          make_child
-                |
-                |--12.50%-- ptmalloc_unlock_all2
-                |          make_child
-                |
-                 --6.25%-- __GI_strcpy
-    21.61%              git  /lib64/libc-2.5.so
-                |
-                |--30.00%-- __GI_read
-                |          |
-                |           --83.33%-- git_config_from_file
-                |                     git_config
-                |                     |
-   [...]
-
-Or you can observe the whole system's page allocations for 10
-seconds:
-
-titan:~/git> perf stat -a -e kmem:mm_page_pcpu_drain -e
-kmem:mm_page_alloc -e kmem:mm_page_free_batched -e
-kmem:mm_page_free sleep 10
-
- Performance counter stats for 'sleep 10':
-
-         171585  kmem:mm_page_pcpu_drain
-         322114  kmem:mm_page_alloc
-          73623  kmem:mm_page_free_batched
-         254115  kmem:mm_page_free
-
-   10.000591410  seconds time elapsed
-
-Or observe how fluctuating the page allocations are, via statistical
-analysis done over ten 1-second intervals:
-
- titan:~/git> perf stat --repeat 10 -a -e kmem:mm_page_pcpu_drain -e
-   kmem:mm_page_alloc -e kmem:mm_page_free_batched -e
-   kmem:mm_page_free sleep 1
-
- Performance counter stats for 'sleep 1' (10 runs):
-
-          17254  kmem:mm_page_pcpu_drain    ( +-   3.709% )
-          34394  kmem:mm_page_alloc         ( +-   4.617% )
-           7509  kmem:mm_page_free_batched  ( +-   4.820% )
-          25653  kmem:mm_page_free	    ( +-   3.672% )
-
-    1.058135029  seconds time elapsed   ( +-   3.089% )
-
-Or you can annotate the recorded 'git gc' run on a per symbol basis
-and check which instructions/source-code generated page allocations:
-
- titan:~/git> perf annotate __GI___fork
- ------------------------------------------------
-  Percent |      Source code & Disassembly of libc-2.5.so
- ------------------------------------------------
-          :
-          :
-          :      Disassembly of section .plt:
-          :      Disassembly of section .text:
-          :
-          :      00000031a2e95560 <__fork>:
- [...]
-     0.00 :        31a2e95602:   b8 38 00 00 00          mov    $0x38,%eax
-     0.00 :        31a2e95607:   0f 05                   syscall
-    83.42 :        31a2e95609:   48 3d 00 f0 ff ff       cmp    $0xfffffffffffff000,%rax
-     0.00 :        31a2e9560f:   0f 87 4d 01 00 00       ja     31a2e95762 <__fork+0x202>
-     0.00 :        31a2e95615:   85 c0                   test   %eax,%eax
-
-( this shows that 83.42% of __GI___fork's page allocations come from
-  the 0x38 system call it performs. )
-
-etc. etc. - a lot more is possible. I could list a dozen of
-other different usecases straight away - neither of which is
-possible via /proc/vmstat.
-
-/proc/vmstat is not in the same league really, in terms of
-expressive power of system analysis and performance
-analysis.
-
-All that the above results needed were those new tracepoints
-in include/tracing/events/kmem.h.
-
-	Ingo
-
-
diff --git a/src/tools/perf/Documentation/jit-interface.txt b/src/tools/perf/Documentation/jit-interface.txt
deleted file mode 100644
index a8656f5..0000000
--- a/src/tools/perf/Documentation/jit-interface.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-perf supports a simple JIT interface to resolve symbols for dynamic code generated
-by a JIT.
-
-The JIT has to write a /tmp/perf-%d.map  (%d = pid of process) file
-
-This is a text file.
-
-Each line has the following format, fields separated with spaces:
-
-START SIZE symbolname
-
-START and SIZE are hex numbers without 0x.
-symbolname is the rest of the line, so it could contain special characters.
-
-The ownership of the file has to match the process.
diff --git a/src/tools/perf/Documentation/manpage-1.72.xsl b/src/tools/perf/Documentation/manpage-1.72.xsl
deleted file mode 100644
index b4d315c..0000000
--- a/src/tools/perf/Documentation/manpage-1.72.xsl
+++ /dev/null
@@ -1,14 +0,0 @@
-<!-- manpage-1.72.xsl:
-     special settings for manpages rendered from asciidoc+docbook
-     handles peculiarities in docbook-xsl 1.72.0 -->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-		version="1.0">
-
-<xsl:import href="manpage-base.xsl"/>
-
-<!-- these are the special values for the roff control characters
-     needed for docbook-xsl 1.72.0 -->
-<xsl:param name="git.docbook.backslash">&#x2593;</xsl:param>
-<xsl:param name="git.docbook.dot"      >&#x2302;</xsl:param>
-
-</xsl:stylesheet>
diff --git a/src/tools/perf/Documentation/manpage-base.xsl b/src/tools/perf/Documentation/manpage-base.xsl
deleted file mode 100644
index a264fa6..0000000
--- a/src/tools/perf/Documentation/manpage-base.xsl
+++ /dev/null
@@ -1,35 +0,0 @@
-<!-- manpage-base.xsl:
-     special formatting for manpages rendered from asciidoc+docbook -->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-		version="1.0">
-
-<!-- these params silence some output from xmlto -->
-<xsl:param name="man.output.quietly" select="1"/>
-<xsl:param name="refentry.meta.get.quietly" select="1"/>
-
-<!-- convert asciidoc callouts to man page format;
-     git.docbook.backslash and git.docbook.dot params
-     must be supplied by another XSL file or other means -->
-<xsl:template match="co">
-	<xsl:value-of select="concat(
-			      $git.docbook.backslash,'fB(',
-			      substring-after(@id,'-'),')',
-			      $git.docbook.backslash,'fR')"/>
-</xsl:template>
-<xsl:template match="calloutlist">
-	<xsl:value-of select="$git.docbook.dot"/>
-	<xsl:text>sp&#10;</xsl:text>
-	<xsl:apply-templates/>
-	<xsl:text>&#10;</xsl:text>
-</xsl:template>
-<xsl:template match="callout">
-	<xsl:value-of select="concat(
-			      $git.docbook.backslash,'fB',
-			      substring-after(@arearefs,'-'),
-			      '. ',$git.docbook.backslash,'fR')"/>
-	<xsl:apply-templates/>
-	<xsl:value-of select="$git.docbook.dot"/>
-	<xsl:text>br&#10;</xsl:text>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/src/tools/perf/Documentation/manpage-bold-literal.xsl b/src/tools/perf/Documentation/manpage-bold-literal.xsl
deleted file mode 100644
index 608eb5d..0000000
--- a/src/tools/perf/Documentation/manpage-bold-literal.xsl
+++ /dev/null
@@ -1,17 +0,0 @@
-<!-- manpage-bold-literal.xsl:
-     special formatting for manpages rendered from asciidoc+docbook -->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-		version="1.0">
-
-<!-- render literal text as bold (instead of plain or monospace);
-     this makes literal text easier to distinguish in manpages
-     viewed on a tty -->
-<xsl:template match="literal">
-	<xsl:value-of select="$git.docbook.backslash"/>
-	<xsl:text>fB</xsl:text>
-	<xsl:apply-templates/>
-	<xsl:value-of select="$git.docbook.backslash"/>
-	<xsl:text>fR</xsl:text>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/src/tools/perf/Documentation/manpage-normal.xsl b/src/tools/perf/Documentation/manpage-normal.xsl
deleted file mode 100644
index a48f5b1..0000000
--- a/src/tools/perf/Documentation/manpage-normal.xsl
+++ /dev/null
@@ -1,13 +0,0 @@
-<!-- manpage-normal.xsl:
-     special settings for manpages rendered from asciidoc+docbook
-     handles anything we want to keep away from docbook-xsl 1.72.0 -->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-		version="1.0">
-
-<xsl:import href="manpage-base.xsl"/>
-
-<!-- these are the normal values for the roff control characters -->
-<xsl:param name="git.docbook.backslash">\</xsl:param>
-<xsl:param name="git.docbook.dot"	>.</xsl:param>
-
-</xsl:stylesheet>
diff --git a/src/tools/perf/Documentation/manpage-suppress-sp.xsl b/src/tools/perf/Documentation/manpage-suppress-sp.xsl
deleted file mode 100644
index a63c763..0000000
--- a/src/tools/perf/Documentation/manpage-suppress-sp.xsl
+++ /dev/null
@@ -1,21 +0,0 @@
-<!-- manpage-suppress-sp.xsl:
-     special settings for manpages rendered from asciidoc+docbook
-     handles erroneous, inline .sp in manpage output of some
-     versions of docbook-xsl -->
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-		version="1.0">
-
-<!-- attempt to work around spurious .sp at the tail of the line
-     that some versions of docbook stylesheets seem to add -->
-<xsl:template match="simpara">
-  <xsl:variable name="content">
-    <xsl:apply-templates/>
-  </xsl:variable>
-  <xsl:value-of select="normalize-space($content)"/>
-  <xsl:if test="not(ancestor::authorblurb) and
-                not(ancestor::personblurb)">
-    <xsl:text>&#10;&#10;</xsl:text>
-  </xsl:if>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/src/tools/perf/Documentation/perf-annotate.txt b/src/tools/perf/Documentation/perf-annotate.txt
deleted file mode 100644
index e9cd39a..0000000
--- a/src/tools/perf/Documentation/perf-annotate.txt
+++ /dev/null
@@ -1,101 +0,0 @@
-perf-annotate(1)
-================
-
-NAME
-----
-perf-annotate - Read perf.data (created by perf record) and display annotated code
-
-SYNOPSIS
---------
-[verse]
-'perf annotate' [-i <file> | --input=file] [symbol_name]
-
-DESCRIPTION
------------
-This command reads the input file and displays an annotated version of the
-code. If the object file has debug symbols then the source code will be
-displayed alongside assembly code.
-
-If there is no debug info in the object, then annotated assembly is displayed.
-
-OPTIONS
--------
--i::
---input=::
-        Input file name. (default: perf.data unless stdin is a fifo)
-
--d::
---dsos=<dso[,dso...]>::
-        Only consider symbols in these dsos.
--s::
---symbol=<symbol>::
-        Symbol to annotate.
-
--f::
---force::
-        Don't complain, do it.
-
--v::
---verbose::
-        Be more verbose. (Show symbol address, etc)
-
--D::
---dump-raw-trace::
-        Dump raw trace in ASCII.
-
--k::
---vmlinux=<file>::
-        vmlinux pathname.
-
--m::
---modules::
-        Load module symbols. WARNING: use only with -k and LIVE kernel.
-
--l::
---print-line::
-        Print matching source lines (may be slow).
-
--P::
---full-paths::
-        Don't shorten the displayed pathnames.
-
---stdio:: Use the stdio interface.
-
---tui:: Use the TUI interface. Use of --tui requires a tty, if one is not
-	present, as when piping to other commands, the stdio interface is
-	used. This interfaces starts by centering on the line with more
-	samples, TAB/UNTAB cycles through the lines with more samples.
-
---gtk:: Use the GTK interface.
-
--C::
---cpu:: Only report samples for the list of CPUs provided. Multiple CPUs can
-	be provided as a comma-separated list with no space: 0,1. Ranges of
-	CPUs are specified with -: 0-2. Default is to report samples on all
-	CPUs.
-
---asm-raw::
-	Show raw instruction encoding of assembly instructions.
-
---source::
-	Interleave source code with assembly code. Enabled by default,
-	disable with --no-source.
-
---symfs=<directory>::
-        Look for files with symbols relative to this directory.
-
--M::
---disassembler-style=:: Set disassembler style for objdump.
-
---objdump=<path>::
-        Path to objdump binary.
-
---skip-missing::
-	Skip symbols that cannot be annotated.
-
---group::
-	Show event group information together
-
-SEE ALSO
---------
-linkperf:perf-record[1], linkperf:perf-report[1]
diff --git a/src/tools/perf/Documentation/perf-archive.txt b/src/tools/perf/Documentation/perf-archive.txt
deleted file mode 100644
index 5032a14..0000000
--- a/src/tools/perf/Documentation/perf-archive.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-perf-archive(1)
-===============
-
-NAME
-----
-perf-archive - Create archive with object files with build-ids found in perf.data file
-
-SYNOPSIS
---------
-[verse]
-'perf archive' [file]
-
-DESCRIPTION
------------
-This command runs runs perf-buildid-list --with-hits, and collects the files
-with the buildids found so that analysis of perf.data contents can be possible
-on another machine.
-
-
-SEE ALSO
---------
-linkperf:perf-record[1], linkperf:perf-buildid-list[1], linkperf:perf-report[1]
diff --git a/src/tools/perf/Documentation/perf-bench.txt b/src/tools/perf/Documentation/perf-bench.txt
deleted file mode 100644
index 7065cd6..0000000
--- a/src/tools/perf/Documentation/perf-bench.txt
+++ /dev/null
@@ -1,192 +0,0 @@
-perf-bench(1)
-=============
-
-NAME
-----
-perf-bench - General framework for benchmark suites
-
-SYNOPSIS
---------
-[verse]
-'perf bench' [<common options>] <subsystem> <suite> [<options>]
-
-DESCRIPTION
------------
-This 'perf bench' command is a general framework for benchmark suites.
-
-COMMON OPTIONS
---------------
--f::
---format=::
-Specify format style.
-Current available format styles are:
-
-'default'::
-Default style. This is mainly for human reading.
----------------------
-% perf bench sched pipe                      # with no style specified
-(executing 1000000 pipe operations between two tasks)
-        Total time:5.855 sec
-                5.855061 usecs/op
-		170792 ops/sec
----------------------
-
-'simple'::
-This simple style is friendly for automated
-processing by scripts.
----------------------
-% perf bench --format=simple sched pipe      # specified simple
-5.988
----------------------
-
-SUBSYSTEM
----------
-
-'sched'::
-	Scheduler and IPC mechanisms.
-
-'mem'::
-	Memory access performance.
-
-'all'::
-	All benchmark subsystems.
-
-SUITES FOR 'sched'
-~~~~~~~~~~~~~~~~~~
-*messaging*::
-Suite for evaluating performance of scheduler and IPC mechanisms.
-Based on hackbench by Rusty Russell.
-
-Options of *messaging*
-^^^^^^^^^^^^^^^^^^^^^^
--p::
---pipe::
-Use pipe() instead of socketpair()
-
--t::
---thread::
-Be multi thread instead of multi process
-
--g::
---group=::
-Specify number of groups
-
--l::
---loop=::
-Specify number of loops
-
-Example of *messaging*
-^^^^^^^^^^^^^^^^^^^^^^
-
----------------------
-% perf bench sched messaging                 # run with default
-options (20 sender and receiver processes per group)
-(10 groups == 400 processes run)
-
-      Total time:0.308 sec
-
-% perf bench sched messaging -t -g 20        # be multi-thread, with 20 groups
-(20 sender and receiver threads per group)
-(20 groups == 800 threads run)
-
-      Total time:0.582 sec
----------------------
-
-*pipe*::
-Suite for pipe() system call.
-Based on pipe-test-1m.c by Ingo Molnar.
-
-Options of *pipe*
-^^^^^^^^^^^^^^^^^
--l::
---loop=::
-Specify number of loops.
-
-Example of *pipe*
-^^^^^^^^^^^^^^^^^
-
----------------------
-% perf bench sched pipe
-(executing 1000000 pipe operations between two tasks)
-
-        Total time:8.091 sec
-                8.091833 usecs/op
-                123581 ops/sec
-
-% perf bench sched pipe -l 1000              # loop 1000
-(executing 1000 pipe operations between two tasks)
-
-        Total time:0.016 sec
-                16.948000 usecs/op
-                59004 ops/sec
----------------------
-
-SUITES FOR 'mem'
-~~~~~~~~~~~~~~~~
-*memcpy*::
-Suite for evaluating performance of simple memory copy in various ways.
-
-Options of *memcpy*
-^^^^^^^^^^^^^^^^^^^
--l::
---length::
-Specify length of memory to copy (default: 1MB).
-Available units are B, KB, MB, GB and TB (case insensitive).
-
--r::
---routine::
-Specify routine to copy (default: default).
-Available routines are depend on the architecture.
-On x86-64, x86-64-unrolled, x86-64-movsq and x86-64-movsb are supported.
-
--i::
---iterations::
-Repeat memcpy invocation this number of times.
-
--c::
---cycle::
-Use perf's cpu-cycles event instead of gettimeofday syscall.
-
--o::
---only-prefault::
-Show only the result with page faults before memcpy.
-
--n::
---no-prefault::
-Show only the result without page faults before memcpy.
-
-*memset*::
-Suite for evaluating performance of simple memory set in various ways.
-
-Options of *memset*
-^^^^^^^^^^^^^^^^^^^
--l::
---length::
-Specify length of memory to set (default: 1MB).
-Available units are B, KB, MB, GB and TB (case insensitive).
-
--r::
---routine::
-Specify routine to set (default: default).
-Available routines are depend on the architecture.
-On x86-64, x86-64-unrolled, x86-64-stosq and x86-64-stosb are supported.
-
--i::
---iterations::
-Repeat memset invocation this number of times.
-
--c::
---cycle::
-Use perf's cpu-cycles event instead of gettimeofday syscall.
-
--o::
---only-prefault::
-Show only the result with page faults before memset.
-
--n::
---no-prefault::
-Show only the result without page faults before memset.
-
-SEE ALSO
---------
-linkperf:perf[1]
diff --git a/src/tools/perf/Documentation/perf-buildid-cache.txt b/src/tools/perf/Documentation/perf-buildid-cache.txt
deleted file mode 100644
index e9a8349..0000000
--- a/src/tools/perf/Documentation/perf-buildid-cache.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-perf-buildid-cache(1)
-=====================
-
-NAME
-----
-perf-buildid-cache - Manage build-id cache.
-
-SYNOPSIS
---------
-[verse]
-'perf buildid-cache <options>'
-
-DESCRIPTION
------------
-This command manages the build-id cache. It can add and remove files to/from
-the cache. In the future it should as well purge older entries, set upper
-limits for the space used by the cache, etc.
-
-OPTIONS
--------
--a::
---add=::
-        Add specified file to the cache.
--r::
---remove=::
-        Remove specified file from the cache.
--M::
---missing=:: 
-	List missing build ids in the cache for the specified file.
--u::
---update::
-	Update specified file of the cache. It can be used to update kallsyms
-	kernel dso to vmlinux in order to support annotation.
--v::
---verbose::
-	Be more verbose.
-
-SEE ALSO
---------
-linkperf:perf-record[1], linkperf:perf-report[1], linkperf:perf-buildid-list[1]
diff --git a/src/tools/perf/Documentation/perf-buildid-list.txt b/src/tools/perf/Documentation/perf-buildid-list.txt
deleted file mode 100644
index 25c52ef..0000000
--- a/src/tools/perf/Documentation/perf-buildid-list.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-perf-buildid-list(1)
-====================
-
-NAME
-----
-perf-buildid-list - List the buildids in a perf.data file
-
-SYNOPSIS
---------
-[verse]
-'perf buildid-list <options>'
-
-DESCRIPTION
------------
-This command displays the buildids found in a perf.data file, so that other
-tools can be used to fetch packages with matching symbol tables for use by
-perf report.
-
-It can also be used to show the build id of the running kernel or in an ELF
-file using -i/--input.
-
-OPTIONS
--------
--H::
---with-hits::
-        Show only DSOs with hits.
--i::
---input=::
-        Input file name. (default: perf.data unless stdin is a fifo)
--f::
---force::
-	Don't do ownership validation.
--k::
---kernel::
-	Show running kernel build id.
--v::
---verbose::
-	Be more verbose.
-
-SEE ALSO
---------
-linkperf:perf-record[1], linkperf:perf-top[1],
-linkperf:perf-report[1]
diff --git a/src/tools/perf/Documentation/perf-diff.txt b/src/tools/perf/Documentation/perf-diff.txt
deleted file mode 100644
index fdfceee..0000000
--- a/src/tools/perf/Documentation/perf-diff.txt
+++ /dev/null
@@ -1,190 +0,0 @@
-perf-diff(1)
-============
-
-NAME
-----
-perf-diff - Read perf.data files and display the differential profile
-
-SYNOPSIS
---------
-[verse]
-'perf diff' [baseline file] [data file1] [[data file2] ... ]
-
-DESCRIPTION
------------
-This command displays the performance difference amongst two or more perf.data
-files captured via perf record.
-
-If no parameters are passed it will assume perf.data.old and perf.data.
-
-The differential profile is displayed only for events matching both
-specified perf.data files.
-
-OPTIONS
--------
--D::
---dump-raw-trace::
-        Dump raw trace in ASCII.
-
--m::
---modules::
-        Load module symbols. WARNING: use only with -k and LIVE kernel
-
--d::
---dsos=::
-	Only consider symbols in these dsos. CSV that understands
-	file://filename entries.
-
--C::
---comms=::
-	Only consider symbols in these comms. CSV that understands
-	file://filename entries.
-
--S::
---symbols=::
-	Only consider these symbols. CSV that understands
-	file://filename entries.
-
--s::
---sort=::
-	Sort by key(s): pid, comm, dso, symbol.
-
--t::
---field-separator=::
-
-	Use a special separator character and don't pad with spaces, replacing
-	all occurrences of this separator in symbol names (and other output)
-	with a '.' character, that thus it's the only non valid separator.
-
--v::
---verbose::
-	Be verbose, for instance, show the raw counts in addition to the
-	diff.
-
--f::
---force::
-       Don't complain, do it.
-
---symfs=<directory>::
-        Look for files with symbols relative to this directory.
-
--b::
---baseline-only::
-        Show only items with match in baseline.
-
--c::
---compute::
-        Differential computation selection - delta,ratio,wdiff (default is delta).
-        See COMPARISON METHODS section for more info.
-
--p::
---period::
-        Show period values for both compared hist entries.
-
--F::
---formula::
-        Show formula for given computation.
-
--o::
---order::
-       Specify compute sorting column number.
-
-COMPARISON
-----------
-The comparison is governed by the baseline file. The baseline perf.data
-file is iterated for samples. All other perf.data files specified on
-the command line are searched for the baseline sample pair. If the pair
-is found, specified computation is made and result is displayed.
-
-All samples from non-baseline perf.data files, that do not match any
-baseline entry, are displayed with empty space within baseline column
-and possible computation results (delta) in their related column.
-
-Example files samples:
-- file A with samples f1, f2, f3, f4,    f6
-- file B with samples     f2,     f4, f5
-- file C with samples f1, f2,         f5
-
-Example output:
-  x - computation takes place for pair
-  b - baseline sample percentage
-
-- perf diff A B C
-
-  baseline/A compute/B compute/C  samples
-  ---------------------------------------
-  b                    x          f1
-  b          x         x          f2
-  b                               f3
-  b          x                    f4
-  b                               f6
-             x         x          f5
-
-- perf diff B A C
-
-  baseline/B compute/A compute/C  samples
-  ---------------------------------------
-  b          x         x          f2
-  b          x                    f4
-  b                    x          f5
-             x         x          f1
-             x                    f3
-             x                    f6
-
-- perf diff C B A
-
-  baseline/C compute/B compute/A  samples
-  ---------------------------------------
-  b                    x          f1
-  b          x         x          f2
-  b          x                    f5
-                       x          f3
-             x         x          f4
-                       x          f6
-
-COMPARISON METHODS
-------------------
-delta
-~~~~~
-If specified the 'Delta' column is displayed with value 'd' computed as:
-
-  d = A->period_percent - B->period_percent
-
-with:
-  - A/B being matching hist entry from data/baseline file specified
-    (or perf.data/perf.data.old) respectively.
-
-  - period_percent being the % of the hist entry period value within
-    single data file
-
-ratio
-~~~~~
-If specified the 'Ratio' column is displayed with value 'r' computed as:
-
-  r = A->period / B->period
-
-with:
-  - A/B being matching hist entry from data/baseline file specified
-    (or perf.data/perf.data.old) respectively.
-
-  - period being the hist entry period value
-
-wdiff:WEIGHT-B,WEIGHT-A
-~~~~~~~~~~~~~~~~~~~~~~~
-If specified the 'Weighted diff' column is displayed with value 'd' computed as:
-
-   d = B->period * WEIGHT-A - A->period * WEIGHT-B
-
-  - A/B being matching hist entry from data/baseline file specified
-    (or perf.data/perf.data.old) respectively.
-
-  - period being the hist entry period value
-
-  - WEIGHT-A/WEIGHT-B being user suplied weights in the the '-c' option
-    behind ':' separator like '-c wdiff:1,2'.
-    - WIEGHT-A being the weight of the data file
-    - WIEGHT-B being the weight of the baseline data file
-
-SEE ALSO
---------
-linkperf:perf-record[1]
diff --git a/src/tools/perf/Documentation/perf-evlist.txt b/src/tools/perf/Documentation/perf-evlist.txt
deleted file mode 100644
index 1ceb370..0000000
--- a/src/tools/perf/Documentation/perf-evlist.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-perf-evlist(1)
-==============
-
-NAME
-----
-perf-evlist - List the event names in a perf.data file
-
-SYNOPSIS
---------
-[verse]
-'perf evlist <options>'
-
-DESCRIPTION
------------
-This command displays the names of events sampled in a perf.data file.
-
-OPTIONS
--------
--i::
---input=::
-        Input file name. (default: perf.data unless stdin is a fifo)
-
--F::
---freq=::
-	Show just the sample frequency used for each event.
-
--v::
---verbose=::
-	Show all fields.
-
--g::
---group::
-	Show event group information.
-
-SEE ALSO
---------
-linkperf:perf-record[1], linkperf:perf-list[1],
-linkperf:perf-report[1]
diff --git a/src/tools/perf/Documentation/perf-help.txt b/src/tools/perf/Documentation/perf-help.txt
deleted file mode 100644
index 5143918..0000000
--- a/src/tools/perf/Documentation/perf-help.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-perf-help(1)
-============
-
-NAME
-----
-perf-help - display help information about perf
-
-SYNOPSIS
---------
-'perf help' [-a|--all] [COMMAND]
-
-DESCRIPTION
------------
-
-With no options and no COMMAND given, the synopsis of the 'perf'
-command and a list of the most commonly used perf commands are printed
-on the standard output.
-
-If the option '--all' or '-a' is given, then all available commands are
-printed on the standard output.
-
-If a perf command is named, a manual page for that command is brought
-up. The 'man' program is used by default for this purpose, but this
-can be overridden by other options or configuration variables.
-
-Note that `perf --help ...` is identical to `perf help ...` because the
-former is internally converted into the latter.
-
-OPTIONS
--------
--a::
---all::
-	Prints all the available commands on the standard output. This
-	option supersedes any other option.
-
-PERF
-----
-Part of the linkperf:perf[1] suite
diff --git a/src/tools/perf/Documentation/perf-inject.txt b/src/tools/perf/Documentation/perf-inject.txt
deleted file mode 100644
index a00a342..0000000
--- a/src/tools/perf/Documentation/perf-inject.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-perf-inject(1)
-==============
-
-NAME
-----
-perf-inject - Filter to augment the events stream with additional information
-
-SYNOPSIS
---------
-[verse]
-'perf inject <options>'
-
-DESCRIPTION
------------
-perf-inject reads a perf-record event stream and repipes it to stdout.  At any
-point the processing code can inject other events into the event stream - in
-this case build-ids (-b option) are read and injected as needed into the event
-stream.
-
-Build-ids are just the first user of perf-inject - potentially anything that
-needs userspace processing to augment the events stream with additional
-information could make use of this facility.
-
-OPTIONS
--------
--b::
---build-ids=::
-        Inject build-ids into the output stream
--v::
---verbose::
-	Be more verbose.
--i::
---input=::
-	Input file name. (default: stdin)
--o::
---output=::
-	Output file name. (default: stdout)
--s::
---sched-stat::
-	Merge sched_stat and sched_switch for getting events where and how long
-	tasks slept. sched_switch contains a callchain where a task slept and
-	sched_stat contains a timeslice how long a task slept.
-
-SEE ALSO
---------
-linkperf:perf-record[1], linkperf:perf-report[1], linkperf:perf-archive[1]
diff --git a/src/tools/perf/Documentation/perf-kmem.txt b/src/tools/perf/Documentation/perf-kmem.txt
deleted file mode 100644
index 7c8fbbf..0000000
--- a/src/tools/perf/Documentation/perf-kmem.txt
+++ /dev/null
@@ -1,47 +0,0 @@
-perf-kmem(1)
-============
-
-NAME
-----
-perf-kmem - Tool to trace/measure kernel memory(slab) properties
-
-SYNOPSIS
---------
-[verse]
-'perf kmem' {record|stat} [<options>]
-
-DESCRIPTION
------------
-There are two variants of perf kmem:
-
-  'perf kmem record <command>' to record the kmem events
-  of an arbitrary workload.
-
-  'perf kmem stat' to report kernel memory statistics.
-
-OPTIONS
--------
--i <file>::
---input=<file>::
-	Select the input file (default: perf.data unless stdin is a fifo)
-
---caller::
-	Show per-callsite statistics
-
---alloc::
-	Show per-allocation statistics
-
--s <key[,key2...]>::
---sort=<key[,key2...]>::
-	Sort the output (default: frag,hit,bytes)
-
--l <num>::
---line=<num>::
-	Print n lines only
-
---raw-ip::
-	Print raw ip instead of symbol
-
-SEE ALSO
---------
-linkperf:perf-record[1]
diff --git a/src/tools/perf/Documentation/perf-kvm.txt b/src/tools/perf/Documentation/perf-kvm.txt
deleted file mode 100644
index ac84db2..0000000
--- a/src/tools/perf/Documentation/perf-kvm.txt
+++ /dev/null
@@ -1,142 +0,0 @@
-perf-kvm(1)
-===========
-
-NAME
-----
-perf-kvm - Tool to trace/measure kvm guest os
-
-SYNOPSIS
---------
-[verse]
-'perf kvm' [--host] [--guest] [--guestmount=<path>
-	[--guestkallsyms=<path> --guestmodules=<path> | --guestvmlinux=<path>]]
-	{top|record|report|diff|buildid-list}
-'perf kvm' [--host] [--guest] [--guestkallsyms=<path> --guestmodules=<path>
-	| --guestvmlinux=<path>] {top|record|report|diff|buildid-list|stat}
-'perf kvm stat [record|report|live] [<options>]
-
-DESCRIPTION
------------
-There are a couple of variants of perf kvm:
-
-  'perf kvm [options] top <command>' to generates and displays
-  a performance counter profile of guest os in realtime
-  of an arbitrary workload.
-
-  'perf kvm record <command>' to record the performance counter profile
-  of an arbitrary workload and save it into a perf data file. If both
-  --host and --guest are input, the perf data file name is perf.data.kvm.
-  If there is  no --host but --guest, the file name is perf.data.guest.
-  If there is no --guest but --host, the file name is perf.data.host.
-
-  'perf kvm report' to display the performance counter profile information
-  recorded via perf kvm record.
-
-  'perf kvm diff' to displays the performance difference amongst two perf.data
-  files captured via perf record.
-
-  'perf kvm buildid-list' to  display the buildids found in a perf data file,
-  so that other tools can be used to fetch packages with matching symbol tables
-  for use by perf report.
-
-  'perf kvm stat <command>' to run a command and gather performance counter
-  statistics.
-  Especially, perf 'kvm stat record/report' generates a statistical analysis
-  of KVM events. Currently, vmexit, mmio and ioport events are supported.
-  'perf kvm stat record <command>' records kvm events and the events between
-  start and end <command>.
-  And this command produces a file which contains tracing results of kvm
-  events.
-
-  'perf kvm stat report' reports statistical data which includes events
-  handled time, samples, and so on.
-
-  'perf kvm stat live' reports statistical data in a live mode (similar to
-  record + report but with statistical data updated live at a given display
-  rate).
-
-OPTIONS
--------
--i::
---input=::
-        Input file name.
--o::
---output::
-        Output file name.
---host=::
-        Collect host side performance profile.
---guest=::
-        Collect guest side performance profile.
---guestmount=<path>::
-	Guest os root file system mount directory. Users mounts guest os
-        root directories under <path> by a specific filesystem access method,
-	typically, sshfs. For example, start 2 guest os. The one's pid is 8888
-	and the other's is 9999.
-        #mkdir ~/guestmount; cd ~/guestmount
-        #sshfs -o allow_other,direct_io -p 5551 localhost:/ 8888/
-        #sshfs -o allow_other,direct_io -p 5552 localhost:/ 9999/
-        #perf kvm --host --guest --guestmount=~/guestmount top
---guestkallsyms=<path>::
-        Guest os /proc/kallsyms file copy. 'perf' kvm' reads it to get guest
-	kernel symbols. Users copy it out from guest os.
---guestmodules=<path>::
-	Guest os /proc/modules file copy. 'perf' kvm' reads it to get guest
-	kernel module information. Users copy it out from guest os.
---guestvmlinux=<path>::
-	Guest os kernel vmlinux.
-
-STAT REPORT OPTIONS
--------------------
---vcpu=<value>::
-       analyze events which occures on this vcpu. (default: all vcpus)
-
---event=<value>::
-       event to be analyzed. Possible values: vmexit, mmio, ioport.
-       (default: vmexit)
--k::
---key=<value>::
-       Sorting key. Possible values: sample (default, sort by samples
-       number), time (sort by average time).
--p::
---pid=::
-    Analyze events only for given process ID(s) (comma separated list).
-
-STAT LIVE OPTIONS
------------------
--d::
---display::
-        Time in seconds between display updates
-
--m::
---mmap-pages=::
-    Number of mmap data pages. Must be a power of two.
-
--a::
---all-cpus::
-        System-wide collection from all CPUs.
-
--p::
---pid=::
-    Analyze events only for given process ID(s) (comma separated list).
-
---vcpu=<value>::
-       analyze events which occures on this vcpu. (default: all vcpus)
-
-
---event=<value>::
-       event to be analyzed. Possible values: vmexit, mmio, ioport.
-       (default: vmexit)
-
--k::
---key=<value>::
-       Sorting key. Possible values: sample (default, sort by samples
-       number), time (sort by average time).
-
---duration=<value>::
-       Show events other than HLT that take longer than duration usecs.
-
-SEE ALSO
---------
-linkperf:perf-top[1], linkperf:perf-record[1], linkperf:perf-report[1],
-linkperf:perf-diff[1], linkperf:perf-buildid-list[1],
-linkperf:perf-stat[1]
diff --git a/src/tools/perf/Documentation/perf-list.txt b/src/tools/perf/Documentation/perf-list.txt
deleted file mode 100644
index 6fce6a6..0000000
--- a/src/tools/perf/Documentation/perf-list.txt
+++ /dev/null
@@ -1,122 +0,0 @@
-perf-list(1)
-============
-
-NAME
-----
-perf-list - List all symbolic event types
-
-SYNOPSIS
---------
-[verse]
-'perf list' [hw|sw|cache|tracepoint|pmu|event_glob]
-
-DESCRIPTION
------------
-This command displays the symbolic event types which can be selected in the
-various perf commands with the -e option.
-
-[[EVENT_MODIFIERS]]
-EVENT MODIFIERS
----------------
-
-Events can optionally have a modifer by appending a colon and one or
-more modifiers. Modifiers allow the user to restrict the events to be
-counted. The following modifiers exist:
-
- u - user-space counting
- k - kernel counting
- h - hypervisor counting
- G - guest counting (in KVM guests)
- H - host counting (not in KVM guests)
- p - precise level
- S - read sample value (PERF_SAMPLE_READ)
- D - pin the event to the PMU
-
-The 'p' modifier can be used for specifying how precise the instruction
-address should be. The 'p' modifier can be specified multiple times:
-
- 0 - SAMPLE_IP can have arbitrary skid
- 1 - SAMPLE_IP must have constant skid
- 2 - SAMPLE_IP requested to have 0 skid
- 3 - SAMPLE_IP must have 0 skid
-
-For Intel systems precise event sampling is implemented with PEBS
-which supports up to precise-level 2.
-
-On AMD systems it is implemented using IBS (up to precise-level 2).
-The precise modifier works with event types 0x76 (cpu-cycles, CPU
-clocks not halted) and 0xC1 (micro-ops retired). Both events map to
-IBS execution sampling (IBS op) with the IBS Op Counter Control bit
-(IbsOpCntCtl) set respectively (see AMD64 Architecture Programmer’s
-Manual Volume 2: System Programming, 13.3 Instruction-Based
-Sampling). Examples to use IBS:
-
- perf record -a -e cpu-cycles:p ...    # use ibs op counting cycles
- perf record -a -e r076:p ...          # same as -e cpu-cycles:p
- perf record -a -e r0C1:p ...          # use ibs op counting micro-ops
-
-RAW HARDWARE EVENT DESCRIPTOR
------------------------------
-Even when an event is not available in a symbolic form within perf right now,
-it can be encoded in a per processor specific way.
-
-For instance For x86 CPUs NNN represents the raw register encoding with the
-layout of IA32_PERFEVTSELx MSRs (see [Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3B: System Programming Guide] Figure 30-1 Layout
-of IA32_PERFEVTSELx MSRs) or AMD's PerfEvtSeln (see [AMD64 Architecture Programmer’s Manual Volume 2: System Programming], Page 344,
-Figure 13-7 Performance Event-Select Register (PerfEvtSeln)).
-
-Note: Only the following bit fields can be set in x86 counter
-registers: event, umask, edge, inv, cmask. Esp. guest/host only and
-OS/user mode flags must be setup using <<EVENT_MODIFIERS, EVENT
-MODIFIERS>>.
-
-Example:
-
-If the Intel docs for a QM720 Core i7 describe an event as:
-
-  Event  Umask  Event Mask
-  Num.   Value  Mnemonic    Description                        Comment
-
-  A8H      01H  LSD.UOPS    Counts the number of micro-ops     Use cmask=1 and
-                            delivered by loop stream detector  invert to count
-                                                               cycles
-
-raw encoding of 0x1A8 can be used:
-
- perf stat -e r1a8 -a sleep 1
- perf record -e r1a8 ...
-
-You should refer to the processor specific documentation for getting these
-details. Some of them are referenced in the SEE ALSO section below.
-
-OPTIONS
--------
-
-Without options all known events will be listed.
-
-To limit the list use:
-
-. 'hw' or 'hardware' to list hardware events such as cache-misses, etc.
-
-. 'sw' or 'software' to list software events such as context switches, etc.
-
-. 'cache' or 'hwcache' to list hardware cache events such as L1-dcache-loads, etc.
-
-. 'tracepoint' to list all tracepoint events, alternatively use
-  'subsys_glob:event_glob' to filter by tracepoint subsystems such as sched,
-  block, etc.
-
-. 'pmu' to print the kernel supplied PMU events.
-
-. If none of the above is matched, it will apply the supplied glob to all
-  events, printing the ones that match.
-
-One or more types can be used at the same time, listing the events for the
-types specified.
-
-SEE ALSO
---------
-linkperf:perf-stat[1], linkperf:perf-top[1],
-linkperf:perf-record[1],
-http://www.intel.com/Assets/PDF/manual/253669.pdf[Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3B: System Programming Guide],
-http://support.amd.com/us/Processor_TechDocs/24593_APM_v2.pdf[AMD64 Architecture Programmer’s Manual Volume 2: System Programming]
diff --git a/src/tools/perf/Documentation/perf-lock.txt b/src/tools/perf/Documentation/perf-lock.txt
deleted file mode 100644
index c7f5f55..0000000
--- a/src/tools/perf/Documentation/perf-lock.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-perf-lock(1)
-============
-
-NAME
-----
-perf-lock - Analyze lock events
-
-SYNOPSIS
---------
-[verse]
-'perf lock' {record|report|script|info}
-
-DESCRIPTION
------------
-You can analyze various lock behaviours
-and statistics with this 'perf lock' command.
-
-  'perf lock record <command>' records lock events
-  between start and end <command>. And this command
-  produces the file "perf.data" which contains tracing
-  results of lock events.
-
-  'perf lock report' reports statistical data.
-
-  'perf lock script' shows raw lock events.
-
-  'perf lock info' shows metadata like threads or addresses
-  of lock instances.
-
-COMMON OPTIONS
---------------
-
--i::
---input=<file>::
-        Input file name. (default: perf.data unless stdin is a fifo)
-
--v::
---verbose::
-        Be more verbose (show symbol address, etc).
-
--D::
---dump-raw-trace::
-        Dump raw trace in ASCII.
-
-REPORT OPTIONS
---------------
-
--k::
---key=<value>::
-        Sorting key. Possible values: acquired (default), contended,
-        wait_total, wait_max, wait_min.
-
-INFO OPTIONS
-------------
-
--t::
---threads::
-	dump thread list in perf.data
-
--m::
---map::
-	dump map of lock instances (address:name table)
-
-SEE ALSO
---------
-linkperf:perf[1]
diff --git a/src/tools/perf/Documentation/perf-mem.txt b/src/tools/perf/Documentation/perf-mem.txt
deleted file mode 100644
index 888d511..0000000
--- a/src/tools/perf/Documentation/perf-mem.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-perf-mem(1)
-===========
-
-NAME
-----
-perf-mem - Profile memory accesses
-
-SYNOPSIS
---------
-[verse]
-'perf mem' [<options>] (record [<command>] | report)
-
-DESCRIPTION
------------
-"perf mem -t <TYPE> record" runs a command and gathers memory operation data
-from it, into perf.data. Perf record options are accepted and are passed through.
-
-"perf mem -t <TYPE> report" displays the result. It invokes perf report with the
-right set of options to display a memory access profile.
-
-OPTIONS
--------
-<command>...::
-	Any command you can specify in a shell.
-
--t::
---type=::
-	Select the memory operation type: load or store (default: load)
-
--D::
---dump-raw-samples=::
-	Dump the raw decoded samples on the screen in a format that is easy to parse with
-	one sample per line.
-
--x::
---field-separator::
-	Specify the field separator used when dump raw samples (-D option). By default,
-	The separator is the space character.
-
--C::
---cpu-list::
-	Restrict dump of raw samples to those provided via this option. Note that the same
-	option can be passed in record mode. It will be interpreted the same way as perf
-	record.
-
-SEE ALSO
---------
-linkperf:perf-record[1], linkperf:perf-report[1]
diff --git a/src/tools/perf/Documentation/perf-probe.txt b/src/tools/perf/Documentation/perf-probe.txt
deleted file mode 100644
index b715cb7..0000000
--- a/src/tools/perf/Documentation/perf-probe.txt
+++ /dev/null
@@ -1,205 +0,0 @@
-perf-probe(1)
-=============
-
-NAME
-----
-perf-probe - Define new dynamic tracepoints
-
-SYNOPSIS
---------
-[verse]
-'perf probe' [options] --add='PROBE' [...]
-or
-'perf probe' [options] PROBE
-or
-'perf probe' [options] --del='[GROUP:]EVENT' [...]
-or
-'perf probe' --list
-or
-'perf probe' [options] --line='LINE'
-or
-'perf probe' [options] --vars='PROBEPOINT'
-
-DESCRIPTION
------------
-This command defines dynamic tracepoint events, by symbol and registers
-without debuginfo, or by C expressions (C line numbers, C function names,
-and C local variables) with debuginfo.
-
-
-OPTIONS
--------
--k::
---vmlinux=PATH::
-	Specify vmlinux path which has debuginfo (Dwarf binary).
-
--m::
---module=MODNAME|PATH::
-	Specify module name in which perf-probe searches probe points
-	or lines. If a path of module file is passed, perf-probe
-	treat it as an offline module (this means you can add a probe on
-        a module which has not been loaded yet).
-
--s::
---source=PATH::
-	Specify path to kernel source.
-
--v::
---verbose::
-        Be more verbose (show parsed arguments, etc).
-
--a::
---add=::
-	Define a probe event (see PROBE SYNTAX for detail).
-
--d::
---del=::
-	Delete probe events. This accepts glob wildcards('*', '?') and character
-	classes(e.g. [a-z], [!A-Z]).
-
--l::
---list::
-	List up current probe events.
-
--L::
---line=::
-	Show source code lines which can be probed. This needs an argument
-	which specifies a range of the source code. (see LINE SYNTAX for detail)
-
--V::
---vars=::
-	Show available local variables at given probe point. The argument
-	syntax is same as PROBE SYNTAX, but NO ARGs.
-
---externs::
-	(Only for --vars) Show external defined variables in addition to local
-	variables.
-
--F::
---funcs::
-	Show available functions in given module or kernel. With -x/--exec,
-	can also list functions in a user space executable / shared library.
-
---filter=FILTER::
-	(Only for --vars and --funcs) Set filter. FILTER is a combination of glob
-	pattern, see FILTER PATTERN for detail.
-	Default FILTER is "!__k???tab_* & !__crc_*" for --vars, and "!_*"
-	for --funcs.
-	If several filters are specified, only the last filter is used.
-
--f::
---force::
-	Forcibly add events with existing name.
-
--n::
---dry-run::
-	Dry run. With this option, --add and --del doesn't execute actual
-	adding and removal operations.
-
---max-probes::
-	Set the maximum number of probe points for an event. Default is 128.
-
--x::
---exec=PATH::
-	Specify path to the executable or shared library file for user
-	space tracing. Can also be used with --funcs option.
-
-In absence of -m/-x options, perf probe checks if the first argument after
-the options is an absolute path name. If its an absolute path, perf probe
-uses it as a target module/target user space binary to probe.
-
-PROBE SYNTAX
-------------
-Probe points are defined by following syntax.
-
-    1) Define event based on function name
-     [EVENT=]FUNC[@SRC][:RLN|+OFFS|%return|;PTN] [ARG ...]
-
-    2) Define event based on source file with line number
-     [EVENT=]SRC:ALN [ARG ...]
-
-    3) Define event based on source file with lazy pattern
-     [EVENT=]SRC;PTN [ARG ...]
-
-
-'EVENT' specifies the name of new event, if omitted, it will be set the name of the probed function. Currently, event group name is set as 'probe'.
-'FUNC' specifies a probed function name, and it may have one of the following options; '+OFFS' is the offset from function entry address in bytes, ':RLN' is the relative-line number from function entry line, and '%return' means that it probes function return. And ';PTN' means lazy matching pattern (see LAZY MATCHING). Note that ';PTN' must be the end of the probe point definition.  In addition, '@SRC' specifies a source file which has that function.
-It is also possible to specify a probe point by the source line number or lazy matching by using 'SRC:ALN' or 'SRC;PTN' syntax, where 'SRC' is the source file path, ':ALN' is the line number and ';PTN' is the lazy matching pattern.
-'ARG' specifies the arguments of this probe point, (see PROBE ARGUMENT).
-
-PROBE ARGUMENT
---------------
-Each probe argument follows below syntax.
-
- [NAME=]LOCALVAR|$retval|%REG|@SYMBOL[:TYPE]
-
-'NAME' specifies the name of this argument (optional). You can use the name of local variable, local data structure member (e.g. var->field, var.field2), local array with fixed index (e.g. array[1], var->array[0], var->pointer[2]), or kprobe-tracer argument format (e.g. $retval, %ax, etc). Note that the name of this argument will be set as the last member name if you specify a local data structure member (e.g. field2 for 'var->field1.field2'.)
-'TYPE' casts the type of this argument (optional). If omitted, perf probe automatically set the type based on debuginfo. You can specify 'string' type only for the local variable or structure member which is an array of or a pointer to 'char' or 'unsigned char' type.
-
-LINE SYNTAX
------------
-Line range is described by following syntax.
-
- "FUNC[@SRC][:RLN[+NUM|-RLN2]]|SRC[:ALN[+NUM|-ALN2]]"
-
-FUNC specifies the function name of showing lines. 'RLN' is the start line
-number from function entry line, and 'RLN2' is the end line number. As same as
-probe syntax, 'SRC' means the source file path, 'ALN' is start line number,
-and 'ALN2' is end line number in the file. It is also possible to specify how
-many lines to show by using 'NUM'. Moreover, 'FUNC@SRC' combination is good
-for searching a specific function when several functions share same name.
-So, "source.c:100-120" shows lines between 100th to l20th in source.c file. And "func:10+20" shows 20 lines from 10th line of func function.
-
-LAZY MATCHING
--------------
- The lazy line matching is similar to glob matching but ignoring spaces in both of pattern and target. So this accepts wildcards('*', '?') and character classes(e.g. [a-z], [!A-Z]).
-
-e.g.
- 'a=*' can matches 'a=b', 'a = b', 'a == b' and so on.
-
-This provides some sort of flexibility and robustness to probe point definitions against minor code changes. For example, actual 10th line of schedule() can be moved easily by modifying schedule(), but the same line matching 'rq=cpu_rq*' may still exist in the function.)
-
-FILTER PATTERN
---------------
- The filter pattern is a glob matching pattern(s) to filter variables.
- In addition, you can use "!" for specifying filter-out rule. You also can give several rules combined with "&" or "|", and fold those rules as one rule by using "(" ")".
-
-e.g.
- With --filter "foo* | bar*", perf probe -V shows variables which start with "foo" or "bar".
- With --filter "!foo* & *bar", perf probe -V shows variables which don't start with "foo" and end with "bar", like "fizzbar". But "foobar" is filtered out.
-
-EXAMPLES
---------
-Display which lines in schedule() can be probed:
-
- ./perf probe --line schedule
-
-Add a probe on schedule() function 12th line with recording cpu local variable:
-
- ./perf probe schedule:12 cpu
- or
- ./perf probe --add='schedule:12 cpu'
-
- this will add one or more probes which has the name start with "schedule".
-
- Add probes on lines in schedule() function which calls update_rq_clock().
-
- ./perf probe 'schedule;update_rq_clock*'
- or
- ./perf probe --add='schedule;update_rq_clock*'
-
-Delete all probes on schedule().
-
- ./perf probe --del='schedule*'
-
-Add probes at zfree() function on /bin/zsh
-
- ./perf probe -x /bin/zsh zfree or ./perf probe /bin/zsh zfree
-
-Add probes at malloc() function on libc
-
- ./perf probe -x /lib/libc.so.6 malloc or ./perf probe /lib/libc.so.6 malloc
-
-SEE ALSO
---------
-linkperf:perf-trace[1], linkperf:perf-record[1]
diff --git a/src/tools/perf/Documentation/perf-record.txt b/src/tools/perf/Documentation/perf-record.txt
deleted file mode 100644
index ca0d3d9..0000000
--- a/src/tools/perf/Documentation/perf-record.txt
+++ /dev/null
@@ -1,199 +0,0 @@
-perf-record(1)
-==============
-
-NAME
-----
-perf-record - Run a command and record its profile into perf.data
-
-SYNOPSIS
---------
-[verse]
-'perf record' [-e <EVENT> | --event=EVENT] [-l] [-a] <command>
-'perf record' [-e <EVENT> | --event=EVENT] [-l] [-a] -- <command> [<options>]
-
-DESCRIPTION
------------
-This command runs a command and gathers a performance counter profile
-from it, into perf.data - without displaying anything.
-
-This file can then be inspected later on, using 'perf report'.
-
-
-OPTIONS
--------
-<command>...::
-	Any command you can specify in a shell.
-
--e::
---event=::
-	Select the PMU event. Selection can be:
-
-        - a symbolic event name	(use 'perf list' to list all events)
-
-        - a raw PMU event (eventsel+umask) in the form of rNNN where NNN is a
-	  hexadecimal event descriptor.
-
-        - a hardware breakpoint event in the form of '\mem:addr[:access]'
-          where addr is the address in memory you want to break in.
-          Access is the memory access type (read, write, execute) it can
-          be passed as follows: '\mem:addr[:[r][w][x]]'.
-          If you want to profile read-write accesses in 0x1000, just set
-          'mem:0x1000:rw'.
-
---filter=<filter>::
-        Event filter.
-
--a::
---all-cpus::
-        System-wide collection from all CPUs.
-
--l::
-        Scale counter values.
-
--p::
---pid=::
-	Record events on existing process ID (comma separated list).
-
--t::
---tid=::
-        Record events on existing thread ID (comma separated list).
-
--u::
---uid=::
-        Record events in threads owned by uid. Name or number.
-
--r::
---realtime=::
-	Collect data with this RT SCHED_FIFO priority.
-
--D::
---no-delay::
-	Collect data without buffering.
-
--c::
---count=::
-	Event period to sample.
-
--o::
---output=::
-	Output file name.
-
--i::
---no-inherit::
-	Child tasks do not inherit counters.
--F::
---freq=::
-	Profile at this frequency.
-
--m::
---mmap-pages=::
-	Number of mmap data pages. Must be a power of two.
-
--g::
-	Enables call-graph (stack chain/backtrace) recording.
-
---call-graph::
-	Setup and enable call-graph (stack chain/backtrace) recording,
-	implies -g.
-
-	Allows specifying "fp" (frame pointer) or "dwarf"
-	(DWARF's CFI - Call Frame Information) as the method to collect
-	the information used to show the call graphs.
-
-	In some systems, where binaries are build with gcc
-	--fomit-frame-pointer, using the "fp" method will produce bogus
-	call graphs, using "dwarf", if available (perf tools linked to
-	the libunwind library) should be used instead.
-
--q::
---quiet::
-	Don't print any message, useful for scripting.
-
--v::
---verbose::
-	Be more verbose (show counter open errors, etc).
-
--s::
---stat::
-	Per thread counts.
-
--d::
---data::
-	Sample addresses.
-
--T::
---timestamp::
-	Sample timestamps. Use it with 'perf report -D' to see the timestamps,
-	for instance.
-
--n::
---no-samples::
-	Don't sample.
-
--R::
---raw-samples::
-Collect raw sample records from all opened counters (default for tracepoint counters).
-
--C::
---cpu::
-Collect samples only on the list of CPUs provided. Multiple CPUs can be provided as a
-comma-separated list with no space: 0,1. Ranges of CPUs are specified with -: 0-2.
-In per-thread mode with inheritance mode on (default), samples are captured only when
-the thread executes on the designated CPUs. Default is to monitor all CPUs.
-
--N::
---no-buildid-cache::
-Do not update the builid cache. This saves some overhead in situations
-where the information in the perf.data file (which includes buildids)
-is sufficient.
-
--G name,...::
---cgroup name,...::
-monitor only in the container (cgroup) called "name". This option is available only
-in per-cpu mode. The cgroup filesystem must be mounted. All threads belonging to
-container "name" are monitored when they run on the monitored CPUs. Multiple cgroups
-can be provided. Each cgroup is applied to the corresponding event, i.e., first cgroup
-to first event, second cgroup to second event and so on. It is possible to provide
-an empty cgroup (monitor all the time) using, e.g., -G foo,,bar. Cgroups must have
-corresponding events, i.e., they always refer to events defined earlier on the command
-line.
-
--b::
---branch-any::
-Enable taken branch stack sampling. Any type of taken branch may be sampled.
-This is a shortcut for --branch-filter any. See --branch-filter for more infos.
-
--j::
---branch-filter::
-Enable taken branch stack sampling. Each sample captures a series of consecutive
-taken branches. The number of branches captured with each sample depends on the
-underlying hardware, the type of branches of interest, and the executed code.
-It is possible to select the types of branches captured by enabling filters. The
-following filters are defined:
-
-        - any:  any type of branches
-        - any_call: any function call or system call
-        - any_ret: any function return or system call return
-        - ind_call: any indirect branch
-        - u:  only when the branch target is at the user level
-        - k: only when the branch target is in the kernel
-        - hv: only when the target is at the hypervisor level
-
-+
-The option requires at least one branch type among any, any_call, any_ret, ind_call.
-The privilege levels may be omitted, in which case, the privilege levels of the associated
-event are applied to the branch filter. Both kernel (k) and hypervisor (hv) privilege
-levels are subject to permissions.  When sampling on multiple events, branch stack sampling
-is enabled for all the sampling events. The sampled branch type is the same for all events.
-The various filters must be specified as a comma separated list: --branch-filter any_ret,u,k
-Note that this feature may not be available on all processors.
-
--W::
---weight::
-Enable weightened sampling. An additional weight is recorded per sample and can be
-displayed with the weight and local_weight sort keys.  This currently works for TSX
-abort events and some memory events in precise mode on modern Intel CPUs.
-
-SEE ALSO
---------
-linkperf:perf-stat[1], linkperf:perf-list[1]
diff --git a/src/tools/perf/Documentation/perf-report.txt b/src/tools/perf/Documentation/perf-report.txt
deleted file mode 100644
index 2b8097e..0000000
--- a/src/tools/perf/Documentation/perf-report.txt
+++ /dev/null
@@ -1,228 +0,0 @@
-perf-report(1)
-==============
-
-NAME
-----
-perf-report - Read perf.data (created by perf record) and display the profile
-
-SYNOPSIS
---------
-[verse]
-'perf report' [-i <file> | --input=file]
-
-DESCRIPTION
------------
-This command displays the performance counter profile information recorded
-via perf record.
-
-OPTIONS
--------
--i::
---input=::
-        Input file name. (default: perf.data unless stdin is a fifo)
-
--v::
---verbose::
-        Be more verbose. (show symbol address, etc)
-
--d::
---dsos=::
-	Only consider symbols in these dsos. CSV that understands
-	file://filename entries.
--n::
---show-nr-samples::
-	Show the number of samples for each symbol
-
---showcpuutilization::
-        Show sample percentage for different cpu modes.
-
--T::
---threads::
-	Show per-thread event counters
--c::
---comms=::
-	Only consider symbols in these comms. CSV that understands
-	file://filename entries.
--S::
---symbols=::
-	Only consider these symbols. CSV that understands
-	file://filename entries.
-
---symbol-filter=::
-	Only show symbols that match (partially) with this filter.
-
--U::
---hide-unresolved::
-        Only display entries resolved to a symbol.
-
--s::
---sort=::
-	Sort histogram entries by given key(s) - multiple keys can be specified
-	in CSV format.  Following sort keys are available:
-	pid, comm, dso, symbol, parent, cpu, srcline, weight, local_weight.
-
-	Each key has following meaning:
-
-	- comm: command (name) of the task which can be read via /proc/<pid>/comm
-	- pid: command and tid of the task
-	- dso: name of library or module executed at the time of sample
-	- symbol: name of function executed at the time of sample
-	- parent: name of function matched to the parent regex filter. Unmatched
-	entries are displayed as "[other]".
-	- cpu: cpu number the task ran at the time of sample
-	- srcline: filename and line number executed at the time of sample.  The
-	DWARF debuggin info must be provided.
-
-	By default, comm, dso and symbol keys are used.
-	(i.e. --sort comm,dso,symbol)
-
-	If --branch-stack option is used, following sort keys are also
-	available:
-	dso_from, dso_to, symbol_from, symbol_to, mispredict.
-
-	- dso_from: name of library or module branched from
-	- dso_to: name of library or module branched to
-	- symbol_from: name of function branched from
-	- symbol_to: name of function branched to
-	- mispredict: "N" for predicted branch, "Y" for mispredicted branch
-
-	And default sort keys are changed to comm, dso_from, symbol_from, dso_to
-	and symbol_to, see '--branch-stack'.
-
--p::
---parent=<regex>::
-        A regex filter to identify parent. The parent is a caller of this
-	function and searched through the callchain, thus it requires callchain
-	information recorded. The pattern is in the exteneded regex format and
-	defaults to "\^sys_|^do_page_fault", see '--sort parent'.
-
--x::
---exclude-other::
-        Only display entries with parent-match.
-
--w::
---column-widths=<width[,width...]>::
-	Force each column width to the provided list, for large terminal
-	readability.
-
--t::
---field-separator=::
-	Use a special separator character and don't pad with spaces, replacing
-	all occurrences of this separator in symbol names (and other output)
-	with a '.' character, that thus it's the only non valid separator.
-
--D::
---dump-raw-trace::
-        Dump raw trace in ASCII.
-
--g [type,min[,limit],order[,key]]::
---call-graph::
-        Display call chains using type, min percent threshold, optional print
-	limit and order.
-	type can be either:
-	- flat: single column, linear exposure of call chains.
-	- graph: use a graph tree, displaying absolute overhead rates.
-	- fractal: like graph, but displays relative rates. Each branch of
-		 the tree is considered as a new profiled object. +
-
-	order can be either:
-	- callee: callee based call graph.
-	- caller: inverted caller based call graph.
-
-	key can be:
-	- function: compare on functions
-	- address: compare on individual code addresses
-
-	Default: fractal,0.5,callee,function.
-
--G::
---inverted::
-        alias for inverted caller based call graph.
-
---ignore-callees=<regex>::
-        Ignore callees of the function(s) matching the given regex.
-        This has the effect of collecting the callers of each such
-        function into one place in the call-graph tree.
-
---pretty=<key>::
-        Pretty printing style.  key: normal, raw
-
---stdio:: Use the stdio interface.
-
---tui:: Use the TUI interface, that is integrated with annotate and allows
-        zooming into DSOs or threads, among other features. Use of --tui
-	requires a tty, if one is not present, as when piping to other
-	commands, the stdio interface is used.
-
---gtk:: Use the GTK2 interface.
-
--k::
---vmlinux=<file>::
-        vmlinux pathname
-
---kallsyms=<file>::
-        kallsyms pathname
-
--m::
---modules::
-        Load module symbols. WARNING: This should only be used with -k and
-        a LIVE kernel.
-
--f::
---force::
-        Don't complain, do it.
-
---symfs=<directory>::
-        Look for files with symbols relative to this directory.
-
--C::
---cpu:: Only report samples for the list of CPUs provided. Multiple CPUs can
-	be provided as a comma-separated list with no space: 0,1. Ranges of
-	CPUs are specified with -: 0-2. Default is to report samples on all
-	CPUs.
-
--M::
---disassembler-style=:: Set disassembler style for objdump.
-
---source::
-	Interleave source code with assembly code. Enabled by default,
-	disable with --no-source.
-
---asm-raw::
-	Show raw instruction encoding of assembly instructions.
-
---show-total-period:: Show a column with the sum of periods.
-
--I::
---show-info::
-	Display extended information about the perf.data file. This adds
-	information which may be very large and thus may clutter the display.
-	It currently includes: cpu and numa topology of the host system.
-
--b::
---branch-stack::
-	Use the addresses of sampled taken branches instead of the instruction
-	address to build the histograms. To generate meaningful output, the
-	perf.data file must have been obtained using perf record -b or
-	perf record --branch-filter xxx where xxx is a branch filter option.
-	perf report is able to auto-detect whether a perf.data file contains
-	branch stacks and it will automatically switch to the branch view mode,
-	unless --no-branch-stack is used.
-
---objdump=<path>::
-        Path to objdump binary.
-
---group::
-	Show event group information together.
-
---demangle::
-	Demangle symbol names to human readable form. It's enabled by default,
-	disable with --no-demangle.
-
---percent-limit::
-	Do not show entries which have an overhead under that percent.
-	(Default: 0).
-
-SEE ALSO
---------
-linkperf:perf-stat[1], linkperf:perf-annotate[1]
diff --git a/src/tools/perf/Documentation/perf-sched.txt b/src/tools/perf/Documentation/perf-sched.txt
deleted file mode 100644
index 8ff4df9..0000000
--- a/src/tools/perf/Documentation/perf-sched.txt
+++ /dev/null
@@ -1,55 +0,0 @@
-perf-sched(1)
-==============
-
-NAME
-----
-perf-sched - Tool to trace/measure scheduler properties (latencies)
-
-SYNOPSIS
---------
-[verse]
-'perf sched' {record|latency|map|replay|script}
-
-DESCRIPTION
------------
-There are five variants of perf sched:
-
-  'perf sched record <command>' to record the scheduling events
-  of an arbitrary workload.
-
-  'perf sched latency' to report the per task scheduling latencies
-  and other scheduling properties of the workload.
-
-  'perf sched script' to see a detailed trace of the workload that
-   was recorded (aliased to 'perf script' for now).
-
-  'perf sched replay' to simulate the workload that was recorded
-  via perf sched record. (this is done by starting up mockup threads
-  that mimic the workload based on the events in the trace. These
-  threads can then replay the timings (CPU runtime and sleep patterns)
-  of the workload as it occurred when it was recorded - and can repeat
-  it a number of times, measuring its performance.)
-
-  'perf sched map' to print a textual context-switching outline of
-  workload captured via perf sched record.  Columns stand for
-  individual CPUs, and the two-letter shortcuts stand for tasks that
-  are running on a CPU. A '*' denotes the CPU that had the event, and
-  a dot signals an idle CPU.
-
-OPTIONS
--------
--i::
---input=<file>::
-        Input file name. (default: perf.data unless stdin is a fifo)
-
--v::
---verbose::
-        Be more verbose. (show symbol address, etc)
-
--D::
---dump-raw-trace=::
-        Display verbose dump of the sched data.
-
-SEE ALSO
---------
-linkperf:perf-record[1]
diff --git a/src/tools/perf/Documentation/perf-script-perl.txt b/src/tools/perf/Documentation/perf-script-perl.txt
deleted file mode 100644
index d00bef2..0000000
--- a/src/tools/perf/Documentation/perf-script-perl.txt
+++ /dev/null
@@ -1,216 +0,0 @@
-perf-script-perl(1)
-==================
-
-NAME
-----
-perf-script-perl - Process trace data with a Perl script
-
-SYNOPSIS
---------
-[verse]
-'perf script' [-s [Perl]:script[.pl] ]
-
-DESCRIPTION
------------
-
-This perf script option is used to process perf script data using perf's
-built-in Perl interpreter.  It reads and processes the input file and
-displays the results of the trace analysis implemented in the given
-Perl script, if any.
-
-STARTER SCRIPTS
----------------
-
-You can avoid reading the rest of this document by running 'perf script
--g perl' in the same directory as an existing perf.data trace file.
-That will generate a starter script containing a handler for each of
-the event types in the trace file; it simply prints every available
-field for each event in the trace file.
-
-You can also look at the existing scripts in
-~/libexec/perf-core/scripts/perl for typical examples showing how to
-do basic things like aggregate event data, print results, etc.  Also,
-the check-perf-script.pl script, while not interesting for its results,
-attempts to exercise all of the main scripting features.
-
-EVENT HANDLERS
---------------
-
-When perf script is invoked using a trace script, a user-defined
-'handler function' is called for each event in the trace.  If there's
-no handler function defined for a given event type, the event is
-ignored (or passed to a 'trace_handled' function, see below) and the
-next event is processed.
-
-Most of the event's field values are passed as arguments to the
-handler function; some of the less common ones aren't - those are
-available as calls back into the perf executable (see below).
-
-As an example, the following perf record command can be used to record
-all sched_wakeup events in the system:
-
- # perf record -a -e sched:sched_wakeup
-
-Traces meant to be processed using a script should be recorded with
-the above option: -a to enable system-wide collection.
-
-The format file for the sched_wakep event defines the following fields
-(see /sys/kernel/debug/tracing/events/sched/sched_wakeup/format):
-
-----
- format:
-        field:unsigned short common_type;
-        field:unsigned char common_flags;
-        field:unsigned char common_preempt_count;
-        field:int common_pid;
-
-        field:char comm[TASK_COMM_LEN];
-        field:pid_t pid;
-        field:int prio;
-        field:int success;
-        field:int target_cpu;
-----
-
-The handler function for this event would be defined as:
-
-----
-sub sched::sched_wakeup
-{
-   my ($event_name, $context, $common_cpu, $common_secs,
-       $common_nsecs, $common_pid, $common_comm,
-       $comm, $pid, $prio, $success, $target_cpu) = @_;
-}
-----
-
-The handler function takes the form subsystem::event_name.
-
-The $common_* arguments in the handler's argument list are the set of
-arguments passed to all event handlers; some of the fields correspond
-to the common_* fields in the format file, but some are synthesized,
-and some of the common_* fields aren't common enough to to be passed
-to every event as arguments but are available as library functions.
-
-Here's a brief description of each of the invariant event args:
-
- $event_name 	  	    the name of the event as text
- $context		    an opaque 'cookie' used in calls back into perf
- $common_cpu		    the cpu the event occurred on
- $common_secs		    the secs portion of the event timestamp
- $common_nsecs		    the nsecs portion of the event timestamp
- $common_pid		    the pid of the current task
- $common_comm		    the name of the current process
-
-All of the remaining fields in the event's format file have
-counterparts as handler function arguments of the same name, as can be
-seen in the example above.
-
-The above provides the basics needed to directly access every field of
-every event in a trace, which covers 90% of what you need to know to
-write a useful trace script.  The sections below cover the rest.
-
-SCRIPT LAYOUT
--------------
-
-Every perf script Perl script should start by setting up a Perl module
-search path and 'use'ing a few support modules (see module
-descriptions below):
-
-----
- use lib "$ENV{'PERF_EXEC_PATH'}/scripts/perl/Perf-Trace-Util/lib";
- use lib "./Perf-Trace-Util/lib";
- use Perf::Trace::Core;
- use Perf::Trace::Context;
- use Perf::Trace::Util;
-----
-
-The rest of the script can contain handler functions and support
-functions in any order.
-
-Aside from the event handler functions discussed above, every script
-can implement a set of optional functions:
-
-*trace_begin*, if defined, is called before any event is processed and
-gives scripts a chance to do setup tasks:
-
-----
- sub trace_begin
- {
- }
-----
-
-*trace_end*, if defined, is called after all events have been
- processed and gives scripts a chance to do end-of-script tasks, such
- as display results:
-
-----
-sub trace_end
-{
-}
-----
-
-*trace_unhandled*, if defined, is called after for any event that
- doesn't have a handler explicitly defined for it.  The standard set
- of common arguments are passed into it:
-
-----
-sub trace_unhandled
-{
-    my ($event_name, $context, $common_cpu, $common_secs,
-        $common_nsecs, $common_pid, $common_comm) = @_;
-}
-----
-
-The remaining sections provide descriptions of each of the available
-built-in perf script Perl modules and their associated functions.
-
-AVAILABLE MODULES AND FUNCTIONS
--------------------------------
-
-The following sections describe the functions and variables available
-via the various Perf::Trace::* Perl modules.  To use the functions and
-variables from the given module, add the corresponding 'use
-Perf::Trace::XXX' line to your perf script script.
-
-Perf::Trace::Core Module
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-These functions provide some essential functions to user scripts.
-
-The *flag_str* and *symbol_str* functions provide human-readable
-strings for flag and symbolic fields.  These correspond to the strings
-and values parsed from the 'print fmt' fields of the event format
-files:
-
-  flag_str($event_name, $field_name, $field_value) - returns the string represention corresponding to $field_value for the flag field $field_name of event $event_name
-  symbol_str($event_name, $field_name, $field_value) - returns the string represention corresponding to $field_value for the symbolic field $field_name of event $event_name
-
-Perf::Trace::Context Module
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Some of the 'common' fields in the event format file aren't all that
-common, but need to be made accessible to user scripts nonetheless.
-
-Perf::Trace::Context defines a set of functions that can be used to
-access this data in the context of the current event.  Each of these
-functions expects a $context variable, which is the same as the
-$context variable passed into every event handler as the second
-argument.
-
- common_pc($context) - returns common_preempt count for the current event
- common_flags($context) - returns common_flags for the current event
- common_lock_depth($context) - returns common_lock_depth for the current event
-
-Perf::Trace::Util Module
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-Various utility functions for use with perf script:
-
-  nsecs($secs, $nsecs) - returns total nsecs given secs/nsecs pair
-  nsecs_secs($nsecs) - returns whole secs portion given nsecs
-  nsecs_nsecs($nsecs) - returns nsecs remainder given nsecs
-  nsecs_str($nsecs) - returns printable string in the form secs.nsecs
-  avg($total, $n) - returns average given a sum and a total number of values
-
-SEE ALSO
---------
-linkperf:perf-script[1]
diff --git a/src/tools/perf/Documentation/perf-script-python.txt b/src/tools/perf/Documentation/perf-script-python.txt
deleted file mode 100644
index 9f1f054..0000000
--- a/src/tools/perf/Documentation/perf-script-python.txt
+++ /dev/null
@@ -1,620 +0,0 @@
-perf-script-python(1)
-====================
-
-NAME
-----
-perf-script-python - Process trace data with a Python script
-
-SYNOPSIS
---------
-[verse]
-'perf script' [-s [Python]:script[.py] ]
-
-DESCRIPTION
------------
-
-This perf script option is used to process perf script data using perf's
-built-in Python interpreter.  It reads and processes the input file and
-displays the results of the trace analysis implemented in the given
-Python script, if any.
-
-A QUICK EXAMPLE
----------------
-
-This section shows the process, start to finish, of creating a working
-Python script that aggregates and extracts useful information from a
-raw perf script stream.  You can avoid reading the rest of this
-document if an example is enough for you; the rest of the document
-provides more details on each step and lists the library functions
-available to script writers.
-
-This example actually details the steps that were used to create the
-'syscall-counts' script you see when you list the available perf script
-scripts via 'perf script -l'.  As such, this script also shows how to
-integrate your script into the list of general-purpose 'perf script'
-scripts listed by that command.
-
-The syscall-counts script is a simple script, but demonstrates all the
-basic ideas necessary to create a useful script.  Here's an example
-of its output (syscall names are not yet supported, they will appear
-as numbers):
-
-----
-syscall events:
-
-event                                          count
-----------------------------------------  -----------
-sys_write                                     455067
-sys_getdents                                    4072
-sys_close                                       3037
-sys_swapoff                                     1769
-sys_read                                         923
-sys_sched_setparam                               826
-sys_open                                         331
-sys_newfstat                                     326
-sys_mmap                                         217
-sys_munmap                                       216
-sys_futex                                        141
-sys_select                                       102
-sys_poll                                          84
-sys_setitimer                                     12
-sys_writev                                         8
-15                                                 8
-sys_lseek                                          7
-sys_rt_sigprocmask                                 6
-sys_wait4                                          3
-sys_ioctl                                          3
-sys_set_robust_list                                1
-sys_exit                                           1
-56                                                 1
-sys_access                                         1
-----
-
-Basically our task is to keep a per-syscall tally that gets updated
-every time a system call occurs in the system.  Our script will do
-that, but first we need to record the data that will be processed by
-that script.  Theoretically, there are a couple of ways we could do
-that:
-
-- we could enable every event under the tracing/events/syscalls
-  directory, but this is over 600 syscalls, well beyond the number
-  allowable by perf.  These individual syscall events will however be
-  useful if we want to later use the guidance we get from the
-  general-purpose scripts to drill down and get more detail about
-  individual syscalls of interest.
-
-- we can enable the sys_enter and/or sys_exit syscalls found under
-  tracing/events/raw_syscalls.  These are called for all syscalls; the
-  'id' field can be used to distinguish between individual syscall
-  numbers.
-
-For this script, we only need to know that a syscall was entered; we
-don't care how it exited, so we'll use 'perf record' to record only
-the sys_enter events:
-
-----
-# perf record -a -e raw_syscalls:sys_enter
-
-^C[ perf record: Woken up 1 times to write data ]
-[ perf record: Captured and wrote 56.545 MB perf.data (~2470503 samples) ]
-----
-
-The options basically say to collect data for every syscall event
-system-wide and multiplex the per-cpu output into a single stream.
-That single stream will be recorded in a file in the current directory
-called perf.data.
-
-Once we have a perf.data file containing our data, we can use the -g
-'perf script' option to generate a Python script that will contain a
-callback handler for each event type found in the perf.data trace
-stream (for more details, see the STARTER SCRIPTS section).
-
-----
-# perf script -g python
-generated Python script: perf-script.py
-
-The output file created also in the current directory is named
-perf-script.py.  Here's the file in its entirety:
-
-# perf script event handlers, generated by perf script -g python
-# Licensed under the terms of the GNU GPL License version 2
-
-# The common_* event handler fields are the most useful fields common to
-# all events.  They don't necessarily correspond to the 'common_*' fields
-# in the format files.  Those fields not available as handler params can
-# be retrieved using Python functions of the form common_*(context).
-# See the perf-script-python Documentation for the list of available functions.
-
-import os
-import sys
-
-sys.path.append(os.environ['PERF_EXEC_PATH'] + \
-	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
-
-from perf_trace_context import *
-from Core import *
-
-def trace_begin():
-	print "in trace_begin"
-
-def trace_end():
-	print "in trace_end"
-
-def raw_syscalls__sys_enter(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	id, args):
-		print_header(event_name, common_cpu, common_secs, common_nsecs,
-			common_pid, common_comm)
-
-		print "id=%d, args=%s\n" % \
-		(id, args),
-
-def trace_unhandled(event_name, context, common_cpu, common_secs, common_nsecs,
-		common_pid, common_comm):
-		print_header(event_name, common_cpu, common_secs, common_nsecs,
-		common_pid, common_comm)
-
-def print_header(event_name, cpu, secs, nsecs, pid, comm):
-	print "%-20s %5u %05u.%09u %8u %-20s " % \
-	(event_name, cpu, secs, nsecs, pid, comm),
-----
-
-At the top is a comment block followed by some import statements and a
-path append which every perf script script should include.
-
-Following that are a couple generated functions, trace_begin() and
-trace_end(), which are called at the beginning and the end of the
-script respectively (for more details, see the SCRIPT_LAYOUT section
-below).
-
-Following those are the 'event handler' functions generated one for
-every event in the 'perf record' output.  The handler functions take
-the form subsystem__event_name, and contain named parameters, one for
-each field in the event; in this case, there's only one event,
-raw_syscalls__sys_enter().  (see the EVENT HANDLERS section below for
-more info on event handlers).
-
-The final couple of functions are, like the begin and end functions,
-generated for every script.  The first, trace_unhandled(), is called
-every time the script finds an event in the perf.data file that
-doesn't correspond to any event handler in the script.  This could
-mean either that the record step recorded event types that it wasn't
-really interested in, or the script was run against a trace file that
-doesn't correspond to the script.
-
-The script generated by -g option simply prints a line for each
-event found in the trace stream i.e. it basically just dumps the event
-and its parameter values to stdout.  The print_header() function is
-simply a utility function used for that purpose.  Let's rename the
-script and run it to see the default output:
-
-----
-# mv perf-script.py syscall-counts.py
-# perf script -s syscall-counts.py
-
-raw_syscalls__sys_enter     1 00840.847582083     7506 perf                  id=1, args=
-raw_syscalls__sys_enter     1 00840.847595764     7506 perf                  id=1, args=
-raw_syscalls__sys_enter     1 00840.847620860     7506 perf                  id=1, args=
-raw_syscalls__sys_enter     1 00840.847710478     6533 npviewer.bin          id=78, args=
-raw_syscalls__sys_enter     1 00840.847719204     6533 npviewer.bin          id=142, args=
-raw_syscalls__sys_enter     1 00840.847755445     6533 npviewer.bin          id=3, args=
-raw_syscalls__sys_enter     1 00840.847775601     6533 npviewer.bin          id=3, args=
-raw_syscalls__sys_enter     1 00840.847781820     6533 npviewer.bin          id=3, args=
-.
-.
-.
-----
-
-Of course, for this script, we're not interested in printing every
-trace event, but rather aggregating it in a useful way.  So we'll get
-rid of everything to do with printing as well as the trace_begin() and
-trace_unhandled() functions, which we won't be using.  That leaves us
-with this minimalistic skeleton:
-
-----
-import os
-import sys
-
-sys.path.append(os.environ['PERF_EXEC_PATH'] + \
-	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
-
-from perf_trace_context import *
-from Core import *
-
-def trace_end():
-	print "in trace_end"
-
-def raw_syscalls__sys_enter(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	id, args):
-----
-
-In trace_end(), we'll simply print the results, but first we need to
-generate some results to print.  To do that we need to have our
-sys_enter() handler do the necessary tallying until all events have
-been counted.  A hash table indexed by syscall id is a good way to
-store that information; every time the sys_enter() handler is called,
-we simply increment a count associated with that hash entry indexed by
-that syscall id:
-
-----
-  syscalls = autodict()
-
-  try:
-    syscalls[id] += 1
-  except TypeError:
-    syscalls[id] = 1
-----
-
-The syscalls 'autodict' object is a special kind of Python dictionary
-(implemented in Core.py) that implements Perl's 'autovivifying' hashes
-in Python i.e. with autovivifying hashes, you can assign nested hash
-values without having to go to the trouble of creating intermediate
-levels if they don't exist e.g syscalls[comm][pid][id] = 1 will create
-the intermediate hash levels and finally assign the value 1 to the
-hash entry for 'id' (because the value being assigned isn't a hash
-object itself, the initial value is assigned in the TypeError
-exception.  Well, there may be a better way to do this in Python but
-that's what works for now).
-
-Putting that code into the raw_syscalls__sys_enter() handler, we
-effectively end up with a single-level dictionary keyed on syscall id
-and having the counts we've tallied as values.
-
-The print_syscall_totals() function iterates over the entries in the
-dictionary and displays a line for each entry containing the syscall
-name (the dictonary keys contain the syscall ids, which are passed to
-the Util function syscall_name(), which translates the raw syscall
-numbers to the corresponding syscall name strings).  The output is
-displayed after all the events in the trace have been processed, by
-calling the print_syscall_totals() function from the trace_end()
-handler called at the end of script processing.
-
-The final script producing the output shown above is shown in its
-entirety below (syscall_name() helper is not yet available, you can
-only deal with id's for now):
-
-----
-import os
-import sys
-
-sys.path.append(os.environ['PERF_EXEC_PATH'] + \
-	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
-
-from perf_trace_context import *
-from Core import *
-from Util import *
-
-syscalls = autodict()
-
-def trace_end():
-	print_syscall_totals()
-
-def raw_syscalls__sys_enter(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	id, args):
-	try:
-		syscalls[id] += 1
-	except TypeError:
-		syscalls[id] = 1
-
-def print_syscall_totals():
-    if for_comm is not None:
-	    print "\nsyscall events for %s:\n\n" % (for_comm),
-    else:
-	    print "\nsyscall events:\n\n",
-
-    print "%-40s  %10s\n" % ("event", "count"),
-    print "%-40s  %10s\n" % ("----------------------------------------", \
-                                 "-----------"),
-
-    for id, val in sorted(syscalls.iteritems(), key = lambda(k, v): (v, k), \
-				  reverse = True):
-	    print "%-40s  %10d\n" % (syscall_name(id), val),
-----
-
-The script can be run just as before:
-
-  # perf script -s syscall-counts.py
-
-So those are the essential steps in writing and running a script.  The
-process can be generalized to any tracepoint or set of tracepoints
-you're interested in - basically find the tracepoint(s) you're
-interested in by looking at the list of available events shown by
-'perf list' and/or look in /sys/kernel/debug/tracing events for
-detailed event and field info, record the corresponding trace data
-using 'perf record', passing it the list of interesting events,
-generate a skeleton script using 'perf script -g python' and modify the
-code to aggregate and display it for your particular needs.
-
-After you've done that you may end up with a general-purpose script
-that you want to keep around and have available for future use.  By
-writing a couple of very simple shell scripts and putting them in the
-right place, you can have your script listed alongside the other
-scripts listed by the 'perf script -l' command e.g.:
-
-----
-root@tropicana:~# perf script -l
-List of available trace scripts:
-  wakeup-latency                       system-wide min/max/avg wakeup latency
-  rw-by-file <comm>                    r/w activity for a program, by file
-  rw-by-pid                            system-wide r/w activity
-----
-
-A nice side effect of doing this is that you also then capture the
-probably lengthy 'perf record' command needed to record the events for
-the script.
-
-To have the script appear as a 'built-in' script, you write two simple
-scripts, one for recording and one for 'reporting'.
-
-The 'record' script is a shell script with the same base name as your
-script, but with -record appended.  The shell script should be put
-into the perf/scripts/python/bin directory in the kernel source tree.
-In that script, you write the 'perf record' command-line needed for
-your script:
-
-----
-# cat kernel-source/tools/perf/scripts/python/bin/syscall-counts-record
-
-#!/bin/bash
-perf record -a -e raw_syscalls:sys_enter
-----
-
-The 'report' script is also a shell script with the same base name as
-your script, but with -report appended.  It should also be located in
-the perf/scripts/python/bin directory.  In that script, you write the
-'perf script -s' command-line needed for running your script:
-
-----
-# cat kernel-source/tools/perf/scripts/python/bin/syscall-counts-report
-
-#!/bin/bash
-# description: system-wide syscall counts
-perf script -s ~/libexec/perf-core/scripts/python/syscall-counts.py
-----
-
-Note that the location of the Python script given in the shell script
-is in the libexec/perf-core/scripts/python directory - this is where
-the script will be copied by 'make install' when you install perf.
-For the installation to install your script there, your script needs
-to be located in the perf/scripts/python directory in the kernel
-source tree:
-
-----
-# ls -al kernel-source/tools/perf/scripts/python
-
-root@tropicana:/home/trz/src/tip# ls -al tools/perf/scripts/python
-total 32
-drwxr-xr-x 4 trz trz 4096 2010-01-26 22:30 .
-drwxr-xr-x 4 trz trz 4096 2010-01-26 22:29 ..
-drwxr-xr-x 2 trz trz 4096 2010-01-26 22:29 bin
--rw-r--r-- 1 trz trz 2548 2010-01-26 22:29 check-perf-script.py
-drwxr-xr-x 3 trz trz 4096 2010-01-26 22:49 Perf-Trace-Util
--rw-r--r-- 1 trz trz 1462 2010-01-26 22:30 syscall-counts.py
-----
-
-Once you've done that (don't forget to do a new 'make install',
-otherwise your script won't show up at run-time), 'perf script -l'
-should show a new entry for your script:
-
-----
-root@tropicana:~# perf script -l
-List of available trace scripts:
-  wakeup-latency                       system-wide min/max/avg wakeup latency
-  rw-by-file <comm>                    r/w activity for a program, by file
-  rw-by-pid                            system-wide r/w activity
-  syscall-counts                       system-wide syscall counts
-----
-
-You can now perform the record step via 'perf script record':
-
-  # perf script record syscall-counts
-
-and display the output using 'perf script report':
-
-  # perf script report syscall-counts
-
-STARTER SCRIPTS
----------------
-
-You can quickly get started writing a script for a particular set of
-trace data by generating a skeleton script using 'perf script -g
-python' in the same directory as an existing perf.data trace file.
-That will generate a starter script containing a handler for each of
-the event types in the trace file; it simply prints every available
-field for each event in the trace file.
-
-You can also look at the existing scripts in
-~/libexec/perf-core/scripts/python for typical examples showing how to
-do basic things like aggregate event data, print results, etc.  Also,
-the check-perf-script.py script, while not interesting for its results,
-attempts to exercise all of the main scripting features.
-
-EVENT HANDLERS
---------------
-
-When perf script is invoked using a trace script, a user-defined
-'handler function' is called for each event in the trace.  If there's
-no handler function defined for a given event type, the event is
-ignored (or passed to a 'trace_handled' function, see below) and the
-next event is processed.
-
-Most of the event's field values are passed as arguments to the
-handler function; some of the less common ones aren't - those are
-available as calls back into the perf executable (see below).
-
-As an example, the following perf record command can be used to record
-all sched_wakeup events in the system:
-
- # perf record -a -e sched:sched_wakeup
-
-Traces meant to be processed using a script should be recorded with
-the above option: -a to enable system-wide collection.
-
-The format file for the sched_wakep event defines the following fields
-(see /sys/kernel/debug/tracing/events/sched/sched_wakeup/format):
-
-----
- format:
-        field:unsigned short common_type;
-        field:unsigned char common_flags;
-        field:unsigned char common_preempt_count;
-        field:int common_pid;
-
-        field:char comm[TASK_COMM_LEN];
-        field:pid_t pid;
-        field:int prio;
-        field:int success;
-        field:int target_cpu;
-----
-
-The handler function for this event would be defined as:
-
-----
-def sched__sched_wakeup(event_name, context, common_cpu, common_secs,
-       common_nsecs, common_pid, common_comm,
-       comm, pid, prio, success, target_cpu):
-       pass
-----
-
-The handler function takes the form subsystem__event_name.
-
-The common_* arguments in the handler's argument list are the set of
-arguments passed to all event handlers; some of the fields correspond
-to the common_* fields in the format file, but some are synthesized,
-and some of the common_* fields aren't common enough to to be passed
-to every event as arguments but are available as library functions.
-
-Here's a brief description of each of the invariant event args:
-
- event_name 	  	    the name of the event as text
- context		    an opaque 'cookie' used in calls back into perf
- common_cpu		    the cpu the event occurred on
- common_secs		    the secs portion of the event timestamp
- common_nsecs		    the nsecs portion of the event timestamp
- common_pid		    the pid of the current task
- common_comm		    the name of the current process
-
-All of the remaining fields in the event's format file have
-counterparts as handler function arguments of the same name, as can be
-seen in the example above.
-
-The above provides the basics needed to directly access every field of
-every event in a trace, which covers 90% of what you need to know to
-write a useful trace script.  The sections below cover the rest.
-
-SCRIPT LAYOUT
--------------
-
-Every perf script Python script should start by setting up a Python
-module search path and 'import'ing a few support modules (see module
-descriptions below):
-
-----
- import os
- import sys
-
- sys.path.append(os.environ['PERF_EXEC_PATH'] + \
-	      '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
-
- from perf_trace_context import *
- from Core import *
-----
-
-The rest of the script can contain handler functions and support
-functions in any order.
-
-Aside from the event handler functions discussed above, every script
-can implement a set of optional functions:
-
-*trace_begin*, if defined, is called before any event is processed and
-gives scripts a chance to do setup tasks:
-
-----
-def trace_begin:
-    pass
-----
-
-*trace_end*, if defined, is called after all events have been
- processed and gives scripts a chance to do end-of-script tasks, such
- as display results:
-
-----
-def trace_end:
-    pass
-----
-
-*trace_unhandled*, if defined, is called after for any event that
- doesn't have a handler explicitly defined for it.  The standard set
- of common arguments are passed into it:
-
-----
-def trace_unhandled(event_name, context, common_cpu, common_secs,
-        common_nsecs, common_pid, common_comm):
-    pass
-----
-
-The remaining sections provide descriptions of each of the available
-built-in perf script Python modules and their associated functions.
-
-AVAILABLE MODULES AND FUNCTIONS
--------------------------------
-
-The following sections describe the functions and variables available
-via the various perf script Python modules.  To use the functions and
-variables from the given module, add the corresponding 'from XXXX
-import' line to your perf script script.
-
-Core.py Module
-~~~~~~~~~~~~~~
-
-These functions provide some essential functions to user scripts.
-
-The *flag_str* and *symbol_str* functions provide human-readable
-strings for flag and symbolic fields.  These correspond to the strings
-and values parsed from the 'print fmt' fields of the event format
-files:
-
-  flag_str(event_name, field_name, field_value) - returns the string represention corresponding to field_value for the flag field field_name of event event_name
-  symbol_str(event_name, field_name, field_value) - returns the string represention corresponding to field_value for the symbolic field field_name of event event_name
-
-The *autodict* function returns a special kind of Python
-dictionary that implements Perl's 'autovivifying' hashes in Python
-i.e. with autovivifying hashes, you can assign nested hash values
-without having to go to the trouble of creating intermediate levels if
-they don't exist.
-
-  autodict() - returns an autovivifying dictionary instance
-
-
-perf_trace_context Module
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Some of the 'common' fields in the event format file aren't all that
-common, but need to be made accessible to user scripts nonetheless.
-
-perf_trace_context defines a set of functions that can be used to
-access this data in the context of the current event.  Each of these
-functions expects a context variable, which is the same as the
-context variable passed into every event handler as the second
-argument.
-
- common_pc(context) - returns common_preempt count for the current event
- common_flags(context) - returns common_flags for the current event
- common_lock_depth(context) - returns common_lock_depth for the current event
-
-Util.py Module
-~~~~~~~~~~~~~~
-
-Various utility functions for use with perf script:
-
-  nsecs(secs, nsecs) - returns total nsecs given secs/nsecs pair
-  nsecs_secs(nsecs) - returns whole secs portion given nsecs
-  nsecs_nsecs(nsecs) - returns nsecs remainder given nsecs
-  nsecs_str(nsecs) - returns printable string in the form secs.nsecs
-  avg(total, n) - returns average given a sum and a total number of values
-
-SEE ALSO
---------
-linkperf:perf-script[1]
diff --git a/src/tools/perf/Documentation/perf-script.txt b/src/tools/perf/Documentation/perf-script.txt
deleted file mode 100644
index e9cbfcd..0000000
--- a/src/tools/perf/Documentation/perf-script.txt
+++ /dev/null
@@ -1,209 +0,0 @@
-perf-script(1)
-=============
-
-NAME
-----
-perf-script - Read perf.data (created by perf record) and display trace output
-
-SYNOPSIS
---------
-[verse]
-'perf script' [<options>]
-'perf script' [<options>] record <script> [<record-options>] <command>
-'perf script' [<options>] report <script> [script-args]
-'perf script' [<options>] <script> <required-script-args> [<record-options>] <command>
-'perf script' [<options>] <top-script> [script-args]
-
-DESCRIPTION
------------
-This command reads the input file and displays the trace recorded.
-
-There are several variants of perf script:
-
-  'perf script' to see a detailed trace of the workload that was
-  recorded.
-
-  You can also run a set of pre-canned scripts that aggregate and
-  summarize the raw trace data in various ways (the list of scripts is
-  available via 'perf script -l').  The following variants allow you to
-  record and run those scripts:
-
-  'perf script record <script> <command>' to record the events required
-  for 'perf script report'.  <script> is the name displayed in the
-  output of 'perf script --list' i.e. the actual script name minus any
-  language extension.  If <command> is not specified, the events are
-  recorded using the -a (system-wide) 'perf record' option.
-
-  'perf script report <script> [args]' to run and display the results
-  of <script>.  <script> is the name displayed in the output of 'perf
-  trace --list' i.e. the actual script name minus any language
-  extension.  The perf.data output from a previous run of 'perf script
-  record <script>' is used and should be present for this command to
-  succeed.  [args] refers to the (mainly optional) args expected by
-  the script.
-
-  'perf script <script> <required-script-args> <command>' to both
-  record the events required for <script> and to run the <script>
-  using 'live-mode' i.e. without writing anything to disk.  <script>
-  is the name displayed in the output of 'perf script --list' i.e. the
-  actual script name minus any language extension.  If <command> is
-  not specified, the events are recorded using the -a (system-wide)
-  'perf record' option.  If <script> has any required args, they
-  should be specified before <command>.  This mode doesn't allow for
-  optional script args to be specified; if optional script args are
-  desired, they can be specified using separate 'perf script record'
-  and 'perf script report' commands, with the stdout of the record step
-  piped to the stdin of the report script, using the '-o -' and '-i -'
-  options of the corresponding commands.
-
-  'perf script <top-script>' to both record the events required for
-  <top-script> and to run the <top-script> using 'live-mode'
-  i.e. without writing anything to disk.  <top-script> is the name
-  displayed in the output of 'perf script --list' i.e. the actual
-  script name minus any language extension; a <top-script> is defined
-  as any script name ending with the string 'top'.
-
-  [<record-options>] can be passed to the record steps of 'perf script
-  record' and 'live-mode' variants; this isn't possible however for
-  <top-script> 'live-mode' or 'perf script report' variants.
-
-  See the 'SEE ALSO' section for links to language-specific
-  information on how to write and run your own trace scripts.
-
-OPTIONS
--------
-<command>...::
-	Any command you can specify in a shell.
-
--D::
---dump-raw-script=::
-        Display verbose dump of the trace data.
-
--L::
---Latency=::
-        Show latency attributes (irqs/preemption disabled, etc).
-
--l::
---list=::
-        Display a list of available trace scripts.
-
--s ['lang']::
---script=::
-        Process trace data with the given script ([lang]:script[.ext]).
-	If the string 'lang' is specified in place of a script name, a
-        list of supported languages will be displayed instead.
-
--g::
---gen-script=::
-        Generate perf-script.[ext] starter script for given language,
-        using current perf.data.
-
--a::
-        Force system-wide collection.  Scripts run without a <command>
-        normally use -a by default, while scripts run with a <command>
-        normally don't - this option allows the latter to be run in
-        system-wide mode.
-
--i::
---input=::
-        Input file name. (default: perf.data unless stdin is a fifo)
-
--d::
---debug-mode::
-        Do various checks like samples ordering and lost events.
-
--f::
---fields::
-        Comma separated list of fields to print. Options are:
-        comm, tid, pid, time, cpu, event, trace, ip, sym, dso, addr, symoff.
-        Field list can be prepended with the type, trace, sw or hw,
-        to indicate to which event type the field list applies.
-        e.g., -f sw:comm,tid,time,ip,sym  and -f trace:time,cpu,trace
-
-		perf script -f <fields>
-
-	is equivalent to:
-
-		perf script -f trace:<fields> -f sw:<fields> -f hw:<fields>
-    
-	i.e., the specified fields apply to all event types if the type string
-	is not given.
-    
-	The arguments are processed in the order received. A later usage can
-	reset a prior request. e.g.:
-    
-		-f trace: -f comm,tid,time,ip,sym
-    
-	The first -f suppresses trace events (field list is ""), but then the
-	second invocation sets the fields to comm,tid,time,ip,sym. In this case a
-	warning is given to the user:
-    
-		"Overriding previous field request for all events."
-    
-	Alternativey, consider the order:
-    
-		-f comm,tid,time,ip,sym -f trace:
-    
-	The first -f sets the fields for all events and the second -f
-	suppresses trace events. The user is given a warning message about
-	the override, and the result of the above is that only S/W and H/W
-	events are displayed with the given fields.
-    
-	For the 'wildcard' option if a user selected field is invalid for an
-	event type, a message is displayed to the user that the option is
-	ignored for that type. For example:
-    
-		$ perf script -f comm,tid,trace
-		'trace' not valid for hardware events. Ignoring.
-		'trace' not valid for software events. Ignoring.
-    
-	Alternatively, if the type is given an invalid field is specified it
-	is an error. For example:
-    
-        perf script -v -f sw:comm,tid,trace
-        'trace' not valid for software events.
-    
-	At this point usage is displayed, and perf-script exits.
-    
-	Finally, a user may not set fields to none for all event types.
-	i.e., -f "" is not allowed.
-
--k::
---vmlinux=<file>::
-        vmlinux pathname
-
---kallsyms=<file>::
-        kallsyms pathname
-
---symfs=<directory>::
-        Look for files with symbols relative to this directory.
-
--G::
---hide-call-graph::
-        When printing symbols do not display call chain.
-
--C::
---cpu:: Only report samples for the list of CPUs provided. Multiple CPUs can
-	be provided as a comma-separated list with no space: 0,1. Ranges of
-	CPUs are specified with -: 0-2. Default is to report samples on all
-	CPUs.
-
--c::
---comms=::
-	Only display events for these comms. CSV that understands
-	file://filename entries.
-
--I::
---show-info::
-	Display extended information about the perf.data file. This adds
-	information which may be very large and thus may clutter the display.
-	It currently includes: cpu and numa topology of the host system.
-	It can only be used with the perf script report mode.
-
---show-kernel-path::
-	Try to resolve the path of [kernel.kallsyms]
-
-SEE ALSO
---------
-linkperf:perf-record[1], linkperf:perf-script-perl[1],
-linkperf:perf-script-python[1]
diff --git a/src/tools/perf/Documentation/perf-stat.txt b/src/tools/perf/Documentation/perf-stat.txt
deleted file mode 100644
index 73c9759..0000000
--- a/src/tools/perf/Documentation/perf-stat.txt
+++ /dev/null
@@ -1,160 +0,0 @@
-perf-stat(1)
-============
-
-NAME
-----
-perf-stat - Run a command and gather performance counter statistics
-
-SYNOPSIS
---------
-[verse]
-'perf stat' [-e <EVENT> | --event=EVENT] [-a] <command>
-'perf stat' [-e <EVENT> | --event=EVENT] [-a] -- <command> [<options>]
-
-DESCRIPTION
------------
-This command runs a command and gathers performance counter statistics
-from it.
-
-
-OPTIONS
--------
-<command>...::
-	Any command you can specify in a shell.
-
-
--e::
---event=::
-	Select the PMU event. Selection can be a symbolic event name
-	(use 'perf list' to list all events) or a raw PMU
-	event (eventsel+umask) in the form of rNNN where NNN is a
-	 hexadecimal event descriptor.
-
--i::
---no-inherit::
-        child tasks do not inherit counters
--p::
---pid=<pid>::
-        stat events on existing process id (comma separated list)
-
--t::
---tid=<tid>::
-        stat events on existing thread id (comma separated list)
-
-
--a::
---all-cpus::
-        system-wide collection from all CPUs
-
--c::
---scale::
-	scale/normalize counter values
-
--r::
---repeat=<n>::
-	repeat command and print average + stddev (max: 100). 0 means forever.
-
--B::
---big-num::
-        print large numbers with thousands' separators according to locale
-
--C::
---cpu=::
-Count only on the list of CPUs provided. Multiple CPUs can be provided as a
-comma-separated list with no space: 0,1. Ranges of CPUs are specified with -: 0-2.
-In per-thread mode, this option is ignored. The -a option is still necessary
-to activate system-wide monitoring. Default is to count on all CPUs.
-
--A::
---no-aggr::
-Do not aggregate counts across all monitored CPUs in system-wide mode (-a).
-This option is only valid in system-wide mode.
-
--n::
---null::
-        null run - don't start any counters
-
--v::
---verbose::
-        be more verbose (show counter open errors, etc)
-
--x SEP::
---field-separator SEP::
-print counts using a CSV-style output to make it easy to import directly into
-spreadsheets. Columns are separated by the string specified in SEP.
-
--G name::
---cgroup name::
-monitor only in the container (cgroup) called "name". This option is available only
-in per-cpu mode. The cgroup filesystem must be mounted. All threads belonging to
-container "name" are monitored when they run on the monitored CPUs. Multiple cgroups
-can be provided. Each cgroup is applied to the corresponding event, i.e., first cgroup
-to first event, second cgroup to second event and so on. It is possible to provide
-an empty cgroup (monitor all the time) using, e.g., -G foo,,bar. Cgroups must have
-corresponding events, i.e., they always refer to events defined earlier on the command
-line.
-
--o file::
---output file::
-Print the output into the designated file.
-
---append::
-Append to the output file designated with the -o option. Ignored if -o is not specified.
-
---log-fd::
-
-Log output to fd, instead of stderr.  Complementary to --output, and mutually exclusive
-with it.  --append may be used here.  Examples:
-     3>results  perf stat --log-fd 3          -- $cmd
-     3>>results perf stat --log-fd 3 --append -- $cmd
-
---pre::
---post::
-	Pre and post measurement hooks, e.g.:
-
-perf stat --repeat 10 --null --sync --pre 'make -s O=defconfig-build/clean' -- make -s -j64 O=defconfig-build/ bzImage
-
--I msecs::
---interval-print msecs::
-	Print count deltas every N milliseconds (minimum: 100ms)
-	example: perf stat -I 1000 -e cycles -a sleep 5
-
---per-socket::
-Aggregate counts per processor socket for system-wide mode measurements.  This
-is a useful mode to detect imbalance between sockets.  To enable this mode,
-use --per-socket in addition to -a. (system-wide).  The output includes the
-socket number and the number of online processors on that socket. This is
-useful to gauge the amount of aggregation.
-
---per-core::
-Aggregate counts per physical processor for system-wide mode measurements.  This
-is a useful mode to detect imbalance between physical cores.  To enable this mode,
-use --per-core in addition to -a. (system-wide).  The output includes the
-core number and the number of online logical processors on that physical processor.
-
--D msecs::
---initial-delay msecs::
-After starting the program, wait msecs before measuring. This is useful to
-filter out the startup phase of the program, which is often very different.
-
-EXAMPLES
---------
-
-$ perf stat -- make -j
-
- Performance counter stats for 'make -j':
-
-    8117.370256  task clock ticks     #      11.281 CPU utilization factor
-            678  context switches     #       0.000 M/sec
-            133  CPU migrations       #       0.000 M/sec
-         235724  pagefaults           #       0.029 M/sec
-    24821162526  CPU cycles           #    3057.784 M/sec
-    18687303457  instructions         #    2302.138 M/sec
-      172158895  cache references     #      21.209 M/sec
-       27075259  cache misses         #       3.335 M/sec
-
- Wall-clock time elapsed:   719.554352 msecs
-
-SEE ALSO
---------
-linkperf:perf-top[1], linkperf:perf-list[1]
diff --git a/src/tools/perf/Documentation/perf-test.txt b/src/tools/perf/Documentation/perf-test.txt
deleted file mode 100644
index d1d3e51..0000000
--- a/src/tools/perf/Documentation/perf-test.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-perf-test(1)
-============
-
-NAME
-----
-perf-test - Runs sanity tests.
-
-SYNOPSIS
---------
-[verse]
-'perf test [<options>] [{list <test-name-fragment>|[<test-name-fragments>|<test-numbers>]}]'
-
-DESCRIPTION
------------
-This command does assorted sanity tests, initially through linked routines but
-also will look for a directory with more tests in the form of scripts.
-
-To get a list of available tests use 'perf test list', specifying a test name
-fragment will show all tests that have it.
-
-To run just specific tests, inform test name fragments or the numbers obtained
-from 'perf test list'.
-
-OPTIONS
--------
--s::
---skip::
-	Tests to skip (comma separater numeric list).
-
--v::
---verbose::
-	Be more verbose.
diff --git a/src/tools/perf/Documentation/perf-timechart.txt b/src/tools/perf/Documentation/perf-timechart.txt
deleted file mode 100644
index 1632b0e..0000000
--- a/src/tools/perf/Documentation/perf-timechart.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-perf-timechart(1)
-=================
-
-NAME
-----
-perf-timechart - Tool to visualize total system behavior during a workload
-
-SYNOPSIS
---------
-[verse]
-'perf timechart' {record}
-
-DESCRIPTION
------------
-There are two variants of perf timechart:
-
-  'perf timechart record <command>' to record the system level events
-  of an arbitrary workload.
-
-  'perf timechart' to turn a trace into a Scalable Vector Graphics file,
-  that can be viewed with popular SVG viewers such as 'Inkscape'.
-
-OPTIONS
--------
--o::
---output=::
-        Select the output file (default: output.svg)
--i::
---input=::
-        Select the input file (default: perf.data unless stdin is a fifo)
--w::
---width=::
-        Select the width of the SVG file (default: 1000)
--P::
---power-only::
-        Only output the CPU power section of the diagram
--p::
---process::
-        Select the processes to display, by name or PID
-
---symfs=<directory>::
-        Look for files with symbols relative to this directory.
-
-SEE ALSO
---------
-linkperf:perf-record[1]
diff --git a/src/tools/perf/Documentation/perf-top.txt b/src/tools/perf/Documentation/perf-top.txt
deleted file mode 100644
index 6a118e7..0000000
--- a/src/tools/perf/Documentation/perf-top.txt
+++ /dev/null
@@ -1,194 +0,0 @@
-perf-top(1)
-===========
-
-NAME
-----
-perf-top - System profiling tool.
-
-SYNOPSIS
---------
-[verse]
-'perf top' [-e <EVENT> | --event=EVENT] [<options>]
-
-DESCRIPTION
------------
-This command generates and displays a performance counter profile in real time.
-
-
-OPTIONS
--------
--a::
---all-cpus::
-        System-wide collection.  (default)
-
--c <count>::
---count=<count>::
-	Event period to sample.
-
--C <cpu-list>::
---cpu=<cpu>::
-Monitor only on the list of CPUs provided. Multiple CPUs can be provided as a
-comma-separated list with no space: 0,1. Ranges of CPUs are specified with -: 0-2.
-Default is to monitor all CPUS.
-
--d <seconds>::
---delay=<seconds>::
-	Number of seconds to delay between refreshes.
-
--e <event>::
---event=<event>::
-	Select the PMU event. Selection can be a symbolic event name
-	(use 'perf list' to list all events) or a raw PMU
-	event (eventsel+umask) in the form of rNNN where NNN is a
-	hexadecimal event descriptor.
-
--E <entries>::
---entries=<entries>::
-	Display this many functions.
-
--f <count>::
---count-filter=<count>::
-	Only display functions with more events than this.
-
--g::
---group::
-        Put the counters into a counter group.
-
--F <freq>::
---freq=<freq>::
-	Profile at this frequency.
-
--i::
---inherit::
-	Child tasks do not inherit counters.
-
--k <path>::
---vmlinux=<path>::
-	Path to vmlinux.  Required for annotation functionality.
-
--m <pages>::
---mmap-pages=<pages>::
-	Number of mmapped data pages.
-
--p <pid>::
---pid=<pid>::
-	Profile events on existing Process ID (comma separated list).
-
--t <tid>::
---tid=<tid>::
-        Profile events on existing thread ID (comma separated list).
-
--u::
---uid=::
-        Record events in threads owned by uid. Name or number.
-
--r <priority>::
---realtime=<priority>::
-	Collect data with this RT SCHED_FIFO priority.
-
--s <symbol>::
---sym-annotate=<symbol>::
-        Annotate this symbol.
-
--K::
---hide_kernel_symbols::
-        Hide kernel symbols.
-
--U::
---hide_user_symbols::
-        Hide user symbols.
-
--D::
---dump-symtab::
-        Dump the symbol table used for profiling.
-
--v::
---verbose::
-	Be more verbose (show counter open errors, etc).
-
--z::
---zero::
-	Zero history across display updates.
-
--s::
---sort::
-	Sort by key(s): pid, comm, dso, symbol, parent, srcline, weight, local_weight.
-
--n::
---show-nr-samples::
-	Show a column with the number of samples.
-
---show-total-period::
-	Show a column with the sum of periods.
-
---dsos::
-	Only consider symbols in these dsos.
-
---comms::
-	Only consider symbols in these comms.
-
---symbols::
-	Only consider these symbols.
-
--M::
---disassembler-style=:: Set disassembler style for objdump.
-
---source::
-	Interleave source code with assembly code. Enabled by default,
-	disable with --no-source.
-
---asm-raw::
-	Show raw instruction encoding of assembly instructions.
-
--G::
-	Enables call-graph (stack chain/backtrace) recording.
-
---call-graph::
-	Setup and enable call-graph (stack chain/backtrace) recording,
-	implies -G.
-
---ignore-callees=<regex>::
-        Ignore callees of the function(s) matching the given regex.
-        This has the effect of collecting the callers of each such
-        function into one place in the call-graph tree.
-
---percent-limit::
-	Do not show entries which have an overhead under that percent.
-	(Default: 0).
-
-INTERACTIVE PROMPTING KEYS
---------------------------
-
-[d]::
-	Display refresh delay.
-
-[e]::
-	Number of entries to display.
-
-[E]::
-	Event to display when multiple counters are active.
-
-[f]::
-	Profile display filter (>= hit count).
-
-[F]::
-	Annotation display filter (>= % of total).
-
-[s]::
-	Annotate symbol.
-
-[S]::
-	Stop annotation, return to full profile display.
-
-[z]::
-	Toggle event count zeroing across display updates.
-
-[qQ]::
-	Quit.
-
-Pressing any unmapped key displays a menu, and prompts for input.
-
-
-SEE ALSO
---------
-linkperf:perf-stat[1], linkperf:perf-list[1]
diff --git a/src/tools/perf/Documentation/perf-trace.txt b/src/tools/perf/Documentation/perf-trace.txt
deleted file mode 100644
index daccd2c..0000000
--- a/src/tools/perf/Documentation/perf-trace.txt
+++ /dev/null
@@ -1,83 +0,0 @@
-perf-trace(1)
-=============
-
-NAME
-----
-perf-trace - strace inspired tool
-
-SYNOPSIS
---------
-[verse]
-'perf trace'
-
-DESCRIPTION
------------
-This command will show the events associated with the target, initially
-syscalls, but other system events like pagefaults, task lifetime events,
-scheduling events, etc.
-
-Initially this is a live mode only tool, but eventually will work with
-perf.data files like the other tools, allowing a detached 'record' from
-analysis phases.
-
-OPTIONS
--------
-
--a::
---all-cpus::
-        System-wide collection from all CPUs.
-
--e::
---expr::
-	List of events to show, currently only syscall names.
-	Prefixing with ! shows all syscalls but the ones specified.  You may
-	need to escape it.
-
--o::
---output=::
-	Output file name.
-
--p::
---pid=::
-	Record events on existing process ID (comma separated list).
-
--t::
---tid=::
-        Record events on existing thread ID (comma separated list).
-
--u::
---uid=::
-        Record events in threads owned by uid. Name or number.
-
--v::
---verbose=::
-        Verbosity level.
-
--i::
---no-inherit::
-	Child tasks do not inherit counters.
-
--m::
---mmap-pages=::
-	Number of mmap data pages. Must be a power of two.
-
--C::
---cpu::
-Collect samples only on the list of CPUs provided. Multiple CPUs can be provided as a
-comma-separated list with no space: 0,1. Ranges of CPUs are specified with -: 0-2.
-In per-thread mode with inheritance mode on (default), Events are captured only when
-the thread executes on the designated CPUs. Default is to monitor all CPUs.
-
---duration:
-	Show only events that had a duration greater than N.M ms.
-
---sched:
-	Accrue thread runtime and provide a summary at the end of the session.
-
--i
---input
-	Process events from a given perf data file.
-
-SEE ALSO
---------
-linkperf:perf-record[1], linkperf:perf-script[1]
diff --git a/src/tools/perf/Documentation/perf.txt b/src/tools/perf/Documentation/perf.txt
deleted file mode 100644
index 0eeb247..0000000
--- a/src/tools/perf/Documentation/perf.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-perf(1)
-=======
-
-NAME
-----
-perf - Performance analysis tools for Linux
-
-SYNOPSIS
---------
-[verse]
-'perf' [--version] [--help] COMMAND [ARGS]
-
-DESCRIPTION
------------
-Performance counters for Linux are a new kernel-based subsystem
-that provide a framework for all things performance analysis. It
-covers hardware level (CPU/PMU, Performance Monitoring Unit) features
-and software features (software counters, tracepoints) as well.
-
-SEE ALSO
---------
-linkperf:perf-stat[1], linkperf:perf-top[1],
-linkperf:perf-record[1], linkperf:perf-report[1],
-linkperf:perf-list[1]
diff --git a/src/tools/perf/Documentation/perfconfig.example b/src/tools/perf/Documentation/perfconfig.example
deleted file mode 100644
index 767ea24..0000000
--- a/src/tools/perf/Documentation/perfconfig.example
+++ /dev/null
@@ -1,29 +0,0 @@
-[colors]
-
-	# These were the old defaults
-	top = red, lightgray
-	medium = green, lightgray
-	normal = black, lightgray
-	selected = lightgray, magenta
-	code = blue, lightgray
-	addr = magenta, lightgray
-
-[tui]
-
-	# Defaults if linked with libslang
-	report = on
-	annotate = on
-	top = on
-
-[buildid]
-
-	# Default, disable using /dev/null
-	dir = /root/.debug
-
-[annotate]
-
-	# Defaults
-	hide_src_code = false
-	use_offset = true
-	jump_arrows = true
-	show_nr_jumps = false
diff --git a/src/tools/perf/MANIFEST b/src/tools/perf/MANIFEST
deleted file mode 100644
index 025de79..0000000
--- a/src/tools/perf/MANIFEST
+++ /dev/null
@@ -1,32 +0,0 @@
-tools/perf
-tools/scripts
-tools/lib/traceevent
-tools/lib/lk
-include/linux/const.h
-include/linux/perf_event.h
-include/linux/rbtree.h
-include/linux/list.h
-include/linux/hash.h
-include/linux/stringify.h
-lib/rbtree.c
-include/linux/swab.h
-arch/*/include/asm/unistd*.h
-arch/*/include/asm/perf_regs.h
-arch/*/include/uapi/asm/unistd*.h
-arch/*/include/uapi/asm/perf_regs.h
-arch/*/lib/memcpy*.S
-arch/*/lib/memset*.S
-include/linux/poison.h
-include/linux/magic.h
-include/linux/hw_breakpoint.h
-include/linux/rbtree_augmented.h
-include/uapi/linux/perf_event.h
-include/uapi/linux/const.h
-include/uapi/linux/swab.h
-include/uapi/linux/hw_breakpoint.h
-arch/x86/include/asm/svm.h
-arch/x86/include/asm/vmx.h
-arch/x86/include/asm/kvm_host.h
-arch/x86/include/uapi/asm/svm.h
-arch/x86/include/uapi/asm/vmx.h
-arch/x86/include/uapi/asm/kvm.h
diff --git a/src/tools/perf/Makefile b/src/tools/perf/Makefile
deleted file mode 100644
index 64c043b..0000000
--- a/src/tools/perf/Makefile
+++ /dev/null
@@ -1,819 +0,0 @@
-include ../scripts/Makefile.include
-
-# The default target of this Makefile is...
-all:
-
-include config/utilities.mak
-
-# Define V to have a more verbose compile.
-#
-# Define O to save output files in a separate directory.
-#
-# Define ARCH as name of target architecture if you want cross-builds.
-#
-# Define CROSS_COMPILE as prefix name of compiler if you want cross-builds.
-#
-# Define NO_LIBPERL to disable perl script extension.
-#
-# Define NO_LIBPYTHON to disable python script extension.
-#
-# Define PYTHON to point to the python binary if the default
-# `python' is not correct; for example: PYTHON=python2
-#
-# Define PYTHON_CONFIG to point to the python-config binary if
-# the default `$(PYTHON)-config' is not correct.
-#
-# Define ASCIIDOC8 if you want to format documentation with AsciiDoc 8
-#
-# Define DOCBOOK_XSL_172 if you want to format man pages with DocBook XSL v1.72.
-#
-# Define LDFLAGS=-static to build a static binary.
-#
-# Define EXTRA_CFLAGS=-m64 or EXTRA_CFLAGS=-m32 as appropriate for cross-builds.
-#
-# Define NO_DWARF if you do not want debug-info analysis feature at all.
-#
-# Define WERROR=0 to disable treating any warnings as errors.
-#
-# Define NO_NEWT if you do not want TUI support. (deprecated)
-#
-# Define NO_SLANG if you do not want TUI support.
-#
-# Define NO_GTK2 if you do not want GTK+ GUI support.
-#
-# Define NO_DEMANGLE if you do not want C++ symbol demangling.
-#
-# Define NO_LIBELF if you do not want libelf dependency (e.g. cross-builds)
-#
-# Define NO_LIBUNWIND if you do not want libunwind dependency for dwarf
-# backtrace post unwind.
-#
-# Define NO_BACKTRACE if you do not want stack backtrace debug feature
-#
-# Define NO_LIBNUMA if you do not want numa perf benchmark
-#
-# Define NO_LIBAUDIT if you do not want libaudit support
-#
-# Define NO_LIBBIONIC if you do not want bionic support
-
-ifeq ($(srctree),)
-srctree := $(patsubst %/,%,$(dir $(shell pwd)))
-srctree := $(patsubst %/,%,$(dir $(srctree)))
-#$(info Determined 'srctree' to be $(srctree))
-endif
-
-ifneq ($(objtree),)
-#$(info Determined 'objtree' to be $(objtree))
-endif
-
-ifneq ($(OUTPUT),)
-#$(info Determined 'OUTPUT' to be $(OUTPUT))
-endif
-
-$(OUTPUT)PERF-VERSION-FILE: .FORCE-PERF-VERSION-FILE
-	@$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT)
-
-CC = $(CROSS_COMPILE)gcc
-AR = $(CROSS_COMPILE)ar
-
-RM      = rm -f
-MKDIR   = mkdir
-FIND    = find
-INSTALL = install
-FLEX    = flex
-BISON   = bison
-STRIP   = strip
-
-LK_DIR          = $(srctree)/tools/lib/lk/
-TRACE_EVENT_DIR = $(srctree)/tools/lib/traceevent/
-
-# include config/Makefile by default and rule out
-# non-config cases
-config := 1
-
-NON_CONFIG_TARGETS := clean TAGS tags cscope help
-
-ifdef MAKECMDGOALS
-ifeq ($(filter-out $(NON_CONFIG_TARGETS),$(MAKECMDGOALS)),)
-  config := 0
-endif
-endif
-
-ifeq ($(config),1)
-include config/Makefile
-endif
-
-export prefix bindir sharedir sysconfdir
-
-# sparse is architecture-neutral, which means that we need to tell it
-# explicitly what architecture to check for. Fix this up for yours..
-SPARSE_FLAGS = -D__BIG_ENDIAN__ -D__powerpc__
-
-# Guard against environment variables
-BUILTIN_OBJS =
-LIB_H =
-LIB_OBJS =
-PYRF_OBJS =
-SCRIPT_SH =
-
-SCRIPT_SH += perf-archive.sh
-
-grep-libs = $(filter -l%,$(1))
-strip-libs = $(filter-out -l%,$(1))
-
-ifneq ($(OUTPUT),)
-  TE_PATH=$(OUTPUT)
-ifneq ($(subdir),)
-  LK_PATH=$(OUTPUT)/../lib/lk/
-else
-  LK_PATH=$(OUTPUT)
-endif
-else
-  TE_PATH=$(TRACE_EVENT_DIR)
-  LK_PATH=$(LK_DIR)
-endif
-
-LIBTRACEEVENT = $(TE_PATH)libtraceevent.a
-export LIBTRACEEVENT
-
-LIBLK = $(LK_PATH)liblk.a
-export LIBLK
-
-# python extension build directories
-PYTHON_EXTBUILD     := $(OUTPUT)python_ext_build/
-PYTHON_EXTBUILD_LIB := $(PYTHON_EXTBUILD)lib/
-PYTHON_EXTBUILD_TMP := $(PYTHON_EXTBUILD)tmp/
-export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP
-
-python-clean := rm -rf $(PYTHON_EXTBUILD) $(OUTPUT)python/perf.so
-
-PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
-PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBTRACEEVENT) $(LIBLK)
-
-$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS)
-	$(QUIET_GEN)CFLAGS='$(CFLAGS)' $(PYTHON_WORD) util/setup.py \
-	  --quiet build_ext; \
-	mkdir -p $(OUTPUT)python && \
-	cp $(PYTHON_EXTBUILD_LIB)perf.so $(OUTPUT)python/
-#
-# No Perl scripts right now:
-#
-
-SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
-
-#
-# Single 'perf' binary right now:
-#
-PROGRAMS += $(OUTPUT)perf
-
-# what 'all' will build and 'install' will install, in perfexecdir
-ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
-
-# what 'all' will build but not install in perfexecdir
-OTHER_PROGRAMS = $(OUTPUT)perf
-
-# Set paths to tools early so that they can be used for version tests.
-ifndef SHELL_PATH
-  SHELL_PATH = /bin/sh
-endif
-ifndef PERL_PATH
-  PERL_PATH = /usr/bin/perl
-endif
-
-export PERL_PATH
-
-$(OUTPUT)util/parse-events-flex.c: util/parse-events.l $(OUTPUT)util/parse-events-bison.c
-	$(QUIET_FLEX)$(FLEX) --header-file=$(OUTPUT)util/parse-events-flex.h $(PARSER_DEBUG_FLEX) -t util/parse-events.l > $(OUTPUT)util/parse-events-flex.c
-
-$(OUTPUT)util/parse-events-bison.c: util/parse-events.y
-	$(QUIET_BISON)$(BISON) -v util/parse-events.y -d $(PARSER_DEBUG_BISON) -o $(OUTPUT)util/parse-events-bison.c -p parse_events_
-
-$(OUTPUT)util/pmu-flex.c: util/pmu.l $(OUTPUT)util/pmu-bison.c
-	$(QUIET_FLEX)$(FLEX) --header-file=$(OUTPUT)util/pmu-flex.h -t util/pmu.l > $(OUTPUT)util/pmu-flex.c
-
-$(OUTPUT)util/pmu-bison.c: util/pmu.y
-	$(QUIET_BISON)$(BISON) -v util/pmu.y -d -o $(OUTPUT)util/pmu-bison.c -p perf_pmu_
-
-$(OUTPUT)util/parse-events.o: $(OUTPUT)util/parse-events-flex.c $(OUTPUT)util/parse-events-bison.c
-$(OUTPUT)util/pmu.o: $(OUTPUT)util/pmu-flex.c $(OUTPUT)util/pmu-bison.c
-
-LIB_FILE=$(OUTPUT)libperf.a
-
-LIB_H += ../../include/uapi/linux/perf_event.h
-LIB_H += ../../include/linux/rbtree.h
-LIB_H += ../../include/linux/list.h
-LIB_H += ../../include/uapi/linux/const.h
-LIB_H += ../../include/linux/hash.h
-LIB_H += ../../include/linux/stringify.h
-LIB_H += util/include/linux/bitmap.h
-LIB_H += util/include/linux/bitops.h
-LIB_H += util/include/linux/compiler.h
-LIB_H += util/include/linux/const.h
-LIB_H += util/include/linux/ctype.h
-LIB_H += util/include/linux/kernel.h
-LIB_H += util/include/linux/list.h
-LIB_H += util/include/linux/export.h
-LIB_H += util/include/linux/magic.h
-LIB_H += util/include/linux/poison.h
-LIB_H += util/include/linux/prefetch.h
-LIB_H += util/include/linux/rbtree.h
-LIB_H += util/include/linux/rbtree_augmented.h
-LIB_H += util/include/linux/string.h
-LIB_H += util/include/linux/types.h
-LIB_H += util/include/linux/linkage.h
-LIB_H += util/include/asm/asm-offsets.h
-LIB_H += util/include/asm/bug.h
-LIB_H += util/include/asm/byteorder.h
-LIB_H += util/include/asm/hweight.h
-LIB_H += util/include/asm/swab.h
-LIB_H += util/include/asm/system.h
-LIB_H += util/include/asm/uaccess.h
-LIB_H += util/include/dwarf-regs.h
-LIB_H += util/include/asm/dwarf2.h
-LIB_H += util/include/asm/cpufeature.h
-LIB_H += util/include/asm/unistd_32.h
-LIB_H += util/include/asm/unistd_64.h
-LIB_H += perf.h
-LIB_H += util/annotate.h
-LIB_H += util/cache.h
-LIB_H += util/callchain.h
-LIB_H += util/build-id.h
-LIB_H += util/debug.h
-LIB_H += util/sysfs.h
-LIB_H += util/pmu.h
-LIB_H += util/event.h
-LIB_H += util/evsel.h
-LIB_H += util/evlist.h
-LIB_H += util/exec_cmd.h
-LIB_H += util/types.h
-LIB_H += util/levenshtein.h
-LIB_H += util/machine.h
-LIB_H += util/map.h
-LIB_H += util/parse-options.h
-LIB_H += util/parse-events.h
-LIB_H += util/quote.h
-LIB_H += util/util.h
-LIB_H += util/xyarray.h
-LIB_H += util/header.h
-LIB_H += util/help.h
-LIB_H += util/session.h
-LIB_H += util/strbuf.h
-LIB_H += util/strlist.h
-LIB_H += util/strfilter.h
-LIB_H += util/svghelper.h
-LIB_H += util/tool.h
-LIB_H += util/run-command.h
-LIB_H += util/sigchain.h
-LIB_H += util/dso.h
-LIB_H += util/symbol.h
-LIB_H += util/color.h
-LIB_H += util/values.h
-LIB_H += util/sort.h
-LIB_H += util/hist.h
-LIB_H += util/thread.h
-LIB_H += util/thread_map.h
-LIB_H += util/trace-event.h
-LIB_H += util/probe-finder.h
-LIB_H += util/dwarf-aux.h
-LIB_H += util/probe-event.h
-LIB_H += util/pstack.h
-LIB_H += util/cpumap.h
-LIB_H += util/top.h
-LIB_H += $(ARCH_INCLUDE)
-LIB_H += util/cgroup.h
-LIB_H += $(LIB_INCLUDE)traceevent/event-parse.h
-LIB_H += util/target.h
-LIB_H += util/rblist.h
-LIB_H += util/intlist.h
-LIB_H += util/perf_regs.h
-LIB_H += util/unwind.h
-LIB_H += util/vdso.h
-LIB_H += ui/helpline.h
-LIB_H += ui/progress.h
-LIB_H += ui/util.h
-LIB_H += ui/ui.h
-
-LIB_OBJS += $(OUTPUT)util/abspath.o
-LIB_OBJS += $(OUTPUT)util/alias.o
-LIB_OBJS += $(OUTPUT)util/annotate.o
-LIB_OBJS += $(OUTPUT)util/build-id.o
-LIB_OBJS += $(OUTPUT)util/config.o
-LIB_OBJS += $(OUTPUT)util/ctype.o
-LIB_OBJS += $(OUTPUT)util/sysfs.o
-LIB_OBJS += $(OUTPUT)util/pmu.o
-LIB_OBJS += $(OUTPUT)util/environment.o
-LIB_OBJS += $(OUTPUT)util/event.o
-LIB_OBJS += $(OUTPUT)util/evlist.o
-LIB_OBJS += $(OUTPUT)util/evsel.o
-LIB_OBJS += $(OUTPUT)util/exec_cmd.o
-LIB_OBJS += $(OUTPUT)util/help.o
-LIB_OBJS += $(OUTPUT)util/levenshtein.o
-LIB_OBJS += $(OUTPUT)util/parse-options.o
-LIB_OBJS += $(OUTPUT)util/parse-events.o
-LIB_OBJS += $(OUTPUT)util/path.o
-LIB_OBJS += $(OUTPUT)util/rbtree.o
-LIB_OBJS += $(OUTPUT)util/bitmap.o
-LIB_OBJS += $(OUTPUT)util/hweight.o
-LIB_OBJS += $(OUTPUT)util/run-command.o
-LIB_OBJS += $(OUTPUT)util/quote.o
-LIB_OBJS += $(OUTPUT)util/strbuf.o
-LIB_OBJS += $(OUTPUT)util/string.o
-LIB_OBJS += $(OUTPUT)util/strlist.o
-LIB_OBJS += $(OUTPUT)util/strfilter.o
-LIB_OBJS += $(OUTPUT)util/top.o
-LIB_OBJS += $(OUTPUT)util/usage.o
-LIB_OBJS += $(OUTPUT)util/wrapper.o
-LIB_OBJS += $(OUTPUT)util/sigchain.o
-LIB_OBJS += $(OUTPUT)util/dso.o
-LIB_OBJS += $(OUTPUT)util/symbol.o
-LIB_OBJS += $(OUTPUT)util/symbol-elf.o
-LIB_OBJS += $(OUTPUT)util/color.o
-LIB_OBJS += $(OUTPUT)util/pager.o
-LIB_OBJS += $(OUTPUT)util/header.o
-LIB_OBJS += $(OUTPUT)util/callchain.o
-LIB_OBJS += $(OUTPUT)util/values.o
-LIB_OBJS += $(OUTPUT)util/debug.o
-LIB_OBJS += $(OUTPUT)util/machine.o
-LIB_OBJS += $(OUTPUT)util/map.o
-LIB_OBJS += $(OUTPUT)util/pstack.o
-LIB_OBJS += $(OUTPUT)util/session.o
-LIB_OBJS += $(OUTPUT)util/thread.o
-LIB_OBJS += $(OUTPUT)util/thread_map.o
-LIB_OBJS += $(OUTPUT)util/trace-event-parse.o
-LIB_OBJS += $(OUTPUT)util/parse-events-flex.o
-LIB_OBJS += $(OUTPUT)util/parse-events-bison.o
-LIB_OBJS += $(OUTPUT)util/pmu-flex.o
-LIB_OBJS += $(OUTPUT)util/pmu-bison.o
-LIB_OBJS += $(OUTPUT)util/trace-event-read.o
-LIB_OBJS += $(OUTPUT)util/trace-event-info.o
-LIB_OBJS += $(OUTPUT)util/trace-event-scripting.o
-LIB_OBJS += $(OUTPUT)util/svghelper.o
-LIB_OBJS += $(OUTPUT)util/sort.o
-LIB_OBJS += $(OUTPUT)util/hist.o
-LIB_OBJS += $(OUTPUT)util/probe-event.o
-LIB_OBJS += $(OUTPUT)util/util.o
-LIB_OBJS += $(OUTPUT)util/xyarray.o
-LIB_OBJS += $(OUTPUT)util/cpumap.o
-LIB_OBJS += $(OUTPUT)util/cgroup.o
-LIB_OBJS += $(OUTPUT)util/target.o
-LIB_OBJS += $(OUTPUT)util/rblist.o
-LIB_OBJS += $(OUTPUT)util/intlist.o
-LIB_OBJS += $(OUTPUT)util/vdso.o
-LIB_OBJS += $(OUTPUT)util/stat.o
-LIB_OBJS += $(OUTPUT)util/record.o
-
-LIB_OBJS += $(OUTPUT)ui/setup.o
-LIB_OBJS += $(OUTPUT)ui/helpline.o
-LIB_OBJS += $(OUTPUT)ui/progress.o
-LIB_OBJS += $(OUTPUT)ui/util.o
-LIB_OBJS += $(OUTPUT)ui/hist.o
-LIB_OBJS += $(OUTPUT)ui/stdio/hist.o
-
-LIB_OBJS += $(OUTPUT)arch/common.o
-
-LIB_OBJS += $(OUTPUT)tests/parse-events.o
-LIB_OBJS += $(OUTPUT)tests/dso-data.o
-LIB_OBJS += $(OUTPUT)tests/attr.o
-LIB_OBJS += $(OUTPUT)tests/vmlinux-kallsyms.o
-LIB_OBJS += $(OUTPUT)tests/open-syscall.o
-LIB_OBJS += $(OUTPUT)tests/open-syscall-all-cpus.o
-LIB_OBJS += $(OUTPUT)tests/open-syscall-tp-fields.o
-LIB_OBJS += $(OUTPUT)tests/mmap-basic.o
-LIB_OBJS += $(OUTPUT)tests/perf-record.o
-LIB_OBJS += $(OUTPUT)tests/rdpmc.o
-LIB_OBJS += $(OUTPUT)tests/evsel-roundtrip-name.o
-LIB_OBJS += $(OUTPUT)tests/evsel-tp-sched.o
-LIB_OBJS += $(OUTPUT)tests/pmu.o
-LIB_OBJS += $(OUTPUT)tests/hists_link.o
-LIB_OBJS += $(OUTPUT)tests/python-use.o
-LIB_OBJS += $(OUTPUT)tests/bp_signal.o
-LIB_OBJS += $(OUTPUT)tests/bp_signal_overflow.o
-LIB_OBJS += $(OUTPUT)tests/task-exit.o
-LIB_OBJS += $(OUTPUT)tests/sw-clock.o
-ifeq ($(ARCH),x86)
-LIB_OBJS += $(OUTPUT)tests/perf-time-to-tsc.o
-endif
-LIB_OBJS += $(OUTPUT)tests/code-reading.o
-LIB_OBJS += $(OUTPUT)tests/sample-parsing.o
-LIB_OBJS += $(OUTPUT)tests/parse-no-sample-id-all.o
-
-BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o
-BUILTIN_OBJS += $(OUTPUT)builtin-bench.o
-# Benchmark modules
-BUILTIN_OBJS += $(OUTPUT)bench/sched-messaging.o
-BUILTIN_OBJS += $(OUTPUT)bench/sched-pipe.o
-ifeq ($(RAW_ARCH),x86_64)
-BUILTIN_OBJS += $(OUTPUT)bench/mem-memcpy-x86-64-asm.o
-BUILTIN_OBJS += $(OUTPUT)bench/mem-memset-x86-64-asm.o
-endif
-BUILTIN_OBJS += $(OUTPUT)bench/mem-memcpy.o
-BUILTIN_OBJS += $(OUTPUT)bench/mem-memset.o
-
-BUILTIN_OBJS += $(OUTPUT)builtin-diff.o
-BUILTIN_OBJS += $(OUTPUT)builtin-evlist.o
-BUILTIN_OBJS += $(OUTPUT)builtin-help.o
-BUILTIN_OBJS += $(OUTPUT)builtin-sched.o
-BUILTIN_OBJS += $(OUTPUT)builtin-buildid-list.o
-BUILTIN_OBJS += $(OUTPUT)builtin-buildid-cache.o
-BUILTIN_OBJS += $(OUTPUT)builtin-list.o
-BUILTIN_OBJS += $(OUTPUT)builtin-record.o
-BUILTIN_OBJS += $(OUTPUT)builtin-report.o
-BUILTIN_OBJS += $(OUTPUT)builtin-stat.o
-BUILTIN_OBJS += $(OUTPUT)builtin-timechart.o
-BUILTIN_OBJS += $(OUTPUT)builtin-top.o
-BUILTIN_OBJS += $(OUTPUT)builtin-script.o
-BUILTIN_OBJS += $(OUTPUT)builtin-probe.o
-BUILTIN_OBJS += $(OUTPUT)builtin-kmem.o
-BUILTIN_OBJS += $(OUTPUT)builtin-lock.o
-BUILTIN_OBJS += $(OUTPUT)builtin-kvm.o
-BUILTIN_OBJS += $(OUTPUT)builtin-inject.o
-BUILTIN_OBJS += $(OUTPUT)tests/builtin-test.o
-BUILTIN_OBJS += $(OUTPUT)builtin-mem.o
-
-PERFLIBS = $(LIB_FILE) $(LIBLK) $(LIBTRACEEVENT)
-
-# We choose to avoid "if .. else if .. else .. endif endif"
-# because maintaining the nesting to match is a pain.  If
-# we had "elif" things would have been much nicer...
-
--include arch/$(ARCH)/Makefile
-
-ifneq ($(OUTPUT),)
-  CFLAGS += -I$(OUTPUT)
-endif
-
-ifdef NO_LIBELF
-EXTLIBS := $(filter-out -lelf,$(EXTLIBS))
-
-# Remove ELF/DWARF dependent codes
-LIB_OBJS := $(filter-out $(OUTPUT)util/symbol-elf.o,$(LIB_OBJS))
-LIB_OBJS := $(filter-out $(OUTPUT)util/dwarf-aux.o,$(LIB_OBJS))
-LIB_OBJS := $(filter-out $(OUTPUT)util/probe-event.o,$(LIB_OBJS))
-LIB_OBJS := $(filter-out $(OUTPUT)util/probe-finder.o,$(LIB_OBJS))
-
-BUILTIN_OBJS := $(filter-out $(OUTPUT)builtin-probe.o,$(BUILTIN_OBJS))
-
-# Use minimal symbol handling
-LIB_OBJS += $(OUTPUT)util/symbol-minimal.o
-
-else # NO_LIBELF
-ifndef NO_DWARF
-  LIB_OBJS += $(OUTPUT)util/probe-finder.o
-  LIB_OBJS += $(OUTPUT)util/dwarf-aux.o
-endif # NO_DWARF
-endif # NO_LIBELF
-
-ifndef NO_LIBUNWIND
-  LIB_OBJS += $(OUTPUT)util/unwind.o
-endif
-LIB_OBJS += $(OUTPUT)tests/keep-tracking.o
-
-ifndef NO_LIBAUDIT
-  BUILTIN_OBJS += $(OUTPUT)builtin-trace.o
-endif
-
-ifndef NO_SLANG
-  LIB_OBJS += $(OUTPUT)ui/browser.o
-  LIB_OBJS += $(OUTPUT)ui/browsers/annotate.o
-  LIB_OBJS += $(OUTPUT)ui/browsers/hists.o
-  LIB_OBJS += $(OUTPUT)ui/browsers/map.o
-  LIB_OBJS += $(OUTPUT)ui/browsers/scripts.o
-  LIB_OBJS += $(OUTPUT)ui/tui/setup.o
-  LIB_OBJS += $(OUTPUT)ui/tui/util.o
-  LIB_OBJS += $(OUTPUT)ui/tui/helpline.o
-  LIB_OBJS += $(OUTPUT)ui/tui/progress.o
-  LIB_H += ui/browser.h
-  LIB_H += ui/browsers/map.h
-  LIB_H += ui/keysyms.h
-  LIB_H += ui/libslang.h
-endif
-
-ifndef NO_GTK2
-  LIB_OBJS += $(OUTPUT)ui/gtk/browser.o
-  LIB_OBJS += $(OUTPUT)ui/gtk/hists.o
-  LIB_OBJS += $(OUTPUT)ui/gtk/setup.o
-  LIB_OBJS += $(OUTPUT)ui/gtk/util.o
-  LIB_OBJS += $(OUTPUT)ui/gtk/helpline.o
-  LIB_OBJS += $(OUTPUT)ui/gtk/progress.o
-  LIB_OBJS += $(OUTPUT)ui/gtk/annotate.o
-endif
-
-ifndef NO_LIBPERL
-  LIB_OBJS += $(OUTPUT)util/scripting-engines/trace-event-perl.o
-  LIB_OBJS += $(OUTPUT)scripts/perl/Perf-Trace-Util/Context.o
-endif
-
-ifndef NO_LIBPYTHON
-  LIB_OBJS += $(OUTPUT)util/scripting-engines/trace-event-python.o
-  LIB_OBJS += $(OUTPUT)scripts/python/Perf-Trace-Util/Context.o
-endif
-
-ifeq ($(NO_PERF_REGS),0)
-  ifeq ($(ARCH),x86)
-    LIB_H += arch/x86/include/perf_regs.h
-  endif
-endif
-
-ifndef NO_LIBNUMA
-  BUILTIN_OBJS += $(OUTPUT)bench/numa.o
-endif
-
-ifdef ASCIIDOC8
-  export ASCIIDOC8
-endif
-
-LIBS = -Wl,--whole-archive $(PERFLIBS) -Wl,--no-whole-archive -Wl,--start-group $(EXTLIBS) -Wl,--end-group
-
-export INSTALL SHELL_PATH
-
-### Build rules
-
-SHELL = $(SHELL_PATH)
-
-all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS)
-
-please_set_SHELL_PATH_to_a_more_modern_shell:
-	@$$(:)
-
-shell_compatibility_test: please_set_SHELL_PATH_to_a_more_modern_shell
-
-strip: $(PROGRAMS) $(OUTPUT)perf
-	$(STRIP) $(STRIP_OPTS) $(PROGRAMS) $(OUTPUT)perf
-
-$(OUTPUT)perf.o: perf.c $(OUTPUT)common-cmds.h $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -include $(OUTPUT)PERF-VERSION-FILE \
-		'-DPERF_HTML_PATH="$(htmldir_SQ)"' \
-		$(CFLAGS) -c $(filter %.c,$^) -o $@
-
-$(OUTPUT)perf: $(OUTPUT)perf.o $(BUILTIN_OBJS) $(PERFLIBS)
-	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(OUTPUT)perf.o \
-               $(BUILTIN_OBJS) $(LIBS) -o $@
-
-$(OUTPUT)builtin-help.o: builtin-help.c $(OUTPUT)common-cmds.h $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) \
-		'-DPERF_HTML_PATH="$(htmldir_SQ)"' \
-		'-DPERF_MAN_PATH="$(mandir_SQ)"' \
-		'-DPERF_INFO_PATH="$(infodir_SQ)"' $<
-
-$(OUTPUT)builtin-timechart.o: builtin-timechart.c $(OUTPUT)common-cmds.h $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) \
-		'-DPERF_HTML_PATH="$(htmldir_SQ)"' \
-		'-DPERF_MAN_PATH="$(mandir_SQ)"' \
-		'-DPERF_INFO_PATH="$(infodir_SQ)"' $<
-
-$(OUTPUT)common-cmds.h: util/generate-cmdlist.sh command-list.txt
-
-$(OUTPUT)common-cmds.h: $(wildcard Documentation/perf-*.txt)
-	$(QUIET_GEN). util/generate-cmdlist.sh > $@+ && mv $@+ $@
-
-$(SCRIPTS) : % : %.sh
-	$(QUIET_GEN)$(INSTALL) '$@.sh' '$(OUTPUT)$@'
-
-# These can record PERF_VERSION
-$(OUTPUT)perf.o perf.spec \
-	$(SCRIPTS) \
-	: $(OUTPUT)PERF-VERSION-FILE
-
-.SUFFIXES:
-.SUFFIXES: .o .c .S .s
-
-# These two need to be here so that when O= is not used they take precedence
-# over the general rule for .o
-
-$(OUTPUT)util/%-flex.o: $(OUTPUT)util/%-flex.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c -Iutil/ $(CFLAGS) -w $<
-
-$(OUTPUT)util/%-bison.o: $(OUTPUT)util/%-bison.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c -Iutil/ $(CFLAGS) -DYYENABLE_NLS=0 -DYYLTYPE_IS_TRIVIAL=0 -w $<
-
-$(OUTPUT)%.o: %.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) $<
-$(OUTPUT)%.i: %.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -E $(CFLAGS) $<
-$(OUTPUT)%.s: %.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -S $(CFLAGS) $<
-$(OUTPUT)%.o: %.S
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) $<
-$(OUTPUT)%.s: %.S
-	$(QUIET_CC)$(CC) -o $@ -E $(CFLAGS) $<
-
-$(OUTPUT)util/exec_cmd.o: util/exec_cmd.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) \
-		'-DPERF_EXEC_PATH="$(perfexecdir_SQ)"' \
-		'-DPREFIX="$(prefix_SQ)"' \
-		$<
-
-$(OUTPUT)tests/attr.o: tests/attr.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) \
-		'-DBINDIR="$(bindir_SQ)"' -DPYTHON='"$(PYTHON_WORD)"' \
-		$<
-
-$(OUTPUT)tests/python-use.o: tests/python-use.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) \
-		-DPYTHONPATH='"$(OUTPUT)python"' \
-		-DPYTHON='"$(PYTHON_WORD)"' \
-		$<
-
-$(OUTPUT)util/config.o: util/config.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) -DETC_PERFCONFIG='"$(ETC_PERFCONFIG_SQ)"' $<
-
-$(OUTPUT)ui/browser.o: ui/browser.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) -DENABLE_SLFUTURE_CONST $<
-
-$(OUTPUT)ui/browsers/annotate.o: ui/browsers/annotate.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) -DENABLE_SLFUTURE_CONST $<
-
-$(OUTPUT)ui/browsers/hists.o: ui/browsers/hists.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) -DENABLE_SLFUTURE_CONST $<
-
-$(OUTPUT)ui/browsers/map.o: ui/browsers/map.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) -DENABLE_SLFUTURE_CONST $<
-
-$(OUTPUT)ui/browsers/scripts.o: ui/browsers/scripts.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) -DENABLE_SLFUTURE_CONST $<
-
-$(OUTPUT)util/rbtree.o: ../../lib/rbtree.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) -Wno-unused-parameter -DETC_PERFCONFIG='"$(ETC_PERFCONFIG_SQ)"' $<
-
-$(OUTPUT)util/parse-events.o: util/parse-events.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) -Wno-redundant-decls $<
-
-$(OUTPUT)util/scripting-engines/trace-event-perl.o: util/scripting-engines/trace-event-perl.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) $(PERL_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-shadow -Wno-undef -Wno-switch-default $<
-
-$(OUTPUT)scripts/perl/Perf-Trace-Util/Context.o: scripts/perl/Perf-Trace-Util/Context.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) $(PERL_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-nested-externs -Wno-undef -Wno-switch-default $<
-
-$(OUTPUT)util/scripting-engines/trace-event-python.o: util/scripting-engines/trace-event-python.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) $(PYTHON_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-shadow $<
-
-$(OUTPUT)scripts/python/Perf-Trace-Util/Context.o: scripts/python/Perf-Trace-Util/Context.c $(OUTPUT)PERF-CFLAGS
-	$(QUIET_CC)$(CC) -o $@ -c $(CFLAGS) $(PYTHON_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-nested-externs $<
-
-$(OUTPUT)perf-%: %.o $(PERFLIBS)
-	$(QUIET_LINK)$(CC) $(CFLAGS) -o $@ $(LDFLAGS) $(filter %.o,$^) $(LIBS)
-
-$(LIB_OBJS) $(BUILTIN_OBJS): $(LIB_H)
-$(patsubst perf-%,%.o,$(PROGRAMS)): $(LIB_H) $(wildcard */*.h)
-
-# we compile into subdirectories. if the target directory is not the source directory, they might not exists. So
-# we depend the various files onto their directories.
-DIRECTORY_DEPS = $(LIB_OBJS) $(BUILTIN_OBJS) $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h
-$(DIRECTORY_DEPS): | $(sort $(dir $(DIRECTORY_DEPS)))
-# In the second step, we make a rule to actually create these directories
-$(sort $(dir $(DIRECTORY_DEPS))):
-	$(QUIET_MKDIR)$(MKDIR) -p $@ 2>/dev/null
-
-$(LIB_FILE): $(LIB_OBJS)
-	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIB_OBJS)
-
-# libtraceevent.a
-$(LIBTRACEEVENT):
-	$(QUIET_SUBDIR0)$(TRACE_EVENT_DIR) $(QUIET_SUBDIR1) O=$(OUTPUT) libtraceevent.a
-
-$(LIBTRACEEVENT)-clean:
-	$(QUIET_SUBDIR0)$(TRACE_EVENT_DIR) $(QUIET_SUBDIR1) O=$(OUTPUT) clean
-
-# if subdir is set, we've been called from above so target has been built
-# already
-$(LIBLK):
-ifeq ($(subdir),)
-	$(QUIET_SUBDIR0)$(LK_DIR) $(QUIET_SUBDIR1) O=$(OUTPUT) liblk.a
-endif
-
-$(LIBLK)-clean:
-ifeq ($(subdir),)
-	$(QUIET_SUBDIR0)$(LK_DIR) $(QUIET_SUBDIR1) O=$(OUTPUT) clean
-endif
-
-help:
-	@echo 'Perf make targets:'
-	@echo '  doc		- make *all* documentation (see below)'
-	@echo '  man		- make manpage documentation (access with man <foo>)'
-	@echo '  html		- make html documentation'
-	@echo '  info		- make GNU info documentation (access with info <foo>)'
-	@echo '  pdf		- make pdf documentation'
-	@echo '  TAGS		- use etags to make tag information for source browsing'
-	@echo '  tags		- use ctags to make tag information for source browsing'
-	@echo '  cscope	- use cscope to make interactive browsing database'
-	@echo ''
-	@echo 'Perf install targets:'
-	@echo '  NOTE: documentation build requires asciidoc, xmlto packages to be installed'
-	@echo '  HINT: use "make prefix=<path> <install target>" to install to a particular'
-	@echo '        path like make prefix=/usr/local install install-doc'
-	@echo '  install	- install compiled binaries'
-	@echo '  install-doc	- install *all* documentation'
-	@echo '  install-man	- install manpage documentation'
-	@echo '  install-html	- install html documentation'
-	@echo '  install-info	- install GNU info documentation'
-	@echo '  install-pdf	- install pdf documentation'
-	@echo ''
-	@echo '  quick-install-doc	- alias for quick-install-man'
-	@echo '  quick-install-man	- install the documentation quickly'
-	@echo '  quick-install-html	- install the html documentation quickly'
-	@echo ''
-	@echo 'Perf maintainer targets:'
-	@echo '  clean			- clean all binary objects and build output'
-
-
-DOC_TARGETS := doc man html info pdf
-
-INSTALL_DOC_TARGETS := $(patsubst %,install-%,$(DOC_TARGETS)) try-install-man
-INSTALL_DOC_TARGETS += quick-install-doc quick-install-man quick-install-html
-
-# 'make doc' should call 'make -C Documentation all'
-$(DOC_TARGETS):
-	$(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) $(@:doc=all)
-
-TAGS:
-	$(RM) TAGS
-	$(FIND) . -name '*.[hcS]' -print | xargs etags -a
-
-tags:
-	$(RM) tags
-	$(FIND) . -name '*.[hcS]' -print | xargs ctags -a
-
-cscope:
-	$(RM) cscope*
-	$(FIND) . -name '*.[hcS]' -print | xargs cscope -b
-
-### Detect prefix changes
-TRACK_CFLAGS = $(subst ','\'',$(CFLAGS)):\
-             $(bindir_SQ):$(perfexecdir_SQ):$(template_dir_SQ):$(prefix_SQ)
-
-$(OUTPUT)PERF-CFLAGS: .FORCE-PERF-CFLAGS
-	@FLAGS='$(TRACK_CFLAGS)'; \
-	    if test x"$$FLAGS" != x"`cat $(OUTPUT)PERF-CFLAGS 2>/dev/null`" ; then \
-		echo 1>&2 "    * new build flags or prefix"; \
-		echo "$$FLAGS" >$(OUTPUT)PERF-CFLAGS; \
-            fi
-
-### Testing rules
-
-# GNU make supports exporting all variables by "export" without parameters.
-# However, the environment gets quite big, and some programs have problems
-# with that.
-
-check: $(OUTPUT)common-cmds.h
-	if sparse; \
-	then \
-		for i in *.c */*.c; \
-		do \
-			sparse $(CFLAGS) $(SPARSE_FLAGS) $$i || exit; \
-		done; \
-	else \
-		exit 1; \
-	fi
-
-### Installation rules
-
-install-bin: all
-	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
-	$(INSTALL) $(OUTPUT)perf '$(DESTDIR_SQ)$(bindir_SQ)'
-	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
-	$(INSTALL) $(OUTPUT)perf-archive -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
-ifndef NO_LIBPERL
-	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util/lib/Perf/Trace'
-	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/bin'
-	$(INSTALL) scripts/perl/Perf-Trace-Util/lib/Perf/Trace/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util/lib/Perf/Trace'
-	$(INSTALL) scripts/perl/*.pl -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl'
-	$(INSTALL) scripts/perl/bin/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/bin'
-endif
-ifndef NO_LIBPYTHON
-	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace'
-	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/bin'
-	$(INSTALL) scripts/python/Perf-Trace-Util/lib/Perf/Trace/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace'
-	$(INSTALL) scripts/python/*.py -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python'
-	$(INSTALL) scripts/python/bin/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/bin'
-endif
-	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d'
-	$(INSTALL) bash_completion '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d/perf'
-	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests'
-	$(INSTALL) tests/attr.py '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests'
-	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr'
-	$(INSTALL) tests/attr/* '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr'
-
-install: install-bin try-install-man
-
-install-python_ext:
-	$(PYTHON_WORD) util/setup.py --quiet install --root='/$(DESTDIR_SQ)'
-
-# 'make install-doc' should call 'make -C Documentation install'
-$(INSTALL_DOC_TARGETS):
-	$(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) $(@:-doc=)
-
-### Cleaning rules
-
-clean: $(LIBTRACEEVENT)-clean $(LIBLK)-clean
-	$(RM) $(LIB_OBJS) $(BUILTIN_OBJS) $(LIB_FILE) $(OUTPUT)perf-archive $(OUTPUT)perf.o $(LANG_BINDINGS)
-	$(RM) $(ALL_PROGRAMS) perf
-	$(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope*
-	$(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) clean
-	$(RM) $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)PERF-CFLAGS
-	$(RM) $(OUTPUT)util/*-bison*
-	$(RM) $(OUTPUT)util/*-flex*
-	$(python-clean)
-
-.PHONY: all install clean strip $(LIBTRACEEVENT) $(LIBLK)
-.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
-.PHONY: .FORCE-PERF-VERSION-FILE TAGS tags cscope .FORCE-PERF-CFLAGS
diff --git a/src/tools/perf/arch/arm/Makefile b/src/tools/perf/arch/arm/Makefile
deleted file mode 100644
index 15130b5..0000000
--- a/src/tools/perf/arch/arm/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-ifndef NO_DWARF
-PERF_HAVE_DWARF_REGS := 1
-LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o
-endif
diff --git a/src/tools/perf/arch/arm/util/dwarf-regs.c b/src/tools/perf/arch/arm/util/dwarf-regs.c
deleted file mode 100644
index 33ec5b3..0000000
--- a/src/tools/perf/arch/arm/util/dwarf-regs.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Mapping of DWARF debug register numbers into register names.
- *
- * Copyright (C) 2010 Will Deacon, ARM Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <stddef.h>
-#include <dwarf-regs.h>
-
-struct pt_regs_dwarfnum {
-	const char *name;
-	unsigned int dwarfnum;
-};
-
-#define STR(s) #s
-#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
-#define GPR_DWARFNUM_NAME(num) \
-	{.name = STR(%r##num), .dwarfnum = num}
-#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
-
-/*
- * Reference:
- * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0040a/IHI0040A_aadwarf.pdf
- */
-static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
-	GPR_DWARFNUM_NAME(0),
-	GPR_DWARFNUM_NAME(1),
-	GPR_DWARFNUM_NAME(2),
-	GPR_DWARFNUM_NAME(3),
-	GPR_DWARFNUM_NAME(4),
-	GPR_DWARFNUM_NAME(5),
-	GPR_DWARFNUM_NAME(6),
-	GPR_DWARFNUM_NAME(7),
-	GPR_DWARFNUM_NAME(8),
-	GPR_DWARFNUM_NAME(9),
-	GPR_DWARFNUM_NAME(10),
-	REG_DWARFNUM_NAME("%fp", 11),
-	REG_DWARFNUM_NAME("%ip", 12),
-	REG_DWARFNUM_NAME("%sp", 13),
-	REG_DWARFNUM_NAME("%lr", 14),
-	REG_DWARFNUM_NAME("%pc", 15),
-	REG_DWARFNUM_END,
-};
-
-/**
- * get_arch_regstr() - lookup register name from it's DWARF register number
- * @n:	the DWARF register number
- *
- * get_arch_regstr() returns the name of the register in struct
- * regdwarfnum_table from it's DWARF register number. If the register is not
- * found in the table, this returns NULL;
- */
-const char *get_arch_regstr(unsigned int n)
-{
-	const struct pt_regs_dwarfnum *roff;
-	for (roff = regdwarfnum_table; roff->name != NULL; roff++)
-		if (roff->dwarfnum == n)
-			return roff->name;
-	return NULL;
-}
diff --git a/src/tools/perf/arch/arm64/Makefile b/src/tools/perf/arch/arm64/Makefile
deleted file mode 100644
index 67e9b3d..0000000
--- a/src/tools/perf/arch/arm64/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-ifndef NO_DWARF
-PERF_HAVE_DWARF_REGS := 1
-LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o
-endif
-ifndef NO_LIBUNWIND
-LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/unwind-libunwind.o
-endif
diff --git a/src/tools/perf/arch/arm64/include/perf_regs.h b/src/tools/perf/arch/arm64/include/perf_regs.h
deleted file mode 100644
index e9441b9..0000000
--- a/src/tools/perf/arch/arm64/include/perf_regs.h
+++ /dev/null
@@ -1,88 +0,0 @@
-#ifndef ARCH_PERF_REGS_H
-#define ARCH_PERF_REGS_H
-
-#include <stdlib.h>
-#include <linux/types.h>
-#include <asm/perf_regs.h>
-
-#define PERF_REGS_MASK	((1ULL << PERF_REG_ARM64_MAX) - 1)
-#define PERF_REG_IP	PERF_REG_ARM64_PC
-#define PERF_REG_SP	PERF_REG_ARM64_SP
-
-static inline const char *perf_reg_name(int id)
-{
-	switch (id) {
-	case PERF_REG_ARM64_X0:
-		return "x0";
-	case PERF_REG_ARM64_X1:
-		return "x1";
-	case PERF_REG_ARM64_X2:
-		return "x2";
-	case PERF_REG_ARM64_X3:
-		return "x3";
-	case PERF_REG_ARM64_X4:
-		return "x4";
-	case PERF_REG_ARM64_X5:
-		return "x5";
-	case PERF_REG_ARM64_X6:
-		return "x6";
-	case PERF_REG_ARM64_X7:
-		return "x7";
-	case PERF_REG_ARM64_X8:
-		return "x8";
-	case PERF_REG_ARM64_X9:
-		return "x9";
-	case PERF_REG_ARM64_X10:
-		return "x10";
-	case PERF_REG_ARM64_X11:
-		return "x11";
-	case PERF_REG_ARM64_X12:
-		return "x12";
-	case PERF_REG_ARM64_X13:
-		return "x13";
-	case PERF_REG_ARM64_X14:
-		return "x14";
-	case PERF_REG_ARM64_X15:
-		return "x15";
-	case PERF_REG_ARM64_X16:
-		return "x16";
-	case PERF_REG_ARM64_X17:
-		return "x17";
-	case PERF_REG_ARM64_X18:
-		return "x18";
-	case PERF_REG_ARM64_X19:
-		return "x19";
-	case PERF_REG_ARM64_X20:
-		return "x20";
-	case PERF_REG_ARM64_X21:
-		return "x21";
-	case PERF_REG_ARM64_X22:
-		return "x22";
-	case PERF_REG_ARM64_X23:
-		return "x23";
-	case PERF_REG_ARM64_X24:
-		return "x24";
-	case PERF_REG_ARM64_X25:
-		return "x25";
-	case PERF_REG_ARM64_X26:
-		return "x26";
-	case PERF_REG_ARM64_X27:
-		return "x27";
-	case PERF_REG_ARM64_X28:
-		return "x28";
-	case PERF_REG_ARM64_X29:
-		return "x29";
-	case PERF_REG_ARM64_SP:
-		return "sp";
-	case PERF_REG_ARM64_LR:
-		return "lr";
-	case PERF_REG_ARM64_PC:
-		return "pc";
-	default:
-		return NULL;
-	}
-
-	return NULL;
-}
-
-#endif /* ARCH_PERF_REGS_H */
diff --git a/src/tools/perf/arch/arm64/util/dwarf-regs.c b/src/tools/perf/arch/arm64/util/dwarf-regs.c
deleted file mode 100644
index d49efeb..0000000
--- a/src/tools/perf/arch/arm64/util/dwarf-regs.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Mapping of DWARF debug register numbers into register names.
- *
- * Copyright (C) 2010 Will Deacon, ARM Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <stddef.h>
-#include <dwarf-regs.h>
-
-struct pt_regs_dwarfnum {
-	const char *name;
-	unsigned int dwarfnum;
-};
-
-#define STR(s) #s
-#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
-#define GPR_DWARFNUM_NAME(num) \
-	{.name = STR(%x##num), .dwarfnum = num}
-#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
-
-/*
- * Reference:
- * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0057b/IHI0057B_aadwarf64.pdf
- */
-static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
-	GPR_DWARFNUM_NAME(0),
-	GPR_DWARFNUM_NAME(1),
-	GPR_DWARFNUM_NAME(2),
-	GPR_DWARFNUM_NAME(3),
-	GPR_DWARFNUM_NAME(4),
-	GPR_DWARFNUM_NAME(5),
-	GPR_DWARFNUM_NAME(6),
-	GPR_DWARFNUM_NAME(7),
-	GPR_DWARFNUM_NAME(8),
-	GPR_DWARFNUM_NAME(9),
-	GPR_DWARFNUM_NAME(10),
-	GPR_DWARFNUM_NAME(11),
-	GPR_DWARFNUM_NAME(12),
-	GPR_DWARFNUM_NAME(13),
-	GPR_DWARFNUM_NAME(14),
-	GPR_DWARFNUM_NAME(15),
-	GPR_DWARFNUM_NAME(16),
-	GPR_DWARFNUM_NAME(17),
-	GPR_DWARFNUM_NAME(18),
-	GPR_DWARFNUM_NAME(19),
-	GPR_DWARFNUM_NAME(20),
-	GPR_DWARFNUM_NAME(21),
-	GPR_DWARFNUM_NAME(22),
-	GPR_DWARFNUM_NAME(23),
-	GPR_DWARFNUM_NAME(24),
-	GPR_DWARFNUM_NAME(25),
-	GPR_DWARFNUM_NAME(26),
-	GPR_DWARFNUM_NAME(27),
-	GPR_DWARFNUM_NAME(28),
-	GPR_DWARFNUM_NAME(29),
-	REG_DWARFNUM_NAME("%lr", 30),
-	REG_DWARFNUM_NAME("%sp", 31),
-	REG_DWARFNUM_END,
-};
-
-/**
- * get_arch_regstr() - lookup register name from it's DWARF register number
- * @n:	the DWARF register number
- *
- * get_arch_regstr() returns the name of the register in struct
- * regdwarfnum_table from it's DWARF register number. If the register is not
- * found in the table, this returns NULL;
- */
-const char *get_arch_regstr(unsigned int n)
-{
-	const struct pt_regs_dwarfnum *roff;
-	for (roff = regdwarfnum_table; roff->name != NULL; roff++)
-		if (roff->dwarfnum == n)
-			return roff->name;
-	return NULL;
-}
diff --git a/src/tools/perf/arch/arm64/util/unwind-libunwind.c b/src/tools/perf/arch/arm64/util/unwind-libunwind.c
deleted file mode 100644
index 436ee43..0000000
--- a/src/tools/perf/arch/arm64/util/unwind-libunwind.c
+++ /dev/null
@@ -1,82 +0,0 @@
-
-#include <errno.h>
-#include <libunwind.h>
-#include "perf_regs.h"
-#include "../../util/unwind.h"
-
-int libunwind__arch_reg_id(int regnum)
-{
-	switch (regnum) {
-	case UNW_AARCH64_X0:
-		return PERF_REG_ARM64_X0;
-	case UNW_AARCH64_X1:
-		return PERF_REG_ARM64_X1;
-	case UNW_AARCH64_X2:
-		return PERF_REG_ARM64_X2;
-	case UNW_AARCH64_X3:
-		return PERF_REG_ARM64_X3;
-	case UNW_AARCH64_X4:
-		return PERF_REG_ARM64_X4;
-	case UNW_AARCH64_X5:
-		return PERF_REG_ARM64_X5;
-	case UNW_AARCH64_X6:
-		return PERF_REG_ARM64_X6;
-	case UNW_AARCH64_X7:
-		return PERF_REG_ARM64_X7;
-	case UNW_AARCH64_X8:
-		return PERF_REG_ARM64_X8;
-	case UNW_AARCH64_X9:
-		return PERF_REG_ARM64_X9;
-	case UNW_AARCH64_X10:
-		return PERF_REG_ARM64_X10;
-	case UNW_AARCH64_X11:
-		return PERF_REG_ARM64_X11;
-	case UNW_AARCH64_X12:
-		return PERF_REG_ARM64_X12;
-	case UNW_AARCH64_X13:
-		return PERF_REG_ARM64_X13;
-	case UNW_AARCH64_X14:
-		return PERF_REG_ARM64_X14;
-	case UNW_AARCH64_X15:
-		return PERF_REG_ARM64_X15;
-	case UNW_AARCH64_X16:
-		return PERF_REG_ARM64_X16;
-	case UNW_AARCH64_X17:
-		return PERF_REG_ARM64_X17;
-	case UNW_AARCH64_X18:
-		return PERF_REG_ARM64_X18;
-	case UNW_AARCH64_X19:
-		return PERF_REG_ARM64_X19;
-	case UNW_AARCH64_X20:
-		return PERF_REG_ARM64_X20;
-	case UNW_AARCH64_X21:
-		return PERF_REG_ARM64_X21;
-	case UNW_AARCH64_X22:
-		return PERF_REG_ARM64_X22;
-	case UNW_AARCH64_X23:
-		return PERF_REG_ARM64_X23;
-	case UNW_AARCH64_X24:
-		return PERF_REG_ARM64_X24;
-	case UNW_AARCH64_X25:
-		return PERF_REG_ARM64_X25;
-	case UNW_AARCH64_X26:
-		return PERF_REG_ARM64_X26;
-	case UNW_AARCH64_X27:
-		return PERF_REG_ARM64_X27;
-	case UNW_AARCH64_X28:
-		return PERF_REG_ARM64_X28;
-	case UNW_AARCH64_X29:
-		return PERF_REG_ARM64_X29;
-	case UNW_AARCH64_X30:
-		return PERF_REG_ARM64_LR;
-	case UNW_AARCH64_SP:
-		return PERF_REG_ARM64_SP;
-	case UNW_AARCH64_PC:
-		return PERF_REG_ARM64_PC;
-	default:
-		pr_err("unwind: invalid reg id %d\n", regnum);
-		return -EINVAL;
-	}
-
-	return -EINVAL;
-}
diff --git a/src/tools/perf/arch/common.c b/src/tools/perf/arch/common.c
deleted file mode 100644
index a8cf951..0000000
--- a/src/tools/perf/arch/common.c
+++ /dev/null
@@ -1,227 +0,0 @@
-#include <stdio.h>
-#include <sys/utsname.h>
-#include "common.h"
-#include "../util/debug.h"
-
-const char *const arm_triplets[] = {
-	"arm-eabi-",
-	"arm-linux-androideabi-",
-	"arm-unknown-linux-",
-	"arm-unknown-linux-gnu-",
-	"arm-unknown-linux-gnueabi-",
-	NULL
-};
-
-#if defined(ANDROID_PATCHES)
-const char *const arm64_triplets[] = {
-	"aarch64-linux-android-",
-	NULL
-};
-#endif
-
-const char *const powerpc_triplets[] = {
-	"powerpc-unknown-linux-gnu-",
-	"powerpc64-unknown-linux-gnu-",
-	NULL
-};
-
-const char *const s390_triplets[] = {
-	"s390-ibm-linux-",
-	NULL
-};
-
-const char *const sh_triplets[] = {
-	"sh-unknown-linux-gnu-",
-	"sh64-unknown-linux-gnu-",
-	NULL
-};
-
-const char *const sparc_triplets[] = {
-	"sparc-unknown-linux-gnu-",
-	"sparc64-unknown-linux-gnu-",
-	NULL
-};
-
-const char *const x86_triplets[] = {
-	"x86_64-pc-linux-gnu-",
-	"x86_64-unknown-linux-gnu-",
-	"i686-pc-linux-gnu-",
-	"i586-pc-linux-gnu-",
-	"i486-pc-linux-gnu-",
-	"i386-pc-linux-gnu-",
-	"i686-linux-android-",
-	"i686-android-linux-",
-	NULL
-};
-
-const char *const mips_triplets[] = {
-	"mips-unknown-linux-gnu-",
-	"mipsel-linux-android-",
-	NULL
-};
-
-static bool lookup_path(char *name)
-{
-	bool found = false;
-	char *path, *tmp;
-	char buf[PATH_MAX];
-	char *env = getenv("PATH");
-
-	if (!env)
-		return false;
-
-	env = strdup(env);
-	if (!env)
-		return false;
-
-	path = strtok_r(env, ":", &tmp);
-	while (path) {
-		scnprintf(buf, sizeof(buf), "%s/%s", path, name);
-		if (access(buf, F_OK) == 0) {
-			found = true;
-			break;
-		}
-		path = strtok_r(NULL, ":", &tmp);
-	}
-	free(env);
-	return found;
-}
-
-static int lookup_triplets(const char *const *triplets, const char *name)
-{
-	int i;
-	char buf[PATH_MAX];
-
-	for (i = 0; triplets[i] != NULL; i++) {
-		scnprintf(buf, sizeof(buf), "%s%s", triplets[i], name);
-		if (lookup_path(buf))
-			return i;
-	}
-	return -1;
-}
-
-/*
- * Return architecture name in a normalized form.
- * The conversion logic comes from the Makefile.
- */
-static const char *normalize_arch(char *arch)
-{
-	if (!strcmp(arch, "x86_64"))
-		return "x86";
-	if (arch[0] == 'i' && arch[2] == '8' && arch[3] == '6')
-		return "x86";
-	if (!strcmp(arch, "sun4u") || !strncmp(arch, "sparc", 5))
-		return "sparc";
-#if defined(ANDROID_PATCHES)
-	if (!strcmp(arch, "aarch64") || !strcmp(arch, "arm64"))
-		return "arm64";
-#endif
-	if (!strncmp(arch, "arm", 3) || !strcmp(arch, "sa110"))
-		return "arm";
-	if (!strncmp(arch, "s390", 4))
-		return "s390";
-	if (!strncmp(arch, "parisc", 6))
-		return "parisc";
-	if (!strncmp(arch, "powerpc", 7) || !strncmp(arch, "ppc", 3))
-		return "powerpc";
-	if (!strncmp(arch, "mips", 4))
-		return "mips";
-	if (!strncmp(arch, "sh", 2) && isdigit(arch[2]))
-		return "sh";
-
-	return arch;
-}
-
-static int perf_session_env__lookup_binutils_path(struct perf_session_env *env,
-						  const char *name,
-						  const char **path)
-{
-	int idx;
-	const char *arch, *cross_env;
-	struct utsname uts;
-	const char *const *path_list;
-	char *buf = NULL;
-
-	arch = normalize_arch(env->arch);
-
-	if (uname(&uts) < 0)
-		goto out;
-
-	/*
-	 * We don't need to try to find objdump path for native system.
-	 * Just use default binutils path (e.g.: "objdump").
-	 */
-	if (!strcmp(normalize_arch(uts.machine), arch))
-		goto out;
-
-	cross_env = getenv("CROSS_COMPILE");
-	if (cross_env) {
-		if (asprintf(&buf, "%s%s", cross_env, name) < 0)
-			goto out_error;
-		if (buf[0] == '/') {
-			if (access(buf, F_OK) == 0)
-				goto out;
-			goto out_error;
-		}
-		if (lookup_path(buf))
-			goto out;
-		free(buf);
-		buf = NULL;
-	}
-
-	if (!strcmp(arch, "arm"))
-		path_list = arm_triplets;
-#if defined(ANDROID_PATCHES)
-	else if (!strcmp(arch, "arm64"))
-		path_list = arm64_triplets;
-#endif
-	else if (!strcmp(arch, "powerpc"))
-		path_list = powerpc_triplets;
-	else if (!strcmp(arch, "sh"))
-		path_list = sh_triplets;
-	else if (!strcmp(arch, "s390"))
-		path_list = s390_triplets;
-	else if (!strcmp(arch, "sparc"))
-		path_list = sparc_triplets;
-	else if (!strcmp(arch, "x86"))
-		path_list = x86_triplets;
-	else if (!strcmp(arch, "mips"))
-		path_list = mips_triplets;
-	else {
-		ui__error("binutils for %s not supported.\n", arch);
-		goto out_error;
-	}
-
-	idx = lookup_triplets(path_list, name);
-	if (idx < 0) {
-		ui__error("Please install %s for %s.\n"
-			  "You can add it to PATH, set CROSS_COMPILE or "
-			  "override the default using --%s.\n",
-			  name, arch, name);
-		goto out_error;
-	}
-
-	if (asprintf(&buf, "%s%s", path_list[idx], name) < 0)
-		goto out_error;
-
-out:
-	*path = buf;
-	return 0;
-out_error:
-	free(buf);
-	*path = NULL;
-	return -1;
-}
-
-int perf_session_env__lookup_objdump(struct perf_session_env *env)
-{
-	/*
-	 * For live mode, env->arch will be NULL and we can use
-	 * the native objdump tool.
-	 */
-	if (env->arch == NULL)
-		return 0;
-
-	return perf_session_env__lookup_binutils_path(env, "objdump",
-						      &objdump_path);
-}
diff --git a/src/tools/perf/arch/common.h b/src/tools/perf/arch/common.h
deleted file mode 100644
index ede246e..0000000
--- a/src/tools/perf/arch/common.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef ARCH_PERF_COMMON_H
-#define ARCH_PERF_COMMON_H
-
-#include "../util/session.h"
-
-extern const char *objdump_path;
-
-int perf_session_env__lookup_objdump(struct perf_session_env *env);
-
-#endif /* ARCH_PERF_COMMON_H */
diff --git a/src/tools/perf/arch/powerpc/Makefile b/src/tools/perf/arch/powerpc/Makefile
deleted file mode 100644
index 744e629..0000000
--- a/src/tools/perf/arch/powerpc/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-ifndef NO_DWARF
-PERF_HAVE_DWARF_REGS := 1
-LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o
-endif
-LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/header.o
diff --git a/src/tools/perf/arch/powerpc/util/dwarf-regs.c b/src/tools/perf/arch/powerpc/util/dwarf-regs.c
deleted file mode 100644
index 733151c..0000000
--- a/src/tools/perf/arch/powerpc/util/dwarf-regs.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Mapping of DWARF debug register numbers into register names.
- *
- * Copyright (C) 2010 Ian Munsie, IBM Corporation.
- *
- * 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.
- */
-
-#include <stddef.h>
-#include <dwarf-regs.h>
-
-
-struct pt_regs_dwarfnum {
-	const char *name;
-	unsigned int dwarfnum;
-};
-
-#define STR(s) #s
-#define REG_DWARFNUM_NAME(r, num) {.name = r, .dwarfnum = num}
-#define GPR_DWARFNUM_NAME(num)	\
-	{.name = STR(%gpr##num), .dwarfnum = num}
-#define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0}
-
-/*
- * Reference:
- * http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html
- */
-static const struct pt_regs_dwarfnum regdwarfnum_table[] = {
-	GPR_DWARFNUM_NAME(0),
-	GPR_DWARFNUM_NAME(1),
-	GPR_DWARFNUM_NAME(2),
-	GPR_DWARFNUM_NAME(3),
-	GPR_DWARFNUM_NAME(4),
-	GPR_DWARFNUM_NAME(5),
-	GPR_DWARFNUM_NAME(6),
-	GPR_DWARFNUM_NAME(7),
-	GPR_DWARFNUM_NAME(8),
-	GPR_DWARFNUM_NAME(9),
-	GPR_DWARFNUM_NAME(10),
-	GPR_DWARFNUM_NAME(11),
-	GPR_DWARFNUM_NAME(12),
-	GPR_DWARFNUM_NAME(13),
-	GPR_DWARFNUM_NAME(14),
-	GPR_DWARFNUM_NAME(15),
-	GPR_DWARFNUM_NAME(16),
-	GPR_DWARFNUM_NAME(17),
-	GPR_DWARFNUM_NAME(18),
-	GPR_DWARFNUM_NAME(19),
-	GPR_DWARFNUM_NAME(20),
-	GPR_DWARFNUM_NAME(21),
-	GPR_DWARFNUM_NAME(22),
-	GPR_DWARFNUM_NAME(23),
-	GPR_DWARFNUM_NAME(24),
-	GPR_DWARFNUM_NAME(25),
-	GPR_DWARFNUM_NAME(26),
-	GPR_DWARFNUM_NAME(27),
-	GPR_DWARFNUM_NAME(28),
-	GPR_DWARFNUM_NAME(29),
-	GPR_DWARFNUM_NAME(30),
-	GPR_DWARFNUM_NAME(31),
-	REG_DWARFNUM_NAME("%msr",   66),
-	REG_DWARFNUM_NAME("%ctr",   109),
-	REG_DWARFNUM_NAME("%link",  108),
-	REG_DWARFNUM_NAME("%xer",   101),
-	REG_DWARFNUM_NAME("%dar",   119),
-	REG_DWARFNUM_NAME("%dsisr", 118),
-	REG_DWARFNUM_END,
-};
-
-/**
- * get_arch_regstr() - lookup register name from it's DWARF register number
- * @n:	the DWARF register number
- *
- * get_arch_regstr() returns the name of the register in struct
- * regdwarfnum_table from it's DWARF register number. If the register is not
- * found in the table, this returns NULL;
- */
-const char *get_arch_regstr(unsigned int n)
-{
-	const struct pt_regs_dwarfnum *roff;
-	for (roff = regdwarfnum_table; roff->name != NULL; roff++)
-		if (roff->dwarfnum == n)
-			return roff->name;
-	return NULL;
-}
diff --git a/src/tools/perf/arch/powerpc/util/header.c b/src/tools/perf/arch/powerpc/util/header.c
deleted file mode 100644
index 2f7073d..0000000
--- a/src/tools/perf/arch/powerpc/util/header.c
+++ /dev/null
@@ -1,36 +0,0 @@
-#include <sys/types.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "../../util/header.h"
-
-#define __stringify_1(x)        #x
-#define __stringify(x)          __stringify_1(x)
-
-#define mfspr(rn)       ({unsigned long rval; \
-			 asm volatile("mfspr %0," __stringify(rn) \
-				      : "=r" (rval)); rval; })
-
-#define SPRN_PVR        0x11F	/* Processor Version Register */
-#define PVR_VER(pvr)    (((pvr) >>  16) & 0xFFFF) /* Version field */
-#define PVR_REV(pvr)    (((pvr) >>   0) & 0xFFFF) /* Revison field */
-
-int
-get_cpuid(char *buffer, size_t sz)
-{
-	unsigned long pvr;
-	int nb;
-
-	pvr = mfspr(SPRN_PVR);
-
-	nb = scnprintf(buffer, sz, "%lu,%lu$", PVR_VER(pvr), PVR_REV(pvr));
-
-	/* look for end marker to ensure the entire data fit */
-	if (strchr(buffer, '$')) {
-		buffer[nb-1] = '\0';
-		return 0;
-	}
-	return -1;
-}
diff --git a/src/tools/perf/arch/s390/Makefile b/src/tools/perf/arch/s390/Makefile
deleted file mode 100644
index 15130b5..0000000
--- a/src/tools/perf/arch/s390/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-ifndef NO_DWARF
-PERF_HAVE_DWARF_REGS := 1
-LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o
-endif
diff --git a/src/tools/perf/arch/s390/util/dwarf-regs.c b/src/tools/perf/arch/s390/util/dwarf-regs.c
deleted file mode 100644
index 0469df0..0000000
--- a/src/tools/perf/arch/s390/util/dwarf-regs.c
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Mapping of DWARF debug register numbers into register names.
- *
- *    Copyright IBM Corp. 2010
- *    Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>,
- *
- */
-
-#include <stddef.h>
-#include <dwarf-regs.h>
-
-#define NUM_GPRS 16
-
-static const char *gpr_names[NUM_GPRS] = {
-	"%r0", "%r1",  "%r2",  "%r3",  "%r4",  "%r5",  "%r6",  "%r7",
-	"%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15",
-};
-
-const char *get_arch_regstr(unsigned int n)
-{
-	return (n >= NUM_GPRS) ? NULL : gpr_names[n];
-}
diff --git a/src/tools/perf/arch/sh/Makefile b/src/tools/perf/arch/sh/Makefile
deleted file mode 100644
index 15130b5..0000000
--- a/src/tools/perf/arch/sh/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-ifndef NO_DWARF
-PERF_HAVE_DWARF_REGS := 1
-LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o
-endif
diff --git a/src/tools/perf/arch/sh/util/dwarf-regs.c b/src/tools/perf/arch/sh/util/dwarf-regs.c
deleted file mode 100644
index 0d0897f..0000000
--- a/src/tools/perf/arch/sh/util/dwarf-regs.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Mapping of DWARF debug register numbers into register names.
- *
- * Copyright (C) 2010 Matt Fleming <matt@console-pimps.org>
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#include <stddef.h>
-#include <dwarf-regs.h>
-
-/*
- * Generic dwarf analysis helpers
- */
-
-#define SH_MAX_REGS 18
-const char *sh_regs_table[SH_MAX_REGS] = {
-	"r0",
-	"r1",
-	"r2",
-	"r3",
-	"r4",
-	"r5",
-	"r6",
-	"r7",
-	"r8",
-	"r9",
-	"r10",
-	"r11",
-	"r12",
-	"r13",
-	"r14",
-	"r15",
-	"pc",
-	"pr",
-};
-
-/* Return architecture dependent register string (for kprobe-tracer) */
-const char *get_arch_regstr(unsigned int n)
-{
-	return (n <= SH_MAX_REGS) ? sh_regs_table[n] : NULL;
-}
diff --git a/src/tools/perf/arch/sparc/Makefile b/src/tools/perf/arch/sparc/Makefile
deleted file mode 100644
index 15130b5..0000000
--- a/src/tools/perf/arch/sparc/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-ifndef NO_DWARF
-PERF_HAVE_DWARF_REGS := 1
-LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o
-endif
diff --git a/src/tools/perf/arch/sparc/util/dwarf-regs.c b/src/tools/perf/arch/sparc/util/dwarf-regs.c
deleted file mode 100644
index 92eda41..0000000
--- a/src/tools/perf/arch/sparc/util/dwarf-regs.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Mapping of DWARF debug register numbers into register names.
- *
- * Copyright (C) 2010 David S. Miller <davem@davemloft.net>
- *
- * 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.
- */
-
-#include <stddef.h>
-#include <dwarf-regs.h>
-
-#define SPARC_MAX_REGS	96
-
-const char *sparc_regs_table[SPARC_MAX_REGS] = {
-	"%g0", "%g1", "%g2", "%g3", "%g4", "%g5", "%g6", "%g7",
-	"%o0", "%o1", "%o2", "%o3", "%o4", "%o5", "%sp", "%o7",
-	"%l0", "%l1", "%l2", "%l3", "%l4", "%l5", "%l6", "%l7",
-	"%i0", "%i1", "%i2", "%i3", "%i4", "%i5", "%fp", "%i7",
-	"%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7",
-	"%f8", "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15",
-	"%f16", "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23",
-	"%f24", "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31",
-	"%f32", "%f33", "%f34", "%f35", "%f36", "%f37", "%f38", "%f39",
-	"%f40", "%f41", "%f42", "%f43", "%f44", "%f45", "%f46", "%f47",
-	"%f48", "%f49", "%f50", "%f51", "%f52", "%f53", "%f54", "%f55",
-	"%f56", "%f57", "%f58", "%f59", "%f60", "%f61", "%f62", "%f63",
-};
-
-/**
- * get_arch_regstr() - lookup register name from it's DWARF register number
- * @n:	the DWARF register number
- *
- * get_arch_regstr() returns the name of the register in struct
- * regdwarfnum_table from it's DWARF register number. If the register is not
- * found in the table, this returns NULL;
- */
-const char *get_arch_regstr(unsigned int n)
-{
-	return (n <= SPARC_MAX_REGS) ? sparc_regs_table[n] : NULL;
-}
diff --git a/src/tools/perf/arch/x86/Makefile b/src/tools/perf/arch/x86/Makefile
deleted file mode 100644
index 8801fe0..0000000
--- a/src/tools/perf/arch/x86/Makefile
+++ /dev/null
@@ -1,10 +0,0 @@
-ifndef NO_DWARF
-PERF_HAVE_DWARF_REGS := 1
-LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o
-endif
-ifndef NO_LIBUNWIND
-LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/unwind.o
-endif
-LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/header.o
-LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/tsc.o
-LIB_H += arch/$(ARCH)/util/tsc.h
diff --git a/src/tools/perf/arch/x86/include/perf_regs.h b/src/tools/perf/arch/x86/include/perf_regs.h
deleted file mode 100644
index 7fcdcdb..0000000
--- a/src/tools/perf/arch/x86/include/perf_regs.h
+++ /dev/null
@@ -1,80 +0,0 @@
-#ifndef ARCH_PERF_REGS_H
-#define ARCH_PERF_REGS_H
-
-#include <stdlib.h>
-#include "../../util/types.h"
-#include <asm/perf_regs.h>
-
-#ifndef ARCH_X86_64
-#define PERF_REGS_MASK ((1ULL << PERF_REG_X86_32_MAX) - 1)
-#else
-#define REG_NOSUPPORT ((1ULL << PERF_REG_X86_DS) | \
-		       (1ULL << PERF_REG_X86_ES) | \
-		       (1ULL << PERF_REG_X86_FS) | \
-		       (1ULL << PERF_REG_X86_GS))
-#define PERF_REGS_MASK (((1ULL << PERF_REG_X86_64_MAX) - 1) & ~REG_NOSUPPORT)
-#endif
-#define PERF_REG_IP PERF_REG_X86_IP
-#define PERF_REG_SP PERF_REG_X86_SP
-
-static inline const char *perf_reg_name(int id)
-{
-	switch (id) {
-	case PERF_REG_X86_AX:
-		return "AX";
-	case PERF_REG_X86_BX:
-		return "BX";
-	case PERF_REG_X86_CX:
-		return "CX";
-	case PERF_REG_X86_DX:
-		return "DX";
-	case PERF_REG_X86_SI:
-		return "SI";
-	case PERF_REG_X86_DI:
-		return "DI";
-	case PERF_REG_X86_BP:
-		return "BP";
-	case PERF_REG_X86_SP:
-		return "SP";
-	case PERF_REG_X86_IP:
-		return "IP";
-	case PERF_REG_X86_FLAGS:
-		return "FLAGS";
-	case PERF_REG_X86_CS:
-		return "CS";
-	case PERF_REG_X86_SS:
-		return "SS";
-	case PERF_REG_X86_DS:
-		return "DS";
-	case PERF_REG_X86_ES:
-		return "ES";
-	case PERF_REG_X86_FS:
-		return "FS";
-	case PERF_REG_X86_GS:
-		return "GS";
-#ifdef ARCH_X86_64
-	case PERF_REG_X86_R8:
-		return "R8";
-	case PERF_REG_X86_R9:
-		return "R9";
-	case PERF_REG_X86_R10:
-		return "R10";
-	case PERF_REG_X86_R11:
-		return "R11";
-	case PERF_REG_X86_R12:
-		return "R12";
-	case PERF_REG_X86_R13:
-		return "R13";
-	case PERF_REG_X86_R14:
-		return "R14";
-	case PERF_REG_X86_R15:
-		return "R15";
-#endif /* ARCH_X86_64 */
-	default:
-		return NULL;
-	}
-
-	return NULL;
-}
-
-#endif /* ARCH_PERF_REGS_H */
diff --git a/src/tools/perf/arch/x86/util/dwarf-regs.c b/src/tools/perf/arch/x86/util/dwarf-regs.c
deleted file mode 100644
index be22dd4..0000000
--- a/src/tools/perf/arch/x86/util/dwarf-regs.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * dwarf-regs.c : Mapping of DWARF debug register numbers into register names.
- * Extracted from probe-finder.c
- *
- * Written by Masami Hiramatsu <mhiramat@redhat.com>
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#include <stddef.h>
-#include <dwarf-regs.h>
-
-/*
- * Generic dwarf analysis helpers
- */
-
-#define X86_32_MAX_REGS 8
-const char *x86_32_regs_table[X86_32_MAX_REGS] = {
-	"%ax",
-	"%cx",
-	"%dx",
-	"%bx",
-	"$stack",	/* Stack address instead of %sp */
-	"%bp",
-	"%si",
-	"%di",
-};
-
-#define X86_64_MAX_REGS 16
-const char *x86_64_regs_table[X86_64_MAX_REGS] = {
-	"%ax",
-	"%dx",
-	"%cx",
-	"%bx",
-	"%si",
-	"%di",
-	"%bp",
-	"%sp",
-	"%r8",
-	"%r9",
-	"%r10",
-	"%r11",
-	"%r12",
-	"%r13",
-	"%r14",
-	"%r15",
-};
-
-/* TODO: switching by dwarf address size */
-#ifdef __x86_64__
-#define ARCH_MAX_REGS X86_64_MAX_REGS
-#define arch_regs_table x86_64_regs_table
-#else
-#define ARCH_MAX_REGS X86_32_MAX_REGS
-#define arch_regs_table x86_32_regs_table
-#endif
-
-/* Return architecture dependent register string (for kprobe-tracer) */
-const char *get_arch_regstr(unsigned int n)
-{
-	return (n <= ARCH_MAX_REGS) ? arch_regs_table[n] : NULL;
-}
diff --git a/src/tools/perf/arch/x86/util/header.c b/src/tools/perf/arch/x86/util/header.c
deleted file mode 100644
index 146d12a..0000000
--- a/src/tools/perf/arch/x86/util/header.c
+++ /dev/null
@@ -1,59 +0,0 @@
-#include <sys/types.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "../../util/header.h"
-
-static inline void
-cpuid(unsigned int op, unsigned int *a, unsigned int *b, unsigned int *c,
-      unsigned int *d)
-{
-	__asm__ __volatile__ (".byte 0x53\n\tcpuid\n\t"
-			      "movl %%ebx, %%esi\n\t.byte 0x5b"
-			: "=a" (*a),
-			"=S" (*b),
-			"=c" (*c),
-			"=d" (*d)
-			: "a" (op));
-}
-
-int
-get_cpuid(char *buffer, size_t sz)
-{
-	unsigned int a, b, c, d, lvl;
-	int family = -1, model = -1, step = -1;
-	int nb;
-	char vendor[16];
-
-	cpuid(0, &lvl, &b, &c, &d);
-	strncpy(&vendor[0], (char *)(&b), 4);
-	strncpy(&vendor[4], (char *)(&d), 4);
-	strncpy(&vendor[8], (char *)(&c), 4);
-	vendor[12] = '\0';
-
-	if (lvl >= 1) {
-		cpuid(1, &a, &b, &c, &d);
-
-		family = (a >> 8) & 0xf;  /* bits 11 - 8 */
-		model  = (a >> 4) & 0xf;  /* Bits  7 - 4 */
-		step   = a & 0xf;
-
-		/* extended family */
-		if (family == 0xf)
-			family += (a >> 20) & 0xff;
-
-		/* extended model */
-		if (family >= 0x6)
-			model += ((a >> 16) & 0xf) << 4;
-	}
-	nb = scnprintf(buffer, sz, "%s,%u,%u,%u$", vendor, family, model, step);
-
-	/* look for end marker to ensure the entire data fit */
-	if (strchr(buffer, '$')) {
-		buffer[nb-1] = '\0';
-		return 0;
-	}
-	return -1;
-}
diff --git a/src/tools/perf/arch/x86/util/tsc.c b/src/tools/perf/arch/x86/util/tsc.c
deleted file mode 100644
index b2519e4..0000000
--- a/src/tools/perf/arch/x86/util/tsc.c
+++ /dev/null
@@ -1,59 +0,0 @@
-#include <stdbool.h>
-#include <errno.h>
-
-#include <linux/perf_event.h>
-
-#include "../../perf.h"
-#include "../../util/types.h"
-#include "../../util/debug.h"
-#include "tsc.h"
-
-u64 perf_time_to_tsc(u64 ns, struct perf_tsc_conversion *tc)
-{
-	u64 t, quot, rem;
-
-	t = ns - tc->time_zero;
-	quot = t / tc->time_mult;
-	rem  = t % tc->time_mult;
-	return (quot << tc->time_shift) +
-	       (rem << tc->time_shift) / tc->time_mult;
-}
-
-u64 tsc_to_perf_time(u64 cyc, struct perf_tsc_conversion *tc)
-{
-	u64 quot, rem;
-
-	quot = cyc >> tc->time_shift;
-	rem  = cyc & ((1 << tc->time_shift) - 1);
-	return tc->time_zero + quot * tc->time_mult +
-	       ((rem * tc->time_mult) >> tc->time_shift);
-}
-
-int perf_read_tsc_conversion(const struct perf_event_mmap_page *pc,
-			     struct perf_tsc_conversion *tc)
-{
-	bool cap_user_time_zero;
-	u32 seq;
-	int i = 0;
-
-	while (1) {
-		seq = pc->lock;
-		rmb();
-		tc->time_mult = pc->time_mult;
-		tc->time_shift = pc->time_shift;
-		tc->time_zero = pc->time_zero;
-		cap_user_time_zero = pc->cap_user_time_zero;
-		rmb();
-		if (pc->lock == seq && !(seq & 1))
-			break;
-		if (++i > 10000) {
-			pr_debug("failed to get perf_event_mmap_page lock\n");
-			return -EINVAL;
-		}
-	}
-
-	if (!cap_user_time_zero)
-		return -EOPNOTSUPP;
-
-	return 0;
-}
diff --git a/src/tools/perf/arch/x86/util/tsc.h b/src/tools/perf/arch/x86/util/tsc.h
deleted file mode 100644
index a24dec8..0000000
--- a/src/tools/perf/arch/x86/util/tsc.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef TOOLS_PERF_ARCH_X86_UTIL_TSC_H__
-#define TOOLS_PERF_ARCH_X86_UTIL_TSC_H__
-
-#include "../../util/types.h"
-
-struct perf_tsc_conversion {
-	u16 time_shift;
-	u32 time_mult;
-	u64 time_zero;
-};
-
-struct perf_event_mmap_page;
-
-int perf_read_tsc_conversion(const struct perf_event_mmap_page *pc,
-			     struct perf_tsc_conversion *tc);
-
-u64 perf_time_to_tsc(u64 ns, struct perf_tsc_conversion *tc);
-u64 tsc_to_perf_time(u64 cyc, struct perf_tsc_conversion *tc);
-
-#endif /* TOOLS_PERF_ARCH_X86_UTIL_TSC_H__ */
diff --git a/src/tools/perf/arch/x86/util/unwind.c b/src/tools/perf/arch/x86/util/unwind.c
deleted file mode 100644
index 78d956e..0000000
--- a/src/tools/perf/arch/x86/util/unwind.c
+++ /dev/null
@@ -1,111 +0,0 @@
-
-#include <errno.h>
-#include <libunwind.h>
-#include "perf_regs.h"
-#include "../../util/unwind.h"
-
-#ifdef ARCH_X86_64
-int unwind__arch_reg_id(int regnum)
-{
-	int id;
-
-	switch (regnum) {
-	case UNW_X86_64_RAX:
-		id = PERF_REG_X86_AX;
-		break;
-	case UNW_X86_64_RDX:
-		id = PERF_REG_X86_DX;
-		break;
-	case UNW_X86_64_RCX:
-		id = PERF_REG_X86_CX;
-		break;
-	case UNW_X86_64_RBX:
-		id = PERF_REG_X86_BX;
-		break;
-	case UNW_X86_64_RSI:
-		id = PERF_REG_X86_SI;
-		break;
-	case UNW_X86_64_RDI:
-		id = PERF_REG_X86_DI;
-		break;
-	case UNW_X86_64_RBP:
-		id = PERF_REG_X86_BP;
-		break;
-	case UNW_X86_64_RSP:
-		id = PERF_REG_X86_SP;
-		break;
-	case UNW_X86_64_R8:
-		id = PERF_REG_X86_R8;
-		break;
-	case UNW_X86_64_R9:
-		id = PERF_REG_X86_R9;
-		break;
-	case UNW_X86_64_R10:
-		id = PERF_REG_X86_R10;
-		break;
-	case UNW_X86_64_R11:
-		id = PERF_REG_X86_R11;
-		break;
-	case UNW_X86_64_R12:
-		id = PERF_REG_X86_R12;
-		break;
-	case UNW_X86_64_R13:
-		id = PERF_REG_X86_R13;
-		break;
-	case UNW_X86_64_R14:
-		id = PERF_REG_X86_R14;
-		break;
-	case UNW_X86_64_R15:
-		id = PERF_REG_X86_R15;
-		break;
-	case UNW_X86_64_RIP:
-		id = PERF_REG_X86_IP;
-		break;
-	default:
-		pr_err("unwind: invalid reg id %d\n", regnum);
-		return -EINVAL;
-	}
-
-	return id;
-}
-#else
-int unwind__arch_reg_id(int regnum)
-{
-	int id;
-
-	switch (regnum) {
-	case UNW_X86_EAX:
-		id = PERF_REG_X86_AX;
-		break;
-	case UNW_X86_EDX:
-		id = PERF_REG_X86_DX;
-		break;
-	case UNW_X86_ECX:
-		id = PERF_REG_X86_CX;
-		break;
-	case UNW_X86_EBX:
-		id = PERF_REG_X86_BX;
-		break;
-	case UNW_X86_ESI:
-		id = PERF_REG_X86_SI;
-		break;
-	case UNW_X86_EDI:
-		id = PERF_REG_X86_DI;
-		break;
-	case UNW_X86_EBP:
-		id = PERF_REG_X86_BP;
-		break;
-	case UNW_X86_ESP:
-		id = PERF_REG_X86_SP;
-		break;
-	case UNW_X86_EIP:
-		id = PERF_REG_X86_IP;
-		break;
-	default:
-		pr_err("unwind: invalid reg id %d\n", regnum);
-		return -EINVAL;
-	}
-
-	return id;
-}
-#endif /* ARCH_X86_64 */
diff --git a/src/tools/perf/bash_completion b/src/tools/perf/bash_completion
deleted file mode 100644
index 56e6a12..0000000
--- a/src/tools/perf/bash_completion
+++ /dev/null
@@ -1,62 +0,0 @@
-# perf completion
-
-function_exists()
-{
-	declare -F $1 > /dev/null
-	return $?
-}
-
-function_exists __ltrim_colon_completions ||
-__ltrim_colon_completions()
-{
-	if [[ "$1" == *:* && "$COMP_WORDBREAKS" == *:* ]]; then
-		# Remove colon-word prefix from COMPREPLY items
-		local colon_word=${1%${1##*:}}
-		local i=${#COMPREPLY[*]}
-		while [[ $((--i)) -ge 0 ]]; do
-			COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"}
-		done
-	fi
-}
-
-have perf &&
-_perf()
-{
-	local cur prev cmd
-
-	COMPREPLY=()
-	if function_exists _get_comp_words_by_ref; then
-		_get_comp_words_by_ref -n : cur prev
-	else
-		cur=$(_get_cword :)
-		prev=${COMP_WORDS[COMP_CWORD-1]}
-	fi
-
-	cmd=${COMP_WORDS[0]}
-
-	# List perf subcommands or long options
-	if [ $COMP_CWORD -eq 1 ]; then
-		if [[ $cur == --* ]]; then
-			COMPREPLY=( $( compgen -W '--help --version \
-			--exec-path --html-path --paginate --no-pager \
-			--perf-dir --work-tree --debugfs-dir' -- "$cur" ) )
-		else
-			cmds=$($cmd --list-cmds)
-			COMPREPLY=( $( compgen -W '$cmds' -- "$cur" ) )
-		fi
-	# List possible events for -e option
-	elif [[ $prev == "-e" && "${COMP_WORDS[1]}" == @(record|stat|top) ]]; then
-		evts=$($cmd list --raw-dump)
-		COMPREPLY=( $( compgen -W '$evts' -- "$cur" ) )
-		__ltrim_colon_completions $cur
-	# List long option names
-	elif [[ $cur == --* ]];  then
-		subcmd=${COMP_WORDS[1]}
-		opts=$($cmd $subcmd --list-opts)
-		COMPREPLY=( $( compgen -W '$opts' -- "$cur" ) )
-	# Fall down to list regular files
-	else
-		_filedir
-	fi
-} &&
-complete -F _perf perf
diff --git a/src/tools/perf/bench/bench.h b/src/tools/perf/bench/bench.h
deleted file mode 100644
index 0fdc852..0000000
--- a/src/tools/perf/bench/bench.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef BENCH_H
-#define BENCH_H
-
-/*
- * The madvise transparent hugepage constants were added in glibc
- * 2.13. For compatibility with older versions of glibc, define these
- * tokens if they are not already defined.
- *
- * PA-RISC uses different madvise values from other architectures and
- * needs to be special-cased.
- */
-#ifdef __hppa__
-# ifndef MADV_HUGEPAGE
-#  define MADV_HUGEPAGE		67
-# endif
-# ifndef MADV_NOHUGEPAGE
-#  define MADV_NOHUGEPAGE	68
-# endif
-#else
-# ifndef MADV_HUGEPAGE
-#  define MADV_HUGEPAGE		14
-# endif
-# ifndef MADV_NOHUGEPAGE
-#  define MADV_NOHUGEPAGE	15
-# endif
-#endif
-
-extern int bench_numa(int argc, const char **argv, const char *prefix);
-extern int bench_sched_messaging(int argc, const char **argv, const char *prefix);
-extern int bench_sched_pipe(int argc, const char **argv, const char *prefix);
-extern int bench_mem_memcpy(int argc, const char **argv,
-			    const char *prefix __maybe_unused);
-extern int bench_mem_memset(int argc, const char **argv, const char *prefix);
-
-#define BENCH_FORMAT_DEFAULT_STR	"default"
-#define BENCH_FORMAT_DEFAULT		0
-#define BENCH_FORMAT_SIMPLE_STR		"simple"
-#define BENCH_FORMAT_SIMPLE		1
-
-#define BENCH_FORMAT_UNKNOWN		-1
-
-extern int bench_format;
-
-#endif
diff --git a/src/tools/perf/bench/mem-memcpy-arch.h b/src/tools/perf/bench/mem-memcpy-arch.h
deleted file mode 100644
index a72e36c..0000000
--- a/src/tools/perf/bench/mem-memcpy-arch.h
+++ /dev/null
@@ -1,12 +0,0 @@
-
-#ifdef ARCH_X86_64
-
-#define MEMCPY_FN(fn, name, desc)		\
-	extern void *fn(void *, const void *, size_t);
-
-#include "mem-memcpy-x86-64-asm-def.h"
-
-#undef MEMCPY_FN
-
-#endif
-
diff --git a/src/tools/perf/bench/mem-memcpy-x86-64-asm-def.h b/src/tools/perf/bench/mem-memcpy-x86-64-asm-def.h
deleted file mode 100644
index d66ab79..0000000
--- a/src/tools/perf/bench/mem-memcpy-x86-64-asm-def.h
+++ /dev/null
@@ -1,12 +0,0 @@
-
-MEMCPY_FN(__memcpy,
-	"x86-64-unrolled",
-	"unrolled memcpy() in arch/x86/lib/memcpy_64.S")
-
-MEMCPY_FN(memcpy_c,
-	"x86-64-movsq",
-	"movsq-based memcpy() in arch/x86/lib/memcpy_64.S")
-
-MEMCPY_FN(memcpy_c_e,
-	"x86-64-movsb",
-	"movsb-based memcpy() in arch/x86/lib/memcpy_64.S")
diff --git a/src/tools/perf/bench/mem-memcpy-x86-64-asm.S b/src/tools/perf/bench/mem-memcpy-x86-64-asm.S
deleted file mode 100644
index fcd9cf0..0000000
--- a/src/tools/perf/bench/mem-memcpy-x86-64-asm.S
+++ /dev/null
@@ -1,12 +0,0 @@
-#define memcpy MEMCPY /* don't hide glibc's memcpy() */
-#define altinstr_replacement text
-#define globl p2align 4; .globl
-#define Lmemcpy_c globl memcpy_c; memcpy_c
-#define Lmemcpy_c_e globl memcpy_c_e; memcpy_c_e
-#include "../../../arch/x86/lib/memcpy_64.S"
-/*
- * We need to provide note.GNU-stack section, saying that we want
- * NOT executable stack. Otherwise the final linking will assume that
- * the ELF stack should not be restricted at all and set it RWX.
- */
-.section .note.GNU-stack,"",@progbits
diff --git a/src/tools/perf/bench/mem-memcpy.c b/src/tools/perf/bench/mem-memcpy.c
deleted file mode 100644
index 8cdca43..0000000
--- a/src/tools/perf/bench/mem-memcpy.c
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * mem-memcpy.c
- *
- * memcpy: Simple memory copy in various ways
- *
- * Written by Hitoshi Mitake <mitake@dcl.info.waseda.ac.jp>
- */
-
-#include "../perf.h"
-#include "../util/util.h"
-#include "../util/parse-options.h"
-#include "../util/header.h"
-#include "bench.h"
-#include "mem-memcpy-arch.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/time.h>
-#include <errno.h>
-
-#define K 1024
-
-static const char	*length_str	= "1MB";
-static const char	*routine	= "default";
-static int		iterations	= 1;
-static bool		use_cycle;
-static int		cycle_fd;
-static bool		only_prefault;
-static bool		no_prefault;
-
-static const struct option options[] = {
-	OPT_STRING('l', "length", &length_str, "1MB",
-		    "Specify length of memory to copy. "
-		    "Available units: B, KB, MB, GB and TB (upper and lower)"),
-	OPT_STRING('r', "routine", &routine, "default",
-		    "Specify routine to copy"),
-	OPT_INTEGER('i', "iterations", &iterations,
-		    "repeat memcpy() invocation this number of times"),
-	OPT_BOOLEAN('c', "cycle", &use_cycle,
-		    "Use cycles event instead of gettimeofday() for measuring"),
-	OPT_BOOLEAN('o', "only-prefault", &only_prefault,
-		    "Show only the result with page faults before memcpy()"),
-	OPT_BOOLEAN('n', "no-prefault", &no_prefault,
-		    "Show only the result without page faults before memcpy()"),
-	OPT_END()
-};
-
-typedef void *(*memcpy_t)(void *, const void *, size_t);
-
-struct routine {
-	const char *name;
-	const char *desc;
-	memcpy_t fn;
-};
-
-struct routine routines[] = {
-	{ "default",
-	  "Default memcpy() provided by glibc",
-	  memcpy },
-#ifdef ARCH_X86_64
-
-#define MEMCPY_FN(fn, name, desc) { name, desc, fn },
-#include "mem-memcpy-x86-64-asm-def.h"
-#undef MEMCPY_FN
-
-#endif
-
-	{ NULL,
-	  NULL,
-	  NULL   }
-};
-
-static const char * const bench_mem_memcpy_usage[] = {
-	"perf bench mem memcpy <options>",
-	NULL
-};
-
-static struct perf_event_attr cycle_attr = {
-	.type		= PERF_TYPE_HARDWARE,
-	.config		= PERF_COUNT_HW_CPU_CYCLES
-};
-
-static void init_cycle(void)
-{
-	cycle_fd = sys_perf_event_open(&cycle_attr, getpid(), -1, -1, 0);
-
-	if (cycle_fd < 0 && errno == ENOSYS)
-		die("No CONFIG_PERF_EVENTS=y kernel support configured?\n");
-	else
-		BUG_ON(cycle_fd < 0);
-}
-
-static u64 get_cycle(void)
-{
-	int ret;
-	u64 clk;
-
-	ret = read(cycle_fd, &clk, sizeof(u64));
-	BUG_ON(ret != sizeof(u64));
-
-	return clk;
-}
-
-static double timeval2double(struct timeval *ts)
-{
-	return (double)ts->tv_sec +
-		(double)ts->tv_usec / (double)1000000;
-}
-
-static void alloc_mem(void **dst, void **src, size_t length)
-{
-	*dst = zalloc(length);
-	if (!*dst)
-		die("memory allocation failed - maybe length is too large?\n");
-
-	*src = zalloc(length);
-	if (!*src)
-		die("memory allocation failed - maybe length is too large?\n");
-	/* Make sure to always replace the zero pages even if MMAP_THRESH is crossed */
-	memset(*src, 0, length);
-}
-
-static u64 do_memcpy_cycle(memcpy_t fn, size_t len, bool prefault)
-{
-	u64 cycle_start = 0ULL, cycle_end = 0ULL;
-	void *src = NULL, *dst = NULL;
-	int i;
-
-	alloc_mem(&src, &dst, len);
-
-	if (prefault)
-		fn(dst, src, len);
-
-	cycle_start = get_cycle();
-	for (i = 0; i < iterations; ++i)
-		fn(dst, src, len);
-	cycle_end = get_cycle();
-
-	free(src);
-	free(dst);
-	return cycle_end - cycle_start;
-}
-
-static double do_memcpy_gettimeofday(memcpy_t fn, size_t len, bool prefault)
-{
-	struct timeval tv_start, tv_end, tv_diff;
-	void *src = NULL, *dst = NULL;
-	int i;
-
-	alloc_mem(&src, &dst, len);
-
-	if (prefault)
-		fn(dst, src, len);
-
-	BUG_ON(gettimeofday(&tv_start, NULL));
-	for (i = 0; i < iterations; ++i)
-		fn(dst, src, len);
-	BUG_ON(gettimeofday(&tv_end, NULL));
-
-	timersub(&tv_end, &tv_start, &tv_diff);
-
-	free(src);
-	free(dst);
-	return (double)((double)len / timeval2double(&tv_diff));
-}
-
-#define pf (no_prefault ? 0 : 1)
-
-#define print_bps(x) do {					\
-		if (x < K)					\
-			printf(" %14lf B/Sec", x);		\
-		else if (x < K * K)				\
-			printf(" %14lfd KB/Sec", x / K);	\
-		else if (x < K * K * K)				\
-			printf(" %14lf MB/Sec", x / K / K);	\
-		else						\
-			printf(" %14lf GB/Sec", x / K / K / K); \
-	} while (0)
-
-int bench_mem_memcpy(int argc, const char **argv,
-		     const char *prefix __maybe_unused)
-{
-	int i;
-	size_t len;
-	double result_bps[2];
-	u64 result_cycle[2];
-
-	argc = parse_options(argc, argv, options,
-			     bench_mem_memcpy_usage, 0);
-
-	if (use_cycle)
-		init_cycle();
-
-	len = (size_t)perf_atoll((char *)length_str);
-
-	result_cycle[0] = result_cycle[1] = 0ULL;
-	result_bps[0] = result_bps[1] = 0.0;
-
-	if ((s64)len <= 0) {
-		fprintf(stderr, "Invalid length:%s\n", length_str);
-		return 1;
-	}
-
-	/* same to without specifying either of prefault and no-prefault */
-	if (only_prefault && no_prefault)
-		only_prefault = no_prefault = false;
-
-	for (i = 0; routines[i].name; i++) {
-		if (!strcmp(routines[i].name, routine))
-			break;
-	}
-	if (!routines[i].name) {
-		printf("Unknown routine:%s\n", routine);
-		printf("Available routines...\n");
-		for (i = 0; routines[i].name; i++) {
-			printf("\t%s ... %s\n",
-			       routines[i].name, routines[i].desc);
-		}
-		return 1;
-	}
-
-	if (bench_format == BENCH_FORMAT_DEFAULT)
-		printf("# Copying %s Bytes ...\n\n", length_str);
-
-	if (!only_prefault && !no_prefault) {
-		/* show both of results */
-		if (use_cycle) {
-			result_cycle[0] =
-				do_memcpy_cycle(routines[i].fn, len, false);
-			result_cycle[1] =
-				do_memcpy_cycle(routines[i].fn, len, true);
-		} else {
-			result_bps[0] =
-				do_memcpy_gettimeofday(routines[i].fn,
-						len, false);
-			result_bps[1] =
-				do_memcpy_gettimeofday(routines[i].fn,
-						len, true);
-		}
-	} else {
-		if (use_cycle) {
-			result_cycle[pf] =
-				do_memcpy_cycle(routines[i].fn,
-						len, only_prefault);
-		} else {
-			result_bps[pf] =
-				do_memcpy_gettimeofday(routines[i].fn,
-						len, only_prefault);
-		}
-	}
-
-	switch (bench_format) {
-	case BENCH_FORMAT_DEFAULT:
-		if (!only_prefault && !no_prefault) {
-			if (use_cycle) {
-				printf(" %14lf Cycle/Byte\n",
-					(double)result_cycle[0]
-					/ (double)len);
-				printf(" %14lf Cycle/Byte (with prefault)\n",
-					(double)result_cycle[1]
-					/ (double)len);
-			} else {
-				print_bps(result_bps[0]);
-				printf("\n");
-				print_bps(result_bps[1]);
-				printf(" (with prefault)\n");
-			}
-		} else {
-			if (use_cycle) {
-				printf(" %14lf Cycle/Byte",
-					(double)result_cycle[pf]
-					/ (double)len);
-			} else
-				print_bps(result_bps[pf]);
-
-			printf("%s\n", only_prefault ? " (with prefault)" : "");
-		}
-		break;
-	case BENCH_FORMAT_SIMPLE:
-		if (!only_prefault && !no_prefault) {
-			if (use_cycle) {
-				printf("%lf %lf\n",
-					(double)result_cycle[0] / (double)len,
-					(double)result_cycle[1] / (double)len);
-			} else {
-				printf("%lf %lf\n",
-					result_bps[0], result_bps[1]);
-			}
-		} else {
-			if (use_cycle) {
-				printf("%lf\n", (double)result_cycle[pf]
-					/ (double)len);
-			} else
-				printf("%lf\n", result_bps[pf]);
-		}
-		break;
-	default:
-		/* reaching this means there's some disaster: */
-		die("unknown format: %d\n", bench_format);
-		break;
-	}
-
-	return 0;
-}
diff --git a/src/tools/perf/bench/mem-memset-arch.h b/src/tools/perf/bench/mem-memset-arch.h
deleted file mode 100644
index a040fa7..0000000
--- a/src/tools/perf/bench/mem-memset-arch.h
+++ /dev/null
@@ -1,12 +0,0 @@
-
-#ifdef ARCH_X86_64
-
-#define MEMSET_FN(fn, name, desc)		\
-	extern void *fn(void *, int, size_t);
-
-#include "mem-memset-x86-64-asm-def.h"
-
-#undef MEMSET_FN
-
-#endif
-
diff --git a/src/tools/perf/bench/mem-memset-x86-64-asm-def.h b/src/tools/perf/bench/mem-memset-x86-64-asm-def.h
deleted file mode 100644
index a71dff9..0000000
--- a/src/tools/perf/bench/mem-memset-x86-64-asm-def.h
+++ /dev/null
@@ -1,12 +0,0 @@
-
-MEMSET_FN(__memset,
-	"x86-64-unrolled",
-	"unrolled memset() in arch/x86/lib/memset_64.S")
-
-MEMSET_FN(memset_c,
-	"x86-64-stosq",
-	"movsq-based memset() in arch/x86/lib/memset_64.S")
-
-MEMSET_FN(memset_c_e,
-	"x86-64-stosb",
-	"movsb-based memset() in arch/x86/lib/memset_64.S")
diff --git a/src/tools/perf/bench/mem-memset-x86-64-asm.S b/src/tools/perf/bench/mem-memset-x86-64-asm.S
deleted file mode 100644
index 9e5af89..0000000
--- a/src/tools/perf/bench/mem-memset-x86-64-asm.S
+++ /dev/null
@@ -1,13 +0,0 @@
-#define memset MEMSET /* don't hide glibc's memset() */
-#define altinstr_replacement text
-#define globl p2align 4; .globl
-#define Lmemset_c globl memset_c; memset_c
-#define Lmemset_c_e globl memset_c_e; memset_c_e
-#include "../../../arch/x86/lib/memset_64.S"
-
-/*
- * We need to provide note.GNU-stack section, saying that we want
- * NOT executable stack. Otherwise the final linking will assume that
- * the ELF stack should not be restricted at all and set it RWX.
- */
-.section .note.GNU-stack,"",@progbits
diff --git a/src/tools/perf/bench/mem-memset.c b/src/tools/perf/bench/mem-memset.c
deleted file mode 100644
index 4a2f120..0000000
--- a/src/tools/perf/bench/mem-memset.c
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * mem-memset.c
- *
- * memset: Simple memory set in various ways
- *
- * Trivial clone of mem-memcpy.c.
- */
-
-#include "../perf.h"
-#include "../util/util.h"
-#include "../util/parse-options.h"
-#include "../util/header.h"
-#include "bench.h"
-#include "mem-memset-arch.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/time.h>
-#include <errno.h>
-
-#define K 1024
-
-static const char	*length_str	= "1MB";
-static const char	*routine	= "default";
-static int		iterations	= 1;
-static bool		use_cycle;
-static int		cycle_fd;
-static bool		only_prefault;
-static bool		no_prefault;
-
-static const struct option options[] = {
-	OPT_STRING('l', "length", &length_str, "1MB",
-		    "Specify length of memory to set. "
-		    "Available units: B, KB, MB, GB and TB (upper and lower)"),
-	OPT_STRING('r', "routine", &routine, "default",
-		    "Specify routine to set"),
-	OPT_INTEGER('i', "iterations", &iterations,
-		    "repeat memset() invocation this number of times"),
-	OPT_BOOLEAN('c', "cycle", &use_cycle,
-		    "Use cycles event instead of gettimeofday() for measuring"),
-	OPT_BOOLEAN('o', "only-prefault", &only_prefault,
-		    "Show only the result with page faults before memset()"),
-	OPT_BOOLEAN('n', "no-prefault", &no_prefault,
-		    "Show only the result without page faults before memset()"),
-	OPT_END()
-};
-
-typedef void *(*memset_t)(void *, int, size_t);
-
-struct routine {
-	const char *name;
-	const char *desc;
-	memset_t fn;
-};
-
-static const struct routine routines[] = {
-	{ "default",
-	  "Default memset() provided by glibc",
-	  memset },
-#ifdef ARCH_X86_64
-
-#define MEMSET_FN(fn, name, desc) { name, desc, fn },
-#include "mem-memset-x86-64-asm-def.h"
-#undef MEMSET_FN
-
-#endif
-
-	{ NULL,
-	  NULL,
-	  NULL   }
-};
-
-static const char * const bench_mem_memset_usage[] = {
-	"perf bench mem memset <options>",
-	NULL
-};
-
-static struct perf_event_attr cycle_attr = {
-	.type		= PERF_TYPE_HARDWARE,
-	.config		= PERF_COUNT_HW_CPU_CYCLES
-};
-
-static void init_cycle(void)
-{
-	cycle_fd = sys_perf_event_open(&cycle_attr, getpid(), -1, -1, 0);
-
-	if (cycle_fd < 0 && errno == ENOSYS)
-		die("No CONFIG_PERF_EVENTS=y kernel support configured?\n");
-	else
-		BUG_ON(cycle_fd < 0);
-}
-
-static u64 get_cycle(void)
-{
-	int ret;
-	u64 clk;
-
-	ret = read(cycle_fd, &clk, sizeof(u64));
-	BUG_ON(ret != sizeof(u64));
-
-	return clk;
-}
-
-static double timeval2double(struct timeval *ts)
-{
-	return (double)ts->tv_sec +
-		(double)ts->tv_usec / (double)1000000;
-}
-
-static void alloc_mem(void **dst, size_t length)
-{
-	*dst = zalloc(length);
-	if (!*dst)
-		die("memory allocation failed - maybe length is too large?\n");
-}
-
-static u64 do_memset_cycle(memset_t fn, size_t len, bool prefault)
-{
-	u64 cycle_start = 0ULL, cycle_end = 0ULL;
-	void *dst = NULL;
-	int i;
-
-	alloc_mem(&dst, len);
-
-	if (prefault)
-		fn(dst, -1, len);
-
-	cycle_start = get_cycle();
-	for (i = 0; i < iterations; ++i)
-		fn(dst, i, len);
-	cycle_end = get_cycle();
-
-	free(dst);
-	return cycle_end - cycle_start;
-}
-
-static double do_memset_gettimeofday(memset_t fn, size_t len, bool prefault)
-{
-	struct timeval tv_start, tv_end, tv_diff;
-	void *dst = NULL;
-	int i;
-
-	alloc_mem(&dst, len);
-
-	if (prefault)
-		fn(dst, -1, len);
-
-	BUG_ON(gettimeofday(&tv_start, NULL));
-	for (i = 0; i < iterations; ++i)
-		fn(dst, i, len);
-	BUG_ON(gettimeofday(&tv_end, NULL));
-
-	timersub(&tv_end, &tv_start, &tv_diff);
-
-	free(dst);
-	return (double)((double)len / timeval2double(&tv_diff));
-}
-
-#define pf (no_prefault ? 0 : 1)
-
-#define print_bps(x) do {					\
-		if (x < K)					\
-			printf(" %14lf B/Sec", x);		\
-		else if (x < K * K)				\
-			printf(" %14lfd KB/Sec", x / K);	\
-		else if (x < K * K * K)				\
-			printf(" %14lf MB/Sec", x / K / K);	\
-		else						\
-			printf(" %14lf GB/Sec", x / K / K / K); \
-	} while (0)
-
-int bench_mem_memset(int argc, const char **argv,
-		     const char *prefix __maybe_unused)
-{
-	int i;
-	size_t len;
-	double result_bps[2];
-	u64 result_cycle[2];
-
-	argc = parse_options(argc, argv, options,
-			     bench_mem_memset_usage, 0);
-
-	if (use_cycle)
-		init_cycle();
-
-	len = (size_t)perf_atoll((char *)length_str);
-
-	result_cycle[0] = result_cycle[1] = 0ULL;
-	result_bps[0] = result_bps[1] = 0.0;
-
-	if ((s64)len <= 0) {
-		fprintf(stderr, "Invalid length:%s\n", length_str);
-		return 1;
-	}
-
-	/* same to without specifying either of prefault and no-prefault */
-	if (only_prefault && no_prefault)
-		only_prefault = no_prefault = false;
-
-	for (i = 0; routines[i].name; i++) {
-		if (!strcmp(routines[i].name, routine))
-			break;
-	}
-	if (!routines[i].name) {
-		printf("Unknown routine:%s\n", routine);
-		printf("Available routines...\n");
-		for (i = 0; routines[i].name; i++) {
-			printf("\t%s ... %s\n",
-			       routines[i].name, routines[i].desc);
-		}
-		return 1;
-	}
-
-	if (bench_format == BENCH_FORMAT_DEFAULT)
-		printf("# Copying %s Bytes ...\n\n", length_str);
-
-	if (!only_prefault && !no_prefault) {
-		/* show both of results */
-		if (use_cycle) {
-			result_cycle[0] =
-				do_memset_cycle(routines[i].fn, len, false);
-			result_cycle[1] =
-				do_memset_cycle(routines[i].fn, len, true);
-		} else {
-			result_bps[0] =
-				do_memset_gettimeofday(routines[i].fn,
-						len, false);
-			result_bps[1] =
-				do_memset_gettimeofday(routines[i].fn,
-						len, true);
-		}
-	} else {
-		if (use_cycle) {
-			result_cycle[pf] =
-				do_memset_cycle(routines[i].fn,
-						len, only_prefault);
-		} else {
-			result_bps[pf] =
-				do_memset_gettimeofday(routines[i].fn,
-						len, only_prefault);
-		}
-	}
-
-	switch (bench_format) {
-	case BENCH_FORMAT_DEFAULT:
-		if (!only_prefault && !no_prefault) {
-			if (use_cycle) {
-				printf(" %14lf Cycle/Byte\n",
-					(double)result_cycle[0]
-					/ (double)len);
-				printf(" %14lf Cycle/Byte (with prefault)\n ",
-					(double)result_cycle[1]
-					/ (double)len);
-			} else {
-				print_bps(result_bps[0]);
-				printf("\n");
-				print_bps(result_bps[1]);
-				printf(" (with prefault)\n");
-			}
-		} else {
-			if (use_cycle) {
-				printf(" %14lf Cycle/Byte",
-					(double)result_cycle[pf]
-					/ (double)len);
-			} else
-				print_bps(result_bps[pf]);
-
-			printf("%s\n", only_prefault ? " (with prefault)" : "");
-		}
-		break;
-	case BENCH_FORMAT_SIMPLE:
-		if (!only_prefault && !no_prefault) {
-			if (use_cycle) {
-				printf("%lf %lf\n",
-					(double)result_cycle[0] / (double)len,
-					(double)result_cycle[1] / (double)len);
-			} else {
-				printf("%lf %lf\n",
-					result_bps[0], result_bps[1]);
-			}
-		} else {
-			if (use_cycle) {
-				printf("%lf\n", (double)result_cycle[pf]
-					/ (double)len);
-			} else
-				printf("%lf\n", result_bps[pf]);
-		}
-		break;
-	default:
-		/* reaching this means there's some disaster: */
-		die("unknown format: %d\n", bench_format);
-		break;
-	}
-
-	return 0;
-}
diff --git a/src/tools/perf/bench/numa.c b/src/tools/perf/bench/numa.c
deleted file mode 100644
index 30d1c32..0000000
--- a/src/tools/perf/bench/numa.c
+++ /dev/null
@@ -1,1731 +0,0 @@
-/*
- * numa.c
- *
- * numa: Simulate NUMA-sensitive workload and measure their NUMA performance
- */
-
-#include "../perf.h"
-#include "../builtin.h"
-#include "../util/util.h"
-#include "../util/parse-options.h"
-
-#include "bench.h"
-
-#include <errno.h>
-#include <sched.h>
-#include <stdio.h>
-#include <assert.h>
-#include <malloc.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <pthread.h>
-#include <sys/mman.h>
-#include <sys/time.h>
-#include <sys/wait.h>
-#include <sys/prctl.h>
-#include <sys/types.h>
-
-#include <numa.h>
-#include <numaif.h>
-
-/*
- * Regular printout to the terminal, supressed if -q is specified:
- */
-#define tprintf(x...) do { if (g && g->p.show_details >= 0) printf(x); } while (0)
-
-/*
- * Debug printf:
- */
-#define dprintf(x...) do { if (g && g->p.show_details >= 1) printf(x); } while (0)
-
-struct thread_data {
-	int			curr_cpu;
-	cpu_set_t		bind_cpumask;
-	int			bind_node;
-	u8			*process_data;
-	int			process_nr;
-	int			thread_nr;
-	int			task_nr;
-	unsigned int		loops_done;
-	u64			val;
-	u64			runtime_ns;
-	pthread_mutex_t		*process_lock;
-};
-
-/* Parameters set by options: */
-
-struct params {
-	/* Startup synchronization: */
-	bool			serialize_startup;
-
-	/* Task hierarchy: */
-	int			nr_proc;
-	int			nr_threads;
-
-	/* Working set sizes: */
-	const char		*mb_global_str;
-	const char		*mb_proc_str;
-	const char		*mb_proc_locked_str;
-	const char		*mb_thread_str;
-
-	double			mb_global;
-	double			mb_proc;
-	double			mb_proc_locked;
-	double			mb_thread;
-
-	/* Access patterns to the working set: */
-	bool			data_reads;
-	bool			data_writes;
-	bool			data_backwards;
-	bool			data_zero_memset;
-	bool			data_rand_walk;
-	u32			nr_loops;
-	u32			nr_secs;
-	u32			sleep_usecs;
-
-	/* Working set initialization: */
-	bool			init_zero;
-	bool			init_random;
-	bool			init_cpu0;
-
-	/* Misc options: */
-	int			show_details;
-	int			run_all;
-	int			thp;
-
-	long			bytes_global;
-	long			bytes_process;
-	long			bytes_process_locked;
-	long			bytes_thread;
-
-	int			nr_tasks;
-	bool			show_quiet;
-
-	bool			show_convergence;
-	bool			measure_convergence;
-
-	int			perturb_secs;
-	int			nr_cpus;
-	int			nr_nodes;
-
-	/* Affinity options -C and -N: */
-	char			*cpu_list_str;
-	char			*node_list_str;
-};
-
-
-/* Global, read-writable area, accessible to all processes and threads: */
-
-struct global_info {
-	u8			*data;
-
-	pthread_mutex_t		startup_mutex;
-	int			nr_tasks_started;
-
-	pthread_mutex_t		startup_done_mutex;
-
-	pthread_mutex_t		start_work_mutex;
-	int			nr_tasks_working;
-
-	pthread_mutex_t		stop_work_mutex;
-	u64			bytes_done;
-
-	struct thread_data	*threads;
-
-	/* Convergence latency measurement: */
-	bool			all_converged;
-	bool			stop_work;
-
-	int			print_once;
-
-	struct params		p;
-};
-
-static struct global_info	*g = NULL;
-
-static int parse_cpus_opt(const struct option *opt, const char *arg, int unset);
-static int parse_nodes_opt(const struct option *opt, const char *arg, int unset);
-
-struct params p0;
-
-static const struct option options[] = {
-	OPT_INTEGER('p', "nr_proc"	, &p0.nr_proc,		"number of processes"),
-	OPT_INTEGER('t', "nr_threads"	, &p0.nr_threads,	"number of threads per process"),
-
-	OPT_STRING('G', "mb_global"	, &p0.mb_global_str,	"MB", "global  memory (MBs)"),
-	OPT_STRING('P', "mb_proc"	, &p0.mb_proc_str,	"MB", "process memory (MBs)"),
-	OPT_STRING('L', "mb_proc_locked", &p0.mb_proc_locked_str,"MB", "process serialized/locked memory access (MBs), <= process_memory"),
-	OPT_STRING('T', "mb_thread"	, &p0.mb_thread_str,	"MB", "thread  memory (MBs)"),
-
-	OPT_UINTEGER('l', "nr_loops"	, &p0.nr_loops,		"max number of loops to run"),
-	OPT_UINTEGER('s', "nr_secs"	, &p0.nr_secs,		"max number of seconds to run"),
-	OPT_UINTEGER('u', "usleep"	, &p0.sleep_usecs,	"usecs to sleep per loop iteration"),
-
-	OPT_BOOLEAN('R', "data_reads"	, &p0.data_reads,	"access the data via writes (can be mixed with -W)"),
-	OPT_BOOLEAN('W', "data_writes"	, &p0.data_writes,	"access the data via writes (can be mixed with -R)"),
-	OPT_BOOLEAN('B', "data_backwards", &p0.data_backwards,	"access the data backwards as well"),
-	OPT_BOOLEAN('Z', "data_zero_memset", &p0.data_zero_memset,"access the data via glibc bzero only"),
-	OPT_BOOLEAN('r', "data_rand_walk", &p0.data_rand_walk,	"access the data with random (32bit LFSR) walk"),
-
-
-	OPT_BOOLEAN('z', "init_zero"	, &p0.init_zero,	"bzero the initial allocations"),
-	OPT_BOOLEAN('I', "init_random"	, &p0.init_random,	"randomize the contents of the initial allocations"),
-	OPT_BOOLEAN('0', "init_cpu0"	, &p0.init_cpu0,	"do the initial allocations on CPU#0"),
-	OPT_INTEGER('x', "perturb_secs", &p0.perturb_secs,	"perturb thread 0/0 every X secs, to test convergence stability"),
-
-	OPT_INCR   ('d', "show_details"	, &p0.show_details,	"Show details"),
-	OPT_INCR   ('a', "all"		, &p0.run_all,		"Run all tests in the suite"),
-	OPT_INTEGER('H', "thp"		, &p0.thp,		"MADV_NOHUGEPAGE < 0 < MADV_HUGEPAGE"),
-	OPT_BOOLEAN('c', "show_convergence", &p0.show_convergence, "show convergence details"),
-	OPT_BOOLEAN('m', "measure_convergence",	&p0.measure_convergence, "measure convergence latency"),
-	OPT_BOOLEAN('q', "quiet"	, &p0.show_quiet,	"bzero the initial allocations"),
-	OPT_BOOLEAN('S', "serialize-startup", &p0.serialize_startup,"serialize thread startup"),
-
-	/* Special option string parsing callbacks: */
-        OPT_CALLBACK('C', "cpus", NULL, "cpu[,cpu2,...cpuN]",
-			"bind the first N tasks to these specific cpus (the rest is unbound)",
-			parse_cpus_opt),
-        OPT_CALLBACK('M', "memnodes", NULL, "node[,node2,...nodeN]",
-			"bind the first N tasks to these specific memory nodes (the rest is unbound)",
-			parse_nodes_opt),
-	OPT_END()
-};
-
-static const char * const bench_numa_usage[] = {
-	"perf bench numa <options>",
-	NULL
-};
-
-static const char * const numa_usage[] = {
-	"perf bench numa mem [<options>]",
-	NULL
-};
-
-static cpu_set_t bind_to_cpu(int target_cpu)
-{
-	cpu_set_t orig_mask, mask;
-	int ret;
-
-	ret = sched_getaffinity(0, sizeof(orig_mask), &orig_mask);
-	BUG_ON(ret);
-
-	CPU_ZERO(&mask);
-
-	if (target_cpu == -1) {
-		int cpu;
-
-		for (cpu = 0; cpu < g->p.nr_cpus; cpu++)
-			CPU_SET(cpu, &mask);
-	} else {
-		BUG_ON(target_cpu < 0 || target_cpu >= g->p.nr_cpus);
-		CPU_SET(target_cpu, &mask);
-	}
-
-	ret = sched_setaffinity(0, sizeof(mask), &mask);
-	BUG_ON(ret);
-
-	return orig_mask;
-}
-
-static cpu_set_t bind_to_node(int target_node)
-{
-	int cpus_per_node = g->p.nr_cpus/g->p.nr_nodes;
-	cpu_set_t orig_mask, mask;
-	int cpu;
-	int ret;
-
-	BUG_ON(cpus_per_node*g->p.nr_nodes != g->p.nr_cpus);
-	BUG_ON(!cpus_per_node);
-
-	ret = sched_getaffinity(0, sizeof(orig_mask), &orig_mask);
-	BUG_ON(ret);
-
-	CPU_ZERO(&mask);
-
-	if (target_node == -1) {
-		for (cpu = 0; cpu < g->p.nr_cpus; cpu++)
-			CPU_SET(cpu, &mask);
-	} else {
-		int cpu_start = (target_node + 0) * cpus_per_node;
-		int cpu_stop  = (target_node + 1) * cpus_per_node;
-
-		BUG_ON(cpu_stop > g->p.nr_cpus);
-
-		for (cpu = cpu_start; cpu < cpu_stop; cpu++)
-			CPU_SET(cpu, &mask);
-	}
-
-	ret = sched_setaffinity(0, sizeof(mask), &mask);
-	BUG_ON(ret);
-
-	return orig_mask;
-}
-
-static void bind_to_cpumask(cpu_set_t mask)
-{
-	int ret;
-
-	ret = sched_setaffinity(0, sizeof(mask), &mask);
-	BUG_ON(ret);
-}
-
-static void mempol_restore(void)
-{
-	int ret;
-
-	ret = set_mempolicy(MPOL_DEFAULT, NULL, g->p.nr_nodes-1);
-
-	BUG_ON(ret);
-}
-
-static void bind_to_memnode(int node)
-{
-	unsigned long nodemask;
-	int ret;
-
-	if (node == -1)
-		return;
-
-	BUG_ON(g->p.nr_nodes > (int)sizeof(nodemask));
-	nodemask = 1L << node;
-
-	ret = set_mempolicy(MPOL_BIND, &nodemask, sizeof(nodemask)*8);
-	dprintf("binding to node %d, mask: %016lx => %d\n", node, nodemask, ret);
-
-	BUG_ON(ret);
-}
-
-#define HPSIZE (2*1024*1024)
-
-#define set_taskname(fmt...)				\
-do {							\
-	char name[20];					\
-							\
-	snprintf(name, 20, fmt);			\
-	prctl(PR_SET_NAME, name);			\
-} while (0)
-
-static u8 *alloc_data(ssize_t bytes0, int map_flags,
-		      int init_zero, int init_cpu0, int thp, int init_random)
-{
-	cpu_set_t orig_mask;
-	ssize_t bytes;
-	u8 *buf;
-	int ret;
-
-	if (!bytes0)
-		return NULL;
-
-	/* Allocate and initialize all memory on CPU#0: */
-	if (init_cpu0) {
-		orig_mask = bind_to_node(0);
-		bind_to_memnode(0);
-	}
-
-	bytes = bytes0 + HPSIZE;
-
-	buf = (void *)mmap(0, bytes, PROT_READ|PROT_WRITE, MAP_ANON|map_flags, -1, 0);
-	BUG_ON(buf == (void *)-1);
-
-	if (map_flags == MAP_PRIVATE) {
-		if (thp > 0) {
-			ret = madvise(buf, bytes, MADV_HUGEPAGE);
-			if (ret && !g->print_once) {
-				g->print_once = 1;
-				printf("WARNING: Could not enable THP - do: 'echo madvise > /sys/kernel/mm/transparent_hugepage/enabled'\n");
-			}
-		}
-		if (thp < 0) {
-			ret = madvise(buf, bytes, MADV_NOHUGEPAGE);
-			if (ret && !g->print_once) {
-				g->print_once = 1;
-				printf("WARNING: Could not disable THP: run a CONFIG_TRANSPARENT_HUGEPAGE kernel?\n");
-			}
-		}
-	}
-
-	if (init_zero) {
-		bzero(buf, bytes);
-	} else {
-		/* Initialize random contents, different in each word: */
-		if (init_random) {
-			u64 *wbuf = (void *)buf;
-			long off = rand();
-			long i;
-
-			for (i = 0; i < bytes/8; i++)
-				wbuf[i] = i + off;
-		}
-	}
-
-	/* Align to 2MB boundary: */
-	buf = (void *)(((unsigned long)buf + HPSIZE-1) & ~(HPSIZE-1));
-
-	/* Restore affinity: */
-	if (init_cpu0) {
-		bind_to_cpumask(orig_mask);
-		mempol_restore();
-	}
-
-	return buf;
-}
-
-static void free_data(void *data, ssize_t bytes)
-{
-	int ret;
-
-	if (!data)
-		return;
-
-	ret = munmap(data, bytes);
-	BUG_ON(ret);
-}
-
-/*
- * Create a shared memory buffer that can be shared between processes, zeroed:
- */
-static void * zalloc_shared_data(ssize_t bytes)
-{
-	return alloc_data(bytes, MAP_SHARED, 1, g->p.init_cpu0,  g->p.thp, g->p.init_random);
-}
-
-/*
- * Create a shared memory buffer that can be shared between processes:
- */
-static void * setup_shared_data(ssize_t bytes)
-{
-	return alloc_data(bytes, MAP_SHARED, 0, g->p.init_cpu0,  g->p.thp, g->p.init_random);
-}
-
-/*
- * Allocate process-local memory - this will either be shared between
- * threads of this process, or only be accessed by this thread:
- */
-static void * setup_private_data(ssize_t bytes)
-{
-	return alloc_data(bytes, MAP_PRIVATE, 0, g->p.init_cpu0,  g->p.thp, g->p.init_random);
-}
-
-/*
- * Return a process-shared (global) mutex:
- */
-static void init_global_mutex(pthread_mutex_t *mutex)
-{
-	pthread_mutexattr_t attr;
-
-	pthread_mutexattr_init(&attr);
-	pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
-	pthread_mutex_init(mutex, &attr);
-}
-
-static int parse_cpu_list(const char *arg)
-{
-	p0.cpu_list_str = strdup(arg);
-
-	dprintf("got CPU list: {%s}\n", p0.cpu_list_str);
-
-	return 0;
-}
-
-static void parse_setup_cpu_list(void)
-{
-	struct thread_data *td;
-	char *str0, *str;
-	int t;
-
-	if (!g->p.cpu_list_str)
-		return;
-
-	dprintf("g->p.nr_tasks: %d\n", g->p.nr_tasks);
-
-	str0 = str = strdup(g->p.cpu_list_str);
-	t = 0;
-
-	BUG_ON(!str);
-
-	tprintf("# binding tasks to CPUs:\n");
-	tprintf("#  ");
-
-	while (true) {
-		int bind_cpu, bind_cpu_0, bind_cpu_1;
-		char *tok, *tok_end, *tok_step, *tok_len, *tok_mul;
-		int bind_len;
-		int step;
-		int mul;
-
-		tok = strsep(&str, ",");
-		if (!tok)
-			break;
-
-		tok_end = strstr(tok, "-");
-
-		dprintf("\ntoken: {%s}, end: {%s}\n", tok, tok_end);
-		if (!tok_end) {
-			/* Single CPU specified: */
-			bind_cpu_0 = bind_cpu_1 = atol(tok);
-		} else {
-			/* CPU range specified (for example: "5-11"): */
-			bind_cpu_0 = atol(tok);
-			bind_cpu_1 = atol(tok_end + 1);
-		}
-
-		step = 1;
-		tok_step = strstr(tok, "#");
-		if (tok_step) {
-			step = atol(tok_step + 1);
-			BUG_ON(step <= 0 || step >= g->p.nr_cpus);
-		}
-
-		/*
-		 * Mask length.
-		 * Eg: "--cpus 8_4-16#4" means: '--cpus 8_4,12_4,16_4',
-		 * where the _4 means the next 4 CPUs are allowed.
-		 */
-		bind_len = 1;
-		tok_len = strstr(tok, "_");
-		if (tok_len) {
-			bind_len = atol(tok_len + 1);
-			BUG_ON(bind_len <= 0 || bind_len > g->p.nr_cpus);
-		}
-
-		/* Multiplicator shortcut, "0x8" is a shortcut for: "0,0,0,0,0,0,0,0" */
-		mul = 1;
-		tok_mul = strstr(tok, "x");
-		if (tok_mul) {
-			mul = atol(tok_mul + 1);
-			BUG_ON(mul <= 0);
-		}
-
-		dprintf("CPUs: %d_%d-%d#%dx%d\n", bind_cpu_0, bind_len, bind_cpu_1, step, mul);
-
-		BUG_ON(bind_cpu_0 < 0 || bind_cpu_0 >= g->p.nr_cpus);
-		BUG_ON(bind_cpu_1 < 0 || bind_cpu_1 >= g->p.nr_cpus);
-		BUG_ON(bind_cpu_0 > bind_cpu_1);
-
-		for (bind_cpu = bind_cpu_0; bind_cpu <= bind_cpu_1; bind_cpu += step) {
-			int i;
-
-			for (i = 0; i < mul; i++) {
-				int cpu;
-
-				if (t >= g->p.nr_tasks) {
-					printf("\n# NOTE: ignoring bind CPUs starting at CPU#%d\n #", bind_cpu);
-					goto out;
-				}
-				td = g->threads + t;
-
-				if (t)
-					tprintf(",");
-				if (bind_len > 1) {
-					tprintf("%2d/%d", bind_cpu, bind_len);
-				} else {
-					tprintf("%2d", bind_cpu);
-				}
-
-				CPU_ZERO(&td->bind_cpumask);
-				for (cpu = bind_cpu; cpu < bind_cpu+bind_len; cpu++) {
-					BUG_ON(cpu < 0 || cpu >= g->p.nr_cpus);
-					CPU_SET(cpu, &td->bind_cpumask);
-				}
-				t++;
-			}
-		}
-	}
-out:
-
-	tprintf("\n");
-
-	if (t < g->p.nr_tasks)
-		printf("# NOTE: %d tasks bound, %d tasks unbound\n", t, g->p.nr_tasks - t);
-
-	free(str0);
-}
-
-static int parse_cpus_opt(const struct option *opt __maybe_unused,
-			  const char *arg, int unset __maybe_unused)
-{
-	if (!arg)
-		return -1;
-
-	return parse_cpu_list(arg);
-}
-
-static int parse_node_list(const char *arg)
-{
-	p0.node_list_str = strdup(arg);
-
-	dprintf("got NODE list: {%s}\n", p0.node_list_str);
-
-	return 0;
-}
-
-static void parse_setup_node_list(void)
-{
-	struct thread_data *td;
-	char *str0, *str;
-	int t;
-
-	if (!g->p.node_list_str)
-		return;
-
-	dprintf("g->p.nr_tasks: %d\n", g->p.nr_tasks);
-
-	str0 = str = strdup(g->p.node_list_str);
-	t = 0;
-
-	BUG_ON(!str);
-
-	tprintf("# binding tasks to NODEs:\n");
-	tprintf("# ");
-
-	while (true) {
-		int bind_node, bind_node_0, bind_node_1;
-		char *tok, *tok_end, *tok_step, *tok_mul;
-		int step;
-		int mul;
-
-		tok = strsep(&str, ",");
-		if (!tok)
-			break;
-
-		tok_end = strstr(tok, "-");
-
-		dprintf("\ntoken: {%s}, end: {%s}\n", tok, tok_end);
-		if (!tok_end) {
-			/* Single NODE specified: */
-			bind_node_0 = bind_node_1 = atol(tok);
-		} else {
-			/* NODE range specified (for example: "5-11"): */
-			bind_node_0 = atol(tok);
-			bind_node_1 = atol(tok_end + 1);
-		}
-
-		step = 1;
-		tok_step = strstr(tok, "#");
-		if (tok_step) {
-			step = atol(tok_step + 1);
-			BUG_ON(step <= 0 || step >= g->p.nr_nodes);
-		}
-
-		/* Multiplicator shortcut, "0x8" is a shortcut for: "0,0,0,0,0,0,0,0" */
-		mul = 1;
-		tok_mul = strstr(tok, "x");
-		if (tok_mul) {
-			mul = atol(tok_mul + 1);
-			BUG_ON(mul <= 0);
-		}
-
-		dprintf("NODEs: %d-%d #%d\n", bind_node_0, bind_node_1, step);
-
-		BUG_ON(bind_node_0 < 0 || bind_node_0 >= g->p.nr_nodes);
-		BUG_ON(bind_node_1 < 0 || bind_node_1 >= g->p.nr_nodes);
-		BUG_ON(bind_node_0 > bind_node_1);
-
-		for (bind_node = bind_node_0; bind_node <= bind_node_1; bind_node += step) {
-			int i;
-
-			for (i = 0; i < mul; i++) {
-				if (t >= g->p.nr_tasks) {
-					printf("\n# NOTE: ignoring bind NODEs starting at NODE#%d\n", bind_node);
-					goto out;
-				}
-				td = g->threads + t;
-
-				if (!t)
-					tprintf(" %2d", bind_node);
-				else
-					tprintf(",%2d", bind_node);
-
-				td->bind_node = bind_node;
-				t++;
-			}
-		}
-	}
-out:
-
-	tprintf("\n");
-
-	if (t < g->p.nr_tasks)
-		printf("# NOTE: %d tasks mem-bound, %d tasks unbound\n", t, g->p.nr_tasks - t);
-
-	free(str0);
-}
-
-static int parse_nodes_opt(const struct option *opt __maybe_unused,
-			  const char *arg, int unset __maybe_unused)
-{
-	if (!arg)
-		return -1;
-
-	return parse_node_list(arg);
-
-	return 0;
-}
-
-#define BIT(x) (1ul << x)
-
-static inline uint32_t lfsr_32(uint32_t lfsr)
-{
-	const uint32_t taps = BIT(1) | BIT(5) | BIT(6) | BIT(31);
-	return (lfsr>>1) ^ ((0x0u - (lfsr & 0x1u)) & taps);
-}
-
-/*
- * Make sure there's real data dependency to RAM (when read
- * accesses are enabled), so the compiler, the CPU and the
- * kernel (KSM, zero page, etc.) cannot optimize away RAM
- * accesses:
- */
-static inline u64 access_data(u64 *data __attribute__((unused)), u64 val)
-{
-	if (g->p.data_reads)
-		val += *data;
-	if (g->p.data_writes)
-		*data = val + 1;
-	return val;
-}
-
-/*
- * The worker process does two types of work, a forwards going
- * loop and a backwards going loop.
- *
- * We do this so that on multiprocessor systems we do not create
- * a 'train' of processing, with highly synchronized processes,
- * skewing the whole benchmark.
- */
-static u64 do_work(u8 *__data, long bytes, int nr, int nr_max, int loop, u64 val)
-{
-	long words = bytes/sizeof(u64);
-	u64 *data = (void *)__data;
-	long chunk_0, chunk_1;
-	u64 *d0, *d, *d1;
-	long off;
-	long i;
-
-	BUG_ON(!data && words);
-	BUG_ON(data && !words);
-
-	if (!data)
-		return val;
-
-	/* Very simple memset() work variant: */
-	if (g->p.data_zero_memset && !g->p.data_rand_walk) {
-		bzero(data, bytes);
-		return val;
-	}
-
-	/* Spread out by PID/TID nr and by loop nr: */
-	chunk_0 = words/nr_max;
-	chunk_1 = words/g->p.nr_loops;
-	off = nr*chunk_0 + loop*chunk_1;
-
-	while (off >= words)
-		off -= words;
-
-	if (g->p.data_rand_walk) {
-		u32 lfsr = nr + loop + val;
-		int j;
-
-		for (i = 0; i < words/1024; i++) {
-			long start, end;
-
-			lfsr = lfsr_32(lfsr);
-
-			start = lfsr % words;
-			end = min(start + 1024, words-1);
-
-			if (g->p.data_zero_memset) {
-				bzero(data + start, (end-start) * sizeof(u64));
-			} else {
-				for (j = start; j < end; j++)
-					val = access_data(data + j, val);
-			}
-		}
-	} else if (!g->p.data_backwards || (nr + loop) & 1) {
-
-		d0 = data + off;
-		d  = data + off + 1;
-		d1 = data + words;
-
-		/* Process data forwards: */
-		for (;;) {
-			if (unlikely(d >= d1))
-				d = data;
-			if (unlikely(d == d0))
-				break;
-
-			val = access_data(d, val);
-
-			d++;
-		}
-	} else {
-		/* Process data backwards: */
-
-		d0 = data + off;
-		d  = data + off - 1;
-		d1 = data + words;
-
-		/* Process data forwards: */
-		for (;;) {
-			if (unlikely(d < data))
-				d = data + words-1;
-			if (unlikely(d == d0))
-				break;
-
-			val = access_data(d, val);
-
-			d--;
-		}
-	}
-
-	return val;
-}
-
-static void update_curr_cpu(int task_nr, unsigned long bytes_worked)
-{
-	unsigned int cpu;
-
-	cpu = sched_getcpu();
-
-	g->threads[task_nr].curr_cpu = cpu;
-	prctl(0, bytes_worked);
-}
-
-#define MAX_NR_NODES	64
-
-/*
- * Count the number of nodes a process's threads
- * are spread out on.
- *
- * A count of 1 means that the process is compressed
- * to a single node. A count of g->p.nr_nodes means it's
- * spread out on the whole system.
- */
-static int count_process_nodes(int process_nr)
-{
-	char node_present[MAX_NR_NODES] = { 0, };
-	int nodes;
-	int n, t;
-
-	for (t = 0; t < g->p.nr_threads; t++) {
-		struct thread_data *td;
-		int task_nr;
-		int node;
-
-		task_nr = process_nr*g->p.nr_threads + t;
-		td = g->threads + task_nr;
-
-		node = numa_node_of_cpu(td->curr_cpu);
-		node_present[node] = 1;
-	}
-
-	nodes = 0;
-
-	for (n = 0; n < MAX_NR_NODES; n++)
-		nodes += node_present[n];
-
-	return nodes;
-}
-
-/*
- * Count the number of distinct process-threads a node contains.
- *
- * A count of 1 means that the node contains only a single
- * process. If all nodes on the system contain at most one
- * process then we are well-converged.
- */
-static int count_node_processes(int node)
-{
-	int processes = 0;
-	int t, p;
-
-	for (p = 0; p < g->p.nr_proc; p++) {
-		for (t = 0; t < g->p.nr_threads; t++) {
-			struct thread_data *td;
-			int task_nr;
-			int n;
-
-			task_nr = p*g->p.nr_threads + t;
-			td = g->threads + task_nr;
-
-			n = numa_node_of_cpu(td->curr_cpu);
-			if (n == node) {
-				processes++;
-				break;
-			}
-		}
-	}
-
-	return processes;
-}
-
-static void calc_convergence_compression(int *strong)
-{
-	unsigned int nodes_min, nodes_max;
-	int p;
-
-	nodes_min = -1;
-	nodes_max =  0;
-
-	for (p = 0; p < g->p.nr_proc; p++) {
-		unsigned int nodes = count_process_nodes(p);
-
-		nodes_min = min(nodes, nodes_min);
-		nodes_max = max(nodes, nodes_max);
-	}
-
-	/* Strong convergence: all threads compress on a single node: */
-	if (nodes_min == 1 && nodes_max == 1) {
-		*strong = 1;
-	} else {
-		*strong = 0;
-		tprintf(" {%d-%d}", nodes_min, nodes_max);
-	}
-}
-
-static void calc_convergence(double runtime_ns_max, double *convergence)
-{
-	unsigned int loops_done_min, loops_done_max;
-	int process_groups;
-	int nodes[MAX_NR_NODES];
-	int distance;
-	int nr_min;
-	int nr_max;
-	int strong;
-	int sum;
-	int nr;
-	int node;
-	int cpu;
-	int t;
-
-	if (!g->p.show_convergence && !g->p.measure_convergence)
-		return;
-
-	for (node = 0; node < g->p.nr_nodes; node++)
-		nodes[node] = 0;
-
-	loops_done_min = -1;
-	loops_done_max = 0;
-
-	for (t = 0; t < g->p.nr_tasks; t++) {
-		struct thread_data *td = g->threads + t;
-		unsigned int loops_done;
-
-		cpu = td->curr_cpu;
-
-		/* Not all threads have written it yet: */
-		if (cpu < 0)
-			continue;
-
-		node = numa_node_of_cpu(cpu);
-
-		nodes[node]++;
-
-		loops_done = td->loops_done;
-		loops_done_min = min(loops_done, loops_done_min);
-		loops_done_max = max(loops_done, loops_done_max);
-	}
-
-	nr_max = 0;
-	nr_min = g->p.nr_tasks;
-	sum = 0;
-
-	for (node = 0; node < g->p.nr_nodes; node++) {
-		nr = nodes[node];
-		nr_min = min(nr, nr_min);
-		nr_max = max(nr, nr_max);
-		sum += nr;
-	}
-	BUG_ON(nr_min > nr_max);
-
-	BUG_ON(sum > g->p.nr_tasks);
-
-	if (0 && (sum < g->p.nr_tasks))
-		return;
-
-	/*
-	 * Count the number of distinct process groups present
-	 * on nodes - when we are converged this will decrease
-	 * to g->p.nr_proc:
-	 */
-	process_groups = 0;
-
-	for (node = 0; node < g->p.nr_nodes; node++) {
-		int processes = count_node_processes(node);
-
-		nr = nodes[node];
-		tprintf(" %2d/%-2d", nr, processes);
-
-		process_groups += processes;
-	}
-
-	distance = nr_max - nr_min;
-
-	tprintf(" [%2d/%-2d]", distance, process_groups);
-
-	tprintf(" l:%3d-%-3d (%3d)",
-		loops_done_min, loops_done_max, loops_done_max-loops_done_min);
-
-	if (loops_done_min && loops_done_max) {
-		double skew = 1.0 - (double)loops_done_min/loops_done_max;
-
-		tprintf(" [%4.1f%%]", skew * 100.0);
-	}
-
-	calc_convergence_compression(&strong);
-
-	if (strong && process_groups == g->p.nr_proc) {
-		if (!*convergence) {
-			*convergence = runtime_ns_max;
-			tprintf(" (%6.1fs converged)\n", *convergence/1e9);
-			if (g->p.measure_convergence) {
-				g->all_converged = true;
-				g->stop_work = true;
-			}
-		}
-	} else {
-		if (*convergence) {
-			tprintf(" (%6.1fs de-converged)", runtime_ns_max/1e9);
-			*convergence = 0;
-		}
-		tprintf("\n");
-	}
-}
-
-static void show_summary(double runtime_ns_max, int l, double *convergence)
-{
-	tprintf("\r #  %5.1f%%  [%.1f mins]",
-		(double)(l+1)/g->p.nr_loops*100.0, runtime_ns_max/1e9 / 60.0);
-
-	calc_convergence(runtime_ns_max, convergence);
-
-	if (g->p.show_details >= 0)
-		fflush(stdout);
-}
-
-static void *worker_thread(void *__tdata)
-{
-	struct thread_data *td = __tdata;
-	struct timeval start0, start, stop, diff;
-	int process_nr = td->process_nr;
-	int thread_nr = td->thread_nr;
-	unsigned long last_perturbance;
-	int task_nr = td->task_nr;
-	int details = g->p.show_details;
-	int first_task, last_task;
-	double convergence = 0;
-	u64 val = td->val;
-	double runtime_ns_max;
-	u8 *global_data;
-	u8 *process_data;
-	u8 *thread_data;
-	u64 bytes_done;
-	long work_done;
-	u32 l;
-
-	bind_to_cpumask(td->bind_cpumask);
-	bind_to_memnode(td->bind_node);
-
-	set_taskname("thread %d/%d", process_nr, thread_nr);
-
-	global_data = g->data;
-	process_data = td->process_data;
-	thread_data = setup_private_data(g->p.bytes_thread);
-
-	bytes_done = 0;
-
-	last_task = 0;
-	if (process_nr == g->p.nr_proc-1 && thread_nr == g->p.nr_threads-1)
-		last_task = 1;
-
-	first_task = 0;
-	if (process_nr == 0 && thread_nr == 0)
-		first_task = 1;
-
-	if (details >= 2) {
-		printf("#  thread %2d / %2d global mem: %p, process mem: %p, thread mem: %p\n",
-			process_nr, thread_nr, global_data, process_data, thread_data);
-	}
-
-	if (g->p.serialize_startup) {
-		pthread_mutex_lock(&g->startup_mutex);
-		g->nr_tasks_started++;
-		pthread_mutex_unlock(&g->startup_mutex);
-
-		/* Here we will wait for the main process to start us all at once: */
-		pthread_mutex_lock(&g->start_work_mutex);
-		g->nr_tasks_working++;
-
-		/* Last one wake the main process: */
-		if (g->nr_tasks_working == g->p.nr_tasks)
-			pthread_mutex_unlock(&g->startup_done_mutex);
-
-		pthread_mutex_unlock(&g->start_work_mutex);
-	}
-
-	gettimeofday(&start0, NULL);
-
-	start = stop = start0;
-	last_perturbance = start.tv_sec;
-
-	for (l = 0; l < g->p.nr_loops; l++) {
-		start = stop;
-
-		if (g->stop_work)
-			break;
-
-		val += do_work(global_data,  g->p.bytes_global,  process_nr, g->p.nr_proc,	l, val);
-		val += do_work(process_data, g->p.bytes_process, thread_nr,  g->p.nr_threads,	l, val);
-		val += do_work(thread_data,  g->p.bytes_thread,  0,          1,		l, val);
-
-		if (g->p.sleep_usecs) {
-			pthread_mutex_lock(td->process_lock);
-			usleep(g->p.sleep_usecs);
-			pthread_mutex_unlock(td->process_lock);
-		}
-		/*
-		 * Amount of work to be done under a process-global lock:
-		 */
-		if (g->p.bytes_process_locked) {
-			pthread_mutex_lock(td->process_lock);
-			val += do_work(process_data, g->p.bytes_process_locked, thread_nr,  g->p.nr_threads,	l, val);
-			pthread_mutex_unlock(td->process_lock);
-		}
-
-		work_done = g->p.bytes_global + g->p.bytes_process +
-			    g->p.bytes_process_locked + g->p.bytes_thread;
-
-		update_curr_cpu(task_nr, work_done);
-		bytes_done += work_done;
-
-		if (details < 0 && !g->p.perturb_secs && !g->p.measure_convergence && !g->p.nr_secs)
-			continue;
-
-		td->loops_done = l;
-
-		gettimeofday(&stop, NULL);
-
-		/* Check whether our max runtime timed out: */
-		if (g->p.nr_secs) {
-			timersub(&stop, &start0, &diff);
-			if (diff.tv_sec >= g->p.nr_secs) {
-				g->stop_work = true;
-				break;
-			}
-		}
-
-		/* Update the summary at most once per second: */
-		if (start.tv_sec == stop.tv_sec)
-			continue;
-
-		/*
-		 * Perturb the first task's equilibrium every g->p.perturb_secs seconds,
-		 * by migrating to CPU#0:
-		 */
-		if (first_task && g->p.perturb_secs && (int)(stop.tv_sec - last_perturbance) >= g->p.perturb_secs) {
-			cpu_set_t orig_mask;
-			int target_cpu;
-			int this_cpu;
-
-			last_perturbance = stop.tv_sec;
-
-			/*
-			 * Depending on where we are running, move into
-			 * the other half of the system, to create some
-			 * real disturbance:
-			 */
-			this_cpu = g->threads[task_nr].curr_cpu;
-			if (this_cpu < g->p.nr_cpus/2)
-				target_cpu = g->p.nr_cpus-1;
-			else
-				target_cpu = 0;
-
-			orig_mask = bind_to_cpu(target_cpu);
-
-			/* Here we are running on the target CPU already */
-			if (details >= 1)
-				printf(" (injecting perturbalance, moved to CPU#%d)\n", target_cpu);
-
-			bind_to_cpumask(orig_mask);
-		}
-
-		if (details >= 3) {
-			timersub(&stop, &start, &diff);
-			runtime_ns_max = diff.tv_sec * 1000000000;
-			runtime_ns_max += diff.tv_usec * 1000;
-
-			if (details >= 0) {
-				printf(" #%2d / %2d: %14.2lf nsecs/op [val: %016lx]\n",
-					process_nr, thread_nr, runtime_ns_max / bytes_done, val);
-			}
-			fflush(stdout);
-		}
-		if (!last_task)
-			continue;
-
-		timersub(&stop, &start0, &diff);
-		runtime_ns_max = diff.tv_sec * 1000000000ULL;
-		runtime_ns_max += diff.tv_usec * 1000ULL;
-
-		show_summary(runtime_ns_max, l, &convergence);
-	}
-
-	gettimeofday(&stop, NULL);
-	timersub(&stop, &start0, &diff);
-	td->runtime_ns = diff.tv_sec * 1000000000ULL;
-	td->runtime_ns += diff.tv_usec * 1000ULL;
-
-	free_data(thread_data, g->p.bytes_thread);
-
-	pthread_mutex_lock(&g->stop_work_mutex);
-	g->bytes_done += bytes_done;
-	pthread_mutex_unlock(&g->stop_work_mutex);
-
-	return NULL;
-}
-
-/*
- * A worker process starts a couple of threads:
- */
-static void worker_process(int process_nr)
-{
-	pthread_mutex_t process_lock;
-	struct thread_data *td;
-	pthread_t *pthreads;
-	u8 *process_data;
-	int task_nr;
-	int ret;
-	int t;
-
-	pthread_mutex_init(&process_lock, NULL);
-	set_taskname("process %d", process_nr);
-
-	/*
-	 * Pick up the memory policy and the CPU binding of our first thread,
-	 * so that we initialize memory accordingly:
-	 */
-	task_nr = process_nr*g->p.nr_threads;
-	td = g->threads + task_nr;
-
-	bind_to_memnode(td->bind_node);
-	bind_to_cpumask(td->bind_cpumask);
-
-	pthreads = zalloc(g->p.nr_threads * sizeof(pthread_t));
-	process_data = setup_private_data(g->p.bytes_process);
-
-	if (g->p.show_details >= 3) {
-		printf(" # process %2d global mem: %p, process mem: %p\n",
-			process_nr, g->data, process_data);
-	}
-
-	for (t = 0; t < g->p.nr_threads; t++) {
-		task_nr = process_nr*g->p.nr_threads + t;
-		td = g->threads + task_nr;
-
-		td->process_data = process_data;
-		td->process_nr   = process_nr;
-		td->thread_nr    = t;
-		td->task_nr	 = task_nr;
-		td->val          = rand();
-		td->curr_cpu	 = -1;
-		td->process_lock = &process_lock;
-
-		ret = pthread_create(pthreads + t, NULL, worker_thread, td);
-		BUG_ON(ret);
-	}
-
-	for (t = 0; t < g->p.nr_threads; t++) {
-                ret = pthread_join(pthreads[t], NULL);
-		BUG_ON(ret);
-	}
-
-	free_data(process_data, g->p.bytes_process);
-	free(pthreads);
-}
-
-static void print_summary(void)
-{
-	if (g->p.show_details < 0)
-		return;
-
-	printf("\n ###\n");
-	printf(" # %d %s will execute (on %d nodes, %d CPUs):\n",
-		g->p.nr_tasks, g->p.nr_tasks == 1 ? "task" : "tasks", g->p.nr_nodes, g->p.nr_cpus);
-	printf(" #      %5dx %5ldMB global  shared mem operations\n",
-			g->p.nr_loops, g->p.bytes_global/1024/1024);
-	printf(" #      %5dx %5ldMB process shared mem operations\n",
-			g->p.nr_loops, g->p.bytes_process/1024/1024);
-	printf(" #      %5dx %5ldMB thread  local  mem operations\n",
-			g->p.nr_loops, g->p.bytes_thread/1024/1024);
-
-	printf(" ###\n");
-
-	printf("\n ###\n"); fflush(stdout);
-}
-
-static void init_thread_data(void)
-{
-	ssize_t size = sizeof(*g->threads)*g->p.nr_tasks;
-	int t;
-
-	g->threads = zalloc_shared_data(size);
-
-	for (t = 0; t < g->p.nr_tasks; t++) {
-		struct thread_data *td = g->threads + t;
-		int cpu;
-
-		/* Allow all nodes by default: */
-		td->bind_node = -1;
-
-		/* Allow all CPUs by default: */
-		CPU_ZERO(&td->bind_cpumask);
-		for (cpu = 0; cpu < g->p.nr_cpus; cpu++)
-			CPU_SET(cpu, &td->bind_cpumask);
-	}
-}
-
-static void deinit_thread_data(void)
-{
-	ssize_t size = sizeof(*g->threads)*g->p.nr_tasks;
-
-	free_data(g->threads, size);
-}
-
-static int init(void)
-{
-	g = (void *)alloc_data(sizeof(*g), MAP_SHARED, 1, 0, 0 /* THP */, 0);
-
-	/* Copy over options: */
-	g->p = p0;
-
-	g->p.nr_cpus = numa_num_configured_cpus();
-
-	g->p.nr_nodes = numa_max_node() + 1;
-
-	/* char array in count_process_nodes(): */
-	BUG_ON(g->p.nr_nodes > MAX_NR_NODES || g->p.nr_nodes < 0);
-
-	if (g->p.show_quiet && !g->p.show_details)
-		g->p.show_details = -1;
-
-	/* Some memory should be specified: */
-	if (!g->p.mb_global_str && !g->p.mb_proc_str && !g->p.mb_thread_str)
-		return -1;
-
-	if (g->p.mb_global_str) {
-		g->p.mb_global = atof(g->p.mb_global_str);
-		BUG_ON(g->p.mb_global < 0);
-	}
-
-	if (g->p.mb_proc_str) {
-		g->p.mb_proc = atof(g->p.mb_proc_str);
-		BUG_ON(g->p.mb_proc < 0);
-	}
-
-	if (g->p.mb_proc_locked_str) {
-		g->p.mb_proc_locked = atof(g->p.mb_proc_locked_str);
-		BUG_ON(g->p.mb_proc_locked < 0);
-		BUG_ON(g->p.mb_proc_locked > g->p.mb_proc);
-	}
-
-	if (g->p.mb_thread_str) {
-		g->p.mb_thread = atof(g->p.mb_thread_str);
-		BUG_ON(g->p.mb_thread < 0);
-	}
-
-	BUG_ON(g->p.nr_threads <= 0);
-	BUG_ON(g->p.nr_proc <= 0);
-
-	g->p.nr_tasks = g->p.nr_proc*g->p.nr_threads;
-
-	g->p.bytes_global		= g->p.mb_global	*1024L*1024L;
-	g->p.bytes_process		= g->p.mb_proc		*1024L*1024L;
-	g->p.bytes_process_locked	= g->p.mb_proc_locked	*1024L*1024L;
-	g->p.bytes_thread		= g->p.mb_thread	*1024L*1024L;
-
-	g->data = setup_shared_data(g->p.bytes_global);
-
-	/* Startup serialization: */
-	init_global_mutex(&g->start_work_mutex);
-	init_global_mutex(&g->startup_mutex);
-	init_global_mutex(&g->startup_done_mutex);
-	init_global_mutex(&g->stop_work_mutex);
-
-	init_thread_data();
-
-	tprintf("#\n");
-	parse_setup_cpu_list();
-	parse_setup_node_list();
-	tprintf("#\n");
-
-	print_summary();
-
-	return 0;
-}
-
-static void deinit(void)
-{
-	free_data(g->data, g->p.bytes_global);
-	g->data = NULL;
-
-	deinit_thread_data();
-
-	free_data(g, sizeof(*g));
-	g = NULL;
-}
-
-/*
- * Print a short or long result, depending on the verbosity setting:
- */
-static void print_res(const char *name, double val,
-		      const char *txt_unit, const char *txt_short, const char *txt_long)
-{
-	if (!name)
-		name = "main,";
-
-	if (g->p.show_quiet)
-		printf(" %-30s %15.3f, %-15s %s\n", name, val, txt_unit, txt_short);
-	else
-		printf(" %14.3f %s\n", val, txt_long);
-}
-
-static int __bench_numa(const char *name)
-{
-	struct timeval start, stop, diff;
-	u64 runtime_ns_min, runtime_ns_sum;
-	pid_t *pids, pid, wpid;
-	double delta_runtime;
-	double runtime_avg;
-	double runtime_sec_max;
-	double runtime_sec_min;
-	int wait_stat;
-	double bytes;
-	int i, t;
-
-	if (init())
-		return -1;
-
-	pids = zalloc(g->p.nr_proc * sizeof(*pids));
-	pid = -1;
-
-	/* All threads try to acquire it, this way we can wait for them to start up: */
-	pthread_mutex_lock(&g->start_work_mutex);
-
-	if (g->p.serialize_startup) {
-		tprintf(" #\n");
-		tprintf(" # Startup synchronization: ..."); fflush(stdout);
-	}
-
-	gettimeofday(&start, NULL);
-
-	for (i = 0; i < g->p.nr_proc; i++) {
-		pid = fork();
-		dprintf(" # process %2d: PID %d\n", i, pid);
-
-		BUG_ON(pid < 0);
-		if (!pid) {
-			/* Child process: */
-			worker_process(i);
-
-			exit(0);
-		}
-		pids[i] = pid;
-
-	}
-	/* Wait for all the threads to start up: */
-	while (g->nr_tasks_started != g->p.nr_tasks)
-		usleep(1000);
-
-	BUG_ON(g->nr_tasks_started != g->p.nr_tasks);
-
-	if (g->p.serialize_startup) {
-		double startup_sec;
-
-		pthread_mutex_lock(&g->startup_done_mutex);
-
-		/* This will start all threads: */
-		pthread_mutex_unlock(&g->start_work_mutex);
-
-		/* This mutex is locked - the last started thread will wake us: */
-		pthread_mutex_lock(&g->startup_done_mutex);
-
-		gettimeofday(&stop, NULL);
-
-		timersub(&stop, &start, &diff);
-
-		startup_sec = diff.tv_sec * 1000000000.0;
-		startup_sec += diff.tv_usec * 1000.0;
-		startup_sec /= 1e9;
-
-		tprintf(" threads initialized in %.6f seconds.\n", startup_sec);
-		tprintf(" #\n");
-
-		start = stop;
-		pthread_mutex_unlock(&g->startup_done_mutex);
-	} else {
-		gettimeofday(&start, NULL);
-	}
-
-	/* Parent process: */
-
-
-	for (i = 0; i < g->p.nr_proc; i++) {
-		wpid = waitpid(pids[i], &wait_stat, 0);
-		BUG_ON(wpid < 0);
-		BUG_ON(!WIFEXITED(wait_stat));
-
-	}
-
-	runtime_ns_sum = 0;
-	runtime_ns_min = -1LL;
-
-	for (t = 0; t < g->p.nr_tasks; t++) {
-		u64 thread_runtime_ns = g->threads[t].runtime_ns;
-
-		runtime_ns_sum += thread_runtime_ns;
-		runtime_ns_min = min(thread_runtime_ns, runtime_ns_min);
-	}
-
-	gettimeofday(&stop, NULL);
-	timersub(&stop, &start, &diff);
-
-	BUG_ON(bench_format != BENCH_FORMAT_DEFAULT);
-
-	tprintf("\n ###\n");
-	tprintf("\n");
-
-	runtime_sec_max = diff.tv_sec * 1000000000.0;
-	runtime_sec_max += diff.tv_usec * 1000.0;
-	runtime_sec_max /= 1e9;
-
-	runtime_sec_min = runtime_ns_min/1e9;
-
-	bytes = g->bytes_done;
-	runtime_avg = (double)runtime_ns_sum / g->p.nr_tasks / 1e9;
-
-	if (g->p.measure_convergence) {
-		print_res(name, runtime_sec_max,
-			"secs,", "NUMA-convergence-latency", "secs latency to NUMA-converge");
-	}
-
-	print_res(name, runtime_sec_max,
-		"secs,", "runtime-max/thread",	"secs slowest (max) thread-runtime");
-
-	print_res(name, runtime_sec_min,
-		"secs,", "runtime-min/thread",	"secs fastest (min) thread-runtime");
-
-	print_res(name, runtime_avg,
-		"secs,", "runtime-avg/thread",	"secs average thread-runtime");
-
-	delta_runtime = (runtime_sec_max - runtime_sec_min)/2.0;
-	print_res(name, delta_runtime / runtime_sec_max * 100.0,
-		"%,", "spread-runtime/thread",	"% difference between max/avg runtime");
-
-	print_res(name, bytes / g->p.nr_tasks / 1e9,
-		"GB,", "data/thread",		"GB data processed, per thread");
-
-	print_res(name, bytes / 1e9,
-		"GB,", "data-total",		"GB data processed, total");
-
-	print_res(name, runtime_sec_max * 1e9 / (bytes / g->p.nr_tasks),
-		"nsecs,", "runtime/byte/thread","nsecs/byte/thread runtime");
-
-	print_res(name, bytes / g->p.nr_tasks / 1e9 / runtime_sec_max,
-		"GB/sec,", "thread-speed",	"GB/sec/thread speed");
-
-	print_res(name, bytes / runtime_sec_max / 1e9,
-		"GB/sec,", "total-speed",	"GB/sec total speed");
-
-	free(pids);
-
-	deinit();
-
-	return 0;
-}
-
-#define MAX_ARGS 50
-
-static int command_size(const char **argv)
-{
-	int size = 0;
-
-	while (*argv) {
-		size++;
-		argv++;
-	}
-
-	BUG_ON(size >= MAX_ARGS);
-
-	return size;
-}
-
-static void init_params(struct params *p, const char *name, int argc, const char **argv)
-{
-	int i;
-
-	printf("\n # Running %s \"perf bench numa", name);
-
-	for (i = 0; i < argc; i++)
-		printf(" %s", argv[i]);
-
-	printf("\"\n");
-
-	memset(p, 0, sizeof(*p));
-
-	/* Initialize nonzero defaults: */
-
-	p->serialize_startup		= 1;
-	p->data_reads			= true;
-	p->data_writes			= true;
-	p->data_backwards		= true;
-	p->data_rand_walk		= true;
-	p->nr_loops			= -1;
-	p->init_random			= true;
-}
-
-static int run_bench_numa(const char *name, const char **argv)
-{
-	int argc = command_size(argv);
-
-	init_params(&p0, name, argc, argv);
-	argc = parse_options(argc, argv, options, bench_numa_usage, 0);
-	if (argc)
-		goto err;
-
-	if (__bench_numa(name))
-		goto err;
-
-	return 0;
-
-err:
-	usage_with_options(numa_usage, options);
-	return -1;
-}
-
-#define OPT_BW_RAM		"-s",  "20", "-zZq",    "--thp", " 1", "--no-data_rand_walk"
-#define OPT_BW_RAM_NOTHP	OPT_BW_RAM,		"--thp", "-1"
-
-#define OPT_CONV		"-s", "100", "-zZ0qcm", "--thp", " 1"
-#define OPT_CONV_NOTHP		OPT_CONV,		"--thp", "-1"
-
-#define OPT_BW			"-s",  "20", "-zZ0q",   "--thp", " 1"
-#define OPT_BW_NOTHP		OPT_BW,			"--thp", "-1"
-
-/*
- * The built-in test-suite executed by "perf bench numa -a".
- *
- * (A minimum of 4 nodes and 16 GB of RAM is recommended.)
- */
-static const char *tests[][MAX_ARGS] = {
-   /* Basic single-stream NUMA bandwidth measurements: */
-   { "RAM-bw-local,",	  "mem",  "-p",  "1",  "-t",  "1", "-P", "1024",
-			  "-C" ,   "0", "-M",   "0", OPT_BW_RAM },
-   { "RAM-bw-local-NOTHP,",
-			  "mem",  "-p",  "1",  "-t",  "1", "-P", "1024",
-			  "-C" ,   "0", "-M",   "0", OPT_BW_RAM_NOTHP },
-   { "RAM-bw-remote,",	  "mem",  "-p",  "1",  "-t",  "1", "-P", "1024",
-			  "-C" ,   "0", "-M",   "1", OPT_BW_RAM },
-
-   /* 2-stream NUMA bandwidth measurements: */
-   { "RAM-bw-local-2x,",  "mem",  "-p",  "2",  "-t",  "1", "-P", "1024",
-			   "-C", "0,2", "-M", "0x2", OPT_BW_RAM },
-   { "RAM-bw-remote-2x,", "mem",  "-p",  "2",  "-t",  "1", "-P", "1024",
-		 	   "-C", "0,2", "-M", "1x2", OPT_BW_RAM },
-
-   /* Cross-stream NUMA bandwidth measurement: */
-   { "RAM-bw-cross,",     "mem",  "-p",  "2",  "-t",  "1", "-P", "1024",
-		 	   "-C", "0,8", "-M", "1,0", OPT_BW_RAM },
-
-   /* Convergence latency measurements: */
-   { " 1x3-convergence,", "mem",  "-p",  "1", "-t",  "3", "-P",  "512", OPT_CONV },
-   { " 1x4-convergence,", "mem",  "-p",  "1", "-t",  "4", "-P",  "512", OPT_CONV },
-   { " 1x6-convergence,", "mem",  "-p",  "1", "-t",  "6", "-P", "1020", OPT_CONV },
-   { " 2x3-convergence,", "mem",  "-p",  "3", "-t",  "3", "-P", "1020", OPT_CONV },
-   { " 3x3-convergence,", "mem",  "-p",  "3", "-t",  "3", "-P", "1020", OPT_CONV },
-   { " 4x4-convergence,", "mem",  "-p",  "4", "-t",  "4", "-P",  "512", OPT_CONV },
-   { " 4x4-convergence-NOTHP,",
-			  "mem",  "-p",  "4", "-t",  "4", "-P",  "512", OPT_CONV_NOTHP },
-   { " 4x6-convergence,", "mem",  "-p",  "4", "-t",  "6", "-P", "1020", OPT_CONV },
-   { " 4x8-convergence,", "mem",  "-p",  "4", "-t",  "8", "-P",  "512", OPT_CONV },
-   { " 8x4-convergence,", "mem",  "-p",  "8", "-t",  "4", "-P",  "512", OPT_CONV },
-   { " 8x4-convergence-NOTHP,",
-			  "mem",  "-p",  "8", "-t",  "4", "-P",  "512", OPT_CONV_NOTHP },
-   { " 3x1-convergence,", "mem",  "-p",  "3", "-t",  "1", "-P",  "512", OPT_CONV },
-   { " 4x1-convergence,", "mem",  "-p",  "4", "-t",  "1", "-P",  "512", OPT_CONV },
-   { " 8x1-convergence,", "mem",  "-p",  "8", "-t",  "1", "-P",  "512", OPT_CONV },
-   { "16x1-convergence,", "mem",  "-p", "16", "-t",  "1", "-P",  "256", OPT_CONV },
-   { "32x1-convergence,", "mem",  "-p", "32", "-t",  "1", "-P",  "128", OPT_CONV },
-
-   /* Various NUMA process/thread layout bandwidth measurements: */
-   { " 2x1-bw-process,",  "mem",  "-p",  "2", "-t",  "1", "-P", "1024", OPT_BW },
-   { " 3x1-bw-process,",  "mem",  "-p",  "3", "-t",  "1", "-P", "1024", OPT_BW },
-   { " 4x1-bw-process,",  "mem",  "-p",  "4", "-t",  "1", "-P", "1024", OPT_BW },
-   { " 8x1-bw-process,",  "mem",  "-p",  "8", "-t",  "1", "-P", " 512", OPT_BW },
-   { " 8x1-bw-process-NOTHP,",
-			  "mem",  "-p",  "8", "-t",  "1", "-P", " 512", OPT_BW_NOTHP },
-   { "16x1-bw-process,",  "mem",  "-p", "16", "-t",  "1", "-P",  "256", OPT_BW },
-
-   { " 4x1-bw-thread,",	  "mem",  "-p",  "1", "-t",  "4", "-T",  "256", OPT_BW },
-   { " 8x1-bw-thread,",	  "mem",  "-p",  "1", "-t",  "8", "-T",  "256", OPT_BW },
-   { "16x1-bw-thread,",   "mem",  "-p",  "1", "-t", "16", "-T",  "128", OPT_BW },
-   { "32x1-bw-thread,",   "mem",  "-p",  "1", "-t", "32", "-T",   "64", OPT_BW },
-
-   { " 2x3-bw-thread,",	  "mem",  "-p",  "2", "-t",  "3", "-P",  "512", OPT_BW },
-   { " 4x4-bw-thread,",	  "mem",  "-p",  "4", "-t",  "4", "-P",  "512", OPT_BW },
-   { " 4x6-bw-thread,",	  "mem",  "-p",  "4", "-t",  "6", "-P",  "512", OPT_BW },
-   { " 4x8-bw-thread,",	  "mem",  "-p",  "4", "-t",  "8", "-P",  "512", OPT_BW },
-   { " 4x8-bw-thread-NOTHP,",
-			  "mem",  "-p",  "4", "-t",  "8", "-P",  "512", OPT_BW_NOTHP },
-   { " 3x3-bw-thread,",	  "mem",  "-p",  "3", "-t",  "3", "-P",  "512", OPT_BW },
-   { " 5x5-bw-thread,",	  "mem",  "-p",  "5", "-t",  "5", "-P",  "512", OPT_BW },
-
-   { "2x16-bw-thread,",   "mem",  "-p",  "2", "-t", "16", "-P",  "512", OPT_BW },
-   { "1x32-bw-thread,",   "mem",  "-p",  "1", "-t", "32", "-P", "2048", OPT_BW },
-
-   { "numa02-bw,",	  "mem",  "-p",  "1", "-t", "32", "-T",   "32", OPT_BW },
-   { "numa02-bw-NOTHP,",  "mem",  "-p",  "1", "-t", "32", "-T",   "32", OPT_BW_NOTHP },
-   { "numa01-bw-thread,", "mem",  "-p",  "2", "-t", "16", "-T",  "192", OPT_BW },
-   { "numa01-bw-thread-NOTHP,",
-			  "mem",  "-p",  "2", "-t", "16", "-T",  "192", OPT_BW_NOTHP },
-};
-
-static int bench_all(void)
-{
-	int nr = ARRAY_SIZE(tests);
-	int ret;
-	int i;
-
-	ret = system("echo ' #'; echo ' # Running test on: '$(uname -a); echo ' #'");
-	BUG_ON(ret < 0);
-
-	for (i = 0; i < nr; i++) {
-		if (run_bench_numa(tests[i][0], tests[i] + 1))
-			return -1;
-	}
-
-	printf("\n");
-
-	return 0;
-}
-
-int bench_numa(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	init_params(&p0, "main,", argc, argv);
-	argc = parse_options(argc, argv, options, bench_numa_usage, 0);
-	if (argc)
-		goto err;
-
-	if (p0.run_all)
-		return bench_all();
-
-	if (__bench_numa(NULL))
-		goto err;
-
-	return 0;
-
-err:
-	usage_with_options(numa_usage, options);
-	return -1;
-}
diff --git a/src/tools/perf/bench/sched-messaging.c b/src/tools/perf/bench/sched-messaging.c
deleted file mode 100644
index cc1190a..0000000
--- a/src/tools/perf/bench/sched-messaging.c
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- *
- * sched-messaging.c
- *
- * messaging: Benchmark for scheduler and IPC mechanisms
- *
- * Based on hackbench by Rusty Russell <rusty@rustcorp.com.au>
- * Ported to perf by Hitoshi Mitake <mitake@dcl.info.waseda.ac.jp>
- *
- */
-
-#include "../perf.h"
-#include "../util/util.h"
-#include "../util/parse-options.h"
-#include "../builtin.h"
-#include "bench.h"
-
-/* Test groups of 20 processes spraying to 20 receivers */
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/wait.h>
-#include <sys/time.h>
-#include <sys/poll.h>
-#include <limits.h>
-
-#define DATASIZE 100
-
-static bool use_pipes = false;
-static unsigned int loops = 100;
-static bool thread_mode = false;
-static unsigned int num_groups = 10;
-
-struct sender_context {
-	unsigned int num_fds;
-	int ready_out;
-	int wakefd;
-	int out_fds[0];
-};
-
-struct receiver_context {
-	unsigned int num_packets;
-	int in_fds[2];
-	int ready_out;
-	int wakefd;
-};
-
-static void barf(const char *msg)
-{
-	fprintf(stderr, "%s (error: %s)\n", msg, strerror(errno));
-	exit(1);
-}
-
-static void fdpair(int fds[2])
-{
-	if (use_pipes) {
-		if (pipe(fds) == 0)
-			return;
-	} else {
-		if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == 0)
-			return;
-	}
-
-	barf(use_pipes ? "pipe()" : "socketpair()");
-}
-
-/* Block until we're ready to go */
-static void ready(int ready_out, int wakefd)
-{
-	char dummy;
-	struct pollfd pollfd = { .fd = wakefd, .events = POLLIN };
-
-	/* Tell them we're ready. */
-	if (write(ready_out, &dummy, 1) != 1)
-		barf("CLIENT: ready write");
-
-	/* Wait for "GO" signal */
-	if (poll(&pollfd, 1, -1) != 1)
-		barf("poll");
-}
-
-/* Sender sprays loops messages down each file descriptor */
-static void *sender(struct sender_context *ctx)
-{
-	char data[DATASIZE];
-	unsigned int i, j;
-
-	ready(ctx->ready_out, ctx->wakefd);
-
-	/* Now pump to every receiver. */
-	for (i = 0; i < loops; i++) {
-		for (j = 0; j < ctx->num_fds; j++) {
-			int ret, done = 0;
-
-again:
-			ret = write(ctx->out_fds[j], data + done,
-				    sizeof(data)-done);
-			if (ret < 0)
-				barf("SENDER: write");
-			done += ret;
-			if (done < DATASIZE)
-				goto again;
-		}
-	}
-
-	return NULL;
-}
-
-
-/* One receiver per fd */
-static void *receiver(struct receiver_context* ctx)
-{
-	unsigned int i;
-
-	if (!thread_mode)
-		close(ctx->in_fds[1]);
-
-	/* Wait for start... */
-	ready(ctx->ready_out, ctx->wakefd);
-
-	/* Receive them all */
-	for (i = 0; i < ctx->num_packets; i++) {
-		char data[DATASIZE];
-		int ret, done = 0;
-
-again:
-		ret = read(ctx->in_fds[0], data + done, DATASIZE - done);
-		if (ret < 0)
-			barf("SERVER: read");
-		done += ret;
-		if (done < DATASIZE)
-			goto again;
-	}
-
-	return NULL;
-}
-
-static pthread_t create_worker(void *ctx, void *(*func)(void *))
-{
-	pthread_attr_t attr;
-	pthread_t childid;
-	int err;
-
-	if (!thread_mode) {
-		/* process mode */
-		/* Fork the receiver. */
-		switch (fork()) {
-		case -1:
-			barf("fork()");
-			break;
-		case 0:
-			(*func) (ctx);
-			exit(0);
-			break;
-		default:
-			break;
-		}
-
-		return (pthread_t)0;
-	}
-
-	if (pthread_attr_init(&attr) != 0)
-		barf("pthread_attr_init:");
-
-#ifndef __ia64__
-	if (pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN) != 0)
-		barf("pthread_attr_setstacksize");
-#endif
-
-	err = pthread_create(&childid, &attr, func, ctx);
-	if (err != 0) {
-		fprintf(stderr, "pthread_create failed: %s (%d)\n",
-			strerror(err), err);
-		exit(-1);
-	}
-	return childid;
-}
-
-static void reap_worker(pthread_t id)
-{
-	int proc_status;
-	void *thread_status;
-
-	if (!thread_mode) {
-		/* process mode */
-		wait(&proc_status);
-		if (!WIFEXITED(proc_status))
-			exit(1);
-	} else {
-		pthread_join(id, &thread_status);
-	}
-}
-
-/* One group of senders and receivers */
-static unsigned int group(pthread_t *pth,
-		unsigned int num_fds,
-		int ready_out,
-		int wakefd)
-{
-	unsigned int i;
-	struct sender_context *snd_ctx = malloc(sizeof(struct sender_context)
-			+ num_fds * sizeof(int));
-
-	if (!snd_ctx)
-		barf("malloc()");
-
-	for (i = 0; i < num_fds; i++) {
-		int fds[2];
-		struct receiver_context *ctx = malloc(sizeof(*ctx));
-
-		if (!ctx)
-			barf("malloc()");
-
-
-		/* Create the pipe between client and server */
-		fdpair(fds);
-
-		ctx->num_packets = num_fds * loops;
-		ctx->in_fds[0] = fds[0];
-		ctx->in_fds[1] = fds[1];
-		ctx->ready_out = ready_out;
-		ctx->wakefd = wakefd;
-
-		pth[i] = create_worker(ctx, (void *)receiver);
-
-		snd_ctx->out_fds[i] = fds[1];
-		if (!thread_mode)
-			close(fds[0]);
-	}
-
-	/* Now we have all the fds, fork the senders */
-	for (i = 0; i < num_fds; i++) {
-		snd_ctx->ready_out = ready_out;
-		snd_ctx->wakefd = wakefd;
-		snd_ctx->num_fds = num_fds;
-
-		pth[num_fds+i] = create_worker(snd_ctx, (void *)sender);
-	}
-
-	/* Close the fds we have left */
-	if (!thread_mode)
-		for (i = 0; i < num_fds; i++)
-			close(snd_ctx->out_fds[i]);
-
-	/* Return number of children to reap */
-	return num_fds * 2;
-}
-
-static const struct option options[] = {
-	OPT_BOOLEAN('p', "pipe", &use_pipes,
-		    "Use pipe() instead of socketpair()"),
-	OPT_BOOLEAN('t', "thread", &thread_mode,
-		    "Be multi thread instead of multi process"),
-	OPT_UINTEGER('g', "group", &num_groups, "Specify number of groups"),
-	OPT_UINTEGER('l', "loop", &loops, "Specify number of loops"),
-	OPT_END()
-};
-
-static const char * const bench_sched_message_usage[] = {
-	"perf bench sched messaging <options>",
-	NULL
-};
-
-int bench_sched_messaging(int argc, const char **argv,
-		    const char *prefix __maybe_unused)
-{
-	unsigned int i, total_children;
-	struct timeval start, stop, diff;
-	unsigned int num_fds = 20;
-	int readyfds[2], wakefds[2];
-	char dummy;
-	pthread_t *pth_tab;
-
-	argc = parse_options(argc, argv, options,
-			     bench_sched_message_usage, 0);
-
-	pth_tab = malloc(num_fds * 2 * num_groups * sizeof(pthread_t));
-	if (!pth_tab)
-		barf("main:malloc()");
-
-	fdpair(readyfds);
-	fdpair(wakefds);
-
-	total_children = 0;
-	for (i = 0; i < num_groups; i++)
-		total_children += group(pth_tab+total_children, num_fds,
-					readyfds[1], wakefds[0]);
-
-	/* Wait for everyone to be ready */
-	for (i = 0; i < total_children; i++)
-		if (read(readyfds[0], &dummy, 1) != 1)
-			barf("Reading for readyfds");
-
-	gettimeofday(&start, NULL);
-
-	/* Kick them off */
-	if (write(wakefds[1], &dummy, 1) != 1)
-		barf("Writing to start them");
-
-	/* Reap them all */
-	for (i = 0; i < total_children; i++)
-		reap_worker(pth_tab[i]);
-
-	gettimeofday(&stop, NULL);
-
-	timersub(&stop, &start, &diff);
-
-	switch (bench_format) {
-	case BENCH_FORMAT_DEFAULT:
-		printf("# %d sender and receiver %s per group\n",
-		       num_fds, thread_mode ? "threads" : "processes");
-		printf("# %d groups == %d %s run\n\n",
-		       num_groups, num_groups * 2 * num_fds,
-		       thread_mode ? "threads" : "processes");
-		printf(" %14s: %lu.%03lu [sec]\n", "Total time",
-		       diff.tv_sec,
-		       (unsigned long) (diff.tv_usec/1000));
-		break;
-	case BENCH_FORMAT_SIMPLE:
-		printf("%lu.%03lu\n", diff.tv_sec,
-		       (unsigned long) (diff.tv_usec/1000));
-		break;
-	default:
-		/* reaching here is something disaster */
-		fprintf(stderr, "Unknown format:%d\n", bench_format);
-		exit(1);
-		break;
-	}
-
-	return 0;
-}
diff --git a/src/tools/perf/bench/sched-pipe.c b/src/tools/perf/bench/sched-pipe.c
deleted file mode 100644
index 69cfba8..0000000
--- a/src/tools/perf/bench/sched-pipe.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- *
- * sched-pipe.c
- *
- * pipe: Benchmark for pipe()
- *
- * Based on pipe-test-1m.c by Ingo Molnar <mingo@redhat.com>
- *  http://people.redhat.com/mingo/cfs-scheduler/tools/pipe-test-1m.c
- * Ported to perf by Hitoshi Mitake <mitake@dcl.info.waseda.ac.jp>
- *
- */
-
-#include "../perf.h"
-#include "../util/util.h"
-#include "../util/parse-options.h"
-#include "../builtin.h"
-#include "bench.h"
-
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <sys/wait.h>
-#include <linux/unistd.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <sys/time.h>
-#include <sys/types.h>
-
-#define LOOPS_DEFAULT 1000000
-static int loops = LOOPS_DEFAULT;
-
-static const struct option options[] = {
-	OPT_INTEGER('l', "loop", &loops,
-		    "Specify number of loops"),
-	OPT_END()
-};
-
-static const char * const bench_sched_pipe_usage[] = {
-	"perf bench sched pipe <options>",
-	NULL
-};
-
-int bench_sched_pipe(int argc, const char **argv,
-		     const char *prefix __maybe_unused)
-{
-	int pipe_1[2], pipe_2[2];
-	int m = 0, i;
-	struct timeval start, stop, diff;
-	unsigned long long result_usec = 0;
-
-	/*
-	 * why does "ret" exist?
-	 * discarding returned value of read(), write()
-	 * causes error in building environment for perf
-	 */
-	int __maybe_unused ret, wait_stat;
-	pid_t pid, retpid __maybe_unused;
-
-	argc = parse_options(argc, argv, options,
-			     bench_sched_pipe_usage, 0);
-
-	BUG_ON(pipe(pipe_1));
-	BUG_ON(pipe(pipe_2));
-
-	pid = fork();
-	assert(pid >= 0);
-
-	gettimeofday(&start, NULL);
-
-	if (!pid) {
-		for (i = 0; i < loops; i++) {
-			ret = read(pipe_1[0], &m, sizeof(int));
-			ret = write(pipe_2[1], &m, sizeof(int));
-		}
-	} else {
-		for (i = 0; i < loops; i++) {
-			ret = write(pipe_1[1], &m, sizeof(int));
-			ret = read(pipe_2[0], &m, sizeof(int));
-		}
-	}
-
-	gettimeofday(&stop, NULL);
-	timersub(&stop, &start, &diff);
-
-	if (pid) {
-		retpid = waitpid(pid, &wait_stat, 0);
-		assert((retpid == pid) && WIFEXITED(wait_stat));
-	} else {
-		exit(0);
-	}
-
-	switch (bench_format) {
-	case BENCH_FORMAT_DEFAULT:
-		printf("# Executed %d pipe operations between two tasks\n\n",
-			loops);
-
-		result_usec = diff.tv_sec * 1000000;
-		result_usec += diff.tv_usec;
-
-		printf(" %14s: %lu.%03lu [sec]\n\n", "Total time",
-		       diff.tv_sec,
-		       (unsigned long) (diff.tv_usec/1000));
-
-		printf(" %14lf usecs/op\n",
-		       (double)result_usec / (double)loops);
-		printf(" %14d ops/sec\n",
-		       (int)((double)loops /
-			     ((double)result_usec / (double)1000000)));
-		break;
-
-	case BENCH_FORMAT_SIMPLE:
-		printf("%lu.%03lu\n",
-		       diff.tv_sec,
-		       (unsigned long) (diff.tv_usec / 1000));
-		break;
-
-	default:
-		/* reaching here is something disaster */
-		fprintf(stderr, "Unknown format:%d\n", bench_format);
-		exit(1);
-		break;
-	}
-
-	return 0;
-}
diff --git a/src/tools/perf/builtin-annotate.c b/src/tools/perf/builtin-annotate.c
deleted file mode 100644
index 5ebd0c3..0000000
--- a/src/tools/perf/builtin-annotate.c
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * builtin-annotate.c
- *
- * Builtin annotate command: Analyze the perf.data input file,
- * look up and read DSOs and symbol information and display
- * a histogram of results, along various sorting keys.
- */
-#include "builtin.h"
-
-#include "util/util.h"
-#include "util/color.h"
-#include <linux/list.h>
-#include "util/cache.h"
-#include <linux/rbtree.h>
-#include "util/symbol.h"
-
-#include "perf.h"
-#include "util/debug.h"
-
-#include "util/evlist.h"
-#include "util/evsel.h"
-#include "util/annotate.h"
-#include "util/event.h"
-#include "util/parse-options.h"
-#include "util/parse-events.h"
-#include "util/thread.h"
-#include "util/sort.h"
-#include "util/hist.h"
-#include "util/session.h"
-#include "util/tool.h"
-#include "arch/common.h"
-
-#include <linux/bitmap.h>
-
-struct perf_annotate {
-	struct perf_tool tool;
-	bool	   force, use_tui, use_stdio, use_gtk;
-	bool	   full_paths;
-	bool	   print_line;
-	bool	   skip_missing;
-	const char *sym_hist_filter;
-	const char *cpu_list;
-	DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS);
-};
-
-static int perf_evsel__add_sample(struct perf_evsel *evsel,
-				  struct perf_sample *sample,
-				  struct addr_location *al,
-				  struct perf_annotate *ann)
-{
-	struct hist_entry *he;
-	int ret;
-
-	if (ann->sym_hist_filter != NULL &&
-	    (al->sym == NULL ||
-	     strcmp(ann->sym_hist_filter, al->sym->name) != 0)) {
-		/* We're only interested in a symbol named sym_hist_filter */
-		if (al->sym != NULL) {
-			rb_erase(&al->sym->rb_node,
-				 &al->map->dso->symbols[al->map->type]);
-			symbol__delete(al->sym);
-		}
-		return 0;
-	}
-
-	he = __hists__add_entry(&evsel->hists, al, NULL, 1, 1);
-	if (he == NULL)
-		return -ENOMEM;
-
-	ret = 0;
-	if (he->ms.sym != NULL) {
-		struct annotation *notes = symbol__annotation(he->ms.sym);
-		if (notes->src == NULL && symbol__alloc_hist(he->ms.sym) < 0)
-			return -ENOMEM;
-
-		ret = hist_entry__inc_addr_samples(he, evsel->idx, al->addr);
-	}
-
-	evsel->hists.stats.total_period += sample->period;
-	hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE);
-	return ret;
-}
-
-static int process_sample_event(struct perf_tool *tool,
-				union perf_event *event,
-				struct perf_sample *sample,
-				struct perf_evsel *evsel,
-				struct machine *machine)
-{
-	struct perf_annotate *ann = container_of(tool, struct perf_annotate, tool);
-	struct addr_location al;
-
-	if (perf_event__preprocess_sample(event, machine, &al, sample) < 0) {
-		pr_warning("problem processing %d event, skipping it.\n",
-			   event->header.type);
-		return -1;
-	}
-
-	if (ann->cpu_list && !test_bit(sample->cpu, ann->cpu_bitmap))
-		return 0;
-
-	if (!al.filtered && perf_evsel__add_sample(evsel, sample, &al, ann)) {
-		pr_warning("problem incrementing symbol count, "
-			   "skipping event\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-static int hist_entry__tty_annotate(struct hist_entry *he,
-				    struct perf_evsel *evsel,
-				    struct perf_annotate *ann)
-{
-	return symbol__tty_annotate(he->ms.sym, he->ms.map, evsel,
-				    ann->print_line, ann->full_paths, 0, 0);
-}
-
-static void hists__find_annotations(struct hists *self,
-				    struct perf_evsel *evsel,
-				    struct perf_annotate *ann)
-{
-	struct rb_node *nd = rb_first(&self->entries), *next;
-	int key = K_RIGHT;
-
-	while (nd) {
-		struct hist_entry *he = rb_entry(nd, struct hist_entry, rb_node);
-		struct annotation *notes;
-
-		if (he->ms.sym == NULL || he->ms.map->dso->annotate_warned)
-			goto find_next;
-
-		notes = symbol__annotation(he->ms.sym);
-		if (notes->src == NULL) {
-find_next:
-			if (key == K_LEFT)
-				nd = rb_prev(nd);
-			else
-				nd = rb_next(nd);
-			continue;
-		}
-
-		if (use_browser == 2) {
-			int ret;
-
-			ret = hist_entry__gtk_annotate(he, evsel, NULL);
-			if (!ret || !ann->skip_missing)
-				return;
-
-			/* skip missing symbols */
-			nd = rb_next(nd);
-		} else if (use_browser == 1) {
-			key = hist_entry__tui_annotate(he, evsel, NULL);
-			switch (key) {
-			case -1:
-				if (!ann->skip_missing)
-					return;
-				/* fall through */
-			case K_RIGHT:
-				next = rb_next(nd);
-				break;
-			case K_LEFT:
-				next = rb_prev(nd);
-				break;
-			default:
-				return;
-			}
-
-			if (next != NULL)
-				nd = next;
-		} else {
-			hist_entry__tty_annotate(he, evsel, ann);
-			nd = rb_next(nd);
-			/*
-			 * Since we have a hist_entry per IP for the same
-			 * symbol, free he->ms.sym->src to signal we already
-			 * processed this symbol.
-			 */
-			free(notes->src);
-			notes->src = NULL;
-		}
-	}
-}
-
-static int __cmd_annotate(struct perf_annotate *ann)
-{
-	int ret;
-	struct perf_session *session;
-	struct perf_evsel *pos;
-	u64 total_nr_samples;
-
-	session = perf_session__new(input_name, O_RDONLY,
-				    ann->force, false, &ann->tool);
-	if (session == NULL)
-		return -ENOMEM;
-
-	machines__set_symbol_filter(&session->machines, symbol__annotate_init);
-
-	if (ann->cpu_list) {
-		ret = perf_session__cpu_bitmap(session, ann->cpu_list,
-					       ann->cpu_bitmap);
-		if (ret)
-			goto out_delete;
-	}
-
-	if (!objdump_path) {
-		ret = perf_session_env__lookup_objdump(&session->header.env);
-		if (ret)
-			goto out_delete;
-	}
-
-	ret = perf_session__process_events(session, &ann->tool);
-	if (ret)
-		goto out_delete;
-
-	if (dump_trace) {
-		perf_session__fprintf_nr_events(session, stdout);
-		goto out_delete;
-	}
-
-	if (verbose > 3)
-		perf_session__fprintf(session, stdout);
-
-	if (verbose > 2)
-		perf_session__fprintf_dsos(session, stdout);
-
-	total_nr_samples = 0;
-	list_for_each_entry(pos, &session->evlist->entries, node) {
-		struct hists *hists = &pos->hists;
-		u32 nr_samples = hists->stats.nr_events[PERF_RECORD_SAMPLE];
-
-		if (nr_samples > 0) {
-			total_nr_samples += nr_samples;
-			hists__collapse_resort(hists);
-			hists__output_resort(hists);
-
-			if (symbol_conf.event_group &&
-			    !perf_evsel__is_group_leader(pos))
-				continue;
-
-			hists__find_annotations(hists, pos, ann);
-		}
-	}
-
-	if (total_nr_samples == 0) {
-		ui__error("The %s file has no samples!\n", session->filename);
-		goto out_delete;
-	}
-
-	if (use_browser == 2)
-		perf_gtk__show_annotations();
-
-out_delete:
-	/*
-	 * Speed up the exit process, for large files this can
-	 * take quite a while.
-	 *
-	 * XXX Enable this when using valgrind or if we ever
-	 * librarize this command.
-	 *
-	 * Also experiment with obstacks to see how much speed
-	 * up we'll get here.
-	 *
-	 * perf_session__delete(session);
-	 */
-	return ret;
-}
-
-static const char * const annotate_usage[] = {
-	"perf annotate [<options>]",
-	NULL
-};
-
-int cmd_annotate(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	struct perf_annotate annotate = {
-		.tool = {
-			.sample	= process_sample_event,
-			.mmap	= perf_event__process_mmap,
-			.mmap2	= perf_event__process_mmap2,
-			.comm	= perf_event__process_comm,
-			.exit	= perf_event__process_exit,
-			.fork	= perf_event__process_fork,
-			.ordered_samples = true,
-			.ordering_requires_timestamps = true,
-		},
-	};
-	const struct option options[] = {
-	OPT_STRING('i', "input", &input_name, "file",
-		    "input file name"),
-	OPT_STRING('d', "dsos", &symbol_conf.dso_list_str, "dso[,dso...]",
-		   "only consider symbols in these dsos"),
-	OPT_STRING('s', "symbol", &annotate.sym_hist_filter, "symbol",
-		    "symbol to annotate"),
-	OPT_BOOLEAN('f', "force", &annotate.force, "don't complain, do it"),
-	OPT_INCR('v', "verbose", &verbose,
-		    "be more verbose (show symbol address, etc)"),
-	OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
-		    "dump raw trace in ASCII"),
-	OPT_BOOLEAN(0, "gtk", &annotate.use_gtk, "Use the GTK interface"),
-	OPT_BOOLEAN(0, "tui", &annotate.use_tui, "Use the TUI interface"),
-	OPT_BOOLEAN(0, "stdio", &annotate.use_stdio, "Use the stdio interface"),
-	OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
-		   "file", "vmlinux pathname"),
-	OPT_BOOLEAN('m', "modules", &symbol_conf.use_modules,
-		    "load module symbols - WARNING: use only with -k and LIVE kernel"),
-	OPT_BOOLEAN('l', "print-line", &annotate.print_line,
-		    "print matching source lines (may be slow)"),
-	OPT_BOOLEAN('P', "full-paths", &annotate.full_paths,
-		    "Don't shorten the displayed pathnames"),
-	OPT_BOOLEAN(0, "skip-missing", &annotate.skip_missing,
-		    "Skip symbols that cannot be annotated"),
-	OPT_STRING('C', "cpu", &annotate.cpu_list, "cpu", "list of cpus to profile"),
-	OPT_STRING(0, "symfs", &symbol_conf.symfs, "directory",
-		   "Look for files with symbols relative to this directory"),
-	OPT_BOOLEAN(0, "source", &symbol_conf.annotate_src,
-		    "Interleave source code with assembly code (default)"),
-	OPT_BOOLEAN(0, "asm-raw", &symbol_conf.annotate_asm_raw,
-		    "Display raw encoding of assembly instructions (default)"),
-	OPT_STRING('M', "disassembler-style", &disassembler_style, "disassembler style",
-		   "Specify disassembler style (e.g. -M intel for intel syntax)"),
-	OPT_STRING(0, "objdump", &objdump_path, "path",
-		   "objdump binary to use for disassembly and annotations"),
-	OPT_BOOLEAN(0, "group", &symbol_conf.event_group,
-		    "Show event group information together"),
-	OPT_END()
-	};
-
-	argc = parse_options(argc, argv, options, annotate_usage, 0);
-
-	if (annotate.use_stdio)
-		use_browser = 0;
-	else if (annotate.use_tui)
-		use_browser = 1;
-	else if (annotate.use_gtk)
-		use_browser = 2;
-
-	setup_browser(true);
-
-	symbol_conf.priv_size = sizeof(struct annotation);
-	symbol_conf.try_vmlinux_path = true;
-
-	if (symbol__init() < 0)
-		return -1;
-
-	if (setup_sorting() < 0)
-		usage_with_options(annotate_usage, options);
-
-	if (argc) {
-		/*
-		 * Special case: if there's an argument left then assume tha
-		 * it's a symbol filter:
-		 */
-		if (argc > 1)
-			usage_with_options(annotate_usage, options);
-
-		annotate.sym_hist_filter = argv[0];
-	}
-
-	return __cmd_annotate(&annotate);
-}
diff --git a/src/tools/perf/builtin-bench.c b/src/tools/perf/builtin-bench.c
deleted file mode 100644
index 77298bf..0000000
--- a/src/tools/perf/builtin-bench.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- *
- * builtin-bench.c
- *
- * General benchmarking subsystem provided by perf
- *
- * Copyright (C) 2009, Hitoshi Mitake <mitake@dcl.info.waseda.ac.jp>
- *
- */
-
-/*
- *
- * Available subsystem list:
- *  sched ... scheduler and IPC mechanism
- *  mem   ... memory access performance
- *
- */
-
-#include "perf.h"
-#include "util/util.h"
-#include "util/parse-options.h"
-#include "builtin.h"
-#include "bench/bench.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-struct bench_suite {
-	const char *name;
-	const char *summary;
-	int (*fn)(int, const char **, const char *);
-};
-						\
-/* sentinel: easy for help */
-#define suite_all { "all", "Test all benchmark suites", NULL }
-
-#ifdef LIBNUMA_SUPPORT
-static struct bench_suite numa_suites[] = {
-	{ "mem",
-	  "Benchmark for NUMA workloads",
-	  bench_numa },
-	suite_all,
-	{ NULL,
-	  NULL,
-	  NULL                  }
-};
-#endif
-
-static struct bench_suite sched_suites[] = {
-	{ "messaging",
-	  "Benchmark for scheduler and IPC mechanisms",
-	  bench_sched_messaging },
-	{ "pipe",
-	  "Flood of communication over pipe() between two processes",
-	  bench_sched_pipe      },
-	suite_all,
-	{ NULL,
-	  NULL,
-	  NULL                  }
-};
-
-static struct bench_suite mem_suites[] = {
-	{ "memcpy",
-	  "Simple memory copy in various ways",
-	  bench_mem_memcpy },
-	{ "memset",
-	  "Simple memory set in various ways",
-	  bench_mem_memset },
-	suite_all,
-	{ NULL,
-	  NULL,
-	  NULL             }
-};
-
-struct bench_subsys {
-	const char *name;
-	const char *summary;
-	struct bench_suite *suites;
-};
-
-static struct bench_subsys subsystems[] = {
-#ifdef LIBNUMA_SUPPORT
-	{ "numa",
-	  "NUMA scheduling and MM behavior",
-	  numa_suites },
-#endif
-	{ "sched",
-	  "scheduler and IPC mechanism",
-	  sched_suites },
-	{ "mem",
-	  "memory access performance",
-	  mem_suites },
-	{ "all",		/* sentinel: easy for help */
-	  "all benchmark subsystem",
-	  NULL },
-	{ NULL,
-	  NULL,
-	  NULL       }
-};
-
-static void dump_suites(int subsys_index)
-{
-	int i;
-
-	printf("# List of available suites for %s...\n\n",
-	       subsystems[subsys_index].name);
-
-	for (i = 0; subsystems[subsys_index].suites[i].name; i++)
-		printf("%14s: %s\n",
-		       subsystems[subsys_index].suites[i].name,
-		       subsystems[subsys_index].suites[i].summary);
-
-	printf("\n");
-	return;
-}
-
-static const char *bench_format_str;
-int bench_format = BENCH_FORMAT_DEFAULT;
-
-static const struct option bench_options[] = {
-	OPT_STRING('f', "format", &bench_format_str, "default",
-		    "Specify format style"),
-	OPT_END()
-};
-
-static const char * const bench_usage[] = {
-	"perf bench [<common options>] <subsystem> <suite> [<options>]",
-	NULL
-};
-
-static void print_usage(void)
-{
-	int i;
-
-	printf("Usage: \n");
-	for (i = 0; bench_usage[i]; i++)
-		printf("\t%s\n", bench_usage[i]);
-	printf("\n");
-
-	printf("# List of available subsystems...\n\n");
-
-	for (i = 0; subsystems[i].name; i++)
-		printf("%14s: %s\n",
-		       subsystems[i].name, subsystems[i].summary);
-	printf("\n");
-}
-
-static int bench_str2int(const char *str)
-{
-	if (!str)
-		return BENCH_FORMAT_DEFAULT;
-
-	if (!strcmp(str, BENCH_FORMAT_DEFAULT_STR))
-		return BENCH_FORMAT_DEFAULT;
-	else if (!strcmp(str, BENCH_FORMAT_SIMPLE_STR))
-		return BENCH_FORMAT_SIMPLE;
-
-	return BENCH_FORMAT_UNKNOWN;
-}
-
-static void all_suite(struct bench_subsys *subsys)	  /* FROM HERE */
-{
-	int i;
-	const char *argv[2];
-	struct bench_suite *suites = subsys->suites;
-
-	argv[1] = NULL;
-	/*
-	 * TODO:
-	 * preparing preset parameters for
-	 * embedded, ordinary PC, HPC, etc...
-	 * will be helpful
-	 */
-	for (i = 0; suites[i].fn; i++) {
-		printf("# Running %s/%s benchmark...\n",
-		       subsys->name,
-		       suites[i].name);
-		fflush(stdout);
-
-		argv[1] = suites[i].name;
-		suites[i].fn(1, argv, NULL);
-		printf("\n");
-	}
-}
-
-static void all_subsystem(void)
-{
-	int i;
-	for (i = 0; subsystems[i].suites; i++)
-		all_suite(&subsystems[i]);
-}
-
-int cmd_bench(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	int i, j, status = 0;
-
-	if (argc < 2) {
-		/* No subsystem specified. */
-		print_usage();
-		goto end;
-	}
-
-	argc = parse_options(argc, argv, bench_options, bench_usage,
-			     PARSE_OPT_STOP_AT_NON_OPTION);
-
-	bench_format = bench_str2int(bench_format_str);
-	if (bench_format == BENCH_FORMAT_UNKNOWN) {
-		printf("Unknown format descriptor:%s\n", bench_format_str);
-		goto end;
-	}
-
-	if (argc < 1) {
-		print_usage();
-		goto end;
-	}
-
-	if (!strcmp(argv[0], "all")) {
-		all_subsystem();
-		goto end;
-	}
-
-	for (i = 0; subsystems[i].name; i++) {
-		if (strcmp(subsystems[i].name, argv[0]))
-			continue;
-
-		if (argc < 2) {
-			/* No suite specified. */
-			dump_suites(i);
-			goto end;
-		}
-
-		if (!strcmp(argv[1], "all")) {
-			all_suite(&subsystems[i]);
-			goto end;
-		}
-
-		for (j = 0; subsystems[i].suites[j].name; j++) {
-			if (strcmp(subsystems[i].suites[j].name, argv[1]))
-				continue;
-
-			if (bench_format == BENCH_FORMAT_DEFAULT)
-				printf("# Running %s/%s benchmark...\n",
-				       subsystems[i].name,
-				       subsystems[i].suites[j].name);
-			fflush(stdout);
-			status = subsystems[i].suites[j].fn(argc - 1,
-							    argv + 1, prefix);
-			goto end;
-		}
-
-		if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) {
-			dump_suites(i);
-			goto end;
-		}
-
-		printf("Unknown suite:%s for %s\n", argv[1], argv[0]);
-		status = 1;
-		goto end;
-	}
-
-	printf("Unknown subsystem:%s\n", argv[0]);
-	status = 1;
-
-end:
-	return status;
-}
diff --git a/src/tools/perf/builtin-buildid-cache.c b/src/tools/perf/builtin-buildid-cache.c
deleted file mode 100644
index c96c8fa..0000000
--- a/src/tools/perf/builtin-buildid-cache.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * builtin-buildid-cache.c
- *
- * Builtin buildid-cache command: Manages build-id cache
- *
- * Copyright (C) 2010, Red Hat Inc.
- * Copyright (C) 2010, Arnaldo Carvalho de Melo <acme@redhat.com>
- */
-#include "builtin.h"
-#include "perf.h"
-#include "util/cache.h"
-#include "util/debug.h"
-#include "util/header.h"
-#include "util/parse-options.h"
-#include "util/strlist.h"
-#include "util/build-id.h"
-#include "util/session.h"
-#include "util/symbol.h"
-
-static int build_id_cache__add_file(const char *filename, const char *debugdir)
-{
-	char sbuild_id[BUILD_ID_SIZE * 2 + 1];
-	u8 build_id[BUILD_ID_SIZE];
-	int err;
-
-	if (filename__read_build_id(filename, &build_id, sizeof(build_id)) < 0) {
-		pr_debug("Couldn't read a build-id in %s\n", filename);
-		return -1;
-	}
-
-	build_id__sprintf(build_id, sizeof(build_id), sbuild_id);
-	err = build_id_cache__add_s(sbuild_id, debugdir, filename,
-				    false, false);
-	if (verbose)
-		pr_info("Adding %s %s: %s\n", sbuild_id, filename,
-			err ? "FAIL" : "Ok");
-	return err;
-}
-
-static int build_id_cache__remove_file(const char *filename,
-				       const char *debugdir)
-{
-	u8 build_id[BUILD_ID_SIZE];
-	char sbuild_id[BUILD_ID_SIZE * 2 + 1];
-
-	int err;
-
-	if (filename__read_build_id(filename, &build_id, sizeof(build_id)) < 0) {
-		pr_debug("Couldn't read a build-id in %s\n", filename);
-		return -1;
-	}
-
-	build_id__sprintf(build_id, sizeof(build_id), sbuild_id);
-	err = build_id_cache__remove_s(sbuild_id, debugdir);
-	if (verbose)
-		pr_info("Removing %s %s: %s\n", sbuild_id, filename,
-			err ? "FAIL" : "Ok");
-
-	return err;
-}
-
-static bool dso__missing_buildid_cache(struct dso *dso, int parm __maybe_unused)
-{
-	char filename[PATH_MAX];
-	u8 build_id[BUILD_ID_SIZE];
-
-	if (dso__build_id_filename(dso, filename, sizeof(filename)) &&
-	    filename__read_build_id(filename, build_id,
-				    sizeof(build_id)) != sizeof(build_id)) {
-		if (errno == ENOENT)
-			return false;
-
-		pr_warning("Problems with %s file, consider removing it from the cache\n", 
-			   filename);
-	} else if (memcmp(dso->build_id, build_id, sizeof(dso->build_id))) {
-		pr_warning("Problems with %s file, consider removing it from the cache\n", 
-			   filename);
-	}
-
-	return true;
-}
-
-static int build_id_cache__fprintf_missing(const char *filename, bool force, FILE *fp)
-{
-	struct perf_session *session = perf_session__new(filename, O_RDONLY,
-							 force, false, NULL);
-	if (session == NULL)
-		return -1;
-
-	perf_session__fprintf_dsos_buildid(session, fp, dso__missing_buildid_cache, 0);
-	perf_session__delete(session);
-
-	return 0;
-}
-
-static int build_id_cache__update_file(const char *filename,
-				       const char *debugdir)
-{
-	u8 build_id[BUILD_ID_SIZE];
-	char sbuild_id[BUILD_ID_SIZE * 2 + 1];
-
-	int err;
-
-	if (filename__read_build_id(filename, &build_id, sizeof(build_id)) < 0) {
-		pr_debug("Couldn't read a build-id in %s\n", filename);
-		return -1;
-	}
-
-	build_id__sprintf(build_id, sizeof(build_id), sbuild_id);
-	err = build_id_cache__remove_s(sbuild_id, debugdir);
-	if (!err) {
-		err = build_id_cache__add_s(sbuild_id, debugdir, filename,
-					    false, false);
-	}
-	if (verbose)
-		pr_info("Updating %s %s: %s\n", sbuild_id, filename,
-			err ? "FAIL" : "Ok");
-
-	return err;
-}
-
-int cmd_buildid_cache(int argc, const char **argv,
-		      const char *prefix __maybe_unused)
-{
-	struct strlist *list;
-	struct str_node *pos;
-	int ret = 0;
-	bool force = false;
-	char debugdir[PATH_MAX];
-	char const *add_name_list_str = NULL,
-		   *remove_name_list_str = NULL,
-		   *missing_filename = NULL,
-		   *update_name_list_str = NULL;
-
-	const struct option buildid_cache_options[] = {
-	OPT_STRING('a', "add", &add_name_list_str,
-		   "file list", "file(s) to add"),
-	OPT_STRING('r', "remove", &remove_name_list_str, "file list",
-		    "file(s) to remove"),
-	OPT_STRING('M', "missing", &missing_filename, "file",
-		   "to find missing build ids in the cache"),
-	OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
-	OPT_STRING('u', "update", &update_name_list_str, "file list",
-		    "file(s) to update"),
-	OPT_INCR('v', "verbose", &verbose, "be more verbose"),
-	OPT_END()
-	};
-	const char * const buildid_cache_usage[] = {
-		"perf buildid-cache [<options>]",
-		NULL
-	};
-
-	argc = parse_options(argc, argv, buildid_cache_options,
-			     buildid_cache_usage, 0);
-
-	if (symbol__init() < 0)
-		return -1;
-
-	setup_pager();
-
-	snprintf(debugdir, sizeof(debugdir), "%s", buildid_dir);
-
-	if (add_name_list_str) {
-		list = strlist__new(true, add_name_list_str);
-		if (list) {
-			strlist__for_each(pos, list)
-				if (build_id_cache__add_file(pos->s, debugdir)) {
-					if (errno == EEXIST) {
-						pr_debug("%s already in the cache\n",
-							 pos->s);
-						continue;
-					}
-					pr_warning("Couldn't add %s: %s\n",
-						   pos->s, strerror(errno));
-				}
-
-			strlist__delete(list);
-		}
-	}
-
-	if (remove_name_list_str) {
-		list = strlist__new(true, remove_name_list_str);
-		if (list) {
-			strlist__for_each(pos, list)
-				if (build_id_cache__remove_file(pos->s, debugdir)) {
-					if (errno == ENOENT) {
-						pr_debug("%s wasn't in the cache\n",
-							 pos->s);
-						continue;
-					}
-					pr_warning("Couldn't remove %s: %s\n",
-						   pos->s, strerror(errno));
-				}
-
-			strlist__delete(list);
-		}
-	}
-
-	if (missing_filename)
-		ret = build_id_cache__fprintf_missing(missing_filename, force, stdout);
-
-	if (update_name_list_str) {
-		list = strlist__new(true, update_name_list_str);
-		if (list) {
-			strlist__for_each(pos, list)
-				if (build_id_cache__update_file(pos->s, debugdir)) {
-					if (errno == ENOENT) {
-						pr_debug("%s wasn't in the cache\n",
-							 pos->s);
-						continue;
-					}
-					pr_warning("Couldn't update %s: %s\n",
-						   pos->s, strerror(errno));
-				}
-
-			strlist__delete(list);
-		}
-	}
-
-	return ret;
-}
diff --git a/src/tools/perf/builtin-buildid-list.c b/src/tools/perf/builtin-buildid-list.c
deleted file mode 100644
index e74366a..0000000
--- a/src/tools/perf/builtin-buildid-list.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * builtin-buildid-list.c
- *
- * Builtin buildid-list command: list buildids in perf.data, in the running
- * kernel and in ELF files.
- *
- * Copyright (C) 2009, Red Hat Inc.
- * Copyright (C) 2009, Arnaldo Carvalho de Melo <acme@redhat.com>
- */
-#include "builtin.h"
-#include "perf.h"
-#include "util/build-id.h"
-#include "util/cache.h"
-#include "util/debug.h"
-#include "util/parse-options.h"
-#include "util/session.h"
-#include "util/symbol.h"
-
-static int sysfs__fprintf_build_id(FILE *fp)
-{
-	u8 kallsyms_build_id[BUILD_ID_SIZE];
-	char sbuild_id[BUILD_ID_SIZE * 2 + 1];
-
-	if (sysfs__read_build_id("/sys/kernel/notes", kallsyms_build_id,
-				 sizeof(kallsyms_build_id)) != 0)
-		return -1;
-
-	build_id__sprintf(kallsyms_build_id, sizeof(kallsyms_build_id),
-			  sbuild_id);
-	fprintf(fp, "%s\n", sbuild_id);
-	return 0;
-}
-
-static int filename__fprintf_build_id(const char *name, FILE *fp)
-{
-	u8 build_id[BUILD_ID_SIZE];
-	char sbuild_id[BUILD_ID_SIZE * 2 + 1];
-
-	if (filename__read_build_id(name, build_id,
-				    sizeof(build_id)) != sizeof(build_id))
-		return 0;
-
-	build_id__sprintf(build_id, sizeof(build_id), sbuild_id);
-	return fprintf(fp, "%s\n", sbuild_id);
-}
-
-static bool dso__skip_buildid(struct dso *dso, int with_hits)
-{
-	return with_hits && !dso->hit;
-}
-
-static int perf_session__list_build_ids(bool force, bool with_hits)
-{
-	struct perf_session *session;
-
-	symbol__elf_init();
-	/*
-	 * See if this is an ELF file first:
-	 */
-	if (filename__fprintf_build_id(input_name, stdout))
-		goto out;
-
-	session = perf_session__new(input_name, O_RDONLY, force, false,
-				    &build_id__mark_dso_hit_ops);
-	if (session == NULL)
-		return -1;
-	/*
-	 * in pipe-mode, the only way to get the buildids is to parse
-	 * the record stream. Buildids are stored as RECORD_HEADER_BUILD_ID
-	 */
-	if (with_hits || session->fd_pipe)
-		perf_session__process_events(session, &build_id__mark_dso_hit_ops);
-
-	perf_session__fprintf_dsos_buildid(session, stdout, dso__skip_buildid, with_hits);
-	perf_session__delete(session);
-out:
-	return 0;
-}
-
-int cmd_buildid_list(int argc, const char **argv,
-		     const char *prefix __maybe_unused)
-{
-	bool show_kernel = false;
-	bool with_hits = false;
-	bool force = false;
-	const struct option options[] = {
-	OPT_BOOLEAN('H', "with-hits", &with_hits, "Show only DSOs with hits"),
-	OPT_STRING('i', "input", &input_name, "file", "input file name"),
-	OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
-	OPT_BOOLEAN('k', "kernel", &show_kernel, "Show current kernel build id"),
-	OPT_INCR('v', "verbose", &verbose, "be more verbose"),
-	OPT_END()
-	};
-	const char * const buildid_list_usage[] = {
-		"perf buildid-list [<options>]",
-		NULL
-	};
-
-	argc = parse_options(argc, argv, options, buildid_list_usage, 0);
-	setup_pager();
-
-	if (show_kernel)
-		return sysfs__fprintf_build_id(stdout);
-
-	return perf_session__list_build_ids(force, with_hits);
-}
diff --git a/src/tools/perf/builtin-diff.c b/src/tools/perf/builtin-diff.c
deleted file mode 100644
index f28799e..0000000
--- a/src/tools/perf/builtin-diff.c
+++ /dev/null
@@ -1,1045 +0,0 @@
-/*
- * builtin-diff.c
- *
- * Builtin diff command: Analyze two perf.data input files, look up and read
- * DSOs and symbol information, sort them and produce a diff.
- */
-#include "builtin.h"
-
-#include "util/debug.h"
-#include "util/event.h"
-#include "util/hist.h"
-#include "util/evsel.h"
-#include "util/evlist.h"
-#include "util/session.h"
-#include "util/tool.h"
-#include "util/sort.h"
-#include "util/symbol.h"
-#include "util/util.h"
-
-#include <stdlib.h>
-#include <math.h>
-
-/* Diff command specific HPP columns. */
-enum {
-	PERF_HPP_DIFF__BASELINE,
-	PERF_HPP_DIFF__PERIOD,
-	PERF_HPP_DIFF__PERIOD_BASELINE,
-	PERF_HPP_DIFF__DELTA,
-	PERF_HPP_DIFF__RATIO,
-	PERF_HPP_DIFF__WEIGHTED_DIFF,
-	PERF_HPP_DIFF__FORMULA,
-
-	PERF_HPP_DIFF__MAX_INDEX
-};
-
-struct diff_hpp_fmt {
-	struct perf_hpp_fmt	 fmt;
-	int			 idx;
-	char			*header;
-	int			 header_width;
-};
-
-struct data__file {
-	struct perf_session	*session;
-	const char		*file;
-	int			 idx;
-	struct hists		*hists;
-	struct diff_hpp_fmt	 fmt[PERF_HPP_DIFF__MAX_INDEX];
-};
-
-static struct data__file *data__files;
-static int data__files_cnt;
-
-#define data__for_each_file_start(i, d, s)	\
-	for (i = s, d = &data__files[s];	\
-	     i < data__files_cnt;		\
-	     i++, d = &data__files[i])
-
-#define data__for_each_file(i, d) data__for_each_file_start(i, d, 0)
-#define data__for_each_file_new(i, d) data__for_each_file_start(i, d, 1)
-
-static char diff__default_sort_order[] = "dso,symbol";
-static bool force;
-static bool show_period;
-static bool show_formula;
-static bool show_baseline_only;
-static unsigned int sort_compute;
-
-static s64 compute_wdiff_w1;
-static s64 compute_wdiff_w2;
-
-enum {
-	COMPUTE_DELTA,
-	COMPUTE_RATIO,
-	COMPUTE_WEIGHTED_DIFF,
-	COMPUTE_MAX,
-};
-
-const char *compute_names[COMPUTE_MAX] = {
-	[COMPUTE_DELTA] = "delta",
-	[COMPUTE_RATIO] = "ratio",
-	[COMPUTE_WEIGHTED_DIFF] = "wdiff",
-};
-
-static int compute;
-
-static int compute_2_hpp[COMPUTE_MAX] = {
-	[COMPUTE_DELTA]		= PERF_HPP_DIFF__DELTA,
-	[COMPUTE_RATIO]		= PERF_HPP_DIFF__RATIO,
-	[COMPUTE_WEIGHTED_DIFF]	= PERF_HPP_DIFF__WEIGHTED_DIFF,
-};
-
-#define MAX_COL_WIDTH 70
-
-static struct header_column {
-	const char *name;
-	int width;
-} columns[PERF_HPP_DIFF__MAX_INDEX] = {
-	[PERF_HPP_DIFF__BASELINE] = {
-		.name  = "Baseline",
-	},
-	[PERF_HPP_DIFF__PERIOD] = {
-		.name  = "Period",
-		.width = 14,
-	},
-	[PERF_HPP_DIFF__PERIOD_BASELINE] = {
-		.name  = "Base period",
-		.width = 14,
-	},
-	[PERF_HPP_DIFF__DELTA] = {
-		.name  = "Delta",
-		.width = 7,
-	},
-	[PERF_HPP_DIFF__RATIO] = {
-		.name  = "Ratio",
-		.width = 14,
-	},
-	[PERF_HPP_DIFF__WEIGHTED_DIFF] = {
-		.name  = "Weighted diff",
-		.width = 14,
-	},
-	[PERF_HPP_DIFF__FORMULA] = {
-		.name  = "Formula",
-		.width = MAX_COL_WIDTH,
-	}
-};
-
-static int setup_compute_opt_wdiff(char *opt)
-{
-	char *w1_str = opt;
-	char *w2_str;
-
-	int ret = -EINVAL;
-
-	if (!opt)
-		goto out;
-
-	w2_str = strchr(opt, ',');
-	if (!w2_str)
-		goto out;
-
-	*w2_str++ = 0x0;
-	if (!*w2_str)
-		goto out;
-
-	compute_wdiff_w1 = strtol(w1_str, NULL, 10);
-	compute_wdiff_w2 = strtol(w2_str, NULL, 10);
-
-	if (!compute_wdiff_w1 || !compute_wdiff_w2)
-		goto out;
-
-	pr_debug("compute wdiff w1(%" PRId64 ") w2(%" PRId64 ")\n",
-		  compute_wdiff_w1, compute_wdiff_w2);
-
-	ret = 0;
-
- out:
-	if (ret)
-		pr_err("Failed: wrong weight data, use 'wdiff:w1,w2'\n");
-
-	return ret;
-}
-
-static int setup_compute_opt(char *opt)
-{
-	if (compute == COMPUTE_WEIGHTED_DIFF)
-		return setup_compute_opt_wdiff(opt);
-
-	if (opt) {
-		pr_err("Failed: extra option specified '%s'", opt);
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static int setup_compute(const struct option *opt, const char *str,
-			 int unset __maybe_unused)
-{
-	int *cp = (int *) opt->value;
-	char *cstr = (char *) str;
-	char buf[50];
-	unsigned i;
-	char *option;
-
-	if (!str) {
-		*cp = COMPUTE_DELTA;
-		return 0;
-	}
-
-	option = strchr(str, ':');
-	if (option) {
-		unsigned len = option++ - str;
-
-		/*
-		 * The str data are not writeable, so we need
-		 * to use another buffer.
-		 */
-
-		/* No option value is longer. */
-		if (len >= sizeof(buf))
-			return -EINVAL;
-
-		strncpy(buf, str, len);
-		buf[len] = 0x0;
-		cstr = buf;
-	}
-
-	for (i = 0; i < COMPUTE_MAX; i++)
-		if (!strcmp(cstr, compute_names[i])) {
-			*cp = i;
-			return setup_compute_opt(option);
-		}
-
-	pr_err("Failed: '%s' is not computation method "
-	       "(use 'delta','ratio' or 'wdiff')\n", str);
-	return -EINVAL;
-}
-
-static double period_percent(struct hist_entry *he, u64 period)
-{
-	u64 total = he->hists->stats.total_period;
-	return (period * 100.0) / total;
-}
-
-static double compute_delta(struct hist_entry *he, struct hist_entry *pair)
-{
-	double old_percent = period_percent(he, he->stat.period);
-	double new_percent = period_percent(pair, pair->stat.period);
-
-	pair->diff.period_ratio_delta = new_percent - old_percent;
-	pair->diff.computed = true;
-	return pair->diff.period_ratio_delta;
-}
-
-static double compute_ratio(struct hist_entry *he, struct hist_entry *pair)
-{
-	double old_period = he->stat.period ?: 1;
-	double new_period = pair->stat.period;
-
-	pair->diff.computed = true;
-	pair->diff.period_ratio = new_period / old_period;
-	return pair->diff.period_ratio;
-}
-
-static s64 compute_wdiff(struct hist_entry *he, struct hist_entry *pair)
-{
-	u64 old_period = he->stat.period;
-	u64 new_period = pair->stat.period;
-
-	pair->diff.computed = true;
-	pair->diff.wdiff = new_period * compute_wdiff_w2 -
-			   old_period * compute_wdiff_w1;
-
-	return pair->diff.wdiff;
-}
-
-static int formula_delta(struct hist_entry *he, struct hist_entry *pair,
-			 char *buf, size_t size)
-{
-	return scnprintf(buf, size,
-			 "(%" PRIu64 " * 100 / %" PRIu64 ") - "
-			 "(%" PRIu64 " * 100 / %" PRIu64 ")",
-			  pair->stat.period, pair->hists->stats.total_period,
-			  he->stat.period, he->hists->stats.total_period);
-}
-
-static int formula_ratio(struct hist_entry *he, struct hist_entry *pair,
-			 char *buf, size_t size)
-{
-	double old_period = he->stat.period;
-	double new_period = pair->stat.period;
-
-	return scnprintf(buf, size, "%.0F / %.0F", new_period, old_period);
-}
-
-static int formula_wdiff(struct hist_entry *he, struct hist_entry *pair,
-			 char *buf, size_t size)
-{
-	u64 old_period = he->stat.period;
-	u64 new_period = pair->stat.period;
-
-	return scnprintf(buf, size,
-		  "(%" PRIu64 " * " "%" PRId64 ") - (%" PRIu64 " * " "%" PRId64 ")",
-		  new_period, compute_wdiff_w2, old_period, compute_wdiff_w1);
-}
-
-static int formula_fprintf(struct hist_entry *he, struct hist_entry *pair,
-			   char *buf, size_t size)
-{
-	switch (compute) {
-	case COMPUTE_DELTA:
-		return formula_delta(he, pair, buf, size);
-	case COMPUTE_RATIO:
-		return formula_ratio(he, pair, buf, size);
-	case COMPUTE_WEIGHTED_DIFF:
-		return formula_wdiff(he, pair, buf, size);
-	default:
-		BUG_ON(1);
-	}
-
-	return -1;
-}
-
-static int hists__add_entry(struct hists *self,
-			    struct addr_location *al, u64 period,
-			    u64 weight)
-{
-	if (__hists__add_entry(self, al, NULL, period, weight) != NULL)
-		return 0;
-	return -ENOMEM;
-}
-
-static int diff__process_sample_event(struct perf_tool *tool __maybe_unused,
-				      union perf_event *event,
-				      struct perf_sample *sample,
-				      struct perf_evsel *evsel,
-				      struct machine *machine)
-{
-	struct addr_location al;
-
-	if (perf_event__preprocess_sample(event, machine, &al, sample) < 0) {
-		pr_warning("problem processing %d event, skipping it.\n",
-			   event->header.type);
-		return -1;
-	}
-
-	if (al.filtered)
-		return 0;
-
-	if (hists__add_entry(&evsel->hists, &al, sample->period, sample->weight)) {
-		pr_warning("problem incrementing symbol period, skipping event\n");
-		return -1;
-	}
-
-	evsel->hists.stats.total_period += sample->period;
-	return 0;
-}
-
-static struct perf_tool tool = {
-	.sample	= diff__process_sample_event,
-	.mmap	= perf_event__process_mmap,
-	.comm	= perf_event__process_comm,
-	.exit	= perf_event__process_exit,
-	.fork	= perf_event__process_fork,
-	.lost	= perf_event__process_lost,
-	.ordered_samples = true,
-	.ordering_requires_timestamps = true,
-};
-
-static struct perf_evsel *evsel_match(struct perf_evsel *evsel,
-				      struct perf_evlist *evlist)
-{
-	struct perf_evsel *e;
-
-	list_for_each_entry(e, &evlist->entries, node)
-		if (perf_evsel__match2(evsel, e))
-			return e;
-
-	return NULL;
-}
-
-static void perf_evlist__collapse_resort(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel;
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		struct hists *hists = &evsel->hists;
-
-		hists__collapse_resort(hists);
-	}
-}
-
-static struct hist_entry*
-get_pair_data(struct hist_entry *he, struct data__file *d)
-{
-	if (hist_entry__has_pairs(he)) {
-		struct hist_entry *pair;
-
-		list_for_each_entry(pair, &he->pairs.head, pairs.node)
-			if (pair->hists == d->hists)
-				return pair;
-	}
-
-	return NULL;
-}
-
-static struct hist_entry*
-get_pair_fmt(struct hist_entry *he, struct diff_hpp_fmt *dfmt)
-{
-	void *ptr = dfmt - dfmt->idx;
-	struct data__file *d = container_of(ptr, struct data__file, fmt);
-
-	return get_pair_data(he, d);
-}
-
-static void hists__baseline_only(struct hists *hists)
-{
-	struct rb_root *root;
-	struct rb_node *next;
-
-	if (sort__need_collapse)
-		root = &hists->entries_collapsed;
-	else
-		root = hists->entries_in;
-
-	next = rb_first(root);
-	while (next != NULL) {
-		struct hist_entry *he = rb_entry(next, struct hist_entry, rb_node_in);
-
-		next = rb_next(&he->rb_node_in);
-		if (!hist_entry__next_pair(he)) {
-			rb_erase(&he->rb_node_in, root);
-			hist_entry__free(he);
-		}
-	}
-}
-
-static void hists__precompute(struct hists *hists)
-{
-	struct rb_root *root;
-	struct rb_node *next;
-
-	if (sort__need_collapse)
-		root = &hists->entries_collapsed;
-	else
-		root = hists->entries_in;
-
-	next = rb_first(root);
-	while (next != NULL) {
-		struct hist_entry *he, *pair;
-
-		he   = rb_entry(next, struct hist_entry, rb_node_in);
-		next = rb_next(&he->rb_node_in);
-
-		pair = get_pair_data(he, &data__files[sort_compute]);
-		if (!pair)
-			continue;
-
-		switch (compute) {
-		case COMPUTE_DELTA:
-			compute_delta(he, pair);
-			break;
-		case COMPUTE_RATIO:
-			compute_ratio(he, pair);
-			break;
-		case COMPUTE_WEIGHTED_DIFF:
-			compute_wdiff(he, pair);
-			break;
-		default:
-			BUG_ON(1);
-		}
-	}
-}
-
-static int64_t cmp_doubles(double l, double r)
-{
-	if (l > r)
-		return -1;
-	else if (l < r)
-		return 1;
-	else
-		return 0;
-}
-
-static int64_t
-__hist_entry__cmp_compute(struct hist_entry *left, struct hist_entry *right,
-			int c)
-{
-	switch (c) {
-	case COMPUTE_DELTA:
-	{
-		double l = left->diff.period_ratio_delta;
-		double r = right->diff.period_ratio_delta;
-
-		return cmp_doubles(l, r);
-	}
-	case COMPUTE_RATIO:
-	{
-		double l = left->diff.period_ratio;
-		double r = right->diff.period_ratio;
-
-		return cmp_doubles(l, r);
-	}
-	case COMPUTE_WEIGHTED_DIFF:
-	{
-		s64 l = left->diff.wdiff;
-		s64 r = right->diff.wdiff;
-
-		return r - l;
-	}
-	default:
-		BUG_ON(1);
-	}
-
-	return 0;
-}
-
-static int64_t
-hist_entry__cmp_compute(struct hist_entry *left, struct hist_entry *right,
-			int c)
-{
-	bool pairs_left  = hist_entry__has_pairs(left);
-	bool pairs_right = hist_entry__has_pairs(right);
-	struct hist_entry *p_right, *p_left;
-
-	if (!pairs_left && !pairs_right)
-		return 0;
-
-	if (!pairs_left || !pairs_right)
-		return pairs_left ? -1 : 1;
-
-	p_left  = get_pair_data(left,  &data__files[sort_compute]);
-	p_right = get_pair_data(right, &data__files[sort_compute]);
-
-	if (!p_left && !p_right)
-		return 0;
-
-	if (!p_left || !p_right)
-		return p_left ? -1 : 1;
-
-	/*
-	 * We have 2 entries of same kind, let's
-	 * make the data comparison.
-	 */
-	return __hist_entry__cmp_compute(p_left, p_right, c);
-}
-
-static void insert_hist_entry_by_compute(struct rb_root *root,
-					 struct hist_entry *he,
-					 int c)
-{
-	struct rb_node **p = &root->rb_node;
-	struct rb_node *parent = NULL;
-	struct hist_entry *iter;
-
-	while (*p != NULL) {
-		parent = *p;
-		iter = rb_entry(parent, struct hist_entry, rb_node);
-		if (hist_entry__cmp_compute(he, iter, c) < 0)
-			p = &(*p)->rb_left;
-		else
-			p = &(*p)->rb_right;
-	}
-
-	rb_link_node(&he->rb_node, parent, p);
-	rb_insert_color(&he->rb_node, root);
-}
-
-static void hists__compute_resort(struct hists *hists)
-{
-	struct rb_root *root;
-	struct rb_node *next;
-
-	if (sort__need_collapse)
-		root = &hists->entries_collapsed;
-	else
-		root = hists->entries_in;
-
-	hists->entries = RB_ROOT;
-	next = rb_first(root);
-
-	hists->nr_entries = 0;
-	hists->stats.total_period = 0;
-	hists__reset_col_len(hists);
-
-	while (next != NULL) {
-		struct hist_entry *he;
-
-		he = rb_entry(next, struct hist_entry, rb_node_in);
-		next = rb_next(&he->rb_node_in);
-
-		insert_hist_entry_by_compute(&hists->entries, he, compute);
-		hists__inc_nr_entries(hists, he);
-	}
-}
-
-static void hists__process(struct hists *hists)
-{
-	if (show_baseline_only)
-		hists__baseline_only(hists);
-
-	if (sort_compute) {
-		hists__precompute(hists);
-		hists__compute_resort(hists);
-	} else {
-		hists__output_resort(hists);
-	}
-
-	hists__fprintf(hists, true, 0, 0, 0, stdout);
-}
-
-static void data__fprintf(void)
-{
-	struct data__file *d;
-	int i;
-
-	fprintf(stdout, "# Data files:\n");
-
-	data__for_each_file(i, d)
-		fprintf(stdout, "#  [%d] %s %s\n",
-			d->idx, d->file,
-			!d->idx ? "(Baseline)" : "");
-
-	fprintf(stdout, "#\n");
-}
-
-static void data_process(void)
-{
-	struct perf_evlist *evlist_base = data__files[0].session->evlist;
-	struct perf_evsel *evsel_base;
-	bool first = true;
-
-	list_for_each_entry(evsel_base, &evlist_base->entries, node) {
-		struct data__file *d;
-		int i;
-
-		data__for_each_file_new(i, d) {
-			struct perf_evlist *evlist = d->session->evlist;
-			struct perf_evsel *evsel;
-
-			evsel = evsel_match(evsel_base, evlist);
-			if (!evsel)
-				continue;
-
-			d->hists = &evsel->hists;
-
-			hists__match(&evsel_base->hists, &evsel->hists);
-
-			if (!show_baseline_only)
-				hists__link(&evsel_base->hists,
-					    &evsel->hists);
-		}
-
-		fprintf(stdout, "%s# Event '%s'\n#\n", first ? "" : "\n",
-			perf_evsel__name(evsel_base));
-
-		first = false;
-
-		if (verbose || data__files_cnt > 2)
-			data__fprintf();
-
-		hists__process(&evsel_base->hists);
-	}
-}
-
-static void data__free(struct data__file *d)
-{
-	int col;
-
-	for (col = 0; col < PERF_HPP_DIFF__MAX_INDEX; col++) {
-		struct diff_hpp_fmt *fmt = &d->fmt[col];
-
-		free(fmt->header);
-	}
-}
-
-static int __cmd_diff(void)
-{
-	struct data__file *d;
-	int ret = -EINVAL, i;
-
-	data__for_each_file(i, d) {
-		d->session = perf_session__new(d->file, O_RDONLY, force,
-					       false, &tool);
-		if (!d->session) {
-			pr_err("Failed to open %s\n", d->file);
-			ret = -ENOMEM;
-			goto out_delete;
-		}
-
-		ret = perf_session__process_events(d->session, &tool);
-		if (ret) {
-			pr_err("Failed to process %s\n", d->file);
-			goto out_delete;
-		}
-
-		perf_evlist__collapse_resort(d->session->evlist);
-	}
-
-	data_process();
-
- out_delete:
-	data__for_each_file(i, d) {
-		if (d->session)
-			perf_session__delete(d->session);
-
-		data__free(d);
-	}
-
-	free(data__files);
-	return ret;
-}
-
-static const char * const diff_usage[] = {
-	"perf diff [<options>] [old_file] [new_file]",
-	NULL,
-};
-
-static const struct option options[] = {
-	OPT_INCR('v', "verbose", &verbose,
-		    "be more verbose (show symbol address, etc)"),
-	OPT_BOOLEAN('b', "baseline-only", &show_baseline_only,
-		    "Show only items with match in baseline"),
-	OPT_CALLBACK('c', "compute", &compute,
-		     "delta,ratio,wdiff:w1,w2 (default delta)",
-		     "Entries differential computation selection",
-		     setup_compute),
-	OPT_BOOLEAN('p', "period", &show_period,
-		    "Show period values."),
-	OPT_BOOLEAN('F', "formula", &show_formula,
-		    "Show formula."),
-	OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
-		    "dump raw trace in ASCII"),
-	OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
-	OPT_BOOLEAN('m', "modules", &symbol_conf.use_modules,
-		    "load module symbols - WARNING: use only with -k and LIVE kernel"),
-	OPT_STRING('d', "dsos", &symbol_conf.dso_list_str, "dso[,dso...]",
-		   "only consider symbols in these dsos"),
-	OPT_STRING('C', "comms", &symbol_conf.comm_list_str, "comm[,comm...]",
-		   "only consider symbols in these comms"),
-	OPT_STRING('S', "symbols", &symbol_conf.sym_list_str, "symbol[,symbol...]",
-		   "only consider these symbols"),
-	OPT_STRING('s', "sort", &sort_order, "key[,key2...]",
-		   "sort by key(s): pid, comm, dso, symbol, parent"),
-	OPT_STRING('t', "field-separator", &symbol_conf.field_sep, "separator",
-		   "separator for columns, no spaces will be added between "
-		   "columns '.' is reserved."),
-	OPT_STRING(0, "symfs", &symbol_conf.symfs, "directory",
-		    "Look for files with symbols relative to this directory"),
-	OPT_UINTEGER('o', "order", &sort_compute, "Specify compute sorting."),
-	OPT_END()
-};
-
-static double baseline_percent(struct hist_entry *he)
-{
-	struct hists *hists = he->hists;
-	return 100.0 * he->stat.period / hists->stats.total_period;
-}
-
-static int hpp__color_baseline(struct perf_hpp_fmt *fmt,
-			       struct perf_hpp *hpp, struct hist_entry *he)
-{
-	struct diff_hpp_fmt *dfmt =
-		container_of(fmt, struct diff_hpp_fmt, fmt);
-	double percent = baseline_percent(he);
-	char pfmt[20] = " ";
-
-	if (!he->dummy) {
-		scnprintf(pfmt, 20, "%%%d.2f%%%%", dfmt->header_width - 1);
-		return percent_color_snprintf(hpp->buf, hpp->size,
-					      pfmt, percent);
-	} else
-		return scnprintf(hpp->buf, hpp->size, "%*s",
-				 dfmt->header_width, pfmt);
-}
-
-static int hpp__entry_baseline(struct hist_entry *he, char *buf, size_t size)
-{
-	double percent = baseline_percent(he);
-	const char *fmt = symbol_conf.field_sep ? "%.2f" : "%6.2f%%";
-	int ret = 0;
-
-	if (!he->dummy)
-		ret = scnprintf(buf, size, fmt, percent);
-
-	return ret;
-}
-
-static void
-hpp__entry_unpair(struct hist_entry *he, int idx, char *buf, size_t size)
-{
-	switch (idx) {
-	case PERF_HPP_DIFF__PERIOD_BASELINE:
-		scnprintf(buf, size, "%" PRIu64, he->stat.period);
-		break;
-
-	default:
-		break;
-	}
-}
-
-static void
-hpp__entry_pair(struct hist_entry *he, struct hist_entry *pair,
-		int idx, char *buf, size_t size)
-{
-	double diff;
-	double ratio;
-	s64 wdiff;
-
-	switch (idx) {
-	case PERF_HPP_DIFF__DELTA:
-		if (pair->diff.computed)
-			diff = pair->diff.period_ratio_delta;
-		else
-			diff = compute_delta(he, pair);
-
-		if (fabs(diff) >= 0.01)
-			scnprintf(buf, size, "%+4.2F%%", diff);
-		break;
-
-	case PERF_HPP_DIFF__RATIO:
-		/* No point for ratio number if we are dummy.. */
-		if (he->dummy)
-			break;
-
-		if (pair->diff.computed)
-			ratio = pair->diff.period_ratio;
-		else
-			ratio = compute_ratio(he, pair);
-
-		if (ratio > 0.0)
-			scnprintf(buf, size, "%14.6F", ratio);
-		break;
-
-	case PERF_HPP_DIFF__WEIGHTED_DIFF:
-		/* No point for wdiff number if we are dummy.. */
-		if (he->dummy)
-			break;
-
-		if (pair->diff.computed)
-			wdiff = pair->diff.wdiff;
-		else
-			wdiff = compute_wdiff(he, pair);
-
-		if (wdiff != 0)
-			scnprintf(buf, size, "%14ld", wdiff);
-		break;
-
-	case PERF_HPP_DIFF__FORMULA:
-		formula_fprintf(he, pair, buf, size);
-		break;
-
-	case PERF_HPP_DIFF__PERIOD:
-		scnprintf(buf, size, "%" PRIu64, pair->stat.period);
-		break;
-
-	default:
-		BUG_ON(1);
-	};
-}
-
-static void
-__hpp__entry_global(struct hist_entry *he, struct diff_hpp_fmt *dfmt,
-		    char *buf, size_t size)
-{
-	struct hist_entry *pair = get_pair_fmt(he, dfmt);
-	int idx = dfmt->idx;
-
-	/* baseline is special */
-	if (idx == PERF_HPP_DIFF__BASELINE)
-		hpp__entry_baseline(he, buf, size);
-	else {
-		if (pair)
-			hpp__entry_pair(he, pair, idx, buf, size);
-		else
-			hpp__entry_unpair(he, idx, buf, size);
-	}
-}
-
-static int hpp__entry_global(struct perf_hpp_fmt *_fmt, struct perf_hpp *hpp,
-			     struct hist_entry *he)
-{
-	struct diff_hpp_fmt *dfmt =
-		container_of(_fmt, struct diff_hpp_fmt, fmt);
-	char buf[MAX_COL_WIDTH] = " ";
-
-	__hpp__entry_global(he, dfmt, buf, MAX_COL_WIDTH);
-
-	if (symbol_conf.field_sep)
-		return scnprintf(hpp->buf, hpp->size, "%s", buf);
-	else
-		return scnprintf(hpp->buf, hpp->size, "%*s",
-				 dfmt->header_width, buf);
-}
-
-static int hpp__header(struct perf_hpp_fmt *fmt,
-		       struct perf_hpp *hpp)
-{
-	struct diff_hpp_fmt *dfmt =
-		container_of(fmt, struct diff_hpp_fmt, fmt);
-
-	BUG_ON(!dfmt->header);
-	return scnprintf(hpp->buf, hpp->size, dfmt->header);
-}
-
-static int hpp__width(struct perf_hpp_fmt *fmt,
-		      struct perf_hpp *hpp __maybe_unused)
-{
-	struct diff_hpp_fmt *dfmt =
-		container_of(fmt, struct diff_hpp_fmt, fmt);
-
-	BUG_ON(dfmt->header_width <= 0);
-	return dfmt->header_width;
-}
-
-static void init_header(struct data__file *d, struct diff_hpp_fmt *dfmt)
-{
-#define MAX_HEADER_NAME 100
-	char buf_indent[MAX_HEADER_NAME];
-	char buf[MAX_HEADER_NAME];
-	const char *header = NULL;
-	int width = 0;
-
-	BUG_ON(dfmt->idx >= PERF_HPP_DIFF__MAX_INDEX);
-	header = columns[dfmt->idx].name;
-	width  = columns[dfmt->idx].width;
-
-	/* Only our defined HPP fmts should appear here. */
-	BUG_ON(!header);
-
-	if (data__files_cnt > 2)
-		scnprintf(buf, MAX_HEADER_NAME, "%s/%d", header, d->idx);
-
-#define NAME (data__files_cnt > 2 ? buf : header)
-	dfmt->header_width = width;
-	width = (int) strlen(NAME);
-	if (dfmt->header_width < width)
-		dfmt->header_width = width;
-
-	scnprintf(buf_indent, MAX_HEADER_NAME, "%*s",
-		  dfmt->header_width, NAME);
-
-	dfmt->header = strdup(buf_indent);
-#undef MAX_HEADER_NAME
-#undef NAME
-}
-
-static void data__hpp_register(struct data__file *d, int idx)
-{
-	struct diff_hpp_fmt *dfmt = &d->fmt[idx];
-	struct perf_hpp_fmt *fmt = &dfmt->fmt;
-
-	dfmt->idx = idx;
-
-	fmt->header = hpp__header;
-	fmt->width  = hpp__width;
-	fmt->entry  = hpp__entry_global;
-
-	/* TODO more colors */
-	if (idx == PERF_HPP_DIFF__BASELINE)
-		fmt->color = hpp__color_baseline;
-
-	init_header(d, dfmt);
-	perf_hpp__column_register(fmt);
-}
-
-static void ui_init(void)
-{
-	struct data__file *d;
-	int i;
-
-	data__for_each_file(i, d) {
-
-		/*
-		 * Baseline or compute realted columns:
-		 *
-		 *   PERF_HPP_DIFF__BASELINE
-		 *   PERF_HPP_DIFF__DELTA
-		 *   PERF_HPP_DIFF__RATIO
-		 *   PERF_HPP_DIFF__WEIGHTED_DIFF
-		 */
-		data__hpp_register(d, i ? compute_2_hpp[compute] :
-					  PERF_HPP_DIFF__BASELINE);
-
-		/*
-		 * And the rest:
-		 *
-		 * PERF_HPP_DIFF__FORMULA
-		 * PERF_HPP_DIFF__PERIOD
-		 * PERF_HPP_DIFF__PERIOD_BASELINE
-		 */
-		if (show_formula && i)
-			data__hpp_register(d, PERF_HPP_DIFF__FORMULA);
-
-		if (show_period)
-			data__hpp_register(d, i ? PERF_HPP_DIFF__PERIOD :
-						  PERF_HPP_DIFF__PERIOD_BASELINE);
-	}
-}
-
-static int data_init(int argc, const char **argv)
-{
-	struct data__file *d;
-	static const char *defaults[] = {
-		"perf.data.old",
-		"perf.data",
-	};
-	bool use_default = true;
-	int i;
-
-	data__files_cnt = 2;
-
-	if (argc) {
-		if (argc == 1)
-			defaults[1] = argv[0];
-		else {
-			data__files_cnt = argc;
-			use_default = false;
-		}
-	} else if (symbol_conf.default_guest_vmlinux_name ||
-		   symbol_conf.default_guest_kallsyms) {
-		defaults[0] = "perf.data.host";
-		defaults[1] = "perf.data.guest";
-	}
-
-	if (sort_compute >= (unsigned int) data__files_cnt) {
-		pr_err("Order option out of limit.\n");
-		return -EINVAL;
-	}
-
-	data__files = zalloc(sizeof(*data__files) * data__files_cnt);
-	if (!data__files)
-		return -ENOMEM;
-
-	data__for_each_file(i, d) {
-		d->file = use_default ? defaults[i] : argv[i];
-		d->idx  = i;
-	}
-
-	return 0;
-}
-
-int cmd_diff(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	sort_order = diff__default_sort_order;
-	argc = parse_options(argc, argv, options, diff_usage, 0);
-
-	if (symbol__init() < 0)
-		return -1;
-
-	if (data_init(argc, argv) < 0)
-		return -1;
-
-	ui_init();
-
-	if (setup_sorting() < 0)
-		usage_with_options(diff_usage, options);
-
-	setup_pager();
-
-	sort__setup_elide(NULL);
-
-	return __cmd_diff();
-}
diff --git a/src/tools/perf/builtin-evlist.c b/src/tools/perf/builtin-evlist.c
deleted file mode 100644
index 05bd9df..0000000
--- a/src/tools/perf/builtin-evlist.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Builtin evlist command: Show the list of event selectors present
- * in a perf.data file.
- */
-#include "builtin.h"
-
-#include "util/util.h"
-
-#include <linux/list.h>
-
-#include "perf.h"
-#include "util/evlist.h"
-#include "util/evsel.h"
-#include "util/parse-events.h"
-#include "util/parse-options.h"
-#include "util/session.h"
-
-static int __cmd_evlist(const char *file_name, struct perf_attr_details *details)
-{
-	struct perf_session *session;
-	struct perf_evsel *pos;
-
-	session = perf_session__new(file_name, O_RDONLY, 0, false, NULL);
-	if (session == NULL)
-		return -ENOMEM;
-
-	list_for_each_entry(pos, &session->evlist->entries, node)
-		perf_evsel__fprintf(pos, details, stdout);
-
-	perf_session__delete(session);
-	return 0;
-}
-
-int cmd_evlist(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	struct perf_attr_details details = { .verbose = false, };
-	const struct option options[] = {
-	OPT_STRING('i', "input", &input_name, "file", "Input file name"),
-	OPT_BOOLEAN('F', "freq", &details.freq, "Show the sample frequency"),
-	OPT_BOOLEAN('v', "verbose", &details.verbose,
-		    "Show all event attr details"),
-	OPT_BOOLEAN('g', "group", &details.event_group,
-		    "Show event group information"),
-	OPT_END()
-	};
-	const char * const evlist_usage[] = {
-		"perf evlist [<options>]",
-		NULL
-	};
-
-	argc = parse_options(argc, argv, options, evlist_usage, 0);
-	if (argc)
-		usage_with_options(evlist_usage, options);
-
-	if (details.event_group && (details.verbose || details.freq)) {
-		pr_err("--group option is not compatible with other options\n");
-		usage_with_options(evlist_usage, options);
-	}
-
-	return __cmd_evlist(input_name, &details);
-}
diff --git a/src/tools/perf/builtin-help.c b/src/tools/perf/builtin-help.c
deleted file mode 100644
index 178b88a..0000000
--- a/src/tools/perf/builtin-help.c
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
- * builtin-help.c
- *
- * Builtin help command
- */
-#include "perf.h"
-#include "util/cache.h"
-#include "builtin.h"
-#include "util/exec_cmd.h"
-#include "common-cmds.h"
-#include "util/parse-options.h"
-#include "util/run-command.h"
-#include "util/help.h"
-
-static struct man_viewer_list {
-	struct man_viewer_list *next;
-	char name[FLEX_ARRAY];
-} *man_viewer_list;
-
-static struct man_viewer_info_list {
-	struct man_viewer_info_list *next;
-	const char *info;
-	char name[FLEX_ARRAY];
-} *man_viewer_info_list;
-
-enum help_format {
-	HELP_FORMAT_NONE,
-	HELP_FORMAT_MAN,
-	HELP_FORMAT_INFO,
-	HELP_FORMAT_WEB,
-};
-
-static enum help_format parse_help_format(const char *format)
-{
-	if (!strcmp(format, "man"))
-		return HELP_FORMAT_MAN;
-	if (!strcmp(format, "info"))
-		return HELP_FORMAT_INFO;
-	if (!strcmp(format, "web") || !strcmp(format, "html"))
-		return HELP_FORMAT_WEB;
-
-	pr_err("unrecognized help format '%s'", format);
-	return HELP_FORMAT_NONE;
-}
-
-static const char *get_man_viewer_info(const char *name)
-{
-	struct man_viewer_info_list *viewer;
-
-	for (viewer = man_viewer_info_list; viewer; viewer = viewer->next) {
-		if (!strcasecmp(name, viewer->name))
-			return viewer->info;
-	}
-	return NULL;
-}
-
-static int check_emacsclient_version(void)
-{
-	struct strbuf buffer = STRBUF_INIT;
-	struct child_process ec_process;
-	const char *argv_ec[] = { "emacsclient", "--version", NULL };
-	int version;
-
-	/* emacsclient prints its version number on stderr */
-	memset(&ec_process, 0, sizeof(ec_process));
-	ec_process.argv = argv_ec;
-	ec_process.err = -1;
-	ec_process.stdout_to_stderr = 1;
-	if (start_command(&ec_process)) {
-		fprintf(stderr, "Failed to start emacsclient.\n");
-		return -1;
-	}
-	strbuf_read(&buffer, ec_process.err, 20);
-	close(ec_process.err);
-
-	/*
-	 * Don't bother checking return value, because "emacsclient --version"
-	 * seems to always exits with code 1.
-	 */
-	finish_command(&ec_process);
-
-	if (prefixcmp(buffer.buf, "emacsclient")) {
-		fprintf(stderr, "Failed to parse emacsclient version.\n");
-		strbuf_release(&buffer);
-		return -1;
-	}
-
-	strbuf_remove(&buffer, 0, strlen("emacsclient"));
-	version = atoi(buffer.buf);
-
-	if (version < 22) {
-		fprintf(stderr,
-			"emacsclient version '%d' too old (< 22).\n",
-			version);
-		strbuf_release(&buffer);
-		return -1;
-	}
-
-	strbuf_release(&buffer);
-	return 0;
-}
-
-static void exec_woman_emacs(const char *path, const char *page)
-{
-	if (!check_emacsclient_version()) {
-		/* This works only with emacsclient version >= 22. */
-		struct strbuf man_page = STRBUF_INIT;
-
-		if (!path)
-			path = "emacsclient";
-		strbuf_addf(&man_page, "(woman \"%s\")", page);
-		execlp(path, "emacsclient", "-e", man_page.buf, NULL);
-		warning("failed to exec '%s': %s", path, strerror(errno));
-	}
-}
-
-static void exec_man_konqueror(const char *path, const char *page)
-{
-	const char *display = getenv("DISPLAY");
-	if (display && *display) {
-		struct strbuf man_page = STRBUF_INIT;
-		const char *filename = "kfmclient";
-
-		/* It's simpler to launch konqueror using kfmclient. */
-		if (path) {
-			const char *file = strrchr(path, '/');
-			if (file && !strcmp(file + 1, "konqueror")) {
-				char *new = strdup(path);
-				char *dest = strrchr(new, '/');
-
-				/* strlen("konqueror") == strlen("kfmclient") */
-				strcpy(dest + 1, "kfmclient");
-				path = new;
-			}
-			if (file)
-				filename = file;
-		} else
-			path = "kfmclient";
-		strbuf_addf(&man_page, "man:%s(1)", page);
-		execlp(path, filename, "newTab", man_page.buf, NULL);
-		warning("failed to exec '%s': %s", path, strerror(errno));
-	}
-}
-
-static void exec_man_man(const char *path, const char *page)
-{
-	if (!path)
-		path = "man";
-	execlp(path, "man", page, NULL);
-	warning("failed to exec '%s': %s", path, strerror(errno));
-}
-
-static void exec_man_cmd(const char *cmd, const char *page)
-{
-	struct strbuf shell_cmd = STRBUF_INIT;
-	strbuf_addf(&shell_cmd, "%s %s", cmd, page);
-	execl("/bin/sh", "sh", "-c", shell_cmd.buf, NULL);
-	warning("failed to exec '%s': %s", cmd, strerror(errno));
-}
-
-static void add_man_viewer(const char *name)
-{
-	struct man_viewer_list **p = &man_viewer_list;
-	size_t len = strlen(name);
-
-	while (*p)
-		p = &((*p)->next);
-	*p = zalloc(sizeof(**p) + len + 1);
-	strncpy((*p)->name, name, len);
-}
-
-static int supported_man_viewer(const char *name, size_t len)
-{
-	return (!strncasecmp("man", name, len) ||
-		!strncasecmp("woman", name, len) ||
-		!strncasecmp("konqueror", name, len));
-}
-
-static void do_add_man_viewer_info(const char *name,
-				   size_t len,
-				   const char *value)
-{
-	struct man_viewer_info_list *new = zalloc(sizeof(*new) + len + 1);
-
-	strncpy(new->name, name, len);
-	new->info = strdup(value);
-	new->next = man_viewer_info_list;
-	man_viewer_info_list = new;
-}
-
-static int add_man_viewer_path(const char *name,
-			       size_t len,
-			       const char *value)
-{
-	if (supported_man_viewer(name, len))
-		do_add_man_viewer_info(name, len, value);
-	else
-		warning("'%s': path for unsupported man viewer.\n"
-			"Please consider using 'man.<tool>.cmd' instead.",
-			name);
-
-	return 0;
-}
-
-static int add_man_viewer_cmd(const char *name,
-			      size_t len,
-			      const char *value)
-{
-	if (supported_man_viewer(name, len))
-		warning("'%s': cmd for supported man viewer.\n"
-			"Please consider using 'man.<tool>.path' instead.",
-			name);
-	else
-		do_add_man_viewer_info(name, len, value);
-
-	return 0;
-}
-
-static int add_man_viewer_info(const char *var, const char *value)
-{
-	const char *name = var + 4;
-	const char *subkey = strrchr(name, '.');
-
-	if (!subkey)
-		return error("Config with no key for man viewer: %s", name);
-
-	if (!strcmp(subkey, ".path")) {
-		if (!value)
-			return config_error_nonbool(var);
-		return add_man_viewer_path(name, subkey - name, value);
-	}
-	if (!strcmp(subkey, ".cmd")) {
-		if (!value)
-			return config_error_nonbool(var);
-		return add_man_viewer_cmd(name, subkey - name, value);
-	}
-
-	warning("'%s': unsupported man viewer sub key.", subkey);
-	return 0;
-}
-
-static int perf_help_config(const char *var, const char *value, void *cb)
-{
-	enum help_format *help_formatp = cb;
-
-	if (!strcmp(var, "help.format")) {
-		if (!value)
-			return config_error_nonbool(var);
-		*help_formatp = parse_help_format(value);
-		if (*help_formatp == HELP_FORMAT_NONE)
-			return -1;
-		return 0;
-	}
-	if (!strcmp(var, "man.viewer")) {
-		if (!value)
-			return config_error_nonbool(var);
-		add_man_viewer(value);
-		return 0;
-	}
-	if (!prefixcmp(var, "man."))
-		return add_man_viewer_info(var, value);
-
-	return perf_default_config(var, value, cb);
-}
-
-static struct cmdnames main_cmds, other_cmds;
-
-void list_common_cmds_help(void)
-{
-	unsigned int i, longest = 0;
-
-	for (i = 0; i < ARRAY_SIZE(common_cmds); i++) {
-		if (longest < strlen(common_cmds[i].name))
-			longest = strlen(common_cmds[i].name);
-	}
-
-	puts(" The most commonly used perf commands are:");
-	for (i = 0; i < ARRAY_SIZE(common_cmds); i++) {
-		printf("   %-*s   ", longest, common_cmds[i].name);
-		puts(common_cmds[i].help);
-	}
-}
-
-static int is_perf_command(const char *s)
-{
-	return is_in_cmdlist(&main_cmds, s) ||
-		is_in_cmdlist(&other_cmds, s);
-}
-
-static const char *prepend(const char *prefix, const char *cmd)
-{
-	size_t pre_len = strlen(prefix);
-	size_t cmd_len = strlen(cmd);
-	char *p = malloc(pre_len + cmd_len + 1);
-	memcpy(p, prefix, pre_len);
-	strcpy(p + pre_len, cmd);
-	return p;
-}
-
-static const char *cmd_to_page(const char *perf_cmd)
-{
-	if (!perf_cmd)
-		return "perf";
-	else if (!prefixcmp(perf_cmd, "perf"))
-		return perf_cmd;
-	else
-		return prepend("perf-", perf_cmd);
-}
-
-static void setup_man_path(void)
-{
-	struct strbuf new_path = STRBUF_INIT;
-	const char *old_path = getenv("MANPATH");
-
-	/* We should always put ':' after our path. If there is no
-	 * old_path, the ':' at the end will let 'man' to try
-	 * system-wide paths after ours to find the manual page. If
-	 * there is old_path, we need ':' as delimiter. */
-	strbuf_addstr(&new_path, system_path(PERF_MAN_PATH));
-	strbuf_addch(&new_path, ':');
-	if (old_path)
-		strbuf_addstr(&new_path, old_path);
-
-	setenv("MANPATH", new_path.buf, 1);
-
-	strbuf_release(&new_path);
-}
-
-static void exec_viewer(const char *name, const char *page)
-{
-	const char *info = get_man_viewer_info(name);
-
-	if (!strcasecmp(name, "man"))
-		exec_man_man(info, page);
-	else if (!strcasecmp(name, "woman"))
-		exec_woman_emacs(info, page);
-	else if (!strcasecmp(name, "konqueror"))
-		exec_man_konqueror(info, page);
-	else if (info)
-		exec_man_cmd(info, page);
-	else
-		warning("'%s': unknown man viewer.", name);
-}
-
-static int show_man_page(const char *perf_cmd)
-{
-	struct man_viewer_list *viewer;
-	const char *page = cmd_to_page(perf_cmd);
-	const char *fallback = getenv("PERF_MAN_VIEWER");
-
-	setup_man_path();
-	for (viewer = man_viewer_list; viewer; viewer = viewer->next)
-		exec_viewer(viewer->name, page); /* will return when unable */
-
-	if (fallback)
-		exec_viewer(fallback, page);
-	exec_viewer("man", page);
-
-	pr_err("no man viewer handled the request");
-	return -1;
-}
-
-static int show_info_page(const char *perf_cmd)
-{
-	const char *page = cmd_to_page(perf_cmd);
-	setenv("INFOPATH", system_path(PERF_INFO_PATH), 1);
-	execlp("info", "info", "perfman", page, NULL);
-	return -1;
-}
-
-static int get_html_page_path(struct strbuf *page_path, const char *page)
-{
-	struct stat st;
-	const char *html_path = system_path(PERF_HTML_PATH);
-
-	/* Check that we have a perf documentation directory. */
-	if (stat(mkpath("%s/perf.html", html_path), &st)
-	    || !S_ISREG(st.st_mode)) {
-		pr_err("'%s': not a documentation directory.", html_path);
-		return -1;
-	}
-
-	strbuf_init(page_path, 0);
-	strbuf_addf(page_path, "%s/%s.html", html_path, page);
-
-	return 0;
-}
-
-/*
- * If open_html is not defined in a platform-specific way (see for
- * example compat/mingw.h), we use the script web--browse to display
- * HTML.
- */
-#ifndef open_html
-static void open_html(const char *path)
-{
-	execl_perf_cmd("web--browse", "-c", "help.browser", path, NULL);
-}
-#endif
-
-static int show_html_page(const char *perf_cmd)
-{
-	const char *page = cmd_to_page(perf_cmd);
-	struct strbuf page_path; /* it leaks but we exec bellow */
-
-	if (get_html_page_path(&page_path, page) != 0)
-		return -1;
-
-	open_html(page_path.buf);
-
-	return 0;
-}
-
-int cmd_help(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	bool show_all = false;
-	enum help_format help_format = HELP_FORMAT_MAN;
-	struct option builtin_help_options[] = {
-	OPT_BOOLEAN('a', "all", &show_all, "print all available commands"),
-	OPT_SET_UINT('m', "man", &help_format, "show man page", HELP_FORMAT_MAN),
-	OPT_SET_UINT('w', "web", &help_format, "show manual in web browser",
-			HELP_FORMAT_WEB),
-	OPT_SET_UINT('i', "info", &help_format, "show info page",
-			HELP_FORMAT_INFO),
-	OPT_END(),
-	};
-	const char * const builtin_help_usage[] = {
-		"perf help [--all] [--man|--web|--info] [command]",
-		NULL
-	};
-	const char *alias;
-	int rc = 0;
-
-	load_command_list("perf-", &main_cmds, &other_cmds);
-
-	perf_config(perf_help_config, &help_format);
-
-	argc = parse_options(argc, argv, builtin_help_options,
-			builtin_help_usage, 0);
-
-	if (show_all) {
-		printf("\n usage: %s\n\n", perf_usage_string);
-		list_commands("perf commands", &main_cmds, &other_cmds);
-		printf(" %s\n\n", perf_more_info_string);
-		return 0;
-	}
-
-	if (!argv[0]) {
-		printf("\n usage: %s\n\n", perf_usage_string);
-		list_common_cmds_help();
-		printf("\n %s\n\n", perf_more_info_string);
-		return 0;
-	}
-
-	alias = alias_lookup(argv[0]);
-	if (alias && !is_perf_command(argv[0])) {
-		printf("`perf %s' is aliased to `%s'\n", argv[0], alias);
-		return 0;
-	}
-
-	switch (help_format) {
-	case HELP_FORMAT_MAN:
-		rc = show_man_page(argv[0]);
-		break;
-	case HELP_FORMAT_INFO:
-		rc = show_info_page(argv[0]);
-		break;
-	case HELP_FORMAT_WEB:
-		rc = show_html_page(argv[0]);
-		break;
-	case HELP_FORMAT_NONE:
-		/* fall-through */
-	default:
-		rc = -1;
-		break;
-	}
-
-	return rc;
-}
diff --git a/src/tools/perf/builtin-inject.c b/src/tools/perf/builtin-inject.c
deleted file mode 100644
index afe377b..0000000
--- a/src/tools/perf/builtin-inject.c
+++ /dev/null
@@ -1,465 +0,0 @@
-/*
- * builtin-inject.c
- *
- * Builtin inject command: Examine the live mode (stdin) event stream
- * and repipe it to stdout while optionally injecting additional
- * events into it.
- */
-#include "builtin.h"
-
-#include "perf.h"
-#include "util/color.h"
-#include "util/evlist.h"
-#include "util/evsel.h"
-#include "util/session.h"
-#include "util/tool.h"
-#include "util/debug.h"
-#include "util/build-id.h"
-
-#include "util/parse-options.h"
-
-#include <linux/list.h>
-
-struct perf_inject {
-	struct perf_tool tool;
-	bool		 build_ids;
-	bool		 sched_stat;
-	const char	 *input_name;
-	int		 pipe_output,
-			 output;
-	u64		 bytes_written;
-	struct list_head samples;
-};
-
-struct event_entry {
-	struct list_head node;
-	u32		 tid;
-	union perf_event event[0];
-};
-
-static int perf_event__repipe_synth(struct perf_tool *tool,
-				    union perf_event *event)
-{
-	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
-	uint32_t size;
-	void *buf = event;
-
-	size = event->header.size;
-
-	while (size) {
-		int ret = write(inject->output, buf, size);
-		if (ret < 0)
-			return -errno;
-
-		size -= ret;
-		buf += ret;
-		inject->bytes_written += ret;
-	}
-
-	return 0;
-}
-
-static int perf_event__repipe_op2_synth(struct perf_tool *tool,
-					union perf_event *event,
-					struct perf_session *session
-					__maybe_unused)
-{
-	return perf_event__repipe_synth(tool, event);
-}
-
-static int perf_event__repipe_attr(struct perf_tool *tool,
-				   union perf_event *event,
-				   struct perf_evlist **pevlist)
-{
-	int ret;
-
-	ret = perf_event__process_attr(tool, event, pevlist);
-	if (ret)
-		return ret;
-
-	return perf_event__repipe_synth(tool, event);
-}
-
-static int perf_event__repipe(struct perf_tool *tool,
-			      union perf_event *event,
-			      struct perf_sample *sample __maybe_unused,
-			      struct machine *machine __maybe_unused)
-{
-	return perf_event__repipe_synth(tool, event);
-}
-
-typedef int (*inject_handler)(struct perf_tool *tool,
-			      union perf_event *event,
-			      struct perf_sample *sample,
-			      struct perf_evsel *evsel,
-			      struct machine *machine);
-
-static int perf_event__repipe_sample(struct perf_tool *tool,
-				     union perf_event *event,
-				     struct perf_sample *sample,
-				     struct perf_evsel *evsel,
-				     struct machine *machine)
-{
-	if (evsel->handler.func) {
-		inject_handler f = evsel->handler.func;
-		return f(tool, event, sample, evsel, machine);
-	}
-
-	build_id__mark_dso_hit(tool, event, sample, evsel, machine);
-
-	return perf_event__repipe_synth(tool, event);
-}
-
-static int perf_event__repipe_mmap(struct perf_tool *tool,
-				   union perf_event *event,
-				   struct perf_sample *sample,
-				   struct machine *machine)
-{
-	int err;
-
-	err = perf_event__process_mmap(tool, event, sample, machine);
-	perf_event__repipe(tool, event, sample, machine);
-
-	return err;
-}
-
-static int perf_event__repipe_mmap2(struct perf_tool *tool,
-				   union perf_event *event,
-				   struct perf_sample *sample,
-				   struct machine *machine)
-{
-	int err;
-
-	err = perf_event__process_mmap2(tool, event, sample, machine);
-	perf_event__repipe(tool, event, sample, machine);
-
-	return err;
-}
-
-static int perf_event__repipe_fork(struct perf_tool *tool,
-				   union perf_event *event,
-				   struct perf_sample *sample,
-				   struct machine *machine)
-{
-	int err;
-
-	err = perf_event__process_fork(tool, event, sample, machine);
-	perf_event__repipe(tool, event, sample, machine);
-
-	return err;
-}
-
-static int perf_event__repipe_tracing_data(struct perf_tool *tool,
-					   union perf_event *event,
-					   struct perf_session *session)
-{
-	int err;
-
-	perf_event__repipe_synth(tool, event);
-	err = perf_event__process_tracing_data(tool, event, session);
-
-	return err;
-}
-
-static int dso__read_build_id(struct dso *self)
-{
-	if (self->has_build_id)
-		return 0;
-
-	if (filename__read_build_id(self->long_name, self->build_id,
-				    sizeof(self->build_id)) > 0) {
-		self->has_build_id = true;
-		return 0;
-	}
-
-	return -1;
-}
-
-static int dso__inject_build_id(struct dso *self, struct perf_tool *tool,
-				struct machine *machine)
-{
-	u16 misc = PERF_RECORD_MISC_USER;
-	int err;
-
-	if (dso__read_build_id(self) < 0) {
-		pr_debug("no build_id found for %s\n", self->long_name);
-		return -1;
-	}
-
-	if (self->kernel)
-		misc = PERF_RECORD_MISC_KERNEL;
-
-	err = perf_event__synthesize_build_id(tool, self, misc, perf_event__repipe,
-					      machine);
-	if (err) {
-		pr_err("Can't synthesize build_id event for %s\n", self->long_name);
-		return -1;
-	}
-
-	return 0;
-}
-
-static int perf_event__inject_buildid(struct perf_tool *tool,
-				      union perf_event *event,
-				      struct perf_sample *sample,
-				      struct perf_evsel *evsel __maybe_unused,
-				      struct machine *machine)
-{
-	struct addr_location al;
-	struct thread *thread;
-	u8 cpumode;
-
-	cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
-
-	thread = machine__findnew_thread(machine, sample->pid, sample->pid);
-	if (thread == NULL) {
-		pr_err("problem processing %d event, skipping it.\n",
-		       event->header.type);
-		goto repipe;
-	}
-
-	thread__find_addr_map(thread, machine, cpumode, MAP__FUNCTION,
-			      sample->ip, &al);
-
-	if (al.map != NULL) {
-		if (!al.map->dso->hit) {
-			al.map->dso->hit = 1;
-			if (map__load(al.map, NULL) >= 0) {
-				dso__inject_build_id(al.map->dso, tool, machine);
-				/*
-				 * If this fails, too bad, let the other side
-				 * account this as unresolved.
-				 */
-			} else {
-#ifdef LIBELF_SUPPORT
-				pr_warning("no symbols found in %s, maybe "
-					   "install a debug package?\n",
-					   al.map->dso->long_name);
-#endif
-			}
-		}
-	}
-
-repipe:
-	perf_event__repipe(tool, event, sample, machine);
-	return 0;
-}
-
-static int perf_inject__sched_process_exit(struct perf_tool *tool,
-					   union perf_event *event __maybe_unused,
-					   struct perf_sample *sample,
-					   struct perf_evsel *evsel __maybe_unused,
-					   struct machine *machine __maybe_unused)
-{
-	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
-	struct event_entry *ent;
-
-	list_for_each_entry(ent, &inject->samples, node) {
-		if (sample->tid == ent->tid) {
-			list_del_init(&ent->node);
-			free(ent);
-			break;
-		}
-	}
-
-	return 0;
-}
-
-static int perf_inject__sched_switch(struct perf_tool *tool,
-				     union perf_event *event,
-				     struct perf_sample *sample,
-				     struct perf_evsel *evsel,
-				     struct machine *machine)
-{
-	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
-	struct event_entry *ent;
-
-	perf_inject__sched_process_exit(tool, event, sample, evsel, machine);
-
-	ent = malloc(event->header.size + sizeof(struct event_entry));
-	if (ent == NULL) {
-		color_fprintf(stderr, PERF_COLOR_RED,
-			     "Not enough memory to process sched switch event!");
-		return -1;
-	}
-
-	ent->tid = sample->tid;
-	memcpy(&ent->event, event, event->header.size);
-	list_add(&ent->node, &inject->samples);
-	return 0;
-}
-
-static int perf_inject__sched_stat(struct perf_tool *tool,
-				   union perf_event *event __maybe_unused,
-				   struct perf_sample *sample,
-				   struct perf_evsel *evsel,
-				   struct machine *machine)
-{
-	struct event_entry *ent;
-	union perf_event *event_sw;
-	struct perf_sample sample_sw;
-	struct perf_inject *inject = container_of(tool, struct perf_inject, tool);
-	u32 pid = perf_evsel__intval(evsel, sample, "pid");
-
-	list_for_each_entry(ent, &inject->samples, node) {
-		if (pid == ent->tid)
-			goto found;
-	}
-
-	return 0;
-found:
-	event_sw = &ent->event[0];
-	perf_evsel__parse_sample(evsel, event_sw, &sample_sw);
-
-	sample_sw.period = sample->period;
-	sample_sw.time	 = sample->time;
-	perf_event__synthesize_sample(event_sw, evsel->attr.sample_type,
-				      evsel->attr.sample_regs_user,
-				      evsel->attr.read_format, &sample_sw,
-				      false);
-	build_id__mark_dso_hit(tool, event_sw, &sample_sw, evsel, machine);
-	return perf_event__repipe(tool, event_sw, &sample_sw, machine);
-}
-
-static void sig_handler(int sig __maybe_unused)
-{
-	session_done = 1;
-}
-
-static int perf_evsel__check_stype(struct perf_evsel *evsel,
-				   u64 sample_type, const char *sample_msg)
-{
-	struct perf_event_attr *attr = &evsel->attr;
-	const char *name = perf_evsel__name(evsel);
-
-	if (!(attr->sample_type & sample_type)) {
-		pr_err("Samples for %s event do not have %s attribute set.",
-			name, sample_msg);
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static int __cmd_inject(struct perf_inject *inject)
-{
-	struct perf_session *session;
-	int ret = -EINVAL;
-
-	signal(SIGINT, sig_handler);
-
-	if (inject->build_ids || inject->sched_stat) {
-		inject->tool.mmap	  = perf_event__repipe_mmap;
-		inject->tool.mmap2	  = perf_event__repipe_mmap2;
-		inject->tool.fork	  = perf_event__repipe_fork;
-		inject->tool.tracing_data = perf_event__repipe_tracing_data;
-	}
-
-	session = perf_session__new(inject->input_name, O_RDONLY, false, true, &inject->tool);
-	if (session == NULL)
-		return -ENOMEM;
-
-	if (inject->build_ids) {
-		inject->tool.sample = perf_event__inject_buildid;
-	} else if (inject->sched_stat) {
-		struct perf_evsel *evsel;
-
-		inject->tool.ordered_samples = true;
-
-		list_for_each_entry(evsel, &session->evlist->entries, node) {
-			const char *name = perf_evsel__name(evsel);
-
-			if (!strcmp(name, "sched:sched_switch")) {
-				if (perf_evsel__check_stype(evsel, PERF_SAMPLE_TID, "TID"))
-					return -EINVAL;
-
-				evsel->handler.func = perf_inject__sched_switch;
-			} else if (!strcmp(name, "sched:sched_process_exit"))
-				evsel->handler.func = perf_inject__sched_process_exit;
-			else if (!strncmp(name, "sched:sched_stat_", 17))
-				evsel->handler.func = perf_inject__sched_stat;
-		}
-	}
-
-	if (!inject->pipe_output)
-		lseek(inject->output, session->header.data_offset, SEEK_SET);
-
-	ret = perf_session__process_events(session, &inject->tool);
-
-	if (!inject->pipe_output) {
-		session->header.data_size = inject->bytes_written;
-		perf_session__write_header(session, session->evlist, inject->output, true);
-	}
-
-	perf_session__delete(session);
-
-	return ret;
-}
-
-int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	struct perf_inject inject = {
-		.tool = {
-			.sample		= perf_event__repipe_sample,
-			.mmap		= perf_event__repipe,
-			.mmap2		= perf_event__repipe,
-			.comm		= perf_event__repipe,
-			.fork		= perf_event__repipe,
-			.exit		= perf_event__repipe,
-			.lost		= perf_event__repipe,
-			.read		= perf_event__repipe_sample,
-			.throttle	= perf_event__repipe,
-			.unthrottle	= perf_event__repipe,
-			.attr		= perf_event__repipe_attr,
-			.tracing_data	= perf_event__repipe_op2_synth,
-			.finished_round	= perf_event__repipe_op2_synth,
-			.build_id	= perf_event__repipe_op2_synth,
-		},
-		.input_name  = "-",
-		.samples = LIST_HEAD_INIT(inject.samples),
-	};
-	const char *output_name = "-";
-	const struct option options[] = {
-		OPT_BOOLEAN('b', "build-ids", &inject.build_ids,
-			    "Inject build-ids into the output stream"),
-		OPT_STRING('i', "input", &inject.input_name, "file",
-			   "input file name"),
-		OPT_STRING('o', "output", &output_name, "file",
-			   "output file name"),
-		OPT_BOOLEAN('s', "sched-stat", &inject.sched_stat,
-			    "Merge sched-stat and sched-switch for getting events "
-			    "where and how long tasks slept"),
-		OPT_INCR('v', "verbose", &verbose,
-			 "be more verbose (show build ids, etc)"),
-		OPT_END()
-	};
-	const char * const inject_usage[] = {
-		"perf inject [<options>]",
-		NULL
-	};
-
-	argc = parse_options(argc, argv, options, inject_usage, 0);
-
-	/*
-	 * Any (unrecognized) arguments left?
-	 */
-	if (argc)
-		usage_with_options(inject_usage, options);
-
-	if (!strcmp(output_name, "-")) {
-		inject.pipe_output = 1;
-		inject.output = STDOUT_FILENO;
-	} else {
-		inject.output = open(output_name, O_CREAT | O_WRONLY | O_TRUNC,
-						  S_IRUSR | S_IWUSR);
-		if (inject.output < 0) {
-			perror("failed to create output file");
-			return -1;
-		}
-	}
-
-	if (symbol__init() < 0)
-		return -1;
-
-	return __cmd_inject(&inject);
-}
diff --git a/src/tools/perf/builtin-kmem.c b/src/tools/perf/builtin-kmem.c
deleted file mode 100644
index 9b5f077..0000000
--- a/src/tools/perf/builtin-kmem.c
+++ /dev/null
@@ -1,782 +0,0 @@
-#include "builtin.h"
-#include "perf.h"
-
-#include "util/evlist.h"
-#include "util/evsel.h"
-#include "util/util.h"
-#include "util/cache.h"
-#include "util/symbol.h"
-#include "util/thread.h"
-#include "util/header.h"
-#include "util/session.h"
-#include "util/tool.h"
-
-#include "util/parse-options.h"
-#include "util/trace-event.h"
-
-#include "util/debug.h"
-
-#include <linux/rbtree.h>
-#include <linux/string.h>
-
-struct alloc_stat;
-typedef int (*sort_fn_t)(struct alloc_stat *, struct alloc_stat *);
-
-static int			alloc_flag;
-static int			caller_flag;
-
-static int			alloc_lines = -1;
-static int			caller_lines = -1;
-
-static bool			raw_ip;
-
-static int			*cpunode_map;
-static int			max_cpu_num;
-
-struct alloc_stat {
-	u64	call_site;
-	u64	ptr;
-	u64	bytes_req;
-	u64	bytes_alloc;
-	u32	hit;
-	u32	pingpong;
-
-	short	alloc_cpu;
-
-	struct rb_node node;
-};
-
-static struct rb_root root_alloc_stat;
-static struct rb_root root_alloc_sorted;
-static struct rb_root root_caller_stat;
-static struct rb_root root_caller_sorted;
-
-static unsigned long total_requested, total_allocated;
-static unsigned long nr_allocs, nr_cross_allocs;
-
-#define PATH_SYS_NODE	"/sys/devices/system/node"
-
-static int init_cpunode_map(void)
-{
-	FILE *fp;
-	int i, err = -1;
-
-	fp = fopen("/sys/devices/system/cpu/kernel_max", "r");
-	if (!fp) {
-		max_cpu_num = 4096;
-		return 0;
-	}
-
-	if (fscanf(fp, "%d", &max_cpu_num) < 1) {
-		pr_err("Failed to read 'kernel_max' from sysfs");
-		goto out_close;
-	}
-
-	max_cpu_num++;
-
-	cpunode_map = calloc(max_cpu_num, sizeof(int));
-	if (!cpunode_map) {
-		pr_err("%s: calloc failed\n", __func__);
-		goto out_close;
-	}
-
-	for (i = 0; i < max_cpu_num; i++)
-		cpunode_map[i] = -1;
-
-	err = 0;
-out_close:
-	fclose(fp);
-	return err;
-}
-
-static int setup_cpunode_map(void)
-{
-	struct dirent *dent1, *dent2;
-	DIR *dir1, *dir2;
-	unsigned int cpu, mem;
-	char buf[PATH_MAX];
-
-	if (init_cpunode_map())
-		return -1;
-
-	dir1 = opendir(PATH_SYS_NODE);
-	if (!dir1)
-		return 0;
-
-	while ((dent1 = readdir(dir1)) != NULL) {
-		if (dent1->d_type != DT_DIR ||
-		    sscanf(dent1->d_name, "node%u", &mem) < 1)
-			continue;
-
-		snprintf(buf, PATH_MAX, "%s/%s", PATH_SYS_NODE, dent1->d_name);
-		dir2 = opendir(buf);
-		if (!dir2)
-			continue;
-		while ((dent2 = readdir(dir2)) != NULL) {
-			if (dent2->d_type != DT_LNK ||
-			    sscanf(dent2->d_name, "cpu%u", &cpu) < 1)
-				continue;
-			cpunode_map[cpu] = mem;
-		}
-		closedir(dir2);
-	}
-	closedir(dir1);
-	return 0;
-}
-
-static int insert_alloc_stat(unsigned long call_site, unsigned long ptr,
-			     int bytes_req, int bytes_alloc, int cpu)
-{
-	struct rb_node **node = &root_alloc_stat.rb_node;
-	struct rb_node *parent = NULL;
-	struct alloc_stat *data = NULL;
-
-	while (*node) {
-		parent = *node;
-		data = rb_entry(*node, struct alloc_stat, node);
-
-		if (ptr > data->ptr)
-			node = &(*node)->rb_right;
-		else if (ptr < data->ptr)
-			node = &(*node)->rb_left;
-		else
-			break;
-	}
-
-	if (data && data->ptr == ptr) {
-		data->hit++;
-		data->bytes_req += bytes_req;
-		data->bytes_alloc += bytes_alloc;
-	} else {
-		data = malloc(sizeof(*data));
-		if (!data) {
-			pr_err("%s: malloc failed\n", __func__);
-			return -1;
-		}
-		data->ptr = ptr;
-		data->pingpong = 0;
-		data->hit = 1;
-		data->bytes_req = bytes_req;
-		data->bytes_alloc = bytes_alloc;
-
-		rb_link_node(&data->node, parent, node);
-		rb_insert_color(&data->node, &root_alloc_stat);
-	}
-	data->call_site = call_site;
-	data->alloc_cpu = cpu;
-	return 0;
-}
-
-static int insert_caller_stat(unsigned long call_site,
-			      int bytes_req, int bytes_alloc)
-{
-	struct rb_node **node = &root_caller_stat.rb_node;
-	struct rb_node *parent = NULL;
-	struct alloc_stat *data = NULL;
-
-	while (*node) {
-		parent = *node;
-		data = rb_entry(*node, struct alloc_stat, node);
-
-		if (call_site > data->call_site)
-			node = &(*node)->rb_right;
-		else if (call_site < data->call_site)
-			node = &(*node)->rb_left;
-		else
-			break;
-	}
-
-	if (data && data->call_site == call_site) {
-		data->hit++;
-		data->bytes_req += bytes_req;
-		data->bytes_alloc += bytes_alloc;
-	} else {
-		data = malloc(sizeof(*data));
-		if (!data) {
-			pr_err("%s: malloc failed\n", __func__);
-			return -1;
-		}
-		data->call_site = call_site;
-		data->pingpong = 0;
-		data->hit = 1;
-		data->bytes_req = bytes_req;
-		data->bytes_alloc = bytes_alloc;
-
-		rb_link_node(&data->node, parent, node);
-		rb_insert_color(&data->node, &root_caller_stat);
-	}
-
-	return 0;
-}
-
-static int perf_evsel__process_alloc_event(struct perf_evsel *evsel,
-					   struct perf_sample *sample)
-{
-	unsigned long ptr = perf_evsel__intval(evsel, sample, "ptr"),
-		      call_site = perf_evsel__intval(evsel, sample, "call_site");
-	int bytes_req = perf_evsel__intval(evsel, sample, "bytes_req"),
-	    bytes_alloc = perf_evsel__intval(evsel, sample, "bytes_alloc");
-
-	if (insert_alloc_stat(call_site, ptr, bytes_req, bytes_alloc, sample->cpu) ||
-	    insert_caller_stat(call_site, bytes_req, bytes_alloc))
-		return -1;
-
-	total_requested += bytes_req;
-	total_allocated += bytes_alloc;
-
-	nr_allocs++;
-	return 0;
-}
-
-static int perf_evsel__process_alloc_node_event(struct perf_evsel *evsel,
-						struct perf_sample *sample)
-{
-	int ret = perf_evsel__process_alloc_event(evsel, sample);
-
-	if (!ret) {
-		int node1 = cpunode_map[sample->cpu],
-		    node2 = perf_evsel__intval(evsel, sample, "node");
-
-		if (node1 != node2)
-			nr_cross_allocs++;
-	}
-
-	return ret;
-}
-
-static int ptr_cmp(struct alloc_stat *, struct alloc_stat *);
-static int callsite_cmp(struct alloc_stat *, struct alloc_stat *);
-
-static struct alloc_stat *search_alloc_stat(unsigned long ptr,
-					    unsigned long call_site,
-					    struct rb_root *root,
-					    sort_fn_t sort_fn)
-{
-	struct rb_node *node = root->rb_node;
-	struct alloc_stat key = { .ptr = ptr, .call_site = call_site };
-
-	while (node) {
-		struct alloc_stat *data;
-		int cmp;
-
-		data = rb_entry(node, struct alloc_stat, node);
-
-		cmp = sort_fn(&key, data);
-		if (cmp < 0)
-			node = node->rb_left;
-		else if (cmp > 0)
-			node = node->rb_right;
-		else
-			return data;
-	}
-	return NULL;
-}
-
-static int perf_evsel__process_free_event(struct perf_evsel *evsel,
-					  struct perf_sample *sample)
-{
-	unsigned long ptr = perf_evsel__intval(evsel, sample, "ptr");
-	struct alloc_stat *s_alloc, *s_caller;
-
-	s_alloc = search_alloc_stat(ptr, 0, &root_alloc_stat, ptr_cmp);
-	if (!s_alloc)
-		return 0;
-
-	if ((short)sample->cpu != s_alloc->alloc_cpu) {
-		s_alloc->pingpong++;
-
-		s_caller = search_alloc_stat(0, s_alloc->call_site,
-					     &root_caller_stat, callsite_cmp);
-		if (!s_caller)
-			return -1;
-		s_caller->pingpong++;
-	}
-	s_alloc->alloc_cpu = -1;
-
-	return 0;
-}
-
-typedef int (*tracepoint_handler)(struct perf_evsel *evsel,
-				  struct perf_sample *sample);
-
-static int process_sample_event(struct perf_tool *tool __maybe_unused,
-				union perf_event *event,
-				struct perf_sample *sample,
-				struct perf_evsel *evsel,
-				struct machine *machine)
-{
-	struct thread *thread = machine__findnew_thread(machine, sample->pid,
-							sample->pid);
-
-	if (thread == NULL) {
-		pr_debug("problem processing %d event, skipping it.\n",
-			 event->header.type);
-		return -1;
-	}
-
-	dump_printf(" ... thread: %s:%d\n", thread->comm, thread->tid);
-
-	if (evsel->handler.func != NULL) {
-		tracepoint_handler f = evsel->handler.func;
-		return f(evsel, sample);
-	}
-
-	return 0;
-}
-
-static struct perf_tool perf_kmem = {
-	.sample		 = process_sample_event,
-	.comm		 = perf_event__process_comm,
-	.ordered_samples = true,
-};
-
-static double fragmentation(unsigned long n_req, unsigned long n_alloc)
-{
-	if (n_alloc == 0)
-		return 0.0;
-	else
-		return 100.0 - (100.0 * n_req / n_alloc);
-}
-
-static void __print_result(struct rb_root *root, struct perf_session *session,
-			   int n_lines, int is_caller)
-{
-	struct rb_node *next;
-	struct machine *machine = &session->machines.host;
-
-	printf("%.102s\n", graph_dotted_line);
-	printf(" %-34s |",  is_caller ? "Callsite": "Alloc Ptr");
-	printf(" Total_alloc/Per | Total_req/Per   | Hit      | Ping-pong | Frag\n");
-	printf("%.102s\n", graph_dotted_line);
-
-	next = rb_first(root);
-
-	while (next && n_lines--) {
-		struct alloc_stat *data = rb_entry(next, struct alloc_stat,
-						   node);
-		struct symbol *sym = NULL;
-		struct map *map;
-		char buf[BUFSIZ];
-		u64 addr;
-
-		if (is_caller) {
-			addr = data->call_site;
-			if (!raw_ip)
-				sym = machine__find_kernel_function(machine, addr, &map, NULL);
-		} else
-			addr = data->ptr;
-
-		if (sym != NULL)
-			snprintf(buf, sizeof(buf), "%s+%" PRIx64 "", sym->name,
-				 addr - map->unmap_ip(map, sym->start));
-		else
-			snprintf(buf, sizeof(buf), "%#" PRIx64 "", addr);
-		printf(" %-34s |", buf);
-
-		printf(" %9llu/%-5lu | %9llu/%-5lu | %8lu | %8lu | %6.3f%%\n",
-		       (unsigned long long)data->bytes_alloc,
-		       (unsigned long)data->bytes_alloc / data->hit,
-		       (unsigned long long)data->bytes_req,
-		       (unsigned long)data->bytes_req / data->hit,
-		       (unsigned long)data->hit,
-		       (unsigned long)data->pingpong,
-		       fragmentation(data->bytes_req, data->bytes_alloc));
-
-		next = rb_next(next);
-	}
-
-	if (n_lines == -1)
-		printf(" ...                                | ...             | ...             | ...    | ...      | ...   \n");
-
-	printf("%.102s\n", graph_dotted_line);
-}
-
-static void print_summary(void)
-{
-	printf("\nSUMMARY\n=======\n");
-	printf("Total bytes requested: %lu\n", total_requested);
-	printf("Total bytes allocated: %lu\n", total_allocated);
-	printf("Total bytes wasted on internal fragmentation: %lu\n",
-	       total_allocated - total_requested);
-	printf("Internal fragmentation: %f%%\n",
-	       fragmentation(total_requested, total_allocated));
-	printf("Cross CPU allocations: %lu/%lu\n", nr_cross_allocs, nr_allocs);
-}
-
-static void print_result(struct perf_session *session)
-{
-	if (caller_flag)
-		__print_result(&root_caller_sorted, session, caller_lines, 1);
-	if (alloc_flag)
-		__print_result(&root_alloc_sorted, session, alloc_lines, 0);
-	print_summary();
-}
-
-struct sort_dimension {
-	const char		name[20];
-	sort_fn_t		cmp;
-	struct list_head	list;
-};
-
-static LIST_HEAD(caller_sort);
-static LIST_HEAD(alloc_sort);
-
-static void sort_insert(struct rb_root *root, struct alloc_stat *data,
-			struct list_head *sort_list)
-{
-	struct rb_node **new = &(root->rb_node);
-	struct rb_node *parent = NULL;
-	struct sort_dimension *sort;
-
-	while (*new) {
-		struct alloc_stat *this;
-		int cmp = 0;
-
-		this = rb_entry(*new, struct alloc_stat, node);
-		parent = *new;
-
-		list_for_each_entry(sort, sort_list, list) {
-			cmp = sort->cmp(data, this);
-			if (cmp)
-				break;
-		}
-
-		if (cmp > 0)
-			new = &((*new)->rb_left);
-		else
-			new = &((*new)->rb_right);
-	}
-
-	rb_link_node(&data->node, parent, new);
-	rb_insert_color(&data->node, root);
-}
-
-static void __sort_result(struct rb_root *root, struct rb_root *root_sorted,
-			  struct list_head *sort_list)
-{
-	struct rb_node *node;
-	struct alloc_stat *data;
-
-	for (;;) {
-		node = rb_first(root);
-		if (!node)
-			break;
-
-		rb_erase(node, root);
-		data = rb_entry(node, struct alloc_stat, node);
-		sort_insert(root_sorted, data, sort_list);
-	}
-}
-
-static void sort_result(void)
-{
-	__sort_result(&root_alloc_stat, &root_alloc_sorted, &alloc_sort);
-	__sort_result(&root_caller_stat, &root_caller_sorted, &caller_sort);
-}
-
-static int __cmd_kmem(void)
-{
-	int err = -EINVAL;
-	struct perf_session *session;
-	const struct perf_evsel_str_handler kmem_tracepoints[] = {
-		{ "kmem:kmalloc",		perf_evsel__process_alloc_event, },
-    		{ "kmem:kmem_cache_alloc",	perf_evsel__process_alloc_event, },
-		{ "kmem:kmalloc_node",		perf_evsel__process_alloc_node_event, },
-    		{ "kmem:kmem_cache_alloc_node", perf_evsel__process_alloc_node_event, },
-		{ "kmem:kfree",			perf_evsel__process_free_event, },
-    		{ "kmem:kmem_cache_free",	perf_evsel__process_free_event, },
-	};
-
-	session = perf_session__new(input_name, O_RDONLY, 0, false, &perf_kmem);
-	if (session == NULL)
-		return -ENOMEM;
-
-	if (perf_session__create_kernel_maps(session) < 0)
-		goto out_delete;
-
-	if (!perf_session__has_traces(session, "kmem record"))
-		goto out_delete;
-
-	if (perf_session__set_tracepoints_handlers(session, kmem_tracepoints)) {
-		pr_err("Initializing perf session tracepoint handlers failed\n");
-		return -1;
-	}
-
-	setup_pager();
-	err = perf_session__process_events(session, &perf_kmem);
-	if (err != 0)
-		goto out_delete;
-	sort_result();
-	print_result(session);
-out_delete:
-	perf_session__delete(session);
-	return err;
-}
-
-static int ptr_cmp(struct alloc_stat *l, struct alloc_stat *r)
-{
-	if (l->ptr < r->ptr)
-		return -1;
-	else if (l->ptr > r->ptr)
-		return 1;
-	return 0;
-}
-
-static struct sort_dimension ptr_sort_dimension = {
-	.name	= "ptr",
-	.cmp	= ptr_cmp,
-};
-
-static int callsite_cmp(struct alloc_stat *l, struct alloc_stat *r)
-{
-	if (l->call_site < r->call_site)
-		return -1;
-	else if (l->call_site > r->call_site)
-		return 1;
-	return 0;
-}
-
-static struct sort_dimension callsite_sort_dimension = {
-	.name	= "callsite",
-	.cmp	= callsite_cmp,
-};
-
-static int hit_cmp(struct alloc_stat *l, struct alloc_stat *r)
-{
-	if (l->hit < r->hit)
-		return -1;
-	else if (l->hit > r->hit)
-		return 1;
-	return 0;
-}
-
-static struct sort_dimension hit_sort_dimension = {
-	.name	= "hit",
-	.cmp	= hit_cmp,
-};
-
-static int bytes_cmp(struct alloc_stat *l, struct alloc_stat *r)
-{
-	if (l->bytes_alloc < r->bytes_alloc)
-		return -1;
-	else if (l->bytes_alloc > r->bytes_alloc)
-		return 1;
-	return 0;
-}
-
-static struct sort_dimension bytes_sort_dimension = {
-	.name	= "bytes",
-	.cmp	= bytes_cmp,
-};
-
-static int frag_cmp(struct alloc_stat *l, struct alloc_stat *r)
-{
-	double x, y;
-
-	x = fragmentation(l->bytes_req, l->bytes_alloc);
-	y = fragmentation(r->bytes_req, r->bytes_alloc);
-
-	if (x < y)
-		return -1;
-	else if (x > y)
-		return 1;
-	return 0;
-}
-
-static struct sort_dimension frag_sort_dimension = {
-	.name	= "frag",
-	.cmp	= frag_cmp,
-};
-
-static int pingpong_cmp(struct alloc_stat *l, struct alloc_stat *r)
-{
-	if (l->pingpong < r->pingpong)
-		return -1;
-	else if (l->pingpong > r->pingpong)
-		return 1;
-	return 0;
-}
-
-static struct sort_dimension pingpong_sort_dimension = {
-	.name	= "pingpong",
-	.cmp	= pingpong_cmp,
-};
-
-static struct sort_dimension *avail_sorts[] = {
-	&ptr_sort_dimension,
-	&callsite_sort_dimension,
-	&hit_sort_dimension,
-	&bytes_sort_dimension,
-	&frag_sort_dimension,
-	&pingpong_sort_dimension,
-};
-
-#define NUM_AVAIL_SORTS	((int)ARRAY_SIZE(avail_sorts))
-
-static int sort_dimension__add(const char *tok, struct list_head *list)
-{
-	struct sort_dimension *sort;
-	int i;
-
-	for (i = 0; i < NUM_AVAIL_SORTS; i++) {
-		if (!strcmp(avail_sorts[i]->name, tok)) {
-			sort = memdup(avail_sorts[i], sizeof(*avail_sorts[i]));
-			if (!sort) {
-				pr_err("%s: memdup failed\n", __func__);
-				return -1;
-			}
-			list_add_tail(&sort->list, list);
-			return 0;
-		}
-	}
-
-	return -1;
-}
-
-static int setup_sorting(struct list_head *sort_list, const char *arg)
-{
-	char *tok;
-	char *str = strdup(arg);
-
-	if (!str) {
-		pr_err("%s: strdup failed\n", __func__);
-		return -1;
-	}
-
-	while (true) {
-		tok = strsep(&str, ",");
-		if (!tok)
-			break;
-		if (sort_dimension__add(tok, sort_list) < 0) {
-			error("Unknown --sort key: '%s'", tok);
-			free(str);
-			return -1;
-		}
-	}
-
-	free(str);
-	return 0;
-}
-
-static int parse_sort_opt(const struct option *opt __maybe_unused,
-			  const char *arg, int unset __maybe_unused)
-{
-	if (!arg)
-		return -1;
-
-	if (caller_flag > alloc_flag)
-		return setup_sorting(&caller_sort, arg);
-	else
-		return setup_sorting(&alloc_sort, arg);
-
-	return 0;
-}
-
-static int parse_caller_opt(const struct option *opt __maybe_unused,
-			    const char *arg __maybe_unused,
-			    int unset __maybe_unused)
-{
-	caller_flag = (alloc_flag + 1);
-	return 0;
-}
-
-static int parse_alloc_opt(const struct option *opt __maybe_unused,
-			   const char *arg __maybe_unused,
-			   int unset __maybe_unused)
-{
-	alloc_flag = (caller_flag + 1);
-	return 0;
-}
-
-static int parse_line_opt(const struct option *opt __maybe_unused,
-			  const char *arg, int unset __maybe_unused)
-{
-	int lines;
-
-	if (!arg)
-		return -1;
-
-	lines = strtoul(arg, NULL, 10);
-
-	if (caller_flag > alloc_flag)
-		caller_lines = lines;
-	else
-		alloc_lines = lines;
-
-	return 0;
-}
-
-static int __cmd_record(int argc, const char **argv)
-{
-	const char * const record_args[] = {
-	"record", "-a", "-R", "-c", "1",
-	"-e", "kmem:kmalloc",
-	"-e", "kmem:kmalloc_node",
-	"-e", "kmem:kfree",
-	"-e", "kmem:kmem_cache_alloc",
-	"-e", "kmem:kmem_cache_alloc_node",
-	"-e", "kmem:kmem_cache_free",
-	};
-	unsigned int rec_argc, i, j;
-	const char **rec_argv;
-
-	rec_argc = ARRAY_SIZE(record_args) + argc - 1;
-	rec_argv = calloc(rec_argc + 1, sizeof(char *));
-
-	if (rec_argv == NULL)
-		return -ENOMEM;
-
-	for (i = 0; i < ARRAY_SIZE(record_args); i++)
-		rec_argv[i] = strdup(record_args[i]);
-
-	for (j = 1; j < (unsigned int)argc; j++, i++)
-		rec_argv[i] = argv[j];
-
-	return cmd_record(i, rec_argv, NULL);
-}
-
-int cmd_kmem(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	const char * const default_sort_order = "frag,hit,bytes";
-	const struct option kmem_options[] = {
-	OPT_STRING('i', "input", &input_name, "file", "input file name"),
-	OPT_CALLBACK_NOOPT(0, "caller", NULL, NULL,
-			   "show per-callsite statistics", parse_caller_opt),
-	OPT_CALLBACK_NOOPT(0, "alloc", NULL, NULL,
-			   "show per-allocation statistics", parse_alloc_opt),
-	OPT_CALLBACK('s', "sort", NULL, "key[,key2...]",
-		     "sort by keys: ptr, call_site, bytes, hit, pingpong, frag",
-		     parse_sort_opt),
-	OPT_CALLBACK('l', "line", NULL, "num", "show n lines", parse_line_opt),
-	OPT_BOOLEAN(0, "raw-ip", &raw_ip, "show raw ip instead of symbol"),
-	OPT_END()
-	};
-	const char * const kmem_usage[] = {
-		"perf kmem [<options>] {record|stat}",
-		NULL
-	};
-	argc = parse_options(argc, argv, kmem_options, kmem_usage, 0);
-
-	if (!argc)
-		usage_with_options(kmem_usage, kmem_options);
-
-	symbol__init();
-
-	if (!strncmp(argv[0], "rec", 3)) {
-		return __cmd_record(argc, argv);
-	} else if (!strcmp(argv[0], "stat")) {
-		if (setup_cpunode_map())
-			return -1;
-
-		if (list_empty(&caller_sort))
-			setup_sorting(&caller_sort, default_sort_order);
-		if (list_empty(&alloc_sort))
-			setup_sorting(&alloc_sort, default_sort_order);
-
-		return __cmd_kmem();
-	} else
-		usage_with_options(kmem_usage, kmem_options);
-
-	return 0;
-}
-
diff --git a/src/tools/perf/builtin-kvm.c b/src/tools/perf/builtin-kvm.c
deleted file mode 100644
index fbc2888..0000000
--- a/src/tools/perf/builtin-kvm.c
+++ /dev/null
@@ -1,1735 +0,0 @@
-#include "builtin.h"
-#include "perf.h"
-
-#include "util/evsel.h"
-#include "util/evlist.h"
-#include "util/util.h"
-#include "util/cache.h"
-#include "util/symbol.h"
-#include "util/thread.h"
-#include "util/header.h"
-#include "util/session.h"
-#include "util/intlist.h"
-#include "util/parse-options.h"
-#include "util/trace-event.h"
-#include "util/debug.h"
-#include <lk/debugfs.h>
-#include "util/tool.h"
-#include "util/stat.h"
-#include "util/top.h"
-
-#include <sys/prctl.h>
-#include <sys/timerfd.h>
-
-#include <termios.h>
-#include <semaphore.h>
-#include <pthread.h>
-#include <math.h>
-
-#if defined(__i386__) || defined(__x86_64__)
-#include <asm/svm.h>
-#include <asm/vmx.h>
-#include <asm/kvm.h>
-
-struct event_key {
-	#define INVALID_KEY     (~0ULL)
-	u64 key;
-	int info;
-};
-
-struct kvm_event_stats {
-	u64 time;
-	struct stats stats;
-};
-
-struct kvm_event {
-	struct list_head hash_entry;
-	struct rb_node rb;
-
-	struct event_key key;
-
-	struct kvm_event_stats total;
-
-	#define DEFAULT_VCPU_NUM 8
-	int max_vcpu;
-	struct kvm_event_stats *vcpu;
-};
-
-typedef int (*key_cmp_fun)(struct kvm_event*, struct kvm_event*, int);
-
-struct kvm_event_key {
-	const char *name;
-	key_cmp_fun key;
-};
-
-
-struct perf_kvm_stat;
-
-struct kvm_events_ops {
-	bool (*is_begin_event)(struct perf_evsel *evsel,
-			       struct perf_sample *sample,
-			       struct event_key *key);
-	bool (*is_end_event)(struct perf_evsel *evsel,
-			     struct perf_sample *sample, struct event_key *key);
-	void (*decode_key)(struct perf_kvm_stat *kvm, struct event_key *key,
-			   char decode[20]);
-	const char *name;
-};
-
-struct exit_reasons_table {
-	unsigned long exit_code;
-	const char *reason;
-};
-
-#define EVENTS_BITS		12
-#define EVENTS_CACHE_SIZE	(1UL << EVENTS_BITS)
-
-struct perf_kvm_stat {
-	struct perf_tool    tool;
-	struct perf_record_opts opts;
-	struct perf_evlist  *evlist;
-	struct perf_session *session;
-
-	const char *file_name;
-	const char *report_event;
-	const char *sort_key;
-	int trace_vcpu;
-
-	struct exit_reasons_table *exit_reasons;
-	int exit_reasons_size;
-	const char *exit_reasons_isa;
-
-	struct kvm_events_ops *events_ops;
-	key_cmp_fun compare;
-	struct list_head kvm_events_cache[EVENTS_CACHE_SIZE];
-
-	u64 total_time;
-	u64 total_count;
-	u64 lost_events;
-	u64 duration;
-
-	const char *pid_str;
-	struct intlist *pid_list;
-
-	struct rb_root result;
-
-	int timerfd;
-	unsigned int display_time;
-	bool live;
-};
-
-
-static void exit_event_get_key(struct perf_evsel *evsel,
-			       struct perf_sample *sample,
-			       struct event_key *key)
-{
-	key->info = 0;
-	key->key = perf_evsel__intval(evsel, sample, "exit_reason");
-}
-
-static bool kvm_exit_event(struct perf_evsel *evsel)
-{
-	return !strcmp(evsel->name, "kvm:kvm_exit");
-}
-
-static bool exit_event_begin(struct perf_evsel *evsel,
-			     struct perf_sample *sample, struct event_key *key)
-{
-	if (kvm_exit_event(evsel)) {
-		exit_event_get_key(evsel, sample, key);
-		return true;
-	}
-
-	return false;
-}
-
-static bool kvm_entry_event(struct perf_evsel *evsel)
-{
-	return !strcmp(evsel->name, "kvm:kvm_entry");
-}
-
-static bool exit_event_end(struct perf_evsel *evsel,
-			   struct perf_sample *sample __maybe_unused,
-			   struct event_key *key __maybe_unused)
-{
-	return kvm_entry_event(evsel);
-}
-
-static struct exit_reasons_table vmx_exit_reasons[] = {
-	VMX_EXIT_REASONS
-};
-
-static struct exit_reasons_table svm_exit_reasons[] = {
-	SVM_EXIT_REASONS
-};
-
-static const char *get_exit_reason(struct perf_kvm_stat *kvm, u64 exit_code)
-{
-	int i = kvm->exit_reasons_size;
-	struct exit_reasons_table *tbl = kvm->exit_reasons;
-
-	while (i--) {
-		if (tbl->exit_code == exit_code)
-			return tbl->reason;
-		tbl++;
-	}
-
-	pr_err("unknown kvm exit code:%lld on %s\n",
-		(unsigned long long)exit_code, kvm->exit_reasons_isa);
-	return "UNKNOWN";
-}
-
-static void exit_event_decode_key(struct perf_kvm_stat *kvm,
-				  struct event_key *key,
-				  char decode[20])
-{
-	const char *exit_reason = get_exit_reason(kvm, key->key);
-
-	scnprintf(decode, 20, "%s", exit_reason);
-}
-
-static struct kvm_events_ops exit_events = {
-	.is_begin_event = exit_event_begin,
-	.is_end_event = exit_event_end,
-	.decode_key = exit_event_decode_key,
-	.name = "VM-EXIT"
-};
-
-/*
- * For the mmio events, we treat:
- * the time of MMIO write: kvm_mmio(KVM_TRACE_MMIO_WRITE...) -> kvm_entry
- * the time of MMIO read: kvm_exit -> kvm_mmio(KVM_TRACE_MMIO_READ...).
- */
-static void mmio_event_get_key(struct perf_evsel *evsel, struct perf_sample *sample,
-			       struct event_key *key)
-{
-	key->key  = perf_evsel__intval(evsel, sample, "gpa");
-	key->info = perf_evsel__intval(evsel, sample, "type");
-}
-
-#define KVM_TRACE_MMIO_READ_UNSATISFIED 0
-#define KVM_TRACE_MMIO_READ 1
-#define KVM_TRACE_MMIO_WRITE 2
-
-static bool mmio_event_begin(struct perf_evsel *evsel,
-			     struct perf_sample *sample, struct event_key *key)
-{
-	/* MMIO read begin event in kernel. */
-	if (kvm_exit_event(evsel))
-		return true;
-
-	/* MMIO write begin event in kernel. */
-	if (!strcmp(evsel->name, "kvm:kvm_mmio") &&
-	    perf_evsel__intval(evsel, sample, "type") == KVM_TRACE_MMIO_WRITE) {
-		mmio_event_get_key(evsel, sample, key);
-		return true;
-	}
-
-	return false;
-}
-
-static bool mmio_event_end(struct perf_evsel *evsel, struct perf_sample *sample,
-			   struct event_key *key)
-{
-	/* MMIO write end event in kernel. */
-	if (kvm_entry_event(evsel))
-		return true;
-
-	/* MMIO read end event in kernel.*/
-	if (!strcmp(evsel->name, "kvm:kvm_mmio") &&
-	    perf_evsel__intval(evsel, sample, "type") == KVM_TRACE_MMIO_READ) {
-		mmio_event_get_key(evsel, sample, key);
-		return true;
-	}
-
-	return false;
-}
-
-static void mmio_event_decode_key(struct perf_kvm_stat *kvm __maybe_unused,
-				  struct event_key *key,
-				  char decode[20])
-{
-	scnprintf(decode, 20, "%#lx:%s", (unsigned long)key->key,
-				key->info == KVM_TRACE_MMIO_WRITE ? "W" : "R");
-}
-
-static struct kvm_events_ops mmio_events = {
-	.is_begin_event = mmio_event_begin,
-	.is_end_event = mmio_event_end,
-	.decode_key = mmio_event_decode_key,
-	.name = "MMIO Access"
-};
-
- /* The time of emulation pio access is from kvm_pio to kvm_entry. */
-static void ioport_event_get_key(struct perf_evsel *evsel,
-				 struct perf_sample *sample,
-				 struct event_key *key)
-{
-	key->key  = perf_evsel__intval(evsel, sample, "port");
-	key->info = perf_evsel__intval(evsel, sample, "rw");
-}
-
-static bool ioport_event_begin(struct perf_evsel *evsel,
-			       struct perf_sample *sample,
-			       struct event_key *key)
-{
-	if (!strcmp(evsel->name, "kvm:kvm_pio")) {
-		ioport_event_get_key(evsel, sample, key);
-		return true;
-	}
-
-	return false;
-}
-
-static bool ioport_event_end(struct perf_evsel *evsel,
-			     struct perf_sample *sample __maybe_unused,
-			     struct event_key *key __maybe_unused)
-{
-	return kvm_entry_event(evsel);
-}
-
-static void ioport_event_decode_key(struct perf_kvm_stat *kvm __maybe_unused,
-				    struct event_key *key,
-				    char decode[20])
-{
-	scnprintf(decode, 20, "%#llx:%s", (unsigned long long)key->key,
-				key->info ? "POUT" : "PIN");
-}
-
-static struct kvm_events_ops ioport_events = {
-	.is_begin_event = ioport_event_begin,
-	.is_end_event = ioport_event_end,
-	.decode_key = ioport_event_decode_key,
-	.name = "IO Port Access"
-};
-
-static bool register_kvm_events_ops(struct perf_kvm_stat *kvm)
-{
-	bool ret = true;
-
-	if (!strcmp(kvm->report_event, "vmexit"))
-		kvm->events_ops = &exit_events;
-	else if (!strcmp(kvm->report_event, "mmio"))
-		kvm->events_ops = &mmio_events;
-	else if (!strcmp(kvm->report_event, "ioport"))
-		kvm->events_ops = &ioport_events;
-	else {
-		pr_err("Unknown report event:%s\n", kvm->report_event);
-		ret = false;
-	}
-
-	return ret;
-}
-
-struct vcpu_event_record {
-	int vcpu_id;
-	u64 start_time;
-	struct kvm_event *last_event;
-};
-
-
-static void init_kvm_event_record(struct perf_kvm_stat *kvm)
-{
-	unsigned int i;
-
-	for (i = 0; i < EVENTS_CACHE_SIZE; i++)
-		INIT_LIST_HEAD(&kvm->kvm_events_cache[i]);
-}
-
-static void clear_events_cache_stats(struct list_head *kvm_events_cache)
-{
-	struct list_head *head;
-	struct kvm_event *event;
-	unsigned int i;
-	int j;
-
-	for (i = 0; i < EVENTS_CACHE_SIZE; i++) {
-		head = &kvm_events_cache[i];
-		list_for_each_entry(event, head, hash_entry) {
-			/* reset stats for event */
-			event->total.time = 0;
-			init_stats(&event->total.stats);
-
-			for (j = 0; j < event->max_vcpu; ++j) {
-				event->vcpu[j].time = 0;
-				init_stats(&event->vcpu[j].stats);
-			}
-		}
-	}
-}
-
-static int kvm_events_hash_fn(u64 key)
-{
-	return key & (EVENTS_CACHE_SIZE - 1);
-}
-
-static bool kvm_event_expand(struct kvm_event *event, int vcpu_id)
-{
-	int old_max_vcpu = event->max_vcpu;
-	void *prev;
-
-	if (vcpu_id < event->max_vcpu)
-		return true;
-
-	while (event->max_vcpu <= vcpu_id)
-		event->max_vcpu += DEFAULT_VCPU_NUM;
-
-	prev = event->vcpu;
-	event->vcpu = realloc(event->vcpu,
-			      event->max_vcpu * sizeof(*event->vcpu));
-	if (!event->vcpu) {
-		free(prev);
-		pr_err("Not enough memory\n");
-		return false;
-	}
-
-	memset(event->vcpu + old_max_vcpu, 0,
-	       (event->max_vcpu - old_max_vcpu) * sizeof(*event->vcpu));
-	return true;
-}
-
-static struct kvm_event *kvm_alloc_init_event(struct event_key *key)
-{
-	struct kvm_event *event;
-
-	event = zalloc(sizeof(*event));
-	if (!event) {
-		pr_err("Not enough memory\n");
-		return NULL;
-	}
-
-	event->key = *key;
-	return event;
-}
-
-static struct kvm_event *find_create_kvm_event(struct perf_kvm_stat *kvm,
-					       struct event_key *key)
-{
-	struct kvm_event *event;
-	struct list_head *head;
-
-	BUG_ON(key->key == INVALID_KEY);
-
-	head = &kvm->kvm_events_cache[kvm_events_hash_fn(key->key)];
-	list_for_each_entry(event, head, hash_entry) {
-		if (event->key.key == key->key && event->key.info == key->info)
-			return event;
-	}
-
-	event = kvm_alloc_init_event(key);
-	if (!event)
-		return NULL;
-
-	list_add(&event->hash_entry, head);
-	return event;
-}
-
-static bool handle_begin_event(struct perf_kvm_stat *kvm,
-			       struct vcpu_event_record *vcpu_record,
-			       struct event_key *key, u64 timestamp)
-{
-	struct kvm_event *event = NULL;
-
-	if (key->key != INVALID_KEY)
-		event = find_create_kvm_event(kvm, key);
-
-	vcpu_record->last_event = event;
-	vcpu_record->start_time = timestamp;
-	return true;
-}
-
-static void
-kvm_update_event_stats(struct kvm_event_stats *kvm_stats, u64 time_diff)
-{
-	kvm_stats->time += time_diff;
-	update_stats(&kvm_stats->stats, time_diff);
-}
-
-static double kvm_event_rel_stddev(int vcpu_id, struct kvm_event *event)
-{
-	struct kvm_event_stats *kvm_stats = &event->total;
-
-	if (vcpu_id != -1)
-		kvm_stats = &event->vcpu[vcpu_id];
-
-	return rel_stddev_stats(stddev_stats(&kvm_stats->stats),
-				avg_stats(&kvm_stats->stats));
-}
-
-static bool update_kvm_event(struct kvm_event *event, int vcpu_id,
-			     u64 time_diff)
-{
-	if (vcpu_id == -1) {
-		kvm_update_event_stats(&event->total, time_diff);
-		return true;
-	}
-
-	if (!kvm_event_expand(event, vcpu_id))
-		return false;
-
-	kvm_update_event_stats(&event->vcpu[vcpu_id], time_diff);
-	return true;
-}
-
-static bool handle_end_event(struct perf_kvm_stat *kvm,
-			     struct vcpu_event_record *vcpu_record,
-			     struct event_key *key,
-			     struct perf_sample *sample)
-{
-	struct kvm_event *event;
-	u64 time_begin, time_diff;
-	int vcpu;
-
-	if (kvm->trace_vcpu == -1)
-		vcpu = -1;
-	else
-		vcpu = vcpu_record->vcpu_id;
-
-	event = vcpu_record->last_event;
-	time_begin = vcpu_record->start_time;
-
-	/* The begin event is not caught. */
-	if (!time_begin)
-		return true;
-
-	/*
-	 * In some case, the 'begin event' only records the start timestamp,
-	 * the actual event is recognized in the 'end event' (e.g. mmio-event).
-	 */
-
-	/* Both begin and end events did not get the key. */
-	if (!event && key->key == INVALID_KEY)
-		return true;
-
-	if (!event)
-		event = find_create_kvm_event(kvm, key);
-
-	if (!event)
-		return false;
-
-	vcpu_record->last_event = NULL;
-	vcpu_record->start_time = 0;
-
-	/* seems to happen once in a while during live mode */
-	if (sample->time < time_begin) {
-		pr_debug("End time before begin time; skipping event.\n");
-		return true;
-	}
-
-	time_diff = sample->time - time_begin;
-
-	if (kvm->duration && time_diff > kvm->duration) {
-		char decode[32];
-
-		kvm->events_ops->decode_key(kvm, &event->key, decode);
-		if (strcmp(decode, "HLT")) {
-			pr_info("%" PRIu64 " VM %d, vcpu %d: %s event took %" PRIu64 "usec\n",
-				 sample->time, sample->pid, vcpu_record->vcpu_id,
-				 decode, time_diff/1000);
-		}
-	}
-
-	return update_kvm_event(event, vcpu, time_diff);
-}
-
-static
-struct vcpu_event_record *per_vcpu_record(struct thread *thread,
-					  struct perf_evsel *evsel,
-					  struct perf_sample *sample)
-{
-	/* Only kvm_entry records vcpu id. */
-	if (!thread->priv && kvm_entry_event(evsel)) {
-		struct vcpu_event_record *vcpu_record;
-
-		vcpu_record = zalloc(sizeof(*vcpu_record));
-		if (!vcpu_record) {
-			pr_err("%s: Not enough memory\n", __func__);
-			return NULL;
-		}
-
-		vcpu_record->vcpu_id = perf_evsel__intval(evsel, sample, "vcpu_id");
-		thread->priv = vcpu_record;
-	}
-
-	return thread->priv;
-}
-
-static bool handle_kvm_event(struct perf_kvm_stat *kvm,
-			     struct thread *thread,
-			     struct perf_evsel *evsel,
-			     struct perf_sample *sample)
-{
-	struct vcpu_event_record *vcpu_record;
-	struct event_key key = {.key = INVALID_KEY};
-
-	vcpu_record = per_vcpu_record(thread, evsel, sample);
-	if (!vcpu_record)
-		return true;
-
-	/* only process events for vcpus user cares about */
-	if ((kvm->trace_vcpu != -1) &&
-	    (kvm->trace_vcpu != vcpu_record->vcpu_id))
-		return true;
-
-	if (kvm->events_ops->is_begin_event(evsel, sample, &key))
-		return handle_begin_event(kvm, vcpu_record, &key, sample->time);
-
-	if (kvm->events_ops->is_end_event(evsel, sample, &key))
-		return handle_end_event(kvm, vcpu_record, &key, sample);
-
-	return true;
-}
-
-#define GET_EVENT_KEY(func, field)					\
-static u64 get_event_ ##func(struct kvm_event *event, int vcpu)		\
-{									\
-	if (vcpu == -1)							\
-		return event->total.field;				\
-									\
-	if (vcpu >= event->max_vcpu)					\
-		return 0;						\
-									\
-	return event->vcpu[vcpu].field;					\
-}
-
-#define COMPARE_EVENT_KEY(func, field)					\
-GET_EVENT_KEY(func, field)						\
-static int compare_kvm_event_ ## func(struct kvm_event *one,		\
-					struct kvm_event *two, int vcpu)\
-{									\
-	return get_event_ ##func(one, vcpu) >				\
-				get_event_ ##func(two, vcpu);		\
-}
-
-GET_EVENT_KEY(time, time);
-COMPARE_EVENT_KEY(count, stats.n);
-COMPARE_EVENT_KEY(mean, stats.mean);
-GET_EVENT_KEY(max, stats.max);
-GET_EVENT_KEY(min, stats.min);
-
-#define DEF_SORT_NAME_KEY(name, compare_key)				\
-	{ #name, compare_kvm_event_ ## compare_key }
-
-static struct kvm_event_key keys[] = {
-	DEF_SORT_NAME_KEY(sample, count),
-	DEF_SORT_NAME_KEY(time, mean),
-	{ NULL, NULL }
-};
-
-static bool select_key(struct perf_kvm_stat *kvm)
-{
-	int i;
-
-	for (i = 0; keys[i].name; i++) {
-		if (!strcmp(keys[i].name, kvm->sort_key)) {
-			kvm->compare = keys[i].key;
-			return true;
-		}
-	}
-
-	pr_err("Unknown compare key:%s\n", kvm->sort_key);
-	return false;
-}
-
-static void insert_to_result(struct rb_root *result, struct kvm_event *event,
-			     key_cmp_fun bigger, int vcpu)
-{
-	struct rb_node **rb = &result->rb_node;
-	struct rb_node *parent = NULL;
-	struct kvm_event *p;
-
-	while (*rb) {
-		p = container_of(*rb, struct kvm_event, rb);
-		parent = *rb;
-
-		if (bigger(event, p, vcpu))
-			rb = &(*rb)->rb_left;
-		else
-			rb = &(*rb)->rb_right;
-	}
-
-	rb_link_node(&event->rb, parent, rb);
-	rb_insert_color(&event->rb, result);
-}
-
-static void
-update_total_count(struct perf_kvm_stat *kvm, struct kvm_event *event)
-{
-	int vcpu = kvm->trace_vcpu;
-
-	kvm->total_count += get_event_count(event, vcpu);
-	kvm->total_time += get_event_time(event, vcpu);
-}
-
-static bool event_is_valid(struct kvm_event *event, int vcpu)
-{
-	return !!get_event_count(event, vcpu);
-}
-
-static void sort_result(struct perf_kvm_stat *kvm)
-{
-	unsigned int i;
-	int vcpu = kvm->trace_vcpu;
-	struct kvm_event *event;
-
-	for (i = 0; i < EVENTS_CACHE_SIZE; i++) {
-		list_for_each_entry(event, &kvm->kvm_events_cache[i], hash_entry) {
-			if (event_is_valid(event, vcpu)) {
-				update_total_count(kvm, event);
-				insert_to_result(&kvm->result, event,
-						 kvm->compare, vcpu);
-			}
-		}
-	}
-}
-
-/* returns left most element of result, and erase it */
-static struct kvm_event *pop_from_result(struct rb_root *result)
-{
-	struct rb_node *node = rb_first(result);
-
-	if (!node)
-		return NULL;
-
-	rb_erase(node, result);
-	return container_of(node, struct kvm_event, rb);
-}
-
-static void print_vcpu_info(struct perf_kvm_stat *kvm)
-{
-	int vcpu = kvm->trace_vcpu;
-
-	pr_info("Analyze events for ");
-
-	if (kvm->live) {
-		if (kvm->opts.target.system_wide)
-			pr_info("all VMs, ");
-		else if (kvm->opts.target.pid)
-			pr_info("pid(s) %s, ", kvm->opts.target.pid);
-		else
-			pr_info("dazed and confused on what is monitored, ");
-	}
-
-	if (vcpu == -1)
-		pr_info("all VCPUs:\n\n");
-	else
-		pr_info("VCPU %d:\n\n", vcpu);
-}
-
-static void show_timeofday(void)
-{
-	char date[64];
-	struct timeval tv;
-	struct tm ltime;
-
-	gettimeofday(&tv, NULL);
-	if (localtime_r(&tv.tv_sec, &ltime)) {
-		strftime(date, sizeof(date), "%H:%M:%S", &ltime);
-		pr_info("%s.%06ld", date, tv.tv_usec);
-	} else
-		pr_info("00:00:00.000000");
-
-	return;
-}
-
-static void print_result(struct perf_kvm_stat *kvm)
-{
-	char decode[20];
-	struct kvm_event *event;
-	int vcpu = kvm->trace_vcpu;
-
-	if (kvm->live) {
-		puts(CONSOLE_CLEAR);
-		show_timeofday();
-	}
-
-	pr_info("\n\n");
-	print_vcpu_info(kvm);
-	pr_info("%20s ", kvm->events_ops->name);
-	pr_info("%10s ", "Samples");
-	pr_info("%9s ", "Samples%");
-
-	pr_info("%9s ", "Time%");
-	pr_info("%10s ", "Min Time");
-	pr_info("%10s ", "Max Time");
-	pr_info("%16s ", "Avg time");
-	pr_info("\n\n");
-
-	while ((event = pop_from_result(&kvm->result))) {
-		u64 ecount, etime, max, min;
-
-		ecount = get_event_count(event, vcpu);
-		etime = get_event_time(event, vcpu);
-		max = get_event_max(event, vcpu);
-		min = get_event_min(event, vcpu);
-
-		kvm->events_ops->decode_key(kvm, &event->key, decode);
-		pr_info("%20s ", decode);
-		pr_info("%10llu ", (unsigned long long)ecount);
-		pr_info("%8.2f%% ", (double)ecount / kvm->total_count * 100);
-		pr_info("%8.2f%% ", (double)etime / kvm->total_time * 100);
-		pr_info("%8" PRIu64 "us ", min / 1000);
-		pr_info("%8" PRIu64 "us ", max / 1000);
-		pr_info("%9.2fus ( +-%7.2f%% )", (double)etime / ecount/1e3,
-			kvm_event_rel_stddev(vcpu, event));
-		pr_info("\n");
-	}
-
-	pr_info("\nTotal Samples:%" PRIu64 ", Total events handled time:%.2fus.\n\n",
-		kvm->total_count, kvm->total_time / 1e3);
-
-	if (kvm->lost_events)
-		pr_info("\nLost events: %" PRIu64 "\n\n", kvm->lost_events);
-}
-
-static int process_lost_event(struct perf_tool *tool,
-			      union perf_event *event __maybe_unused,
-			      struct perf_sample *sample __maybe_unused,
-			      struct machine *machine __maybe_unused)
-{
-	struct perf_kvm_stat *kvm = container_of(tool, struct perf_kvm_stat, tool);
-
-	kvm->lost_events++;
-	return 0;
-}
-
-static bool skip_sample(struct perf_kvm_stat *kvm,
-			struct perf_sample *sample)
-{
-	if (kvm->pid_list && intlist__find(kvm->pid_list, sample->pid) == NULL)
-		return true;
-
-	return false;
-}
-
-static int process_sample_event(struct perf_tool *tool,
-				union perf_event *event,
-				struct perf_sample *sample,
-				struct perf_evsel *evsel,
-				struct machine *machine)
-{
-	struct thread *thread;
-	struct perf_kvm_stat *kvm = container_of(tool, struct perf_kvm_stat,
-						 tool);
-
-	if (skip_sample(kvm, sample))
-		return 0;
-
-	thread = machine__findnew_thread(machine, sample->pid, sample->tid);
-	if (thread == NULL) {
-		pr_debug("problem processing %d event, skipping it.\n",
-			event->header.type);
-		return -1;
-	}
-
-	if (!handle_kvm_event(kvm, thread, evsel, sample))
-		return -1;
-
-	return 0;
-}
-
-static int cpu_isa_config(struct perf_kvm_stat *kvm)
-{
-	char buf[64], *cpuid;
-	int err, isa;
-
-	if (kvm->live) {
-		err = get_cpuid(buf, sizeof(buf));
-		if (err != 0) {
-			pr_err("Failed to look up CPU type (Intel or AMD)\n");
-			return err;
-		}
-		cpuid = buf;
-	} else
-		cpuid = kvm->session->header.env.cpuid;
-
-	if (strstr(cpuid, "Intel"))
-		isa = 1;
-	else if (strstr(cpuid, "AMD"))
-		isa = 0;
-	else {
-		pr_err("CPU %s is not supported.\n", cpuid);
-		return -ENOTSUP;
-	}
-
-	if (isa == 1) {
-		kvm->exit_reasons = vmx_exit_reasons;
-		kvm->exit_reasons_size = ARRAY_SIZE(vmx_exit_reasons);
-		kvm->exit_reasons_isa = "VMX";
-	}
-
-	return 0;
-}
-
-static bool verify_vcpu(int vcpu)
-{
-	if (vcpu != -1 && vcpu < 0) {
-		pr_err("Invalid vcpu:%d.\n", vcpu);
-		return false;
-	}
-
-	return true;
-}
-
-/* keeping the max events to a modest level to keep
- * the processing of samples per mmap smooth.
- */
-#define PERF_KVM__MAX_EVENTS_PER_MMAP  25
-
-static s64 perf_kvm__mmap_read_idx(struct perf_kvm_stat *kvm, int idx,
-				   u64 *mmap_time)
-{
-	union perf_event *event;
-	struct perf_sample sample;
-	s64 n = 0;
-	int err;
-
-	*mmap_time = ULLONG_MAX;
-	while ((event = perf_evlist__mmap_read(kvm->evlist, idx)) != NULL) {
-		err = perf_evlist__parse_sample(kvm->evlist, event, &sample);
-		if (err) {
-			perf_evlist__mmap_consume(kvm->evlist, idx);
-			pr_err("Failed to parse sample\n");
-			return -1;
-		}
-
-		err = perf_session_queue_event(kvm->session, event, &sample, 0);
-		/*
-		 * FIXME: Here we can't consume the event, as perf_session_queue_event will
-		 *        point to it, and it'll get possibly overwritten by the kernel.
-		 */
-		perf_evlist__mmap_consume(kvm->evlist, idx);
-
-		if (err) {
-			pr_err("Failed to enqueue sample: %d\n", err);
-			return -1;
-		}
-
-		/* save time stamp of our first sample for this mmap */
-		if (n == 0)
-			*mmap_time = sample.time;
-
-		/* limit events per mmap handled all at once */
-		n++;
-		if (n == PERF_KVM__MAX_EVENTS_PER_MMAP)
-			break;
-	}
-
-	return n;
-}
-
-static int perf_kvm__mmap_read(struct perf_kvm_stat *kvm)
-{
-	int i, err, throttled = 0;
-	s64 n, ntotal = 0;
-	u64 flush_time = ULLONG_MAX, mmap_time;
-
-	for (i = 0; i < kvm->evlist->nr_mmaps; i++) {
-		n = perf_kvm__mmap_read_idx(kvm, i, &mmap_time);
-		if (n < 0)
-			return -1;
-
-		/* flush time is going to be the minimum of all the individual
-		 * mmap times. Essentially, we flush all the samples queued up
-		 * from the last pass under our minimal start time -- that leaves
-		 * a very small race for samples to come in with a lower timestamp.
-		 * The ioctl to return the perf_clock timestamp should close the
-		 * race entirely.
-		 */
-		if (mmap_time < flush_time)
-			flush_time = mmap_time;
-
-		ntotal += n;
-		if (n == PERF_KVM__MAX_EVENTS_PER_MMAP)
-			throttled = 1;
-	}
-
-	/* flush queue after each round in which we processed events */
-	if (ntotal) {
-		kvm->session->ordered_samples.next_flush = flush_time;
-		err = kvm->tool.finished_round(&kvm->tool, NULL, kvm->session);
-		if (err) {
-			if (kvm->lost_events)
-				pr_info("\nLost events: %" PRIu64 "\n\n",
-					kvm->lost_events);
-			return err;
-		}
-	}
-
-	return throttled;
-}
-
-static volatile int done;
-
-static void sig_handler(int sig __maybe_unused)
-{
-	done = 1;
-}
-
-static int perf_kvm__timerfd_create(struct perf_kvm_stat *kvm)
-{
-	struct itimerspec new_value;
-	int rc = -1;
-
-	kvm->timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK);
-	if (kvm->timerfd < 0) {
-		pr_err("timerfd_create failed\n");
-		goto out;
-	}
-
-	new_value.it_value.tv_sec = kvm->display_time;
-	new_value.it_value.tv_nsec = 0;
-	new_value.it_interval.tv_sec = kvm->display_time;
-	new_value.it_interval.tv_nsec = 0;
-
-	if (timerfd_settime(kvm->timerfd, 0, &new_value, NULL) != 0) {
-		pr_err("timerfd_settime failed: %d\n", errno);
-		close(kvm->timerfd);
-		goto out;
-	}
-
-	rc = 0;
-out:
-	return rc;
-}
-
-static int perf_kvm__handle_timerfd(struct perf_kvm_stat *kvm)
-{
-	uint64_t c;
-	int rc;
-
-	rc = read(kvm->timerfd, &c, sizeof(uint64_t));
-	if (rc < 0) {
-		if (errno == EAGAIN)
-			return 0;
-
-		pr_err("Failed to read timer fd: %d\n", errno);
-		return -1;
-	}
-
-	if (rc != sizeof(uint64_t)) {
-		pr_err("Error reading timer fd - invalid size returned\n");
-		return -1;
-	}
-
-	if (c != 1)
-		pr_debug("Missed timer beats: %" PRIu64 "\n", c-1);
-
-	/* update display */
-	sort_result(kvm);
-	print_result(kvm);
-
-	/* reset counts */
-	clear_events_cache_stats(kvm->kvm_events_cache);
-	kvm->total_count = 0;
-	kvm->total_time = 0;
-	kvm->lost_events = 0;
-
-	return 0;
-}
-
-static int fd_set_nonblock(int fd)
-{
-	long arg = 0;
-
-	arg = fcntl(fd, F_GETFL);
-	if (arg < 0) {
-		pr_err("Failed to get current flags for fd %d\n", fd);
-		return -1;
-	}
-
-	if (fcntl(fd, F_SETFL, arg | O_NONBLOCK) < 0) {
-		pr_err("Failed to set non-block option on fd %d\n", fd);
-		return -1;
-	}
-
-	return 0;
-}
-
-static
-int perf_kvm__handle_stdin(struct termios *tc_now, struct termios *tc_save)
-{
-	int c;
-
-	tcsetattr(0, TCSANOW, tc_now);
-	c = getc(stdin);
-	tcsetattr(0, TCSAFLUSH, tc_save);
-
-	if (c == 'q')
-		return 1;
-
-	return 0;
-}
-
-static int kvm_events_live_report(struct perf_kvm_stat *kvm)
-{
-	struct pollfd *pollfds = NULL;
-	int nr_fds, nr_stdin, ret, err = -EINVAL;
-	struct termios tc, save;
-
-	/* live flag must be set first */
-	kvm->live = true;
-
-	ret = cpu_isa_config(kvm);
-	if (ret < 0)
-		return ret;
-
-	if (!verify_vcpu(kvm->trace_vcpu) ||
-	    !select_key(kvm) ||
-	    !register_kvm_events_ops(kvm)) {
-		goto out;
-	}
-
-	init_kvm_event_record(kvm);
-
-	tcgetattr(0, &save);
-	tc = save;
-	tc.c_lflag &= ~(ICANON | ECHO);
-	tc.c_cc[VMIN] = 0;
-	tc.c_cc[VTIME] = 0;
-
-	signal(SIGINT, sig_handler);
-	signal(SIGTERM, sig_handler);
-
-	/* copy pollfds -- need to add timerfd and stdin */
-	nr_fds = kvm->evlist->nr_fds;
-	pollfds = zalloc(sizeof(struct pollfd) * (nr_fds + 2));
-	if (!pollfds) {
-		err = -ENOMEM;
-		goto out;
-	}
-	memcpy(pollfds, kvm->evlist->pollfd,
-		sizeof(struct pollfd) * kvm->evlist->nr_fds);
-
-	/* add timer fd */
-	if (perf_kvm__timerfd_create(kvm) < 0) {
-		err = -1;
-		goto out;
-	}
-
-	pollfds[nr_fds].fd = kvm->timerfd;
-	pollfds[nr_fds].events = POLLIN;
-	nr_fds++;
-
-	pollfds[nr_fds].fd = fileno(stdin);
-	pollfds[nr_fds].events = POLLIN;
-	nr_stdin = nr_fds;
-	nr_fds++;
-	if (fd_set_nonblock(fileno(stdin)) != 0)
-		goto out;
-
-	/* everything is good - enable the events and process */
-	perf_evlist__enable(kvm->evlist);
-
-	while (!done) {
-		int rc;
-
-		rc = perf_kvm__mmap_read(kvm);
-		if (rc < 0)
-			break;
-
-		err = perf_kvm__handle_timerfd(kvm);
-		if (err)
-			goto out;
-
-		if (pollfds[nr_stdin].revents & POLLIN)
-			done = perf_kvm__handle_stdin(&tc, &save);
-
-		if (!rc && !done)
-			err = poll(pollfds, nr_fds, 100);
-	}
-
-	perf_evlist__disable(kvm->evlist);
-
-	if (err == 0) {
-		sort_result(kvm);
-		print_result(kvm);
-	}
-
-out:
-	if (kvm->timerfd >= 0)
-		close(kvm->timerfd);
-
-	if (pollfds)
-		free(pollfds);
-
-	return err;
-}
-
-static int kvm_live_open_events(struct perf_kvm_stat *kvm)
-{
-	int err, rc = -1;
-	struct perf_evsel *pos;
-	struct perf_evlist *evlist = kvm->evlist;
-
-	perf_evlist__config(evlist, &kvm->opts);
-
-	/*
-	 * Note: exclude_{guest,host} do not apply here.
-	 *       This command processes KVM tracepoints from host only
-	 */
-	list_for_each_entry(pos, &evlist->entries, node) {
-		struct perf_event_attr *attr = &pos->attr;
-
-		/* make sure these *are* set */
-		perf_evsel__set_sample_bit(pos, TID);
-		perf_evsel__set_sample_bit(pos, TIME);
-		perf_evsel__set_sample_bit(pos, CPU);
-		perf_evsel__set_sample_bit(pos, RAW);
-		/* make sure these are *not*; want as small a sample as possible */
-		perf_evsel__reset_sample_bit(pos, PERIOD);
-		perf_evsel__reset_sample_bit(pos, IP);
-		perf_evsel__reset_sample_bit(pos, CALLCHAIN);
-		perf_evsel__reset_sample_bit(pos, ADDR);
-		perf_evsel__reset_sample_bit(pos, READ);
-		attr->mmap = 0;
-		attr->comm = 0;
-		attr->task = 0;
-
-		attr->sample_period = 1;
-
-		attr->watermark = 0;
-		attr->wakeup_events = 1000;
-
-		/* will enable all once we are ready */
-		attr->disabled = 1;
-	}
-
-	err = perf_evlist__open(evlist);
-	if (err < 0) {
-		printf("Couldn't create the events: %s\n", strerror(errno));
-		goto out;
-	}
-
-	if (perf_evlist__mmap(evlist, kvm->opts.mmap_pages, false) < 0) {
-		ui__error("Failed to mmap the events: %s\n", strerror(errno));
-		perf_evlist__close(evlist);
-		goto out;
-	}
-
-	rc = 0;
-
-out:
-	return rc;
-}
-
-static int read_events(struct perf_kvm_stat *kvm)
-{
-	int ret;
-
-	struct perf_tool eops = {
-		.sample			= process_sample_event,
-		.comm			= perf_event__process_comm,
-		.ordered_samples	= true,
-	};
-
-	kvm->tool = eops;
-	kvm->session = perf_session__new(kvm->file_name, O_RDONLY, 0, false,
-					 &kvm->tool);
-	if (!kvm->session) {
-		pr_err("Initializing perf session failed\n");
-		return -EINVAL;
-	}
-
-	if (!perf_session__has_traces(kvm->session, "kvm record"))
-		return -EINVAL;
-
-	/*
-	 * Do not use 'isa' recorded in kvm_exit tracepoint since it is not
-	 * traced in the old kernel.
-	 */
-	ret = cpu_isa_config(kvm);
-	if (ret < 0)
-		return ret;
-
-	return perf_session__process_events(kvm->session, &kvm->tool);
-}
-
-static int parse_target_str(struct perf_kvm_stat *kvm)
-{
-	if (kvm->pid_str) {
-		kvm->pid_list = intlist__new(kvm->pid_str);
-		if (kvm->pid_list == NULL) {
-			pr_err("Error parsing process id string\n");
-			return -EINVAL;
-		}
-	}
-
-	return 0;
-}
-
-static int kvm_events_report_vcpu(struct perf_kvm_stat *kvm)
-{
-	int ret = -EINVAL;
-	int vcpu = kvm->trace_vcpu;
-
-	if (parse_target_str(kvm) != 0)
-		goto exit;
-
-	if (!verify_vcpu(vcpu))
-		goto exit;
-
-	if (!select_key(kvm))
-		goto exit;
-
-	if (!register_kvm_events_ops(kvm))
-		goto exit;
-
-	init_kvm_event_record(kvm);
-	setup_pager();
-
-	ret = read_events(kvm);
-	if (ret)
-		goto exit;
-
-	sort_result(kvm);
-	print_result(kvm);
-
-exit:
-	return ret;
-}
-
-static const char * const kvm_events_tp[] = {
-	"kvm:kvm_entry",
-	"kvm:kvm_exit",
-	"kvm:kvm_mmio",
-	"kvm:kvm_pio",
-};
-
-#define STRDUP_FAIL_EXIT(s)		\
-	({	char *_p;		\
-	_p = strdup(s);		\
-		if (!_p)		\
-			return -ENOMEM;	\
-		_p;			\
-	})
-
-static int
-kvm_events_record(struct perf_kvm_stat *kvm, int argc, const char **argv)
-{
-	unsigned int rec_argc, i, j;
-	const char **rec_argv;
-	const char * const record_args[] = {
-		"record",
-		"-R",
-		"-m", "1024",
-		"-c", "1",
-	};
-
-	rec_argc = ARRAY_SIZE(record_args) + argc + 2 +
-		   2 * ARRAY_SIZE(kvm_events_tp);
-	rec_argv = calloc(rec_argc + 1, sizeof(char *));
-
-	if (rec_argv == NULL)
-		return -ENOMEM;
-
-	for (i = 0; i < ARRAY_SIZE(record_args); i++)
-		rec_argv[i] = STRDUP_FAIL_EXIT(record_args[i]);
-
-	for (j = 0; j < ARRAY_SIZE(kvm_events_tp); j++) {
-		rec_argv[i++] = "-e";
-		rec_argv[i++] = STRDUP_FAIL_EXIT(kvm_events_tp[j]);
-	}
-
-	rec_argv[i++] = STRDUP_FAIL_EXIT("-o");
-	rec_argv[i++] = STRDUP_FAIL_EXIT(kvm->file_name);
-
-	for (j = 1; j < (unsigned int)argc; j++, i++)
-		rec_argv[i] = argv[j];
-
-	return cmd_record(i, rec_argv, NULL);
-}
-
-static int
-kvm_events_report(struct perf_kvm_stat *kvm, int argc, const char **argv)
-{
-	const struct option kvm_events_report_options[] = {
-		OPT_STRING(0, "event", &kvm->report_event, "report event",
-			    "event for reporting: vmexit, mmio, ioport"),
-		OPT_INTEGER(0, "vcpu", &kvm->trace_vcpu,
-			    "vcpu id to report"),
-		OPT_STRING('k', "key", &kvm->sort_key, "sort-key",
-			    "key for sorting: sample(sort by samples number)"
-			    " time (sort by avg time)"),
-		OPT_STRING('p', "pid", &kvm->pid_str, "pid",
-			   "analyze events only for given process id(s)"),
-		OPT_END()
-	};
-
-	const char * const kvm_events_report_usage[] = {
-		"perf kvm stat report [<options>]",
-		NULL
-	};
-
-	symbol__init();
-
-	if (argc) {
-		argc = parse_options(argc, argv,
-				     kvm_events_report_options,
-				     kvm_events_report_usage, 0);
-		if (argc)
-			usage_with_options(kvm_events_report_usage,
-					   kvm_events_report_options);
-	}
-
-	return kvm_events_report_vcpu(kvm);
-}
-
-static struct perf_evlist *kvm_live_event_list(void)
-{
-	struct perf_evlist *evlist;
-	char *tp, *name, *sys;
-	unsigned int j;
-	int err = -1;
-
-	evlist = perf_evlist__new();
-	if (evlist == NULL)
-		return NULL;
-
-	for (j = 0; j < ARRAY_SIZE(kvm_events_tp); j++) {
-
-		tp = strdup(kvm_events_tp[j]);
-		if (tp == NULL)
-			goto out;
-
-		/* split tracepoint into subsystem and name */
-		sys = tp;
-		name = strchr(tp, ':');
-		if (name == NULL) {
-			pr_err("Error parsing %s tracepoint: subsystem delimiter not found\n",
-				kvm_events_tp[j]);
-			free(tp);
-			goto out;
-		}
-		*name = '\0';
-		name++;
-
-		if (perf_evlist__add_newtp(evlist, sys, name, NULL)) {
-			pr_err("Failed to add %s tracepoint to the list\n", kvm_events_tp[j]);
-			free(tp);
-			goto out;
-		}
-
-		free(tp);
-	}
-
-	err = 0;
-
-out:
-	if (err) {
-		perf_evlist__delete(evlist);
-		evlist = NULL;
-	}
-
-	return evlist;
-}
-
-static int kvm_events_live(struct perf_kvm_stat *kvm,
-			   int argc, const char **argv)
-{
-	char errbuf[BUFSIZ];
-	int err;
-
-	const struct option live_options[] = {
-		OPT_STRING('p', "pid", &kvm->opts.target.pid, "pid",
-			"record events on existing process id"),
-		OPT_UINTEGER('m', "mmap-pages", &kvm->opts.mmap_pages,
-			"number of mmap data pages"),
-		OPT_INCR('v', "verbose", &verbose,
-			"be more verbose (show counter open errors, etc)"),
-		OPT_BOOLEAN('a', "all-cpus", &kvm->opts.target.system_wide,
-			"system-wide collection from all CPUs"),
-		OPT_UINTEGER('d', "display", &kvm->display_time,
-			"time in seconds between display updates"),
-		OPT_STRING(0, "event", &kvm->report_event, "report event",
-			"event for reporting: vmexit, mmio, ioport"),
-		OPT_INTEGER(0, "vcpu", &kvm->trace_vcpu,
-			"vcpu id to report"),
-		OPT_STRING('k', "key", &kvm->sort_key, "sort-key",
-			"key for sorting: sample(sort by samples number)"
-			" time (sort by avg time)"),
-		OPT_U64(0, "duration", &kvm->duration,
-		    "show events other than HALT that take longer than duration usecs"),
-		OPT_END()
-	};
-	const char * const live_usage[] = {
-		"perf kvm stat live [<options>]",
-		NULL
-	};
-
-
-	/* event handling */
-	kvm->tool.sample = process_sample_event;
-	kvm->tool.comm   = perf_event__process_comm;
-	kvm->tool.exit   = perf_event__process_exit;
-	kvm->tool.fork   = perf_event__process_fork;
-	kvm->tool.lost   = process_lost_event;
-	kvm->tool.ordered_samples = true;
-	perf_tool__fill_defaults(&kvm->tool);
-
-	/* set defaults */
-	kvm->display_time = 1;
-	kvm->opts.user_interval = 1;
-	kvm->opts.mmap_pages = 512;
-	kvm->opts.target.uses_mmap = false;
-	kvm->opts.target.uid_str = NULL;
-	kvm->opts.target.uid = UINT_MAX;
-
-	symbol__init();
-	disable_buildid_cache();
-
-	use_browser = 0;
-	setup_browser(false);
-
-	if (argc) {
-		argc = parse_options(argc, argv, live_options,
-				     live_usage, 0);
-		if (argc)
-			usage_with_options(live_usage, live_options);
-	}
-
-	kvm->duration *= NSEC_PER_USEC;   /* convert usec to nsec */
-
-	/*
-	 * target related setups
-	 */
-	err = perf_target__validate(&kvm->opts.target);
-	if (err) {
-		perf_target__strerror(&kvm->opts.target, err, errbuf, BUFSIZ);
-		ui__warning("%s", errbuf);
-	}
-
-	if (perf_target__none(&kvm->opts.target))
-		kvm->opts.target.system_wide = true;
-
-
-	/*
-	 * generate the event list
-	 */
-	kvm->evlist = kvm_live_event_list();
-	if (kvm->evlist == NULL) {
-		err = -1;
-		goto out;
-	}
-
-	symbol_conf.nr_events = kvm->evlist->nr_entries;
-
-	if (perf_evlist__create_maps(kvm->evlist, &kvm->opts.target) < 0)
-		usage_with_options(live_usage, live_options);
-
-	/*
-	 * perf session
-	 */
-	kvm->session = perf_session__new(NULL, O_WRONLY, false, false, &kvm->tool);
-	if (kvm->session == NULL) {
-		err = -ENOMEM;
-		goto out;
-	}
-	kvm->session->evlist = kvm->evlist;
-	perf_session__set_id_hdr_size(kvm->session);
-
-
-	if (perf_target__has_task(&kvm->opts.target))
-		perf_event__synthesize_thread_map(&kvm->tool,
-						  kvm->evlist->threads,
-						  perf_event__process,
-						  &kvm->session->machines.host);
-	else
-		perf_event__synthesize_threads(&kvm->tool, perf_event__process,
-					       &kvm->session->machines.host);
-
-
-	err = kvm_live_open_events(kvm);
-	if (err)
-		goto out;
-
-	err = kvm_events_live_report(kvm);
-
-out:
-	exit_browser(0);
-
-	if (kvm->session)
-		perf_session__delete(kvm->session);
-	kvm->session = NULL;
-	if (kvm->evlist) {
-		perf_evlist__delete_maps(kvm->evlist);
-		perf_evlist__delete(kvm->evlist);
-	}
-
-	return err;
-}
-
-static void print_kvm_stat_usage(void)
-{
-	printf("Usage: perf kvm stat <command>\n\n");
-
-	printf("# Available commands:\n");
-	printf("\trecord: record kvm events\n");
-	printf("\treport: report statistical data of kvm events\n");
-	printf("\tlive:   live reporting of statistical data of kvm events\n");
-
-	printf("\nOtherwise, it is the alias of 'perf stat':\n");
-}
-
-static int kvm_cmd_stat(const char *file_name, int argc, const char **argv)
-{
-	struct perf_kvm_stat kvm = {
-		.file_name = file_name,
-
-		.trace_vcpu	= -1,
-		.report_event	= "vmexit",
-		.sort_key	= "sample",
-
-		.exit_reasons = svm_exit_reasons,
-		.exit_reasons_size = ARRAY_SIZE(svm_exit_reasons),
-		.exit_reasons_isa = "SVM",
-	};
-
-	if (argc == 1) {
-		print_kvm_stat_usage();
-		goto perf_stat;
-	}
-
-	if (!strncmp(argv[1], "rec", 3))
-		return kvm_events_record(&kvm, argc - 1, argv + 1);
-
-	if (!strncmp(argv[1], "rep", 3))
-		return kvm_events_report(&kvm, argc - 1 , argv + 1);
-
-	if (!strncmp(argv[1], "live", 4))
-		return kvm_events_live(&kvm, argc - 1 , argv + 1);
-
-perf_stat:
-	return cmd_stat(argc, argv, NULL);
-}
-#endif
-
-static int __cmd_record(const char *file_name, int argc, const char **argv)
-{
-	int rec_argc, i = 0, j;
-	const char **rec_argv;
-
-	rec_argc = argc + 2;
-	rec_argv = calloc(rec_argc + 1, sizeof(char *));
-	rec_argv[i++] = strdup("record");
-	rec_argv[i++] = strdup("-o");
-	rec_argv[i++] = strdup(file_name);
-	for (j = 1; j < argc; j++, i++)
-		rec_argv[i] = argv[j];
-
-	BUG_ON(i != rec_argc);
-
-	return cmd_record(i, rec_argv, NULL);
-}
-
-static int __cmd_report(const char *file_name, int argc, const char **argv)
-{
-	int rec_argc, i = 0, j;
-	const char **rec_argv;
-
-	rec_argc = argc + 2;
-	rec_argv = calloc(rec_argc + 1, sizeof(char *));
-	rec_argv[i++] = strdup("report");
-	rec_argv[i++] = strdup("-i");
-	rec_argv[i++] = strdup(file_name);
-	for (j = 1; j < argc; j++, i++)
-		rec_argv[i] = argv[j];
-
-	BUG_ON(i != rec_argc);
-
-	return cmd_report(i, rec_argv, NULL);
-}
-
-static int
-__cmd_buildid_list(const char *file_name, int argc, const char **argv)
-{
-	int rec_argc, i = 0, j;
-	const char **rec_argv;
-
-	rec_argc = argc + 2;
-	rec_argv = calloc(rec_argc + 1, sizeof(char *));
-	rec_argv[i++] = strdup("buildid-list");
-	rec_argv[i++] = strdup("-i");
-	rec_argv[i++] = strdup(file_name);
-	for (j = 1; j < argc; j++, i++)
-		rec_argv[i] = argv[j];
-
-	BUG_ON(i != rec_argc);
-
-	return cmd_buildid_list(i, rec_argv, NULL);
-}
-
-int cmd_kvm(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	const char *file_name = NULL;
-	const struct option kvm_options[] = {
-		OPT_STRING('i', "input", &file_name, "file",
-			   "Input file name"),
-		OPT_STRING('o', "output", &file_name, "file",
-			   "Output file name"),
-		OPT_BOOLEAN(0, "guest", &perf_guest,
-			    "Collect guest os data"),
-		OPT_BOOLEAN(0, "host", &perf_host,
-			    "Collect host os data"),
-		OPT_STRING(0, "guestmount", &symbol_conf.guestmount, "directory",
-			   "guest mount directory under which every guest os"
-			   " instance has a subdir"),
-		OPT_STRING(0, "guestvmlinux", &symbol_conf.default_guest_vmlinux_name,
-			   "file", "file saving guest os vmlinux"),
-		OPT_STRING(0, "guestkallsyms", &symbol_conf.default_guest_kallsyms,
-			   "file", "file saving guest os /proc/kallsyms"),
-		OPT_STRING(0, "guestmodules", &symbol_conf.default_guest_modules,
-			   "file", "file saving guest os /proc/modules"),
-		OPT_END()
-	};
-
-
-	const char * const kvm_usage[] = {
-		"perf kvm [<options>] {top|record|report|diff|buildid-list|stat}",
-		NULL
-	};
-
-	perf_host  = 0;
-	perf_guest = 1;
-
-	argc = parse_options(argc, argv, kvm_options, kvm_usage,
-			PARSE_OPT_STOP_AT_NON_OPTION);
-	if (!argc)
-		usage_with_options(kvm_usage, kvm_options);
-
-	if (!perf_host)
-		perf_guest = 1;
-
-	if (!file_name) {
-		if (perf_host && !perf_guest)
-			file_name = strdup("perf.data.host");
-		else if (!perf_host && perf_guest)
-			file_name = strdup("perf.data.guest");
-		else
-			file_name = strdup("perf.data.kvm");
-
-		if (!file_name) {
-			pr_err("Failed to allocate memory for filename\n");
-			return -ENOMEM;
-		}
-	}
-
-	if (!strncmp(argv[0], "rec", 3))
-		return __cmd_record(file_name, argc, argv);
-	else if (!strncmp(argv[0], "rep", 3))
-		return __cmd_report(file_name, argc, argv);
-	else if (!strncmp(argv[0], "diff", 4))
-		return cmd_diff(argc, argv, NULL);
-	else if (!strncmp(argv[0], "top", 3))
-		return cmd_top(argc, argv, NULL);
-	else if (!strncmp(argv[0], "buildid-list", 12))
-		return __cmd_buildid_list(file_name, argc, argv);
-#if defined(__i386__) || defined(__x86_64__)
-	else if (!strncmp(argv[0], "stat", 4))
-		return kvm_cmd_stat(file_name, argc, argv);
-#endif
-	else
-		usage_with_options(kvm_usage, kvm_options);
-
-	return 0;
-}
diff --git a/src/tools/perf/builtin-list.c b/src/tools/perf/builtin-list.c
deleted file mode 100644
index e79f423..0000000
--- a/src/tools/perf/builtin-list.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * builtin-list.c
- *
- * Builtin list command: list all event types
- *
- * Copyright (C) 2009, Thomas Gleixner <tglx@linutronix.de>
- * Copyright (C) 2008-2009, Red Hat Inc, Ingo Molnar <mingo@redhat.com>
- * Copyright (C) 2011, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
- */
-#include "builtin.h"
-
-#include "perf.h"
-
-#include "util/parse-events.h"
-#include "util/cache.h"
-#include "util/pmu.h"
-
-int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	setup_pager();
-
-	if (argc == 1)
-		print_events(NULL, false);
-	else {
-		int i;
-
-		for (i = 1; i < argc; ++i) {
-			if (i > 2)
-				putchar('\n');
-			if (strncmp(argv[i], "tracepoint", 10) == 0)
-				print_tracepoint_events(NULL, NULL, false);
-			else if (strcmp(argv[i], "hw") == 0 ||
-				 strcmp(argv[i], "hardware") == 0)
-				print_events_type(PERF_TYPE_HARDWARE);
-			else if (strcmp(argv[i], "sw") == 0 ||
-				 strcmp(argv[i], "software") == 0)
-				print_events_type(PERF_TYPE_SOFTWARE);
-			else if (strcmp(argv[i], "cache") == 0 ||
-				 strcmp(argv[i], "hwcache") == 0)
-				print_hwcache_events(NULL, false);
-			else if (strcmp(argv[i], "pmu") == 0)
-				print_pmu_events(NULL, false);
-			else if (strcmp(argv[i], "--raw-dump") == 0)
-				print_events(NULL, true);
-			else {
-				char *sep = strchr(argv[i], ':'), *s;
-				int sep_idx;
-
-				if (sep == NULL) {
-					print_events(argv[i], false);
-					continue;
-				}
-				sep_idx = sep - argv[i];
-				s = strdup(argv[i]);
-				if (s == NULL)
-					return -1;
-
-				s[sep_idx] = '\0';
-				print_tracepoint_events(s, s + sep_idx + 1, false);
-				free(s);
-			}
-		}
-	}
-	return 0;
-}
diff --git a/src/tools/perf/builtin-lock.c b/src/tools/perf/builtin-lock.c
deleted file mode 100644
index ee33ba2..0000000
--- a/src/tools/perf/builtin-lock.c
+++ /dev/null
@@ -1,998 +0,0 @@
-#include "builtin.h"
-#include "perf.h"
-
-#include "util/evlist.h"
-#include "util/evsel.h"
-#include "util/util.h"
-#include "util/cache.h"
-#include "util/symbol.h"
-#include "util/thread.h"
-#include "util/header.h"
-
-#include "util/parse-options.h"
-#include "util/trace-event.h"
-
-#include "util/debug.h"
-#include "util/session.h"
-#include "util/tool.h"
-
-#include <sys/types.h>
-#include <sys/prctl.h>
-#include <semaphore.h>
-#include <pthread.h>
-#include <math.h>
-#include <limits.h>
-
-#include <linux/list.h>
-#include <linux/hash.h>
-
-static struct perf_session *session;
-
-/* based on kernel/lockdep.c */
-#define LOCKHASH_BITS		12
-#define LOCKHASH_SIZE		(1UL << LOCKHASH_BITS)
-
-static struct list_head lockhash_table[LOCKHASH_SIZE];
-
-#define __lockhashfn(key)	hash_long((unsigned long)key, LOCKHASH_BITS)
-#define lockhashentry(key)	(lockhash_table + __lockhashfn((key)))
-
-struct lock_stat {
-	struct list_head	hash_entry;
-	struct rb_node		rb;		/* used for sorting */
-
-	/*
-	 * FIXME: perf_evsel__intval() returns u64,
-	 * so address of lockdep_map should be dealed as 64bit.
-	 * Is there more better solution?
-	 */
-	void			*addr;		/* address of lockdep_map, used as ID */
-	char			*name;		/* for strcpy(), we cannot use const */
-
-	unsigned int		nr_acquire;
-	unsigned int		nr_acquired;
-	unsigned int		nr_contended;
-	unsigned int		nr_release;
-
-	unsigned int		nr_readlock;
-	unsigned int		nr_trylock;
-	/* these times are in nano sec. */
-	u64			wait_time_total;
-	u64			wait_time_min;
-	u64			wait_time_max;
-
-	int			discard; /* flag of blacklist */
-};
-
-/*
- * States of lock_seq_stat
- *
- * UNINITIALIZED is required for detecting first event of acquire.
- * As the nature of lock events, there is no guarantee
- * that the first event for the locks are acquire,
- * it can be acquired, contended or release.
- */
-#define SEQ_STATE_UNINITIALIZED      0	       /* initial state */
-#define SEQ_STATE_RELEASED	1
-#define SEQ_STATE_ACQUIRING	2
-#define SEQ_STATE_ACQUIRED	3
-#define SEQ_STATE_READ_ACQUIRED	4
-#define SEQ_STATE_CONTENDED	5
-
-/*
- * MAX_LOCK_DEPTH
- * Imported from include/linux/sched.h.
- * Should this be synchronized?
- */
-#define MAX_LOCK_DEPTH 48
-
-/*
- * struct lock_seq_stat:
- * Place to put on state of one lock sequence
- * 1) acquire -> acquired -> release
- * 2) acquire -> contended -> acquired -> release
- * 3) acquire (with read or try) -> release
- * 4) Are there other patterns?
- */
-struct lock_seq_stat {
-	struct list_head        list;
-	int			state;
-	u64			prev_event_time;
-	void                    *addr;
-
-	int                     read_count;
-};
-
-struct thread_stat {
-	struct rb_node		rb;
-
-	u32                     tid;
-	struct list_head        seq_list;
-};
-
-static struct rb_root		thread_stats;
-
-static struct thread_stat *thread_stat_find(u32 tid)
-{
-	struct rb_node *node;
-	struct thread_stat *st;
-
-	node = thread_stats.rb_node;
-	while (node) {
-		st = container_of(node, struct thread_stat, rb);
-		if (st->tid == tid)
-			return st;
-		else if (tid < st->tid)
-			node = node->rb_left;
-		else
-			node = node->rb_right;
-	}
-
-	return NULL;
-}
-
-static void thread_stat_insert(struct thread_stat *new)
-{
-	struct rb_node **rb = &thread_stats.rb_node;
-	struct rb_node *parent = NULL;
-	struct thread_stat *p;
-
-	while (*rb) {
-		p = container_of(*rb, struct thread_stat, rb);
-		parent = *rb;
-
-		if (new->tid < p->tid)
-			rb = &(*rb)->rb_left;
-		else if (new->tid > p->tid)
-			rb = &(*rb)->rb_right;
-		else
-			BUG_ON("inserting invalid thread_stat\n");
-	}
-
-	rb_link_node(&new->rb, parent, rb);
-	rb_insert_color(&new->rb, &thread_stats);
-}
-
-static struct thread_stat *thread_stat_findnew_after_first(u32 tid)
-{
-	struct thread_stat *st;
-
-	st = thread_stat_find(tid);
-	if (st)
-		return st;
-
-	st = zalloc(sizeof(struct thread_stat));
-	if (!st) {
-		pr_err("memory allocation failed\n");
-		return NULL;
-	}
-
-	st->tid = tid;
-	INIT_LIST_HEAD(&st->seq_list);
-
-	thread_stat_insert(st);
-
-	return st;
-}
-
-static struct thread_stat *thread_stat_findnew_first(u32 tid);
-static struct thread_stat *(*thread_stat_findnew)(u32 tid) =
-	thread_stat_findnew_first;
-
-static struct thread_stat *thread_stat_findnew_first(u32 tid)
-{
-	struct thread_stat *st;
-
-	st = zalloc(sizeof(struct thread_stat));
-	if (!st) {
-		pr_err("memory allocation failed\n");
-		return NULL;
-	}
-	st->tid = tid;
-	INIT_LIST_HEAD(&st->seq_list);
-
-	rb_link_node(&st->rb, NULL, &thread_stats.rb_node);
-	rb_insert_color(&st->rb, &thread_stats);
-
-	thread_stat_findnew = thread_stat_findnew_after_first;
-	return st;
-}
-
-/* build simple key function one is bigger than two */
-#define SINGLE_KEY(member)						\
-	static int lock_stat_key_ ## member(struct lock_stat *one,	\
-					 struct lock_stat *two)		\
-	{								\
-		return one->member > two->member;			\
-	}
-
-SINGLE_KEY(nr_acquired)
-SINGLE_KEY(nr_contended)
-SINGLE_KEY(wait_time_total)
-SINGLE_KEY(wait_time_max)
-
-static int lock_stat_key_wait_time_min(struct lock_stat *one,
-					struct lock_stat *two)
-{
-	u64 s1 = one->wait_time_min;
-	u64 s2 = two->wait_time_min;
-	if (s1 == ULLONG_MAX)
-		s1 = 0;
-	if (s2 == ULLONG_MAX)
-		s2 = 0;
-	return s1 > s2;
-}
-
-struct lock_key {
-	/*
-	 * name: the value for specify by user
-	 * this should be simpler than raw name of member
-	 * e.g. nr_acquired -> acquired, wait_time_total -> wait_total
-	 */
-	const char		*name;
-	int			(*key)(struct lock_stat*, struct lock_stat*);
-};
-
-static const char		*sort_key = "acquired";
-
-static int			(*compare)(struct lock_stat *, struct lock_stat *);
-
-static struct rb_root		result;	/* place to store sorted data */
-
-#define DEF_KEY_LOCK(name, fn_suffix)	\
-	{ #name, lock_stat_key_ ## fn_suffix }
-struct lock_key keys[] = {
-	DEF_KEY_LOCK(acquired, nr_acquired),
-	DEF_KEY_LOCK(contended, nr_contended),
-	DEF_KEY_LOCK(wait_total, wait_time_total),
-	DEF_KEY_LOCK(wait_min, wait_time_min),
-	DEF_KEY_LOCK(wait_max, wait_time_max),
-
-	/* extra comparisons much complicated should be here */
-
-	{ NULL, NULL }
-};
-
-static int select_key(void)
-{
-	int i;
-
-	for (i = 0; keys[i].name; i++) {
-		if (!strcmp(keys[i].name, sort_key)) {
-			compare = keys[i].key;
-			return 0;
-		}
-	}
-
-	pr_err("Unknown compare key: %s\n", sort_key);
-
-	return -1;
-}
-
-static void insert_to_result(struct lock_stat *st,
-			     int (*bigger)(struct lock_stat *, struct lock_stat *))
-{
-	struct rb_node **rb = &result.rb_node;
-	struct rb_node *parent = NULL;
-	struct lock_stat *p;
-
-	while (*rb) {
-		p = container_of(*rb, struct lock_stat, rb);
-		parent = *rb;
-
-		if (bigger(st, p))
-			rb = &(*rb)->rb_left;
-		else
-			rb = &(*rb)->rb_right;
-	}
-
-	rb_link_node(&st->rb, parent, rb);
-	rb_insert_color(&st->rb, &result);
-}
-
-/* returns left most element of result, and erase it */
-static struct lock_stat *pop_from_result(void)
-{
-	struct rb_node *node = result.rb_node;
-
-	if (!node)
-		return NULL;
-
-	while (node->rb_left)
-		node = node->rb_left;
-
-	rb_erase(node, &result);
-	return container_of(node, struct lock_stat, rb);
-}
-
-static struct lock_stat *lock_stat_findnew(void *addr, const char *name)
-{
-	struct list_head *entry = lockhashentry(addr);
-	struct lock_stat *ret, *new;
-
-	list_for_each_entry(ret, entry, hash_entry) {
-		if (ret->addr == addr)
-			return ret;
-	}
-
-	new = zalloc(sizeof(struct lock_stat));
-	if (!new)
-		goto alloc_failed;
-
-	new->addr = addr;
-	new->name = zalloc(sizeof(char) * strlen(name) + 1);
-	if (!new->name)
-		goto alloc_failed;
-	strcpy(new->name, name);
-
-	new->wait_time_min = ULLONG_MAX;
-
-	list_add(&new->hash_entry, entry);
-	return new;
-
-alloc_failed:
-	pr_err("memory allocation failed\n");
-	return NULL;
-}
-
-struct trace_lock_handler {
-	int (*acquire_event)(struct perf_evsel *evsel,
-			     struct perf_sample *sample);
-
-	int (*acquired_event)(struct perf_evsel *evsel,
-			      struct perf_sample *sample);
-
-	int (*contended_event)(struct perf_evsel *evsel,
-			       struct perf_sample *sample);
-
-	int (*release_event)(struct perf_evsel *evsel,
-			     struct perf_sample *sample);
-};
-
-static struct lock_seq_stat *get_seq(struct thread_stat *ts, void *addr)
-{
-	struct lock_seq_stat *seq;
-
-	list_for_each_entry(seq, &ts->seq_list, list) {
-		if (seq->addr == addr)
-			return seq;
-	}
-
-	seq = zalloc(sizeof(struct lock_seq_stat));
-	if (!seq) {
-		pr_err("memory allocation failed\n");
-		return NULL;
-	}
-	seq->state = SEQ_STATE_UNINITIALIZED;
-	seq->addr = addr;
-
-	list_add(&seq->list, &ts->seq_list);
-	return seq;
-}
-
-enum broken_state {
-	BROKEN_ACQUIRE,
-	BROKEN_ACQUIRED,
-	BROKEN_CONTENDED,
-	BROKEN_RELEASE,
-	BROKEN_MAX,
-};
-
-static int bad_hist[BROKEN_MAX];
-
-enum acquire_flags {
-	TRY_LOCK = 1,
-	READ_LOCK = 2,
-};
-
-static int report_lock_acquire_event(struct perf_evsel *evsel,
-				     struct perf_sample *sample)
-{
-	void *addr;
-	struct lock_stat *ls;
-	struct thread_stat *ts;
-	struct lock_seq_stat *seq;
-	const char *name = perf_evsel__strval(evsel, sample, "name");
-	u64 tmp = perf_evsel__intval(evsel, sample, "lockdep_addr");
-	int flag = perf_evsel__intval(evsel, sample, "flag");
-
-	memcpy(&addr, &tmp, sizeof(void *));
-
-	ls = lock_stat_findnew(addr, name);
-	if (!ls)
-		return -1;
-	if (ls->discard)
-		return 0;
-
-	ts = thread_stat_findnew(sample->tid);
-	if (!ts)
-		return -1;
-
-	seq = get_seq(ts, addr);
-	if (!seq)
-		return -1;
-
-	switch (seq->state) {
-	case SEQ_STATE_UNINITIALIZED:
-	case SEQ_STATE_RELEASED:
-		if (!flag) {
-			seq->state = SEQ_STATE_ACQUIRING;
-		} else {
-			if (flag & TRY_LOCK)
-				ls->nr_trylock++;
-			if (flag & READ_LOCK)
-				ls->nr_readlock++;
-			seq->state = SEQ_STATE_READ_ACQUIRED;
-			seq->read_count = 1;
-			ls->nr_acquired++;
-		}
-		break;
-	case SEQ_STATE_READ_ACQUIRED:
-		if (flag & READ_LOCK) {
-			seq->read_count++;
-			ls->nr_acquired++;
-			goto end;
-		} else {
-			goto broken;
-		}
-		break;
-	case SEQ_STATE_ACQUIRED:
-	case SEQ_STATE_ACQUIRING:
-	case SEQ_STATE_CONTENDED:
-broken:
-		/* broken lock sequence, discard it */
-		ls->discard = 1;
-		bad_hist[BROKEN_ACQUIRE]++;
-		list_del(&seq->list);
-		free(seq);
-		goto end;
-		break;
-	default:
-		BUG_ON("Unknown state of lock sequence found!\n");
-		break;
-	}
-
-	ls->nr_acquire++;
-	seq->prev_event_time = sample->time;
-end:
-	return 0;
-}
-
-static int report_lock_acquired_event(struct perf_evsel *evsel,
-				      struct perf_sample *sample)
-{
-	void *addr;
-	struct lock_stat *ls;
-	struct thread_stat *ts;
-	struct lock_seq_stat *seq;
-	u64 contended_term;
-	const char *name = perf_evsel__strval(evsel, sample, "name");
-	u64 tmp = perf_evsel__intval(evsel, sample, "lockdep_addr");
-
-	memcpy(&addr, &tmp, sizeof(void *));
-
-	ls = lock_stat_findnew(addr, name);
-	if (!ls)
-		return -1;
-	if (ls->discard)
-		return 0;
-
-	ts = thread_stat_findnew(sample->tid);
-	if (!ts)
-		return -1;
-
-	seq = get_seq(ts, addr);
-	if (!seq)
-		return -1;
-
-	switch (seq->state) {
-	case SEQ_STATE_UNINITIALIZED:
-		/* orphan event, do nothing */
-		return 0;
-	case SEQ_STATE_ACQUIRING:
-		break;
-	case SEQ_STATE_CONTENDED:
-		contended_term = sample->time - seq->prev_event_time;
-		ls->wait_time_total += contended_term;
-		if (contended_term < ls->wait_time_min)
-			ls->wait_time_min = contended_term;
-		if (ls->wait_time_max < contended_term)
-			ls->wait_time_max = contended_term;
-		break;
-	case SEQ_STATE_RELEASED:
-	case SEQ_STATE_ACQUIRED:
-	case SEQ_STATE_READ_ACQUIRED:
-		/* broken lock sequence, discard it */
-		ls->discard = 1;
-		bad_hist[BROKEN_ACQUIRED]++;
-		list_del(&seq->list);
-		free(seq);
-		goto end;
-		break;
-
-	default:
-		BUG_ON("Unknown state of lock sequence found!\n");
-		break;
-	}
-
-	seq->state = SEQ_STATE_ACQUIRED;
-	ls->nr_acquired++;
-	seq->prev_event_time = sample->time;
-end:
-	return 0;
-}
-
-static int report_lock_contended_event(struct perf_evsel *evsel,
-				       struct perf_sample *sample)
-{
-	void *addr;
-	struct lock_stat *ls;
-	struct thread_stat *ts;
-	struct lock_seq_stat *seq;
-	const char *name = perf_evsel__strval(evsel, sample, "name");
-	u64 tmp = perf_evsel__intval(evsel, sample, "lockdep_addr");
-
-	memcpy(&addr, &tmp, sizeof(void *));
-
-	ls = lock_stat_findnew(addr, name);
-	if (!ls)
-		return -1;
-	if (ls->discard)
-		return 0;
-
-	ts = thread_stat_findnew(sample->tid);
-	if (!ts)
-		return -1;
-
-	seq = get_seq(ts, addr);
-	if (!seq)
-		return -1;
-
-	switch (seq->state) {
-	case SEQ_STATE_UNINITIALIZED:
-		/* orphan event, do nothing */
-		return 0;
-	case SEQ_STATE_ACQUIRING:
-		break;
-	case SEQ_STATE_RELEASED:
-	case SEQ_STATE_ACQUIRED:
-	case SEQ_STATE_READ_ACQUIRED:
-	case SEQ_STATE_CONTENDED:
-		/* broken lock sequence, discard it */
-		ls->discard = 1;
-		bad_hist[BROKEN_CONTENDED]++;
-		list_del(&seq->list);
-		free(seq);
-		goto end;
-		break;
-	default:
-		BUG_ON("Unknown state of lock sequence found!\n");
-		break;
-	}
-
-	seq->state = SEQ_STATE_CONTENDED;
-	ls->nr_contended++;
-	seq->prev_event_time = sample->time;
-end:
-	return 0;
-}
-
-static int report_lock_release_event(struct perf_evsel *evsel,
-				     struct perf_sample *sample)
-{
-	void *addr;
-	struct lock_stat *ls;
-	struct thread_stat *ts;
-	struct lock_seq_stat *seq;
-	const char *name = perf_evsel__strval(evsel, sample, "name");
-	u64 tmp = perf_evsel__intval(evsel, sample, "lockdep_addr");
-
-	memcpy(&addr, &tmp, sizeof(void *));
-
-	ls = lock_stat_findnew(addr, name);
-	if (!ls)
-		return -1;
-	if (ls->discard)
-		return 0;
-
-	ts = thread_stat_findnew(sample->tid);
-	if (!ts)
-		return -1;
-
-	seq = get_seq(ts, addr);
-	if (!seq)
-		return -1;
-
-	switch (seq->state) {
-	case SEQ_STATE_UNINITIALIZED:
-		goto end;
-		break;
-	case SEQ_STATE_ACQUIRED:
-		break;
-	case SEQ_STATE_READ_ACQUIRED:
-		seq->read_count--;
-		BUG_ON(seq->read_count < 0);
-		if (!seq->read_count) {
-			ls->nr_release++;
-			goto end;
-		}
-		break;
-	case SEQ_STATE_ACQUIRING:
-	case SEQ_STATE_CONTENDED:
-	case SEQ_STATE_RELEASED:
-		/* broken lock sequence, discard it */
-		ls->discard = 1;
-		bad_hist[BROKEN_RELEASE]++;
-		goto free_seq;
-		break;
-	default:
-		BUG_ON("Unknown state of lock sequence found!\n");
-		break;
-	}
-
-	ls->nr_release++;
-free_seq:
-	list_del(&seq->list);
-	free(seq);
-end:
-	return 0;
-}
-
-/* lock oriented handlers */
-/* TODO: handlers for CPU oriented, thread oriented */
-static struct trace_lock_handler report_lock_ops  = {
-	.acquire_event		= report_lock_acquire_event,
-	.acquired_event		= report_lock_acquired_event,
-	.contended_event	= report_lock_contended_event,
-	.release_event		= report_lock_release_event,
-};
-
-static struct trace_lock_handler *trace_handler;
-
-static int perf_evsel__process_lock_acquire(struct perf_evsel *evsel,
-					     struct perf_sample *sample)
-{
-	if (trace_handler->acquire_event)
-		return trace_handler->acquire_event(evsel, sample);
-	return 0;
-}
-
-static int perf_evsel__process_lock_acquired(struct perf_evsel *evsel,
-					      struct perf_sample *sample)
-{
-	if (trace_handler->acquired_event)
-		return trace_handler->acquired_event(evsel, sample);
-	return 0;
-}
-
-static int perf_evsel__process_lock_contended(struct perf_evsel *evsel,
-					      struct perf_sample *sample)
-{
-	if (trace_handler->contended_event)
-		return trace_handler->contended_event(evsel, sample);
-	return 0;
-}
-
-static int perf_evsel__process_lock_release(struct perf_evsel *evsel,
-					    struct perf_sample *sample)
-{
-	if (trace_handler->release_event)
-		return trace_handler->release_event(evsel, sample);
-	return 0;
-}
-
-static void print_bad_events(int bad, int total)
-{
-	/* Output for debug, this have to be removed */
-	int i;
-	const char *name[4] =
-		{ "acquire", "acquired", "contended", "release" };
-
-	pr_info("\n=== output for debug===\n\n");
-	pr_info("bad: %d, total: %d\n", bad, total);
-	pr_info("bad rate: %f %%\n", (double)bad / (double)total * 100);
-	pr_info("histogram of events caused bad sequence\n");
-	for (i = 0; i < BROKEN_MAX; i++)
-		pr_info(" %10s: %d\n", name[i], bad_hist[i]);
-}
-
-/* TODO: various way to print, coloring, nano or milli sec */
-static void print_result(void)
-{
-	struct lock_stat *st;
-	char cut_name[20];
-	int bad, total;
-
-	pr_info("%20s ", "Name");
-	pr_info("%10s ", "acquired");
-	pr_info("%10s ", "contended");
-
-	pr_info("%15s ", "total wait (ns)");
-	pr_info("%15s ", "max wait (ns)");
-	pr_info("%15s ", "min wait (ns)");
-
-	pr_info("\n\n");
-
-	bad = total = 0;
-	while ((st = pop_from_result())) {
-		total++;
-		if (st->discard) {
-			bad++;
-			continue;
-		}
-		bzero(cut_name, 20);
-
-		if (strlen(st->name) < 16) {
-			/* output raw name */
-			pr_info("%20s ", st->name);
-		} else {
-			strncpy(cut_name, st->name, 16);
-			cut_name[16] = '.';
-			cut_name[17] = '.';
-			cut_name[18] = '.';
-			cut_name[19] = '\0';
-			/* cut off name for saving output style */
-			pr_info("%20s ", cut_name);
-		}
-
-		pr_info("%10u ", st->nr_acquired);
-		pr_info("%10u ", st->nr_contended);
-
-		pr_info("%15" PRIu64 " ", st->wait_time_total);
-		pr_info("%15" PRIu64 " ", st->wait_time_max);
-		pr_info("%15" PRIu64 " ", st->wait_time_min == ULLONG_MAX ?
-		       0 : st->wait_time_min);
-		pr_info("\n");
-	}
-
-	print_bad_events(bad, total);
-}
-
-static bool info_threads, info_map;
-
-static void dump_threads(void)
-{
-	struct thread_stat *st;
-	struct rb_node *node;
-	struct thread *t;
-
-	pr_info("%10s: comm\n", "Thread ID");
-
-	node = rb_first(&thread_stats);
-	while (node) {
-		st = container_of(node, struct thread_stat, rb);
-		t = perf_session__findnew(session, st->tid);
-		pr_info("%10d: %s\n", st->tid, t->comm);
-		node = rb_next(node);
-	};
-}
-
-static void dump_map(void)
-{
-	unsigned int i;
-	struct lock_stat *st;
-
-	pr_info("Address of instance: name of class\n");
-	for (i = 0; i < LOCKHASH_SIZE; i++) {
-		list_for_each_entry(st, &lockhash_table[i], hash_entry) {
-			pr_info(" %p: %s\n", st->addr, st->name);
-		}
-	}
-}
-
-static int dump_info(void)
-{
-	int rc = 0;
-
-	if (info_threads)
-		dump_threads();
-	else if (info_map)
-		dump_map();
-	else {
-		rc = -1;
-		pr_err("Unknown type of information\n");
-	}
-
-	return rc;
-}
-
-typedef int (*tracepoint_handler)(struct perf_evsel *evsel,
-				  struct perf_sample *sample);
-
-static int process_sample_event(struct perf_tool *tool __maybe_unused,
-				union perf_event *event,
-				struct perf_sample *sample,
-				struct perf_evsel *evsel,
-				struct machine *machine)
-{
-	struct thread *thread = machine__findnew_thread(machine, sample->pid,
-							sample->tid);
-
-	if (thread == NULL) {
-		pr_debug("problem processing %d event, skipping it.\n",
-			event->header.type);
-		return -1;
-	}
-
-	if (evsel->handler.func != NULL) {
-		tracepoint_handler f = evsel->handler.func;
-		return f(evsel, sample);
-	}
-
-	return 0;
-}
-
-static const struct perf_evsel_str_handler lock_tracepoints[] = {
-	{ "lock:lock_acquire",	 perf_evsel__process_lock_acquire,   }, /* CONFIG_LOCKDEP */
-	{ "lock:lock_acquired",	 perf_evsel__process_lock_acquired,  }, /* CONFIG_LOCKDEP, CONFIG_LOCK_STAT */
-	{ "lock:lock_contended", perf_evsel__process_lock_contended, }, /* CONFIG_LOCKDEP, CONFIG_LOCK_STAT */
-	{ "lock:lock_release",	 perf_evsel__process_lock_release,   }, /* CONFIG_LOCKDEP */
-};
-
-static int read_events(void)
-{
-	struct perf_tool eops = {
-		.sample		 = process_sample_event,
-		.comm		 = perf_event__process_comm,
-		.ordered_samples = true,
-	};
-	session = perf_session__new(input_name, O_RDONLY, 0, false, &eops);
-	if (!session) {
-		pr_err("Initializing perf session failed\n");
-		return -1;
-	}
-
-	if (perf_session__set_tracepoints_handlers(session, lock_tracepoints)) {
-		pr_err("Initializing perf session tracepoint handlers failed\n");
-		return -1;
-	}
-
-	return perf_session__process_events(session, &eops);
-}
-
-static void sort_result(void)
-{
-	unsigned int i;
-	struct lock_stat *st;
-
-	for (i = 0; i < LOCKHASH_SIZE; i++) {
-		list_for_each_entry(st, &lockhash_table[i], hash_entry) {
-			insert_to_result(st, compare);
-		}
-	}
-}
-
-static int __cmd_report(void)
-{
-	setup_pager();
-
-	if ((select_key() != 0) ||
-	    (read_events() != 0))
-		return -1;
-
-	sort_result();
-	print_result();
-
-	return 0;
-}
-
-static int __cmd_record(int argc, const char **argv)
-{
-	const char *record_args[] = {
-		"record", "-R", "-m", "1024", "-c", "1",
-	};
-	unsigned int rec_argc, i, j;
-	const char **rec_argv;
-
-	for (i = 0; i < ARRAY_SIZE(lock_tracepoints); i++) {
-		if (!is_valid_tracepoint(lock_tracepoints[i].name)) {
-				pr_err("tracepoint %s is not enabled. "
-				       "Are CONFIG_LOCKDEP and CONFIG_LOCK_STAT enabled?\n",
-				       lock_tracepoints[i].name);
-				return 1;
-		}
-	}
-
-	rec_argc = ARRAY_SIZE(record_args) + argc - 1;
-	/* factor of 2 is for -e in front of each tracepoint */
-	rec_argc += 2 * ARRAY_SIZE(lock_tracepoints);
-
-	rec_argv = calloc(rec_argc + 1, sizeof(char *));
-	if (rec_argv == NULL)
-		return -ENOMEM;
-
-	for (i = 0; i < ARRAY_SIZE(record_args); i++)
-		rec_argv[i] = strdup(record_args[i]);
-
-	for (j = 0; j < ARRAY_SIZE(lock_tracepoints); j++) {
-		rec_argv[i++] = "-e";
-		rec_argv[i++] = strdup(lock_tracepoints[j].name);
-	}
-
-	for (j = 1; j < (unsigned int)argc; j++, i++)
-		rec_argv[i] = argv[j];
-
-	BUG_ON(i != rec_argc);
-
-	return cmd_record(i, rec_argv, NULL);
-}
-
-int cmd_lock(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	const struct option info_options[] = {
-	OPT_BOOLEAN('t', "threads", &info_threads,
-		    "dump thread list in perf.data"),
-	OPT_BOOLEAN('m', "map", &info_map,
-		    "map of lock instances (address:name table)"),
-	OPT_END()
-	};
-	const struct option lock_options[] = {
-	OPT_STRING('i', "input", &input_name, "file", "input file name"),
-	OPT_INCR('v', "verbose", &verbose, "be more verbose (show symbol address, etc)"),
-	OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace, "dump raw trace in ASCII"),
-	OPT_END()
-	};
-	const struct option report_options[] = {
-	OPT_STRING('k', "key", &sort_key, "acquired",
-		    "key for sorting (acquired / contended / wait_total / wait_max / wait_min)"),
-	/* TODO: type */
-	OPT_END()
-	};
-	const char * const info_usage[] = {
-		"perf lock info [<options>]",
-		NULL
-	};
-	const char * const lock_usage[] = {
-		"perf lock [<options>] {record|report|script|info}",
-		NULL
-	};
-	const char * const report_usage[] = {
-		"perf lock report [<options>]",
-		NULL
-	};
-	unsigned int i;
-	int rc = 0;
-
-	symbol__init();
-	for (i = 0; i < LOCKHASH_SIZE; i++)
-		INIT_LIST_HEAD(lockhash_table + i);
-
-	argc = parse_options(argc, argv, lock_options, lock_usage,
-			     PARSE_OPT_STOP_AT_NON_OPTION);
-	if (!argc)
-		usage_with_options(lock_usage, lock_options);
-
-	if (!strncmp(argv[0], "rec", 3)) {
-		return __cmd_record(argc, argv);
-	} else if (!strncmp(argv[0], "report", 6)) {
-		trace_handler = &report_lock_ops;
-		if (argc) {
-			argc = parse_options(argc, argv,
-					     report_options, report_usage, 0);
-			if (argc)
-				usage_with_options(report_usage, report_options);
-		}
-		__cmd_report();
-	} else if (!strcmp(argv[0], "script")) {
-		/* Aliased to 'perf script' */
-		return cmd_script(argc, argv, prefix);
-	} else if (!strcmp(argv[0], "info")) {
-		if (argc) {
-			argc = parse_options(argc, argv,
-					     info_options, info_usage, 0);
-			if (argc)
-				usage_with_options(info_usage, info_options);
-		}
-		/* recycling report_lock_ops */
-		trace_handler = &report_lock_ops;
-		setup_pager();
-		if (read_events() != 0)
-			rc = -1;
-		else
-			rc = dump_info();
-	} else {
-		usage_with_options(lock_usage, lock_options);
-	}
-
-	return rc;
-}
diff --git a/src/tools/perf/builtin-mem.c b/src/tools/perf/builtin-mem.c
deleted file mode 100644
index 253133a..0000000
--- a/src/tools/perf/builtin-mem.c
+++ /dev/null
@@ -1,241 +0,0 @@
-#include "builtin.h"
-#include "perf.h"
-
-#include "util/parse-options.h"
-#include "util/trace-event.h"
-#include "util/tool.h"
-#include "util/session.h"
-
-#define MEM_OPERATION_LOAD	"load"
-#define MEM_OPERATION_STORE	"store"
-
-static const char	*mem_operation		= MEM_OPERATION_LOAD;
-
-struct perf_mem {
-	struct perf_tool	tool;
-	char const		*input_name;
-	bool			hide_unresolved;
-	bool			dump_raw;
-	const char		*cpu_list;
-	DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS);
-};
-
-static const char * const mem_usage[] = {
-	"perf mem [<options>] {record <command> |report}",
-	NULL
-};
-
-static int __cmd_record(int argc, const char **argv)
-{
-	int rec_argc, i = 0, j;
-	const char **rec_argv;
-	char event[64];
-	int ret;
-
-	rec_argc = argc + 4;
-	rec_argv = calloc(rec_argc + 1, sizeof(char *));
-	if (!rec_argv)
-		return -1;
-
-	rec_argv[i++] = strdup("record");
-	if (!strcmp(mem_operation, MEM_OPERATION_LOAD))
-		rec_argv[i++] = strdup("-W");
-	rec_argv[i++] = strdup("-d");
-	rec_argv[i++] = strdup("-e");
-
-	if (strcmp(mem_operation, MEM_OPERATION_LOAD))
-		sprintf(event, "cpu/mem-stores/pp");
-	else
-		sprintf(event, "cpu/mem-loads/pp");
-
-	rec_argv[i++] = strdup(event);
-	for (j = 1; j < argc; j++, i++)
-		rec_argv[i] = argv[j];
-
-	ret = cmd_record(i, rec_argv, NULL);
-	free(rec_argv);
-	return ret;
-}
-
-static int
-dump_raw_samples(struct perf_tool *tool,
-		 union perf_event *event,
-		 struct perf_sample *sample,
-		 struct perf_evsel *evsel __maybe_unused,
-		 struct machine *machine)
-{
-	struct perf_mem *mem = container_of(tool, struct perf_mem, tool);
-	struct addr_location al;
-	const char *fmt;
-
-	if (perf_event__preprocess_sample(event, machine, &al, sample) < 0) {
-		fprintf(stderr, "problem processing %d event, skipping it.\n",
-				event->header.type);
-		return -1;
-	}
-
-	if (al.filtered || (mem->hide_unresolved && al.sym == NULL))
-		return 0;
-
-	if (al.map != NULL)
-		al.map->dso->hit = 1;
-
-	if (symbol_conf.field_sep) {
-		fmt = "%d%s%d%s0x%"PRIx64"%s0x%"PRIx64"%s%"PRIu64
-		      "%s0x%"PRIx64"%s%s:%s\n";
-	} else {
-		fmt = "%5d%s%5d%s0x%016"PRIx64"%s0x016%"PRIx64
-		      "%s%5"PRIu64"%s0x%06"PRIx64"%s%s:%s\n";
-		symbol_conf.field_sep = " ";
-	}
-
-	printf(fmt,
-		sample->pid,
-		symbol_conf.field_sep,
-		sample->tid,
-		symbol_conf.field_sep,
-		sample->ip,
-		symbol_conf.field_sep,
-		sample->addr,
-		symbol_conf.field_sep,
-		sample->weight,
-		symbol_conf.field_sep,
-		sample->data_src,
-		symbol_conf.field_sep,
-		al.map ? (al.map->dso ? al.map->dso->long_name : "???") : "???",
-		al.sym ? al.sym->name : "???");
-
-	return 0;
-}
-
-static int process_sample_event(struct perf_tool *tool,
-				union perf_event *event,
-				struct perf_sample *sample,
-				struct perf_evsel *evsel,
-				struct machine *machine)
-{
-	return dump_raw_samples(tool, event, sample, evsel, machine);
-}
-
-static int report_raw_events(struct perf_mem *mem)
-{
-	int err = -EINVAL;
-	int ret;
-	struct perf_session *session = perf_session__new(input_name, O_RDONLY,
-							 0, false, &mem->tool);
-
-	if (session == NULL)
-		return -ENOMEM;
-
-	if (mem->cpu_list) {
-		ret = perf_session__cpu_bitmap(session, mem->cpu_list,
-					       mem->cpu_bitmap);
-		if (ret)
-			goto out_delete;
-	}
-
-	if (symbol__init() < 0)
-		return -1;
-
-	printf("# PID, TID, IP, ADDR, LOCAL WEIGHT, DSRC, SYMBOL\n");
-
-	err = perf_session__process_events(session, &mem->tool);
-	if (err)
-		return err;
-
-	return 0;
-
-out_delete:
-	perf_session__delete(session);
-	return err;
-}
-
-static int report_events(int argc, const char **argv, struct perf_mem *mem)
-{
-	const char **rep_argv;
-	int ret, i = 0, j, rep_argc;
-
-	if (mem->dump_raw)
-		return report_raw_events(mem);
-
-	rep_argc = argc + 3;
-	rep_argv = calloc(rep_argc + 1, sizeof(char *));
-	if (!rep_argv)
-		return -1;
-
-	rep_argv[i++] = strdup("report");
-	rep_argv[i++] = strdup("--mem-mode");
-	rep_argv[i++] = strdup("-n"); /* display number of samples */
-
-	/*
-	 * there is no weight (cost) associated with stores, so don't print
-	 * the column
-	 */
-	if (strcmp(mem_operation, MEM_OPERATION_LOAD))
-		rep_argv[i++] = strdup("--sort=mem,sym,dso,symbol_daddr,"
-				       "dso_daddr,tlb,locked");
-
-	for (j = 1; j < argc; j++, i++)
-		rep_argv[i] = argv[j];
-
-	ret = cmd_report(i, rep_argv, NULL);
-	free(rep_argv);
-	return ret;
-}
-
-int cmd_mem(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	struct stat st;
-	struct perf_mem mem = {
-		.tool = {
-			.sample		= process_sample_event,
-			.mmap		= perf_event__process_mmap,
-			.mmap2		= perf_event__process_mmap2,
-			.comm		= perf_event__process_comm,
-			.lost		= perf_event__process_lost,
-			.fork		= perf_event__process_fork,
-			.build_id	= perf_event__process_build_id,
-			.ordered_samples = true,
-		},
-		.input_name		 = "perf.data",
-	};
-	const struct option mem_options[] = {
-	OPT_STRING('t', "type", &mem_operation,
-		   "type", "memory operations(load/store)"),
-	OPT_BOOLEAN('D', "dump-raw-samples", &mem.dump_raw,
-		    "dump raw samples in ASCII"),
-	OPT_BOOLEAN('U', "hide-unresolved", &mem.hide_unresolved,
-		    "Only display entries resolved to a symbol"),
-	OPT_STRING('i', "input", &input_name, "file",
-		   "input file name"),
-	OPT_STRING('C', "cpu", &mem.cpu_list, "cpu",
-		   "list of cpus to profile"),
-	OPT_STRING('x', "field-separator", &symbol_conf.field_sep,
-		   "separator",
-		   "separator for columns, no spaces will be added"
-		   " between columns '.' is reserved."),
-	OPT_END()
-	};
-
-	argc = parse_options(argc, argv, mem_options, mem_usage,
-			     PARSE_OPT_STOP_AT_NON_OPTION);
-
-	if (!argc || !(strncmp(argv[0], "rec", 3) || mem_operation))
-		usage_with_options(mem_usage, mem_options);
-
-	if (!mem.input_name || !strlen(mem.input_name)) {
-		if (!fstat(STDIN_FILENO, &st) && S_ISFIFO(st.st_mode))
-			mem.input_name = "-";
-		else
-			mem.input_name = "perf.data";
-	}
-
-	if (!strncmp(argv[0], "rec", 3))
-		return __cmd_record(argc, argv);
-	else if (!strncmp(argv[0], "rep", 3))
-		return report_events(argc, argv, &mem);
-	else
-		usage_with_options(mem_usage, mem_options);
-
-	return 0;
-}
diff --git a/src/tools/perf/builtin-probe.c b/src/tools/perf/builtin-probe.c
deleted file mode 100644
index e8a66f9..0000000
--- a/src/tools/perf/builtin-probe.c
+++ /dev/null
@@ -1,470 +0,0 @@
-/*
- * builtin-probe.c
- *
- * Builtin probe command: Set up probe events by C expression
- *
- * Written by Masami Hiramatsu <mhiramat@redhat.com>
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-#include <sys/utsname.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "perf.h"
-#include "builtin.h"
-#include "util/util.h"
-#include "util/strlist.h"
-#include "util/strfilter.h"
-#include "util/symbol.h"
-#include "util/debug.h"
-#include <lk/debugfs.h>
-#include "util/parse-options.h"
-#include "util/probe-finder.h"
-#include "util/probe-event.h"
-
-#define DEFAULT_VAR_FILTER "!__k???tab_* & !__crc_*"
-#define DEFAULT_FUNC_FILTER "!_*"
-
-/* Session management structure */
-static struct {
-	bool list_events;
-	bool force_add;
-	bool show_lines;
-	bool show_vars;
-	bool show_ext_vars;
-	bool show_funcs;
-	bool mod_events;
-	bool uprobes;
-	int nevents;
-	struct perf_probe_event events[MAX_PROBES];
-	struct strlist *dellist;
-	struct line_range line_range;
-	const char *target;
-	int max_probe_points;
-	struct strfilter *filter;
-} params;
-
-/* Parse an event definition. Note that any error must die. */
-static int parse_probe_event(const char *str)
-{
-	struct perf_probe_event *pev = &params.events[params.nevents];
-	int ret;
-
-	pr_debug("probe-definition(%d): %s\n", params.nevents, str);
-	if (++params.nevents == MAX_PROBES) {
-		pr_err("Too many probes (> %d) were specified.", MAX_PROBES);
-		return -1;
-	}
-
-	pev->uprobes = params.uprobes;
-
-	/* Parse a perf-probe command into event */
-	ret = parse_perf_probe_command(str, pev);
-	pr_debug("%d arguments\n", pev->nargs);
-
-	return ret;
-}
-
-static int set_target(const char *ptr)
-{
-	int found = 0;
-	const char *buf;
-
-	/*
-	 * The first argument after options can be an absolute path
-	 * to an executable / library or kernel module.
-	 *
-	 * TODO: Support relative path, and $PATH, $LD_LIBRARY_PATH,
-	 * short module name.
-	 */
-	if (!params.target && ptr && *ptr == '/') {
-		params.target = ptr;
-		found = 1;
-		buf = ptr + (strlen(ptr) - 3);
-
-		if (strcmp(buf, ".ko"))
-			params.uprobes = true;
-
-	}
-
-	return found;
-}
-
-static int parse_probe_event_argv(int argc, const char **argv)
-{
-	int i, len, ret, found_target;
-	char *buf;
-
-	found_target = set_target(argv[0]);
-	if (found_target && argc == 1)
-		return 0;
-
-	/* Bind up rest arguments */
-	len = 0;
-	for (i = 0; i < argc; i++) {
-		if (i == 0 && found_target)
-			continue;
-
-		len += strlen(argv[i]) + 1;
-	}
-	buf = zalloc(len + 1);
-	if (buf == NULL)
-		return -ENOMEM;
-	len = 0;
-	for (i = 0; i < argc; i++) {
-		if (i == 0 && found_target)
-			continue;
-
-		len += sprintf(&buf[len], "%s ", argv[i]);
-	}
-	params.mod_events = true;
-	ret = parse_probe_event(buf);
-	free(buf);
-	return ret;
-}
-
-static int opt_add_probe_event(const struct option *opt __maybe_unused,
-			      const char *str, int unset __maybe_unused)
-{
-	if (str) {
-		params.mod_events = true;
-		return parse_probe_event(str);
-	} else
-		return 0;
-}
-
-static int opt_del_probe_event(const struct option *opt __maybe_unused,
-			       const char *str, int unset __maybe_unused)
-{
-	if (str) {
-		params.mod_events = true;
-		if (!params.dellist)
-			params.dellist = strlist__new(true, NULL);
-		strlist__add(params.dellist, str);
-	}
-	return 0;
-}
-
-static int opt_set_target(const struct option *opt, const char *str,
-			int unset __maybe_unused)
-{
-	int ret = -ENOENT;
-
-	if  (str && !params.target) {
-		if (!strcmp(opt->long_name, "exec"))
-			params.uprobes = true;
-#ifdef DWARF_SUPPORT
-		else if (!strcmp(opt->long_name, "module"))
-			params.uprobes = false;
-#endif
-		else
-			return ret;
-
-		params.target = str;
-		ret = 0;
-	}
-
-	return ret;
-}
-
-#ifdef DWARF_SUPPORT
-static int opt_show_lines(const struct option *opt __maybe_unused,
-			  const char *str, int unset __maybe_unused)
-{
-	int ret = 0;
-
-	if (!str)
-		return 0;
-
-	if (params.show_lines) {
-		pr_warning("Warning: more than one --line options are"
-			   " detected. Only the first one is valid.\n");
-		return 0;
-	}
-
-	params.show_lines = true;
-	ret = parse_line_range_desc(str, &params.line_range);
-	INIT_LIST_HEAD(&params.line_range.line_list);
-
-	return ret;
-}
-
-static int opt_show_vars(const struct option *opt __maybe_unused,
-			 const char *str, int unset __maybe_unused)
-{
-	struct perf_probe_event *pev = &params.events[params.nevents];
-	int ret;
-
-	if (!str)
-		return 0;
-
-	ret = parse_probe_event(str);
-	if (!ret && pev->nargs != 0) {
-		pr_err("  Error: '--vars' doesn't accept arguments.\n");
-		return -EINVAL;
-	}
-	params.show_vars = true;
-
-	return ret;
-}
-#endif
-
-static int opt_set_filter(const struct option *opt __maybe_unused,
-			  const char *str, int unset __maybe_unused)
-{
-	const char *err;
-
-	if (str) {
-		pr_debug2("Set filter: %s\n", str);
-		if (params.filter)
-			strfilter__delete(params.filter);
-		params.filter = strfilter__new(str, &err);
-		if (!params.filter) {
-			pr_err("Filter parse error at %td.\n", err - str + 1);
-			pr_err("Source: \"%s\"\n", str);
-			pr_err("         %*c\n", (int)(err - str + 1), '^');
-			return -EINVAL;
-		}
-	}
-
-	return 0;
-}
-
-int cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	const char * const probe_usage[] = {
-		"perf probe [<options>] 'PROBEDEF' ['PROBEDEF' ...]",
-		"perf probe [<options>] --add 'PROBEDEF' [--add 'PROBEDEF' ...]",
-		"perf probe [<options>] --del '[GROUP:]EVENT' ...",
-		"perf probe --list",
-#ifdef DWARF_SUPPORT
-		"perf probe [<options>] --line 'LINEDESC'",
-		"perf probe [<options>] --vars 'PROBEPOINT'",
-#endif
-		NULL
-};
-	const struct option options[] = {
-	OPT_INCR('v', "verbose", &verbose,
-		    "be more verbose (show parsed arguments, etc)"),
-	OPT_BOOLEAN('l', "list", &params.list_events,
-		    "list up current probe events"),
-	OPT_CALLBACK('d', "del", NULL, "[GROUP:]EVENT", "delete a probe event.",
-		opt_del_probe_event),
-	OPT_CALLBACK('a', "add", NULL,
-#ifdef DWARF_SUPPORT
-		"[EVENT=]FUNC[@SRC][+OFF|%return|:RL|;PT]|SRC:AL|SRC;PT"
-		" [[NAME=]ARG ...]",
-#else
-		"[EVENT=]FUNC[+OFF|%return] [[NAME=]ARG ...]",
-#endif
-		"probe point definition, where\n"
-		"\t\tGROUP:\tGroup name (optional)\n"
-		"\t\tEVENT:\tEvent name\n"
-		"\t\tFUNC:\tFunction name\n"
-		"\t\tOFF:\tOffset from function entry (in byte)\n"
-		"\t\t%return:\tPut the probe at function return\n"
-#ifdef DWARF_SUPPORT
-		"\t\tSRC:\tSource code path\n"
-		"\t\tRL:\tRelative line number from function entry.\n"
-		"\t\tAL:\tAbsolute line number in file.\n"
-		"\t\tPT:\tLazy expression of line code.\n"
-		"\t\tARG:\tProbe argument (local variable name or\n"
-		"\t\t\tkprobe-tracer argument format.)\n",
-#else
-		"\t\tARG:\tProbe argument (kprobe-tracer argument format.)\n",
-#endif
-		opt_add_probe_event),
-	OPT_BOOLEAN('f', "force", &params.force_add, "forcibly add events"
-		    " with existing name"),
-#ifdef DWARF_SUPPORT
-	OPT_CALLBACK('L', "line", NULL,
-		     "FUNC[:RLN[+NUM|-RLN2]]|SRC:ALN[+NUM|-ALN2]",
-		     "Show source code lines.", opt_show_lines),
-	OPT_CALLBACK('V', "vars", NULL,
-		     "FUNC[@SRC][+OFF|%return|:RL|;PT]|SRC:AL|SRC;PT",
-		     "Show accessible variables on PROBEDEF", opt_show_vars),
-	OPT_BOOLEAN('\0', "externs", &params.show_ext_vars,
-		    "Show external variables too (with --vars only)"),
-	OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
-		   "file", "vmlinux pathname"),
-	OPT_STRING('s', "source", &symbol_conf.source_prefix,
-		   "directory", "path to kernel source"),
-	OPT_CALLBACK('m', "module", NULL, "modname|path",
-		"target module name (for online) or path (for offline)",
-		opt_set_target),
-#endif
-	OPT__DRY_RUN(&probe_event_dry_run),
-	OPT_INTEGER('\0', "max-probes", &params.max_probe_points,
-		 "Set how many probe points can be found for a probe."),
-	OPT_BOOLEAN('F', "funcs", &params.show_funcs,
-		    "Show potential probe-able functions."),
-	OPT_CALLBACK('\0', "filter", NULL,
-		     "[!]FILTER", "Set a filter (with --vars/funcs only)\n"
-		     "\t\t\t(default: \"" DEFAULT_VAR_FILTER "\" for --vars,\n"
-		     "\t\t\t \"" DEFAULT_FUNC_FILTER "\" for --funcs)",
-		     opt_set_filter),
-	OPT_CALLBACK('x', "exec", NULL, "executable|path",
-			"target executable name or path", opt_set_target),
-	OPT_END()
-	};
-	int ret;
-
-	argc = parse_options(argc, argv, options, probe_usage,
-			     PARSE_OPT_STOP_AT_NON_OPTION);
-	if (argc > 0) {
-		if (strcmp(argv[0], "-") == 0) {
-			pr_warning("  Error: '-' is not supported.\n");
-			usage_with_options(probe_usage, options);
-		}
-		ret = parse_probe_event_argv(argc, argv);
-		if (ret < 0) {
-			pr_err("  Error: Parse Error.  (%d)\n", ret);
-			return ret;
-		}
-	}
-
-	if (params.max_probe_points == 0)
-		params.max_probe_points = MAX_PROBES;
-
-	if ((!params.nevents && !params.dellist && !params.list_events &&
-	     !params.show_lines && !params.show_funcs))
-		usage_with_options(probe_usage, options);
-
-	/*
-	 * Only consider the user's kernel image path if given.
-	 */
-	symbol_conf.try_vmlinux_path = (symbol_conf.vmlinux_name == NULL);
-
-	if (params.list_events) {
-		if (params.mod_events) {
-			pr_err("  Error: Don't use --list with --add/--del.\n");
-			usage_with_options(probe_usage, options);
-		}
-		if (params.show_lines) {
-			pr_err("  Error: Don't use --list with --line.\n");
-			usage_with_options(probe_usage, options);
-		}
-		if (params.show_vars) {
-			pr_err(" Error: Don't use --list with --vars.\n");
-			usage_with_options(probe_usage, options);
-		}
-		if (params.show_funcs) {
-			pr_err("  Error: Don't use --list with --funcs.\n");
-			usage_with_options(probe_usage, options);
-		}
-		if (params.uprobes) {
-			pr_warning("  Error: Don't use --list with --exec.\n");
-			usage_with_options(probe_usage, options);
-		}
-		ret = show_perf_probe_events();
-		if (ret < 0)
-			pr_err("  Error: Failed to show event list. (%d)\n",
-			       ret);
-		return ret;
-	}
-	if (params.show_funcs) {
-		if (params.nevents != 0 || params.dellist) {
-			pr_err("  Error: Don't use --funcs with"
-			       " --add/--del.\n");
-			usage_with_options(probe_usage, options);
-		}
-		if (params.show_lines) {
-			pr_err("  Error: Don't use --funcs with --line.\n");
-			usage_with_options(probe_usage, options);
-		}
-		if (params.show_vars) {
-			pr_err("  Error: Don't use --funcs with --vars.\n");
-			usage_with_options(probe_usage, options);
-		}
-		if (!params.filter)
-			params.filter = strfilter__new(DEFAULT_FUNC_FILTER,
-						       NULL);
-		ret = show_available_funcs(params.target, params.filter,
-					params.uprobes);
-		strfilter__delete(params.filter);
-		if (ret < 0)
-			pr_err("  Error: Failed to show functions."
-			       " (%d)\n", ret);
-		return ret;
-	}
-
-#ifdef DWARF_SUPPORT
-	if (params.show_lines && !params.uprobes) {
-		if (params.mod_events) {
-			pr_err("  Error: Don't use --line with"
-			       " --add/--del.\n");
-			usage_with_options(probe_usage, options);
-		}
-		if (params.show_vars) {
-			pr_err(" Error: Don't use --line with --vars.\n");
-			usage_with_options(probe_usage, options);
-		}
-
-		ret = show_line_range(&params.line_range, params.target);
-		if (ret < 0)
-			pr_err("  Error: Failed to show lines. (%d)\n", ret);
-		return ret;
-	}
-	if (params.show_vars) {
-		if (params.mod_events) {
-			pr_err("  Error: Don't use --vars with"
-			       " --add/--del.\n");
-			usage_with_options(probe_usage, options);
-		}
-		if (!params.filter)
-			params.filter = strfilter__new(DEFAULT_VAR_FILTER,
-						       NULL);
-
-		ret = show_available_vars(params.events, params.nevents,
-					  params.max_probe_points,
-					  params.target,
-					  params.filter,
-					  params.show_ext_vars);
-		strfilter__delete(params.filter);
-		if (ret < 0)
-			pr_err("  Error: Failed to show vars. (%d)\n", ret);
-		return ret;
-	}
-#endif
-
-	if (params.dellist) {
-		ret = del_perf_probe_events(params.dellist);
-		strlist__delete(params.dellist);
-		if (ret < 0) {
-			pr_err("  Error: Failed to delete events. (%d)\n", ret);
-			return ret;
-		}
-	}
-
-	if (params.nevents) {
-		ret = add_perf_probe_events(params.events, params.nevents,
-					    params.max_probe_points,
-					    params.target,
-					    params.force_add);
-		if (ret < 0) {
-			pr_err("  Error: Failed to add events. (%d)\n", ret);
-			return ret;
-		}
-	}
-	return 0;
-}
diff --git a/src/tools/perf/builtin-record.c b/src/tools/perf/builtin-record.c
deleted file mode 100644
index d046514..0000000
--- a/src/tools/perf/builtin-record.c
+++ /dev/null
@@ -1,1019 +0,0 @@
-/*
- * builtin-record.c
- *
- * Builtin record command: Record the profile of a workload
- * (or a CPU, or a PID) into the perf.data output file - for
- * later analysis via perf report.
- */
-#include "builtin.h"
-
-#include "perf.h"
-
-#include "util/build-id.h"
-#include "util/util.h"
-#include "util/parse-options.h"
-#include "util/parse-events.h"
-
-#include "util/header.h"
-#include "util/event.h"
-#include "util/evlist.h"
-#include "util/evsel.h"
-#include "util/debug.h"
-#include "util/session.h"
-#include "util/tool.h"
-#include "util/symbol.h"
-#include "util/cpumap.h"
-#include "util/thread_map.h"
-
-#include <unistd.h>
-#include <sched.h>
-#include <sys/mman.h>
-
-#ifndef HAVE_ON_EXIT
-#ifndef ATEXIT_MAX
-#define ATEXIT_MAX 32
-#endif
-static int __on_exit_count = 0;
-typedef void (*on_exit_func_t) (int, void *);
-static on_exit_func_t __on_exit_funcs[ATEXIT_MAX];
-static void *__on_exit_args[ATEXIT_MAX];
-static int __exitcode = 0;
-static void __handle_on_exit_funcs(void);
-static int on_exit(on_exit_func_t function, void *arg);
-#define exit(x) (exit)(__exitcode = (x))
-
-static int on_exit(on_exit_func_t function, void *arg)
-{
-	if (__on_exit_count == ATEXIT_MAX)
-		return -ENOMEM;
-	else if (__on_exit_count == 0)
-		atexit(__handle_on_exit_funcs);
-	__on_exit_funcs[__on_exit_count] = function;
-	__on_exit_args[__on_exit_count++] = arg;
-	return 0;
-}
-
-static void __handle_on_exit_funcs(void)
-{
-	int i;
-	for (i = 0; i < __on_exit_count; i++)
-		__on_exit_funcs[i] (__exitcode, __on_exit_args[i]);
-}
-#endif
-
-struct perf_record {
-	struct perf_tool	tool;
-	struct perf_record_opts	opts;
-	u64			bytes_written;
-	const char		*output_name;
-	struct perf_evlist	*evlist;
-	struct perf_session	*session;
-	const char		*progname;
-	int			output;
-	unsigned int		page_size;
-	int			realtime_prio;
-	bool			no_buildid;
-	bool			no_buildid_cache;
-	long			samples;
-	off_t			post_processing_offset;
-};
-
-static void advance_output(struct perf_record *rec, size_t size)
-{
-	rec->bytes_written += size;
-}
-
-static int write_output(struct perf_record *rec, void *buf, size_t size)
-{
-	while (size) {
-		int ret = write(rec->output, buf, size);
-
-		if (ret < 0) {
-			pr_err("failed to write\n");
-			return -1;
-		}
-
-		size -= ret;
-		buf += ret;
-
-		rec->bytes_written += ret;
-	}
-
-	return 0;
-}
-
-static int process_synthesized_event(struct perf_tool *tool,
-				     union perf_event *event,
-				     struct perf_sample *sample __maybe_unused,
-				     struct machine *machine __maybe_unused)
-{
-	struct perf_record *rec = container_of(tool, struct perf_record, tool);
-	if (write_output(rec, event, event->header.size) < 0)
-		return -1;
-
-	return 0;
-}
-
-static int perf_record__mmap_read(struct perf_record *rec,
-				   struct perf_mmap *md)
-{
-	unsigned int head = perf_mmap__read_head(md);
-	unsigned int old = md->prev;
-	unsigned char *data = md->base + rec->page_size;
-	unsigned long size;
-	void *buf;
-	int rc = 0;
-
-	if (old == head)
-		return 0;
-
-	rec->samples++;
-
-	size = head - old;
-
-	if ((old & md->mask) + size != (head & md->mask)) {
-		buf = &data[old & md->mask];
-		size = md->mask + 1 - (old & md->mask);
-		old += size;
-
-		if (write_output(rec, buf, size) < 0) {
-			rc = -1;
-			goto out;
-		}
-	}
-
-	buf = &data[old & md->mask];
-	size = head - old;
-	old += size;
-
-	if (write_output(rec, buf, size) < 0) {
-		rc = -1;
-		goto out;
-	}
-
-	md->prev = old;
-	perf_mmap__write_tail(md, old);
-
-out:
-	return rc;
-}
-
-static volatile int done = 0;
-static volatile int signr = -1;
-static volatile int child_finished = 0;
-
-static void sig_handler(int sig)
-{
-	if (sig == SIGCHLD)
-		child_finished = 1;
-
-	done = 1;
-	signr = sig;
-}
-
-static void perf_record__sig_exit(int exit_status __maybe_unused, void *arg)
-{
-	struct perf_record *rec = arg;
-	int status;
-
-	if (rec->evlist->workload.pid > 0) {
-		if (!child_finished)
-			kill(rec->evlist->workload.pid, SIGTERM);
-
-		wait(&status);
-		if (WIFSIGNALED(status))
-			psignal(WTERMSIG(status), rec->progname);
-	}
-
-	if (signr == -1 || signr == SIGUSR1)
-		return;
-
-	signal(signr, SIG_DFL);
-}
-
-static int perf_record__open(struct perf_record *rec)
-{
-	char msg[512];
-	struct perf_evsel *pos;
-	struct perf_evlist *evlist = rec->evlist;
-	struct perf_session *session = rec->session;
-	struct perf_record_opts *opts = &rec->opts;
-	int rc = 0;
-
-	perf_evlist__config(evlist, opts);
-
-	list_for_each_entry(pos, &evlist->entries, node) {
-try_again:
-		if (perf_evsel__open(pos, evlist->cpus, evlist->threads) < 0) {
-			if (perf_evsel__fallback(pos, errno, msg, sizeof(msg))) {
-				if (verbose)
-					ui__warning("%s\n", msg);
-				goto try_again;
-			}
-
-			rc = -errno;
-			perf_evsel__open_strerror(pos, &opts->target,
-						  errno, msg, sizeof(msg));
-			ui__error("%s\n", msg);
-			goto out;
-		}
-	}
-
-	if (perf_evlist__apply_filters(evlist)) {
-		error("failed to set filter with %d (%s)\n", errno,
-			strerror(errno));
-		rc = -1;
-		goto out;
-	}
-
-	if (perf_evlist__mmap(evlist, opts->mmap_pages, false) < 0) {
-		if (errno == EPERM) {
-			pr_err("Permission error mapping pages.\n"
-			       "Consider increasing "
-			       "/proc/sys/kernel/perf_event_mlock_kb,\n"
-			       "or try again with a smaller value of -m/--mmap_pages.\n"
-			       "(current value: %d)\n", opts->mmap_pages);
-			rc = -errno;
-		} else if (!is_power_of_2(opts->mmap_pages) &&
-			   (opts->mmap_pages != UINT_MAX)) {
-			pr_err("--mmap_pages/-m value must be a power of two.");
-			rc = -EINVAL;
-		} else {
-			pr_err("failed to mmap with %d (%s)\n", errno, strerror(errno));
-			rc = -errno;
-		}
-		goto out;
-	}
-
-	session->evlist = evlist;
-	perf_session__set_id_hdr_size(session);
-out:
-	return rc;
-}
-
-static int process_buildids(struct perf_record *rec)
-{
-	u64 size = lseek(rec->output, 0, SEEK_CUR);
-
-	if (size == 0)
-		return 0;
-
-	rec->session->fd = rec->output;
-	return __perf_session__process_events(rec->session, rec->post_processing_offset,
-					      size - rec->post_processing_offset,
-					      size, &build_id__mark_dso_hit_ops);
-}
-
-static void perf_record__exit(int status, void *arg)
-{
-	struct perf_record *rec = arg;
-
-	if (status != 0)
-		return;
-
-	if (!rec->opts.pipe_output) {
-		rec->session->header.data_size += rec->bytes_written;
-
-		if (!rec->no_buildid)
-			process_buildids(rec);
-		perf_session__write_header(rec->session, rec->evlist,
-					   rec->output, true);
-		perf_session__delete(rec->session);
-		perf_evlist__delete(rec->evlist);
-		symbol__exit();
-	}
-}
-
-static void perf_event__synthesize_guest_os(struct machine *machine, void *data)
-{
-	int err;
-	struct perf_tool *tool = data;
-	/*
-	 *As for guest kernel when processing subcommand record&report,
-	 *we arrange module mmap prior to guest kernel mmap and trigger
-	 *a preload dso because default guest module symbols are loaded
-	 *from guest kallsyms instead of /lib/modules/XXX/XXX. This
-	 *method is used to avoid symbol missing when the first addr is
-	 *in module instead of in guest kernel.
-	 */
-	err = perf_event__synthesize_modules(tool, process_synthesized_event,
-					     machine);
-	if (err < 0)
-		pr_err("Couldn't record guest kernel [%d]'s reference"
-		       " relocation symbol.\n", machine->pid);
-
-	/*
-	 * We use _stext for guest kernel because guest kernel's /proc/kallsyms
-	 * have no _text sometimes.
-	 */
-	err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
-						 machine, "_text");
-	if (err < 0)
-		err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
-							 machine, "_stext");
-	if (err < 0)
-		pr_err("Couldn't record guest kernel [%d]'s reference"
-		       " relocation symbol.\n", machine->pid);
-}
-
-static struct perf_event_header finished_round_event = {
-	.size = sizeof(struct perf_event_header),
-	.type = PERF_RECORD_FINISHED_ROUND,
-};
-
-static int perf_record__mmap_read_all(struct perf_record *rec)
-{
-	int i;
-	int rc = 0;
-
-	for (i = 0; i < rec->evlist->nr_mmaps; i++) {
-		if (rec->evlist->mmap[i].base) {
-			if (perf_record__mmap_read(rec, &rec->evlist->mmap[i]) != 0) {
-				rc = -1;
-				goto out;
-			}
-		}
-	}
-
-	if (perf_header__has_feat(&rec->session->header, HEADER_TRACING_DATA))
-		rc = write_output(rec, &finished_round_event,
-				  sizeof(finished_round_event));
-
-out:
-	return rc;
-}
-
-static int __cmd_record(struct perf_record *rec, int argc, const char **argv)
-{
-	struct stat st;
-	int flags;
-	int err, output, feat;
-	unsigned long waking = 0;
-	const bool forks = argc > 0;
-	struct machine *machine;
-	struct perf_tool *tool = &rec->tool;
-	struct perf_record_opts *opts = &rec->opts;
-	struct perf_evlist *evsel_list = rec->evlist;
-	const char *output_name = rec->output_name;
-	struct perf_session *session;
-	bool disabled = false;
-
-	rec->progname = argv[0];
-
-	rec->page_size = sysconf(_SC_PAGE_SIZE);
-
-	on_exit(perf_record__sig_exit, rec);
-	signal(SIGCHLD, sig_handler);
-	signal(SIGINT, sig_handler);
-	signal(SIGUSR1, sig_handler);
-	signal(SIGTERM, sig_handler);
-
-	if (!output_name) {
-		if (!fstat(STDOUT_FILENO, &st) && S_ISFIFO(st.st_mode))
-			opts->pipe_output = true;
-		else
-			rec->output_name = output_name = "perf.data";
-	}
-	if (output_name) {
-		if (!strcmp(output_name, "-"))
-			opts->pipe_output = true;
-		else if (!stat(output_name, &st) && st.st_size) {
-			char oldname[PATH_MAX];
-			snprintf(oldname, sizeof(oldname), "%s.old",
-				 output_name);
-			unlink(oldname);
-			rename(output_name, oldname);
-		}
-	}
-
-	flags = O_CREAT|O_RDWR|O_TRUNC;
-
-	if (opts->pipe_output)
-		output = STDOUT_FILENO;
-	else
-		output = open(output_name, flags, S_IRUSR | S_IWUSR);
-	if (output < 0) {
-		perror("failed to create output file");
-		return -1;
-	}
-
-	rec->output = output;
-
-	session = perf_session__new(output_name, O_WRONLY,
-				    true, false, NULL);
-	if (session == NULL) {
-		pr_err("Not enough memory for reading perf file header\n");
-		return -1;
-	}
-
-	rec->session = session;
-
-	for (feat = HEADER_FIRST_FEATURE; feat < HEADER_LAST_FEATURE; feat++)
-		perf_header__set_feat(&session->header, feat);
-
-	if (rec->no_buildid)
-		perf_header__clear_feat(&session->header, HEADER_BUILD_ID);
-
-	if (!have_tracepoints(&evsel_list->entries))
-		perf_header__clear_feat(&session->header, HEADER_TRACING_DATA);
-
-	if (!rec->opts.branch_stack)
-		perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK);
-
-	if (forks) {
-		err = perf_evlist__prepare_workload(evsel_list, &opts->target,
-						    argv, opts->pipe_output,
-						    true);
-		if (err < 0) {
-			pr_err("Couldn't run the workload!\n");
-			goto out_delete_session;
-		}
-	}
-
-	if (perf_record__open(rec) != 0) {
-		err = -1;
-		goto out_delete_session;
-	}
-
-	if (!evsel_list->nr_groups)
-		perf_header__clear_feat(&session->header, HEADER_GROUP_DESC);
-
-	/*
-	 * perf_session__delete(session) will be called at perf_record__exit()
-	 */
-	on_exit(perf_record__exit, rec);
-
-	if (opts->pipe_output) {
-		err = perf_header__write_pipe(output);
-		if (err < 0)
-			goto out_delete_session;
-	} else {
-		err = perf_session__write_header(session, evsel_list,
-						 output, false);
-		if (err < 0)
-			goto out_delete_session;
-	}
-
-	if (!rec->no_buildid
-	    && !perf_header__has_feat(&session->header, HEADER_BUILD_ID)) {
-		pr_err("Couldn't generate buildids. "
-		       "Use --no-buildid to profile anyway.\n");
-		err = -1;
-		goto out_delete_session;
-	}
-
-	rec->post_processing_offset = lseek(output, 0, SEEK_CUR);
-
-	machine = &session->machines.host;
-
-	if (opts->pipe_output) {
-		err = perf_event__synthesize_attrs(tool, session,
-						   process_synthesized_event);
-		if (err < 0) {
-			pr_err("Couldn't synthesize attrs.\n");
-			goto out_delete_session;
-		}
-
-		if (have_tracepoints(&evsel_list->entries)) {
-			/*
-			 * FIXME err <= 0 here actually means that
-			 * there were no tracepoints so its not really
-			 * an error, just that we don't need to
-			 * synthesize anything.  We really have to
-			 * return this more properly and also
-			 * propagate errors that now are calling die()
-			 */
-			err = perf_event__synthesize_tracing_data(tool, output, evsel_list,
-								  process_synthesized_event);
-			if (err <= 0) {
-				pr_err("Couldn't record tracing data.\n");
-				goto out_delete_session;
-			}
-			advance_output(rec, err);
-		}
-	}
-
-	err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
-						 machine, "_text");
-	if (err < 0)
-		err = perf_event__synthesize_kernel_mmap(tool, process_synthesized_event,
-							 machine, "_stext");
-	if (err < 0)
-		pr_err("Couldn't record kernel reference relocation symbol\n"
-		       "Symbol resolution may be skewed if relocation was used (e.g. kexec).\n"
-		       "Check /proc/kallsyms permission or run as root.\n");
-
-	err = perf_event__synthesize_modules(tool, process_synthesized_event,
-					     machine);
-	if (err < 0)
-		pr_err("Couldn't record kernel module information.\n"
-		       "Symbol resolution may be skewed if relocation was used (e.g. kexec).\n"
-		       "Check /proc/modules permission or run as root.\n");
-
-	if (perf_guest) {
-		machines__process_guests(&session->machines,
-					 perf_event__synthesize_guest_os, tool);
-	}
-
-	if (perf_target__has_task(&opts->target))
-		err = perf_event__synthesize_thread_map(tool, evsel_list->threads,
-						  process_synthesized_event,
-						  machine);
-	else if (perf_target__has_cpu(&opts->target))
-		err = perf_event__synthesize_threads(tool, process_synthesized_event,
-					       machine);
-	else /* command specified */
-		err = 0;
-
-	if (err != 0)
-		goto out_delete_session;
-
-	if (rec->realtime_prio) {
-		struct sched_param param;
-
-		param.sched_priority = rec->realtime_prio;
-		if (sched_setscheduler(0, SCHED_FIFO, &param)) {
-			pr_err("Could not set realtime priority.\n");
-			err = -1;
-			goto out_delete_session;
-		}
-	}
-
-	/*
-	 * When perf is starting the traced process, all the events
-	 * (apart from group members) have enable_on_exec=1 set,
-	 * so don't spoil it by prematurely enabling them.
-	 */
-	if (!perf_target__none(&opts->target))
-		perf_evlist__enable(evsel_list);
-
-	/*
-	 * Let the child rip
-	 */
-	if (forks)
-		perf_evlist__start_workload(evsel_list);
-
-	for (;;) {
-		int hits = rec->samples;
-
-		if (perf_record__mmap_read_all(rec) < 0) {
-			err = -1;
-			goto out_delete_session;
-		}
-
-		if (hits == rec->samples) {
-			if (done)
-				break;
-			err = poll(evsel_list->pollfd, evsel_list->nr_fds, -1);
-			waking++;
-		}
-
-		/*
-		 * When perf is starting the traced process, at the end events
-		 * die with the process and we wait for that. Thus no need to
-		 * disable events in this case.
-		 */
-		if (done && !disabled && !perf_target__none(&opts->target)) {
-			perf_evlist__disable(evsel_list);
-			disabled = true;
-		}
-	}
-
-	if (quiet || signr == SIGUSR1)
-		return 0;
-
-	fprintf(stderr, "[ perf record: Woken up %ld times to write data ]\n", waking);
-
-	/*
-	 * Approximate RIP event size: 24 bytes.
-	 */
-	fprintf(stderr,
-		"[ perf record: Captured and wrote %.3f MB %s (~%" PRIu64 " samples) ]\n",
-		(double)rec->bytes_written / 1024.0 / 1024.0,
-		output_name,
-		rec->bytes_written / 24);
-
-	return 0;
-
-out_delete_session:
-	perf_session__delete(session);
-	return err;
-}
-
-#define BRANCH_OPT(n, m) \
-	{ .name = n, .mode = (m) }
-
-#define BRANCH_END { .name = NULL }
-
-struct branch_mode {
-	const char *name;
-	int mode;
-};
-
-static const struct branch_mode branch_modes[] = {
-	BRANCH_OPT("u", PERF_SAMPLE_BRANCH_USER),
-	BRANCH_OPT("k", PERF_SAMPLE_BRANCH_KERNEL),
-	BRANCH_OPT("hv", PERF_SAMPLE_BRANCH_HV),
-	BRANCH_OPT("any", PERF_SAMPLE_BRANCH_ANY),
-	BRANCH_OPT("any_call", PERF_SAMPLE_BRANCH_ANY_CALL),
-	BRANCH_OPT("any_ret", PERF_SAMPLE_BRANCH_ANY_RETURN),
-	BRANCH_OPT("ind_call", PERF_SAMPLE_BRANCH_IND_CALL),
-	BRANCH_END
-};
-
-static int
-parse_branch_stack(const struct option *opt, const char *str, int unset)
-{
-#define ONLY_PLM \
-	(PERF_SAMPLE_BRANCH_USER	|\
-	 PERF_SAMPLE_BRANCH_KERNEL	|\
-	 PERF_SAMPLE_BRANCH_HV)
-
-	uint64_t *mode = (uint64_t *)opt->value;
-	const struct branch_mode *br;
-	char *s, *os = NULL, *p;
-	int ret = -1;
-
-	if (unset)
-		return 0;
-
-	/*
-	 * cannot set it twice, -b + --branch-filter for instance
-	 */
-	if (*mode)
-		return -1;
-
-	/* str may be NULL in case no arg is passed to -b */
-	if (str) {
-		/* because str is read-only */
-		s = os = strdup(str);
-		if (!s)
-			return -1;
-
-		for (;;) {
-			p = strchr(s, ',');
-			if (p)
-				*p = '\0';
-
-			for (br = branch_modes; br->name; br++) {
-				if (!strcasecmp(s, br->name))
-					break;
-			}
-			if (!br->name) {
-				ui__warning("unknown branch filter %s,"
-					    " check man page\n", s);
-				goto error;
-			}
-
-			*mode |= br->mode;
-
-			if (!p)
-				break;
-
-			s = p + 1;
-		}
-	}
-	ret = 0;
-
-	/* default to any branch */
-	if ((*mode & ~ONLY_PLM) == 0) {
-		*mode = PERF_SAMPLE_BRANCH_ANY;
-	}
-error:
-	free(os);
-	return ret;
-}
-
-#ifdef LIBUNWIND_SUPPORT
-static int get_stack_size(char *str, unsigned long *_size)
-{
-	char *endptr;
-	unsigned long size;
-	unsigned long max_size = round_down(USHRT_MAX, sizeof(u64));
-
-	size = strtoul(str, &endptr, 0);
-
-	do {
-		if (*endptr)
-			break;
-
-		size = round_up(size, sizeof(u64));
-		if (!size || size > max_size)
-			break;
-
-		*_size = size;
-		return 0;
-
-	} while (0);
-
-	pr_err("callchain: Incorrect stack dump size (max %ld): %s\n",
-	       max_size, str);
-	return -1;
-}
-#endif /* LIBUNWIND_SUPPORT */
-
-int record_parse_callchain(const char *arg, struct perf_record_opts *opts)
-{
-	char *tok, *name, *saveptr = NULL;
-	char *buf;
-	int ret = -1;
-
-	/* We need buffer that we know we can write to. */
-	buf = malloc(strlen(arg) + 1);
-	if (!buf)
-		return -ENOMEM;
-
-	strcpy(buf, arg);
-
-	tok = strtok_r((char *)buf, ",", &saveptr);
-	name = tok ? : (char *)buf;
-
-	do {
-		/* Framepointer style */
-		if (!strncmp(name, "fp", sizeof("fp"))) {
-			if (!strtok_r(NULL, ",", &saveptr)) {
-				opts->call_graph = CALLCHAIN_FP;
-				ret = 0;
-			} else
-				pr_err("callchain: No more arguments "
-				       "needed for -g fp\n");
-			break;
-
-#ifdef LIBUNWIND_SUPPORT
-		/* Dwarf style */
-		} else if (!strncmp(name, "dwarf", sizeof("dwarf"))) {
-			const unsigned long default_stack_dump_size = 8192;
-
-			ret = 0;
-			opts->call_graph = CALLCHAIN_DWARF;
-			opts->stack_dump_size = default_stack_dump_size;
-
-			tok = strtok_r(NULL, ",", &saveptr);
-			if (tok) {
-				unsigned long size = 0;
-
-				ret = get_stack_size(tok, &size);
-				opts->stack_dump_size = size;
-			}
-#endif /* LIBUNWIND_SUPPORT */
-		} else {
-			pr_err("callchain: Unknown --call-graph option "
-			       "value: %s\n", arg);
-			break;
-		}
-
-	} while (0);
-
-	free(buf);
-	return ret;
-}
-
-static void callchain_debug(struct perf_record_opts *opts)
-{
-	pr_debug("callchain: type %d\n", opts->call_graph);
-
-	if (opts->call_graph == CALLCHAIN_DWARF)
-		pr_debug("callchain: stack dump size %d\n",
-			 opts->stack_dump_size);
-}
-
-int record_parse_callchain_opt(const struct option *opt,
-			       const char *arg,
-			       int unset)
-{
-	struct perf_record_opts *opts = opt->value;
-	int ret;
-
-	/* --no-call-graph */
-	if (unset) {
-		opts->call_graph = CALLCHAIN_NONE;
-		pr_debug("callchain: disabled\n");
-		return 0;
-	}
-
-	ret = record_parse_callchain(arg, opts);
-	if (!ret)
-		callchain_debug(opts);
-
-	return ret;
-}
-
-int record_callchain_opt(const struct option *opt,
-			 const char *arg __maybe_unused,
-			 int unset __maybe_unused)
-{
-	struct perf_record_opts *opts = opt->value;
-
-	if (opts->call_graph == CALLCHAIN_NONE)
-		opts->call_graph = CALLCHAIN_FP;
-
-	callchain_debug(opts);
-	return 0;
-}
-
-static const char * const record_usage[] = {
-	"perf record [<options>] [<command>]",
-	"perf record [<options>] -- <command> [<options>]",
-	NULL
-};
-
-/*
- * XXX Ideally would be local to cmd_record() and passed to a perf_record__new
- * because we need to have access to it in perf_record__exit, that is called
- * after cmd_record() exits, but since record_options need to be accessible to
- * builtin-script, leave it here.
- *
- * At least we don't ouch it in all the other functions here directly.
- *
- * Just say no to tons of global variables, sigh.
- */
-static struct perf_record record = {
-	.opts = {
-		.mmap_pages	     = UINT_MAX,
-		.user_freq	     = UINT_MAX,
-		.user_interval	     = ULLONG_MAX,
-		.freq		     = 4000,
-		.target		     = {
-			.uses_mmap   = true,
-		},
-	},
-};
-
-#define CALLCHAIN_HELP "setup and enables call-graph (stack chain/backtrace) recording: "
-
-#ifdef LIBUNWIND_SUPPORT
-const char record_callchain_help[] = CALLCHAIN_HELP "fp dwarf";
-#else
-const char record_callchain_help[] = CALLCHAIN_HELP "fp";
-#endif
-
-/*
- * XXX Will stay a global variable till we fix builtin-script.c to stop messing
- * with it and switch to use the library functions in perf_evlist that came
- * from builtin-record.c, i.e. use perf_record_opts,
- * perf_evlist__prepare_workload, etc instead of fork+exec'in 'perf record',
- * using pipes, etc.
- */
-const struct option record_options[] = {
-	OPT_CALLBACK('e', "event", &record.evlist, "event",
-		     "event selector. use 'perf list' to list available events",
-		     parse_events_option),
-	OPT_CALLBACK(0, "filter", &record.evlist, "filter",
-		     "event filter", parse_filter),
-	OPT_STRING('p', "pid", &record.opts.target.pid, "pid",
-		    "record events on existing process id"),
-	OPT_STRING('t', "tid", &record.opts.target.tid, "tid",
-		    "record events on existing thread id"),
-	OPT_INTEGER('r', "realtime", &record.realtime_prio,
-		    "collect data with this RT SCHED_FIFO priority"),
-	OPT_BOOLEAN('D', "no-delay", &record.opts.no_delay,
-		    "collect data without buffering"),
-	OPT_BOOLEAN('R', "raw-samples", &record.opts.raw_samples,
-		    "collect raw sample records from all opened counters"),
-	OPT_BOOLEAN('a', "all-cpus", &record.opts.target.system_wide,
-			    "system-wide collection from all CPUs"),
-	OPT_STRING('C', "cpu", &record.opts.target.cpu_list, "cpu",
-		    "list of cpus to monitor"),
-	OPT_U64('c', "count", &record.opts.user_interval, "event period to sample"),
-	OPT_STRING('o', "output", &record.output_name, "file",
-		    "output file name"),
-	OPT_BOOLEAN('i', "no-inherit", &record.opts.no_inherit,
-		    "child tasks do not inherit counters"),
-	OPT_UINTEGER('F', "freq", &record.opts.user_freq, "profile at this frequency"),
-	OPT_UINTEGER('m', "mmap-pages", &record.opts.mmap_pages,
-		     "number of mmap data pages"),
-	OPT_BOOLEAN(0, "group", &record.opts.group,
-		    "put the counters into a counter group"),
-	OPT_CALLBACK_NOOPT('g', NULL, &record.opts,
-			   NULL, "enables call-graph recording" ,
-			   &record_callchain_opt),
-	OPT_CALLBACK(0, "call-graph", &record.opts,
-		     "mode[,dump_size]", record_callchain_help,
-		     &record_parse_callchain_opt),
-	OPT_INCR('v', "verbose", &verbose,
-		    "be more verbose (show counter open errors, etc)"),
-	OPT_BOOLEAN('q', "quiet", &quiet, "don't print any message"),
-	OPT_BOOLEAN('s', "stat", &record.opts.inherit_stat,
-		    "per thread counts"),
-	OPT_BOOLEAN('d', "data", &record.opts.sample_address,
-		    "Sample addresses"),
-	OPT_BOOLEAN('T', "timestamp", &record.opts.sample_time, "Sample timestamps"),
-	OPT_BOOLEAN('P', "period", &record.opts.period, "Sample period"),
-	OPT_BOOLEAN('n', "no-samples", &record.opts.no_samples,
-		    "don't sample"),
-	OPT_BOOLEAN('N', "no-buildid-cache", &record.no_buildid_cache,
-		    "do not update the buildid cache"),
-	OPT_BOOLEAN('B', "no-buildid", &record.no_buildid,
-		    "do not collect buildids in perf.data"),
-	OPT_CALLBACK('G', "cgroup", &record.evlist, "name",
-		     "monitor event in cgroup name only",
-		     parse_cgroups),
-	OPT_STRING('u', "uid", &record.opts.target.uid_str, "user",
-		   "user to profile"),
-
-	OPT_CALLBACK_NOOPT('b', "branch-any", &record.opts.branch_stack,
-		     "branch any", "sample any taken branches",
-		     parse_branch_stack),
-
-	OPT_CALLBACK('j', "branch-filter", &record.opts.branch_stack,
-		     "branch filter mask", "branch stack filter modes",
-		     parse_branch_stack),
-	OPT_BOOLEAN('W', "weight", &record.opts.sample_weight,
-		    "sample by weight (on special events only)"),
-	OPT_END()
-};
-
-int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	int err = -ENOMEM;
-	struct perf_evlist *evsel_list;
-	struct perf_record *rec = &record;
-	char errbuf[BUFSIZ];
-
-	evsel_list = perf_evlist__new();
-	if (evsel_list == NULL)
-		return -ENOMEM;
-
-	rec->evlist = evsel_list;
-
-	argc = parse_options(argc, argv, record_options, record_usage,
-			    PARSE_OPT_STOP_AT_NON_OPTION);
-	if (!argc && perf_target__none(&rec->opts.target))
-		usage_with_options(record_usage, record_options);
-
-	if (nr_cgroups && !rec->opts.target.system_wide) {
-		ui__error("cgroup monitoring only available in"
-			  " system-wide mode\n");
-		usage_with_options(record_usage, record_options);
-	}
-
-	symbol__init();
-
-	if (symbol_conf.kptr_restrict)
-		pr_warning(
-"WARNING: Kernel address maps (/proc/{kallsyms,modules}) are restricted,\n"
-"check /proc/sys/kernel/kptr_restrict.\n\n"
-"Samples in kernel functions may not be resolved if a suitable vmlinux\n"
-"file is not found in the buildid cache or in the vmlinux path.\n\n"
-"Samples in kernel modules won't be resolved at all.\n\n"
-"If some relocation was applied (e.g. kexec) symbols may be misresolved\n"
-"even with a suitable vmlinux or kallsyms file.\n\n");
-
-	if (rec->no_buildid_cache || rec->no_buildid)
-		disable_buildid_cache();
-
-	if (evsel_list->nr_entries == 0 &&
-	    perf_evlist__add_default(evsel_list) < 0) {
-		pr_err("Not enough memory for event selector list\n");
-		goto out_symbol_exit;
-	}
-
-	err = perf_target__validate(&rec->opts.target);
-	if (err) {
-		perf_target__strerror(&rec->opts.target, err, errbuf, BUFSIZ);
-		ui__warning("%s", errbuf);
-	}
-
-	err = perf_target__parse_uid(&rec->opts.target);
-	if (err) {
-		int saved_errno = errno;
-
-		perf_target__strerror(&rec->opts.target, err, errbuf, BUFSIZ);
-		ui__error("%s", errbuf);
-
-		err = -saved_errno;
-		goto out_symbol_exit;
-	}
-
-	err = -ENOMEM;
-	if (perf_evlist__create_maps(evsel_list, &rec->opts.target) < 0)
-		usage_with_options(record_usage, record_options);
-
-	if (rec->opts.user_interval != ULLONG_MAX)
-		rec->opts.default_interval = rec->opts.user_interval;
-	if (rec->opts.user_freq != UINT_MAX)
-		rec->opts.freq = rec->opts.user_freq;
-
-	/*
-	 * User specified count overrides default frequency.
-	 */
-	if (rec->opts.default_interval)
-		rec->opts.freq = 0;
-	else if (rec->opts.freq) {
-		rec->opts.default_interval = rec->opts.freq;
-	} else {
-		ui__error("frequency and count are zero, aborting\n");
-		err = -EINVAL;
-		goto out_free_fd;
-	}
-
-	err = __cmd_record(&record, argc, argv);
-
-	perf_evlist__munmap(evsel_list);
-	perf_evlist__close(evsel_list);
-out_free_fd:
-	perf_evlist__delete_maps(evsel_list);
-out_symbol_exit:
-	symbol__exit();
-	return err;
-}
diff --git a/src/tools/perf/builtin-report.c b/src/tools/perf/builtin-report.c
deleted file mode 100644
index 72eae74..0000000
--- a/src/tools/perf/builtin-report.c
+++ /dev/null
@@ -1,977 +0,0 @@
-/*
- * builtin-report.c
- *
- * Builtin report command: Analyze the perf.data input file,
- * look up and read DSOs and symbol information and display
- * a histogram of results, along various sorting keys.
- */
-#include "builtin.h"
-
-#include "util/util.h"
-#include "util/cache.h"
-
-#include "util/annotate.h"
-#include "util/color.h"
-#include <linux/list.h>
-#include <linux/rbtree.h>
-#include "util/symbol.h"
-#include "util/callchain.h"
-#include "util/strlist.h"
-#include "util/values.h"
-
-#include "perf.h"
-#include "util/debug.h"
-#include "util/evlist.h"
-#include "util/evsel.h"
-#include "util/header.h"
-#include "util/session.h"
-#include "util/tool.h"
-
-#include "util/parse-options.h"
-#include "util/parse-events.h"
-
-#include "util/thread.h"
-#include "util/sort.h"
-#include "util/hist.h"
-#include "arch/common.h"
-
-#include <linux/bitmap.h>
-
-struct perf_report {
-	struct perf_tool	tool;
-	struct perf_session	*session;
-	bool			force, use_tui, use_gtk, use_stdio;
-	bool			hide_unresolved;
-	bool			dont_use_callchains;
-	bool			show_full_info;
-	bool			show_threads;
-	bool			inverted_callchain;
-	bool			mem_mode;
-	struct perf_read_values	show_threads_values;
-	const char		*pretty_printing_style;
-	const char		*cpu_list;
-	const char		*symbol_filter_str;
-	float			min_percent;
-	DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS);
-};
-
-static int perf_report_config(const char *var, const char *value, void *cb)
-{
-	if (!strcmp(var, "report.group")) {
-		symbol_conf.event_group = perf_config_bool(var, value);
-		return 0;
-	}
-	if (!strcmp(var, "report.percent-limit")) {
-		struct perf_report *rep = cb;
-		rep->min_percent = strtof(value, NULL);
-		return 0;
-	}
-
-	return perf_default_config(var, value, cb);
-}
-
-static int perf_report__add_mem_hist_entry(struct perf_tool *tool,
-					   struct addr_location *al,
-					   struct perf_sample *sample,
-					   struct perf_evsel *evsel,
-					   struct machine *machine,
-					   union perf_event *event)
-{
-	struct perf_report *rep = container_of(tool, struct perf_report, tool);
-	struct symbol *parent = NULL;
-	u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
-	int err = 0;
-	struct hist_entry *he;
-	struct mem_info *mi, *mx;
-	uint64_t cost;
-
-	if ((sort__has_parent || symbol_conf.use_callchain) &&
-	    sample->callchain) {
-		err = machine__resolve_callchain(machine, evsel, al->thread,
-						 sample, &parent, al);
-		if (err)
-			return err;
-	}
-
-	mi = machine__resolve_mem(machine, al->thread, sample, cpumode);
-	if (!mi)
-		return -ENOMEM;
-
-	if (rep->hide_unresolved && !al->sym)
-		return 0;
-
-	cost = sample->weight;
-	if (!cost)
-		cost = 1;
-
-	/*
-	 * must pass period=weight in order to get the correct
-	 * sorting from hists__collapse_resort() which is solely
-	 * based on periods. We want sorting be done on nr_events * weight
-	 * and this is indirectly achieved by passing period=weight here
-	 * and the he_stat__add_period() function.
-	 */
-	he = __hists__add_mem_entry(&evsel->hists, al, parent, mi, cost, cost);
-	if (!he)
-		return -ENOMEM;
-
-	/*
-	 * In the TUI browser, we are doing integrated annotation,
-	 * so we don't allocate the extra space needed because the stdio
-	 * code will not use it.
-	 */
-	if (sort__has_sym && he->ms.sym && use_browser > 0) {
-		struct annotation *notes = symbol__annotation(he->ms.sym);
-
-		assert(evsel != NULL);
-
-		if (notes->src == NULL && symbol__alloc_hist(he->ms.sym) < 0)
-			goto out;
-
-		err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr);
-		if (err)
-			goto out;
-	}
-
-	if (sort__has_sym && he->mem_info->daddr.sym && use_browser > 0) {
-		struct annotation *notes;
-
-		mx = he->mem_info;
-
-		notes = symbol__annotation(mx->daddr.sym);
-		if (notes->src == NULL && symbol__alloc_hist(mx->daddr.sym) < 0)
-			goto out;
-
-		err = symbol__inc_addr_samples(mx->daddr.sym,
-					       mx->daddr.map,
-					       evsel->idx,
-					       mx->daddr.al_addr);
-		if (err)
-			goto out;
-	}
-
-	evsel->hists.stats.total_period += cost;
-	hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE);
-	err = 0;
-
-	if (symbol_conf.use_callchain) {
-		err = callchain_append(he->callchain,
-				       &callchain_cursor,
-				       sample->period);
-	}
-out:
-	return err;
-}
-
-static int perf_report__add_branch_hist_entry(struct perf_tool *tool,
-					struct addr_location *al,
-					struct perf_sample *sample,
-					struct perf_evsel *evsel,
-				      struct machine *machine)
-{
-	struct perf_report *rep = container_of(tool, struct perf_report, tool);
-	struct symbol *parent = NULL;
-	int err = 0;
-	unsigned i;
-	struct hist_entry *he;
-	struct branch_info *bi, *bx;
-
-	if ((sort__has_parent || symbol_conf.use_callchain)
-	    && sample->callchain) {
-		err = machine__resolve_callchain(machine, evsel, al->thread,
-						 sample, &parent, al);
-		if (err)
-			return err;
-	}
-
-	bi = machine__resolve_bstack(machine, al->thread,
-				     sample->branch_stack);
-	if (!bi)
-		return -ENOMEM;
-
-	for (i = 0; i < sample->branch_stack->nr; i++) {
-		if (rep->hide_unresolved && !(bi[i].from.sym && bi[i].to.sym))
-			continue;
-
-		err = -ENOMEM;
-
-		/*
-		 * The report shows the percentage of total branches captured
-		 * and not events sampled. Thus we use a pseudo period of 1.
-		 */
-		he = __hists__add_branch_entry(&evsel->hists, al, parent,
-				&bi[i], 1, 1);
-		if (he) {
-			struct annotation *notes;
-			bx = he->branch_info;
-			if (bx->from.sym && use_browser == 1 && sort__has_sym) {
-				notes = symbol__annotation(bx->from.sym);
-				if (!notes->src
-				    && symbol__alloc_hist(bx->from.sym) < 0)
-					goto out;
-
-				err = symbol__inc_addr_samples(bx->from.sym,
-							       bx->from.map,
-							       evsel->idx,
-							       bx->from.al_addr);
-				if (err)
-					goto out;
-			}
-
-			if (bx->to.sym && use_browser == 1 && sort__has_sym) {
-				notes = symbol__annotation(bx->to.sym);
-				if (!notes->src
-				    && symbol__alloc_hist(bx->to.sym) < 0)
-					goto out;
-
-				err = symbol__inc_addr_samples(bx->to.sym,
-							       bx->to.map,
-							       evsel->idx,
-							       bx->to.al_addr);
-				if (err)
-					goto out;
-			}
-			evsel->hists.stats.total_period += 1;
-			hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE);
-		} else
-			goto out;
-	}
-	err = 0;
-out:
-	free(bi);
-	return err;
-}
-
-static int perf_evsel__add_hist_entry(struct perf_evsel *evsel,
-				      struct addr_location *al,
-				      struct perf_sample *sample,
-				      struct machine *machine)
-{
-	struct symbol *parent = NULL;
-	int err = 0;
-	struct hist_entry *he;
-
-	if ((sort__has_parent || symbol_conf.use_callchain) && sample->callchain) {
-		err = machine__resolve_callchain(machine, evsel, al->thread,
-						 sample, &parent, al);
-		if (err)
-			return err;
-	}
-
-	he = __hists__add_entry(&evsel->hists, al, parent, sample->period,
-					sample->weight);
-	if (he == NULL)
-		return -ENOMEM;
-
-	if (symbol_conf.use_callchain) {
-		err = callchain_append(he->callchain,
-				       &callchain_cursor,
-				       sample->period);
-		if (err)
-			return err;
-	}
-	/*
-	 * Only in the TUI browser we are doing integrated annotation,
-	 * so we don't allocated the extra space needed because the stdio
-	 * code will not use it.
-	 */
-	if (he->ms.sym != NULL && use_browser == 1 && sort__has_sym) {
-		struct annotation *notes = symbol__annotation(he->ms.sym);
-
-		assert(evsel != NULL);
-
-		err = -ENOMEM;
-		if (notes->src == NULL && symbol__alloc_hist(he->ms.sym) < 0)
-			goto out;
-
-		err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr);
-	}
-
-	evsel->hists.stats.total_period += sample->period;
-	hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE);
-out:
-	return err;
-}
-
-
-static int process_sample_event(struct perf_tool *tool,
-				union perf_event *event,
-				struct perf_sample *sample,
-				struct perf_evsel *evsel,
-				struct machine *machine)
-{
-	struct perf_report *rep = container_of(tool, struct perf_report, tool);
-	struct addr_location al;
-	int ret;
-
-	if (perf_event__preprocess_sample(event, machine, &al, sample) < 0) {
-		fprintf(stderr, "problem processing %d event, skipping it.\n",
-			event->header.type);
-		return -1;
-	}
-
-	if (al.filtered || (rep->hide_unresolved && al.sym == NULL))
-		return 0;
-
-	if (rep->cpu_list && !test_bit(sample->cpu, rep->cpu_bitmap))
-		return 0;
-
-	if (sort__mode == SORT_MODE__BRANCH) {
-		ret = perf_report__add_branch_hist_entry(tool, &al, sample,
-							 evsel, machine);
-		if (ret < 0)
-			pr_debug("problem adding lbr entry, skipping event\n");
-	} else if (rep->mem_mode == 1) {
-		ret = perf_report__add_mem_hist_entry(tool, &al, sample,
-						      evsel, machine, event);
-		if (ret < 0)
-			pr_debug("problem adding mem entry, skipping event\n");
-	} else {
-		if (al.map != NULL)
-			al.map->dso->hit = 1;
-
-		ret = perf_evsel__add_hist_entry(evsel, &al, sample, machine);
-		if (ret < 0)
-			pr_debug("problem incrementing symbol period, skipping event\n");
-	}
-	return ret;
-}
-
-static int process_read_event(struct perf_tool *tool,
-			      union perf_event *event,
-			      struct perf_sample *sample __maybe_unused,
-			      struct perf_evsel *evsel,
-			      struct machine *machine __maybe_unused)
-{
-	struct perf_report *rep = container_of(tool, struct perf_report, tool);
-
-	if (rep->show_threads) {
-		const char *name = evsel ? perf_evsel__name(evsel) : "unknown";
-		perf_read_values_add_value(&rep->show_threads_values,
-					   event->read.pid, event->read.tid,
-					   event->read.id,
-					   name,
-					   event->read.value);
-	}
-
-	dump_printf(": %d %d %s %" PRIu64 "\n", event->read.pid, event->read.tid,
-		    evsel ? perf_evsel__name(evsel) : "FAIL",
-		    event->read.value);
-
-	return 0;
-}
-
-/* For pipe mode, sample_type is not currently set */
-static int perf_report__setup_sample_type(struct perf_report *rep)
-{
-	struct perf_session *self = rep->session;
-	u64 sample_type = perf_evlist__combined_sample_type(self->evlist);
-
-	if (!self->fd_pipe && !(sample_type & PERF_SAMPLE_CALLCHAIN)) {
-		if (sort__has_parent) {
-			ui__error("Selected --sort parent, but no "
-				    "callchain data. Did you call "
-				    "'perf record' without -g?\n");
-			return -EINVAL;
-		}
-		if (symbol_conf.use_callchain) {
-			ui__error("Selected -g but no callchain data. Did "
-				    "you call 'perf record' without -g?\n");
-			return -1;
-		}
-	} else if (!rep->dont_use_callchains &&
-		   callchain_param.mode != CHAIN_NONE &&
-		   !symbol_conf.use_callchain) {
-			symbol_conf.use_callchain = true;
-			if (callchain_register_param(&callchain_param) < 0) {
-				ui__error("Can't register callchain params.\n");
-				return -EINVAL;
-			}
-	}
-
-	if (sort__mode == SORT_MODE__BRANCH) {
-		if (!self->fd_pipe &&
-		    !(sample_type & PERF_SAMPLE_BRANCH_STACK)) {
-			ui__error("Selected -b but no branch data. "
-				  "Did you call perf record without -b?\n");
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-static void sig_handler(int sig __maybe_unused)
-{
-	session_done = 1;
-}
-
-static size_t hists__fprintf_nr_sample_events(struct perf_report *rep,
-					      struct hists *self,
-					      const char *evname, FILE *fp)
-{
-	size_t ret;
-	char unit;
-	unsigned long nr_samples = self->stats.nr_events[PERF_RECORD_SAMPLE];
-	u64 nr_events = self->stats.total_period;
-	struct perf_evsel *evsel = hists_to_evsel(self);
-	char buf[512];
-	size_t size = sizeof(buf);
-
-	if (perf_evsel__is_group_event(evsel)) {
-		struct perf_evsel *pos;
-
-		perf_evsel__group_desc(evsel, buf, size);
-		evname = buf;
-
-		for_each_group_member(pos, evsel) {
-			nr_samples += pos->hists.stats.nr_events[PERF_RECORD_SAMPLE];
-			nr_events += pos->hists.stats.total_period;
-		}
-	}
-
-	nr_samples = convert_unit(nr_samples, &unit);
-	ret = fprintf(fp, "# Samples: %lu%c", nr_samples, unit);
-	if (evname != NULL)
-		ret += fprintf(fp, " of event '%s'", evname);
-
-	if (rep->mem_mode) {
-		ret += fprintf(fp, "\n# Total weight : %" PRIu64, nr_events);
-		ret += fprintf(fp, "\n# Sort order   : %s", sort_order);
-	} else
-		ret += fprintf(fp, "\n# Event count (approx.): %" PRIu64, nr_events);
-	return ret + fprintf(fp, "\n#\n");
-}
-
-static int perf_evlist__tty_browse_hists(struct perf_evlist *evlist,
-					 struct perf_report *rep,
-					 const char *help)
-{
-	struct perf_evsel *pos;
-
-	list_for_each_entry(pos, &evlist->entries, node) {
-		struct hists *hists = &pos->hists;
-		const char *evname = perf_evsel__name(pos);
-
-		if (symbol_conf.event_group &&
-		    !perf_evsel__is_group_leader(pos))
-			continue;
-
-		hists__fprintf_nr_sample_events(rep, hists, evname, stdout);
-		hists__fprintf(hists, true, 0, 0, rep->min_percent, stdout);
-		fprintf(stdout, "\n\n");
-	}
-
-	if (sort_order == default_sort_order &&
-	    parent_pattern == default_parent_pattern) {
-		fprintf(stdout, "#\n# (%s)\n#\n", help);
-
-		if (rep->show_threads) {
-			bool style = !strcmp(rep->pretty_printing_style, "raw");
-			perf_read_values_display(stdout, &rep->show_threads_values,
-						 style);
-			perf_read_values_destroy(&rep->show_threads_values);
-		}
-	}
-
-	return 0;
-}
-
-static int __cmd_report(struct perf_report *rep)
-{
-	int ret = -EINVAL;
-	u64 nr_samples;
-	struct perf_session *session = rep->session;
-	struct perf_evsel *pos;
-	struct map *kernel_map;
-	struct kmap *kernel_kmap;
-	const char *help = "For a higher level overview, try: perf report --sort comm,dso";
-
-	signal(SIGINT, sig_handler);
-
-	if (rep->cpu_list) {
-		ret = perf_session__cpu_bitmap(session, rep->cpu_list,
-					       rep->cpu_bitmap);
-		if (ret)
-			return ret;
-	}
-
-	if (use_browser <= 0)
-		perf_session__fprintf_info(session, stdout, rep->show_full_info);
-
-	if (rep->show_threads)
-		perf_read_values_init(&rep->show_threads_values);
-
-	ret = perf_report__setup_sample_type(rep);
-	if (ret)
-		return ret;
-
-	ret = perf_session__process_events(session, &rep->tool);
-	if (ret)
-		return ret;
-
-	kernel_map = session->machines.host.vmlinux_maps[MAP__FUNCTION];
-	kernel_kmap = map__kmap(kernel_map);
-	if (kernel_map == NULL ||
-	    (kernel_map->dso->hit &&
-	     (kernel_kmap->ref_reloc_sym == NULL ||
-	      kernel_kmap->ref_reloc_sym->addr == 0))) {
-		const char *desc =
-		    "As no suitable kallsyms nor vmlinux was found, kernel samples\n"
-		    "can't be resolved.";
-
-		if (kernel_map) {
-			const struct dso *kdso = kernel_map->dso;
-			if (!RB_EMPTY_ROOT(&kdso->symbols[MAP__FUNCTION])) {
-				desc = "If some relocation was applied (e.g. "
-				       "kexec) symbols may be misresolved.";
-			}
-		}
-
-		ui__warning(
-"Kernel address maps (/proc/{kallsyms,modules}) were restricted.\n\n"
-"Check /proc/sys/kernel/kptr_restrict before running 'perf record'.\n\n%s\n\n"
-"Samples in kernel modules can't be resolved as well.\n\n",
-		desc);
-	}
-
-	if (verbose > 3)
-		perf_session__fprintf(session, stdout);
-
-	if (verbose > 2)
-		perf_session__fprintf_dsos(session, stdout);
-
-	if (dump_trace) {
-		perf_session__fprintf_nr_events(session, stdout);
-		return 0;
-	}
-
-	nr_samples = 0;
-	list_for_each_entry(pos, &session->evlist->entries, node) {
-		struct hists *hists = &pos->hists;
-
-		if (pos->idx == 0)
-			hists->symbol_filter_str = rep->symbol_filter_str;
-
-		hists__collapse_resort(hists);
-		nr_samples += hists->stats.nr_events[PERF_RECORD_SAMPLE];
-
-		/* Non-group events are considered as leader */
-		if (symbol_conf.event_group &&
-		    !perf_evsel__is_group_leader(pos)) {
-			struct hists *leader_hists = &pos->leader->hists;
-
-			hists__match(leader_hists, hists);
-			hists__link(leader_hists, hists);
-		}
-	}
-
-	if (session_done())
-		return 0;
-
-	if (nr_samples == 0) {
-		ui__error("The %s file has no samples!\n", session->filename);
-		return 0;
-	}
-
-	list_for_each_entry(pos, &session->evlist->entries, node)
-		hists__output_resort(&pos->hists);
-
-	if (use_browser > 0) {
-		if (use_browser == 1) {
-			ret = perf_evlist__tui_browse_hists(session->evlist,
-							help, NULL,
-							rep->min_percent,
-							&session->header.env);
-			/*
-			 * Usually "ret" is the last pressed key, and we only
-			 * care if the key notifies us to switch data file.
-			 */
-			if (ret != K_SWITCH_INPUT_DATA)
-				ret = 0;
-
-		} else if (use_browser == 2) {
-			perf_evlist__gtk_browse_hists(session->evlist, help,
-						      NULL, rep->min_percent);
-		}
-	} else
-		perf_evlist__tty_browse_hists(session->evlist, rep, help);
-
-	return ret;
-}
-
-static int
-parse_callchain_opt(const struct option *opt, const char *arg, int unset)
-{
-	struct perf_report *rep = (struct perf_report *)opt->value;
-	char *tok, *tok2;
-	char *endptr;
-
-	/*
-	 * --no-call-graph
-	 */
-	if (unset) {
-		rep->dont_use_callchains = true;
-		return 0;
-	}
-
-	symbol_conf.use_callchain = true;
-
-	if (!arg)
-		return 0;
-
-	tok = strtok((char *)arg, ",");
-	if (!tok)
-		return -1;
-
-	/* get the output mode */
-	if (!strncmp(tok, "graph", strlen(arg)))
-		callchain_param.mode = CHAIN_GRAPH_ABS;
-
-	else if (!strncmp(tok, "flat", strlen(arg)))
-		callchain_param.mode = CHAIN_FLAT;
-
-	else if (!strncmp(tok, "fractal", strlen(arg)))
-		callchain_param.mode = CHAIN_GRAPH_REL;
-
-	else if (!strncmp(tok, "none", strlen(arg))) {
-		callchain_param.mode = CHAIN_NONE;
-		symbol_conf.use_callchain = false;
-
-		return 0;
-	}
-
-	else
-		return -1;
-
-	/* get the min percentage */
-	tok = strtok(NULL, ",");
-	if (!tok)
-		goto setup;
-
-	callchain_param.min_percent = strtod(tok, &endptr);
-	if (tok == endptr)
-		return -1;
-
-	/* get the print limit */
-	tok2 = strtok(NULL, ",");
-	if (!tok2)
-		goto setup;
-
-	if (tok2[0] != 'c') {
-		callchain_param.print_limit = strtoul(tok2, &endptr, 0);
-		tok2 = strtok(NULL, ",");
-		if (!tok2)
-			goto setup;
-	}
-
-	/* get the call chain order */
-	if (!strncmp(tok2, "caller", strlen("caller")))
-		callchain_param.order = ORDER_CALLER;
-	else if (!strncmp(tok2, "callee", strlen("callee")))
-		callchain_param.order = ORDER_CALLEE;
-	else
-		return -1;
-
-	/* Get the sort key */
-	tok2 = strtok(NULL, ",");
-	if (!tok2)
-		goto setup;
-	if (!strncmp(tok2, "function", strlen("function")))
-		callchain_param.key = CCKEY_FUNCTION;
-	else if (!strncmp(tok2, "address", strlen("address")))
-		callchain_param.key = CCKEY_ADDRESS;
-	else
-		return -1;
-setup:
-	if (callchain_register_param(&callchain_param) < 0) {
-		fprintf(stderr, "Can't register callchain params\n");
-		return -1;
-	}
-	return 0;
-}
-
-int
-report_parse_ignore_callees_opt(const struct option *opt __maybe_unused,
-				const char *arg, int unset __maybe_unused)
-{
-	if (arg) {
-		int err = regcomp(&ignore_callees_regex, arg, REG_EXTENDED);
-		if (err) {
-			char buf[BUFSIZ];
-			regerror(err, &ignore_callees_regex, buf, sizeof(buf));
-			pr_err("Invalid --ignore-callees regex: %s\n%s", arg, buf);
-			return -1;
-		}
-		have_ignore_callees = 1;
-	}
-
-	return 0;
-}
-
-static int
-parse_branch_mode(const struct option *opt __maybe_unused,
-		  const char *str __maybe_unused, int unset)
-{
-	int *branch_mode = opt->value;
-
-	*branch_mode = !unset;
-	return 0;
-}
-
-static int
-parse_percent_limit(const struct option *opt, const char *str,
-		    int unset __maybe_unused)
-{
-	struct perf_report *rep = opt->value;
-
-	rep->min_percent = strtof(str, NULL);
-	return 0;
-}
-
-int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	struct perf_session *session;
-	struct stat st;
-	bool has_br_stack = false;
-	int branch_mode = -1;
-	int ret = -1;
-	char callchain_default_opt[] = "fractal,0.5,callee";
-	const char * const report_usage[] = {
-		"perf report [<options>]",
-		NULL
-	};
-	struct perf_report report = {
-		.tool = {
-			.sample		 = process_sample_event,
-			.mmap		 = perf_event__process_mmap,
-			.mmap2		 = perf_event__process_mmap2,
-			.comm		 = perf_event__process_comm,
-			.exit		 = perf_event__process_exit,
-			.fork		 = perf_event__process_fork,
-			.lost		 = perf_event__process_lost,
-			.read		 = process_read_event,
-			.attr		 = perf_event__process_attr,
-			.tracing_data	 = perf_event__process_tracing_data,
-			.build_id	 = perf_event__process_build_id,
-			.ordered_samples = true,
-			.ordering_requires_timestamps = true,
-		},
-		.pretty_printing_style	 = "normal",
-	};
-	const struct option options[] = {
-	OPT_STRING('i', "input", &input_name, "file",
-		    "input file name"),
-	OPT_INCR('v', "verbose", &verbose,
-		    "be more verbose (show symbol address, etc)"),
-	OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
-		    "dump raw trace in ASCII"),
-	OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
-		   "file", "vmlinux pathname"),
-	OPT_STRING(0, "kallsyms", &symbol_conf.kallsyms_name,
-		   "file", "kallsyms pathname"),
-	OPT_BOOLEAN('f', "force", &report.force, "don't complain, do it"),
-	OPT_BOOLEAN('m', "modules", &symbol_conf.use_modules,
-		    "load module symbols - WARNING: use only with -k and LIVE kernel"),
-	OPT_BOOLEAN('n', "show-nr-samples", &symbol_conf.show_nr_samples,
-		    "Show a column with the number of samples"),
-	OPT_BOOLEAN('T', "threads", &report.show_threads,
-		    "Show per-thread event counters"),
-	OPT_STRING(0, "pretty", &report.pretty_printing_style, "key",
-		   "pretty printing style key: normal raw"),
-	OPT_BOOLEAN(0, "tui", &report.use_tui, "Use the TUI interface"),
-	OPT_BOOLEAN(0, "gtk", &report.use_gtk, "Use the GTK2 interface"),
-	OPT_BOOLEAN(0, "stdio", &report.use_stdio,
-		    "Use the stdio interface"),
-	OPT_STRING('s', "sort", &sort_order, "key[,key2...]",
-		   "sort by key(s): pid, comm, dso, symbol, parent, cpu, srcline,"
-		   " dso_to, dso_from, symbol_to, symbol_from, mispredict,"
-		   " weight, local_weight, mem, symbol_daddr, dso_daddr, tlb, "
-		   "snoop, locked"),
-	OPT_BOOLEAN(0, "showcpuutilization", &symbol_conf.show_cpu_utilization,
-		    "Show sample percentage for different cpu modes"),
-	OPT_STRING('p', "parent", &parent_pattern, "regex",
-		   "regex filter to identify parent, see: '--sort parent'"),
-	OPT_BOOLEAN('x', "exclude-other", &symbol_conf.exclude_other,
-		    "Only display entries with parent-match"),
-	OPT_CALLBACK_DEFAULT('g', "call-graph", &report, "output_type,min_percent[,print_limit],call_order",
-		     "Display callchains using output_type (graph, flat, fractal, or none) , min percent threshold, optional print limit, callchain order, key (function or address). "
-		     "Default: fractal,0.5,callee,function", &parse_callchain_opt, callchain_default_opt),
-	OPT_BOOLEAN('G', "inverted", &report.inverted_callchain,
-		    "alias for inverted call graph"),
-	OPT_CALLBACK(0, "ignore-callees", NULL, "regex",
-		   "ignore callees of these functions in call graphs",
-		   report_parse_ignore_callees_opt),
-	OPT_STRING('d', "dsos", &symbol_conf.dso_list_str, "dso[,dso...]",
-		   "only consider symbols in these dsos"),
-	OPT_STRING('c', "comms", &symbol_conf.comm_list_str, "comm[,comm...]",
-		   "only consider symbols in these comms"),
-	OPT_STRING('S', "symbols", &symbol_conf.sym_list_str, "symbol[,symbol...]",
-		   "only consider these symbols"),
-	OPT_STRING(0, "symbol-filter", &report.symbol_filter_str, "filter",
-		   "only show symbols that (partially) match with this filter"),
-	OPT_STRING('w', "column-widths", &symbol_conf.col_width_list_str,
-		   "width[,width...]",
-		   "don't try to adjust column width, use these fixed values"),
-	OPT_STRING('t', "field-separator", &symbol_conf.field_sep, "separator",
-		   "separator for columns, no spaces will be added between "
-		   "columns '.' is reserved."),
-	OPT_BOOLEAN('U', "hide-unresolved", &report.hide_unresolved,
-		    "Only display entries resolved to a symbol"),
-	OPT_STRING(0, "symfs", &symbol_conf.symfs, "directory",
-		    "Look for files with symbols relative to this directory"),
-	OPT_STRING('C', "cpu", &report.cpu_list, "cpu",
-		   "list of cpus to profile"),
-	OPT_BOOLEAN('I', "show-info", &report.show_full_info,
-		    "Display extended information about perf.data file"),
-	OPT_BOOLEAN(0, "source", &symbol_conf.annotate_src,
-		    "Interleave source code with assembly code (default)"),
-	OPT_BOOLEAN(0, "asm-raw", &symbol_conf.annotate_asm_raw,
-		    "Display raw encoding of assembly instructions (default)"),
-	OPT_STRING('M', "disassembler-style", &disassembler_style, "disassembler style",
-		   "Specify disassembler style (e.g. -M intel for intel syntax)"),
-	OPT_BOOLEAN(0, "show-total-period", &symbol_conf.show_total_period,
-		    "Show a column with the sum of periods"),
-	OPT_BOOLEAN(0, "group", &symbol_conf.event_group,
-		    "Show event group information together"),
-	OPT_CALLBACK_NOOPT('b', "branch-stack", &branch_mode, "",
-		    "use branch records for histogram filling", parse_branch_mode),
-	OPT_STRING(0, "objdump", &objdump_path, "path",
-		   "objdump binary to use for disassembly and annotations"),
-	OPT_BOOLEAN(0, "demangle", &symbol_conf.demangle,
-		    "Disable symbol demangling"),
-	OPT_BOOLEAN(0, "mem-mode", &report.mem_mode, "mem access profile"),
-	OPT_CALLBACK(0, "percent-limit", &report, "percent",
-		     "Don't show entries under that percent", parse_percent_limit),
-	OPT_END()
-	};
-
-	perf_config(perf_report_config, &report);
-
-	argc = parse_options(argc, argv, options, report_usage, 0);
-
-	if (report.use_stdio)
-		use_browser = 0;
-	else if (report.use_tui)
-		use_browser = 1;
-	else if (report.use_gtk)
-		use_browser = 2;
-
-	if (report.inverted_callchain)
-		callchain_param.order = ORDER_CALLER;
-
-	if (!input_name || !strlen(input_name)) {
-		if (!fstat(STDIN_FILENO, &st) && S_ISFIFO(st.st_mode))
-			input_name = "-";
-		else
-			input_name = "perf.data";
-	}
-
-	if (strcmp(input_name, "-") != 0)
-		setup_browser(true);
-	else {
-		use_browser = 0;
-		perf_hpp__init();
-	}
-
-repeat:
-	session = perf_session__new(input_name, O_RDONLY,
-				    report.force, false, &report.tool);
-	if (session == NULL)
-		return -ENOMEM;
-
-	report.session = session;
-
-	has_br_stack = perf_header__has_feat(&session->header,
-					     HEADER_BRANCH_STACK);
-
-	if (branch_mode == -1 && has_br_stack)
-		sort__mode = SORT_MODE__BRANCH;
-
-	/* sort__mode could be NORMAL if --no-branch-stack */
-	if (sort__mode == SORT_MODE__BRANCH) {
-		/*
-		 * if no sort_order is provided, then specify
-		 * branch-mode specific order
-		 */
-		if (sort_order == default_sort_order)
-			sort_order = "comm,dso_from,symbol_from,"
-				     "dso_to,symbol_to";
-
-	}
-	if (report.mem_mode) {
-		if (sort__mode == SORT_MODE__BRANCH) {
-			fprintf(stderr, "branch and mem mode incompatible\n");
-			goto error;
-		}
-		sort__mode = SORT_MODE__MEMORY;
-
-		/*
-		 * if no sort_order is provided, then specify
-		 * branch-mode specific order
-		 */
-		if (sort_order == default_sort_order)
-			sort_order = "local_weight,mem,sym,dso,symbol_daddr,dso_daddr,snoop,tlb,locked";
-	}
-
-	if (setup_sorting() < 0)
-		usage_with_options(report_usage, options);
-
-	/*
-	 * Only in the TUI browser we are doing integrated annotation,
-	 * so don't allocate extra space that won't be used in the stdio
-	 * implementation.
-	 */
-	if (use_browser == 1 && sort__has_sym) {
-		symbol_conf.priv_size = sizeof(struct annotation);
-		machines__set_symbol_filter(&session->machines,
-					    symbol__annotate_init);
-		/*
- 		 * For searching by name on the "Browse map details".
- 		 * providing it only in verbose mode not to bloat too
- 		 * much struct symbol.
- 		 */
-		if (verbose) {
-			/*
-			 * XXX: Need to provide a less kludgy way to ask for
-			 * more space per symbol, the u32 is for the index on
-			 * the ui browser.
-			 * See symbol__browser_index.
-			 */
-			symbol_conf.priv_size += sizeof(u32);
-			symbol_conf.sort_by_name = true;
-		}
-	}
-
-	if (symbol__init() < 0)
-		goto error;
-
-	if (parent_pattern != default_parent_pattern) {
-		if (sort_dimension__add("parent") < 0)
-			goto error;
-	}
-
-	if (argc) {
-		/*
-		 * Special case: if there's an argument left then assume that
-		 * it's a symbol filter:
-		 */
-		if (argc > 1)
-			usage_with_options(report_usage, options);
-
-		report.symbol_filter_str = argv[0];
-	}
-
-	sort__setup_elide(stdout);
-
-	ret = __cmd_report(&report);
-	if (ret == K_SWITCH_INPUT_DATA) {
-		perf_session__delete(session);
-		goto repeat;
-	} else
-		ret = 0;
-
-error:
-	perf_session__delete(session);
-	return ret;
-}
diff --git a/src/tools/perf/builtin-sched.c b/src/tools/perf/builtin-sched.c
deleted file mode 100644
index d8c51b2..0000000
--- a/src/tools/perf/builtin-sched.c
+++ /dev/null
@@ -1,1773 +0,0 @@
-#include "builtin.h"
-#include "perf.h"
-
-#include "util/util.h"
-#include "util/evlist.h"
-#include "util/cache.h"
-#include "util/evsel.h"
-#include "util/symbol.h"
-#include "util/thread.h"
-#include "util/header.h"
-#include "util/session.h"
-#include "util/tool.h"
-
-#include "util/parse-options.h"
-#include "util/trace-event.h"
-
-#include "util/debug.h"
-
-#include <sys/prctl.h>
-#include <sys/resource.h>
-
-#include <semaphore.h>
-#include <pthread.h>
-#include <math.h>
-
-#define PR_SET_NAME		15               /* Set process name */
-#define MAX_CPUS		4096
-#define COMM_LEN		20
-#define SYM_LEN			129
-#define MAX_PID			65536
-
-struct sched_atom;
-
-struct task_desc {
-	unsigned long		nr;
-	unsigned long		pid;
-	char			comm[COMM_LEN];
-
-	unsigned long		nr_events;
-	unsigned long		curr_event;
-	struct sched_atom	**atoms;
-
-	pthread_t		thread;
-	sem_t			sleep_sem;
-
-	sem_t			ready_for_work;
-	sem_t			work_done_sem;
-
-	u64			cpu_usage;
-};
-
-enum sched_event_type {
-	SCHED_EVENT_RUN,
-	SCHED_EVENT_SLEEP,
-	SCHED_EVENT_WAKEUP,
-	SCHED_EVENT_MIGRATION,
-};
-
-struct sched_atom {
-	enum sched_event_type	type;
-	int			specific_wait;
-	u64			timestamp;
-	u64			duration;
-	unsigned long		nr;
-	sem_t			*wait_sem;
-	struct task_desc	*wakee;
-};
-
-#define TASK_STATE_TO_CHAR_STR "RSDTtZX"
-
-enum thread_state {
-	THREAD_SLEEPING = 0,
-	THREAD_WAIT_CPU,
-	THREAD_SCHED_IN,
-	THREAD_IGNORE
-};
-
-struct work_atom {
-	struct list_head	list;
-	enum thread_state	state;
-	u64			sched_out_time;
-	u64			wake_up_time;
-	u64			sched_in_time;
-	u64			runtime;
-};
-
-struct work_atoms {
-	struct list_head	work_list;
-	struct thread		*thread;
-	struct rb_node		node;
-	u64			max_lat;
-	u64			max_lat_at;
-	u64			total_lat;
-	u64			nb_atoms;
-	u64			total_runtime;
-};
-
-typedef int (*sort_fn_t)(struct work_atoms *, struct work_atoms *);
-
-struct perf_sched;
-
-struct trace_sched_handler {
-	int (*switch_event)(struct perf_sched *sched, struct perf_evsel *evsel,
-			    struct perf_sample *sample, struct machine *machine);
-
-	int (*runtime_event)(struct perf_sched *sched, struct perf_evsel *evsel,
-			     struct perf_sample *sample, struct machine *machine);
-
-	int (*wakeup_event)(struct perf_sched *sched, struct perf_evsel *evsel,
-			    struct perf_sample *sample, struct machine *machine);
-
-	/* PERF_RECORD_FORK event, not sched_process_fork tracepoint */
-	int (*fork_event)(struct perf_sched *sched, union perf_event *event,
-			  struct machine *machine);
-
-	int (*migrate_task_event)(struct perf_sched *sched,
-				  struct perf_evsel *evsel,
-				  struct perf_sample *sample,
-				  struct machine *machine);
-};
-
-struct perf_sched {
-	struct perf_tool tool;
-	const char	 *sort_order;
-	unsigned long	 nr_tasks;
-	struct task_desc *pid_to_task[MAX_PID];
-	struct task_desc **tasks;
-	const struct trace_sched_handler *tp_handler;
-	pthread_mutex_t	 start_work_mutex;
-	pthread_mutex_t	 work_done_wait_mutex;
-	int		 profile_cpu;
-/*
- * Track the current task - that way we can know whether there's any
- * weird events, such as a task being switched away that is not current.
- */
-	int		 max_cpu;
-	u32		 curr_pid[MAX_CPUS];
-	struct thread	 *curr_thread[MAX_CPUS];
-	char		 next_shortname1;
-	char		 next_shortname2;
-	unsigned int	 replay_repeat;
-	unsigned long	 nr_run_events;
-	unsigned long	 nr_sleep_events;
-	unsigned long	 nr_wakeup_events;
-	unsigned long	 nr_sleep_corrections;
-	unsigned long	 nr_run_events_optimized;
-	unsigned long	 targetless_wakeups;
-	unsigned long	 multitarget_wakeups;
-	unsigned long	 nr_runs;
-	unsigned long	 nr_timestamps;
-	unsigned long	 nr_unordered_timestamps;
-	unsigned long	 nr_state_machine_bugs;
-	unsigned long	 nr_context_switch_bugs;
-	unsigned long	 nr_events;
-	unsigned long	 nr_lost_chunks;
-	unsigned long	 nr_lost_events;
-	u64		 run_measurement_overhead;
-	u64		 sleep_measurement_overhead;
-	u64		 start_time;
-	u64		 cpu_usage;
-	u64		 runavg_cpu_usage;
-	u64		 parent_cpu_usage;
-	u64		 runavg_parent_cpu_usage;
-	u64		 sum_runtime;
-	u64		 sum_fluct;
-	u64		 run_avg;
-	u64		 all_runtime;
-	u64		 all_count;
-	u64		 cpu_last_switched[MAX_CPUS];
-	struct rb_root	 atom_root, sorted_atom_root;
-	struct list_head sort_list, cmp_pid;
-};
-
-static u64 get_nsecs(void)
-{
-	struct timespec ts;
-
-	clock_gettime(CLOCK_MONOTONIC, &ts);
-
-	return ts.tv_sec * 1000000000ULL + ts.tv_nsec;
-}
-
-static void burn_nsecs(struct perf_sched *sched, u64 nsecs)
-{
-	u64 T0 = get_nsecs(), T1;
-
-	do {
-		T1 = get_nsecs();
-	} while (T1 + sched->run_measurement_overhead < T0 + nsecs);
-}
-
-static void sleep_nsecs(u64 nsecs)
-{
-	struct timespec ts;
-
-	ts.tv_nsec = nsecs % 999999999;
-	ts.tv_sec = nsecs / 999999999;
-
-	nanosleep(&ts, NULL);
-}
-
-static void calibrate_run_measurement_overhead(struct perf_sched *sched)
-{
-	u64 T0, T1, delta, min_delta = 1000000000ULL;
-	int i;
-
-	for (i = 0; i < 10; i++) {
-		T0 = get_nsecs();
-		burn_nsecs(sched, 0);
-		T1 = get_nsecs();
-		delta = T1-T0;
-		min_delta = min(min_delta, delta);
-	}
-	sched->run_measurement_overhead = min_delta;
-
-	printf("run measurement overhead: %" PRIu64 " nsecs\n", min_delta);
-}
-
-static void calibrate_sleep_measurement_overhead(struct perf_sched *sched)
-{
-	u64 T0, T1, delta, min_delta = 1000000000ULL;
-	int i;
-
-	for (i = 0; i < 10; i++) {
-		T0 = get_nsecs();
-		sleep_nsecs(10000);
-		T1 = get_nsecs();
-		delta = T1-T0;
-		min_delta = min(min_delta, delta);
-	}
-	min_delta -= 10000;
-	sched->sleep_measurement_overhead = min_delta;
-
-	printf("sleep measurement overhead: %" PRIu64 " nsecs\n", min_delta);
-}
-
-static struct sched_atom *
-get_new_event(struct task_desc *task, u64 timestamp)
-{
-	struct sched_atom *event = zalloc(sizeof(*event));
-	unsigned long idx = task->nr_events;
-	size_t size;
-
-	event->timestamp = timestamp;
-	event->nr = idx;
-
-	task->nr_events++;
-	size = sizeof(struct sched_atom *) * task->nr_events;
-	task->atoms = realloc(task->atoms, size);
-	BUG_ON(!task->atoms);
-
-	task->atoms[idx] = event;
-
-	return event;
-}
-
-static struct sched_atom *last_event(struct task_desc *task)
-{
-	if (!task->nr_events)
-		return NULL;
-
-	return task->atoms[task->nr_events - 1];
-}
-
-static void add_sched_event_run(struct perf_sched *sched, struct task_desc *task,
-				u64 timestamp, u64 duration)
-{
-	struct sched_atom *event, *curr_event = last_event(task);
-
-	/*
-	 * optimize an existing RUN event by merging this one
-	 * to it:
-	 */
-	if (curr_event && curr_event->type == SCHED_EVENT_RUN) {
-		sched->nr_run_events_optimized++;
-		curr_event->duration += duration;
-		return;
-	}
-
-	event = get_new_event(task, timestamp);
-
-	event->type = SCHED_EVENT_RUN;
-	event->duration = duration;
-
-	sched->nr_run_events++;
-}
-
-static void add_sched_event_wakeup(struct perf_sched *sched, struct task_desc *task,
-				   u64 timestamp, struct task_desc *wakee)
-{
-	struct sched_atom *event, *wakee_event;
-
-	event = get_new_event(task, timestamp);
-	event->type = SCHED_EVENT_WAKEUP;
-	event->wakee = wakee;
-
-	wakee_event = last_event(wakee);
-	if (!wakee_event || wakee_event->type != SCHED_EVENT_SLEEP) {
-		sched->targetless_wakeups++;
-		return;
-	}
-	if (wakee_event->wait_sem) {
-		sched->multitarget_wakeups++;
-		return;
-	}
-
-	wakee_event->wait_sem = zalloc(sizeof(*wakee_event->wait_sem));
-	sem_init(wakee_event->wait_sem, 0, 0);
-	wakee_event->specific_wait = 1;
-	event->wait_sem = wakee_event->wait_sem;
-
-	sched->nr_wakeup_events++;
-}
-
-static void add_sched_event_sleep(struct perf_sched *sched, struct task_desc *task,
-				  u64 timestamp, u64 task_state __maybe_unused)
-{
-	struct sched_atom *event = get_new_event(task, timestamp);
-
-	event->type = SCHED_EVENT_SLEEP;
-
-	sched->nr_sleep_events++;
-}
-
-static struct task_desc *register_pid(struct perf_sched *sched,
-				      unsigned long pid, const char *comm)
-{
-	struct task_desc *task;
-
-	BUG_ON(pid >= MAX_PID);
-
-	task = sched->pid_to_task[pid];
-
-	if (task)
-		return task;
-
-	task = zalloc(sizeof(*task));
-	task->pid = pid;
-	task->nr = sched->nr_tasks;
-	strcpy(task->comm, comm);
-	/*
-	 * every task starts in sleeping state - this gets ignored
-	 * if there's no wakeup pointing to this sleep state:
-	 */
-	add_sched_event_sleep(sched, task, 0, 0);
-
-	sched->pid_to_task[pid] = task;
-	sched->nr_tasks++;
-	sched->tasks = realloc(sched->tasks, sched->nr_tasks * sizeof(struct task_task *));
-	BUG_ON(!sched->tasks);
-	sched->tasks[task->nr] = task;
-
-	if (verbose)
-		printf("registered task #%ld, PID %ld (%s)\n", sched->nr_tasks, pid, comm);
-
-	return task;
-}
-
-
-static void print_task_traces(struct perf_sched *sched)
-{
-	struct task_desc *task;
-	unsigned long i;
-
-	for (i = 0; i < sched->nr_tasks; i++) {
-		task = sched->tasks[i];
-		printf("task %6ld (%20s:%10ld), nr_events: %ld\n",
-			task->nr, task->comm, task->pid, task->nr_events);
-	}
-}
-
-static void add_cross_task_wakeups(struct perf_sched *sched)
-{
-	struct task_desc *task1, *task2;
-	unsigned long i, j;
-
-	for (i = 0; i < sched->nr_tasks; i++) {
-		task1 = sched->tasks[i];
-		j = i + 1;
-		if (j == sched->nr_tasks)
-			j = 0;
-		task2 = sched->tasks[j];
-		add_sched_event_wakeup(sched, task1, 0, task2);
-	}
-}
-
-static void perf_sched__process_event(struct perf_sched *sched,
-				      struct sched_atom *atom)
-{
-	int ret = 0;
-
-	switch (atom->type) {
-		case SCHED_EVENT_RUN:
-			burn_nsecs(sched, atom->duration);
-			break;
-		case SCHED_EVENT_SLEEP:
-			if (atom->wait_sem)
-				ret = sem_wait(atom->wait_sem);
-			BUG_ON(ret);
-			break;
-		case SCHED_EVENT_WAKEUP:
-			if (atom->wait_sem)
-				ret = sem_post(atom->wait_sem);
-			BUG_ON(ret);
-			break;
-		case SCHED_EVENT_MIGRATION:
-			break;
-		default:
-			BUG_ON(1);
-	}
-}
-
-static u64 get_cpu_usage_nsec_parent(void)
-{
-	struct rusage ru;
-	u64 sum;
-	int err;
-
-	err = getrusage(RUSAGE_SELF, &ru);
-	BUG_ON(err);
-
-	sum =  ru.ru_utime.tv_sec*1e9 + ru.ru_utime.tv_usec*1e3;
-	sum += ru.ru_stime.tv_sec*1e9 + ru.ru_stime.tv_usec*1e3;
-
-	return sum;
-}
-
-static int self_open_counters(void)
-{
-	struct perf_event_attr attr;
-	int fd;
-
-	memset(&attr, 0, sizeof(attr));
-
-	attr.type = PERF_TYPE_SOFTWARE;
-	attr.config = PERF_COUNT_SW_TASK_CLOCK;
-
-	fd = sys_perf_event_open(&attr, 0, -1, -1, 0);
-
-	if (fd < 0)
-		pr_err("Error: sys_perf_event_open() syscall returned "
-		       "with %d (%s)\n", fd, strerror(errno));
-	return fd;
-}
-
-static u64 get_cpu_usage_nsec_self(int fd)
-{
-	u64 runtime;
-	int ret;
-
-	ret = read(fd, &runtime, sizeof(runtime));
-	BUG_ON(ret != sizeof(runtime));
-
-	return runtime;
-}
-
-struct sched_thread_parms {
-	struct task_desc  *task;
-	struct perf_sched *sched;
-};
-
-static void *thread_func(void *ctx)
-{
-	struct sched_thread_parms *parms = ctx;
-	struct task_desc *this_task = parms->task;
-	struct perf_sched *sched = parms->sched;
-	u64 cpu_usage_0, cpu_usage_1;
-	unsigned long i, ret;
-	char comm2[22];
-	int fd;
-
-	free(parms);
-
-	sprintf(comm2, ":%s", this_task->comm);
-	prctl(PR_SET_NAME, comm2);
-	fd = self_open_counters();
-	if (fd < 0)
-		return NULL;
-again:
-	ret = sem_post(&this_task->ready_for_work);
-	BUG_ON(ret);
-	ret = pthread_mutex_lock(&sched->start_work_mutex);
-	BUG_ON(ret);
-	ret = pthread_mutex_unlock(&sched->start_work_mutex);
-	BUG_ON(ret);
-
-	cpu_usage_0 = get_cpu_usage_nsec_self(fd);
-
-	for (i = 0; i < this_task->nr_events; i++) {
-		this_task->curr_event = i;
-		perf_sched__process_event(sched, this_task->atoms[i]);
-	}
-
-	cpu_usage_1 = get_cpu_usage_nsec_self(fd);
-	this_task->cpu_usage = cpu_usage_1 - cpu_usage_0;
-	ret = sem_post(&this_task->work_done_sem);
-	BUG_ON(ret);
-
-	ret = pthread_mutex_lock(&sched->work_done_wait_mutex);
-	BUG_ON(ret);
-	ret = pthread_mutex_unlock(&sched->work_done_wait_mutex);
-	BUG_ON(ret);
-
-	goto again;
-}
-
-static void create_tasks(struct perf_sched *sched)
-{
-	struct task_desc *task;
-	pthread_attr_t attr;
-	unsigned long i;
-	int err;
-
-	err = pthread_attr_init(&attr);
-	BUG_ON(err);
-	err = pthread_attr_setstacksize(&attr,
-			(size_t) max(16 * 1024, PTHREAD_STACK_MIN));
-	BUG_ON(err);
-	err = pthread_mutex_lock(&sched->start_work_mutex);
-	BUG_ON(err);
-	err = pthread_mutex_lock(&sched->work_done_wait_mutex);
-	BUG_ON(err);
-	for (i = 0; i < sched->nr_tasks; i++) {
-		struct sched_thread_parms *parms = malloc(sizeof(*parms));
-		BUG_ON(parms == NULL);
-		parms->task = task = sched->tasks[i];
-		parms->sched = sched;
-		sem_init(&task->sleep_sem, 0, 0);
-		sem_init(&task->ready_for_work, 0, 0);
-		sem_init(&task->work_done_sem, 0, 0);
-		task->curr_event = 0;
-		err = pthread_create(&task->thread, &attr, thread_func, parms);
-		BUG_ON(err);
-	}
-}
-
-static void wait_for_tasks(struct perf_sched *sched)
-{
-	u64 cpu_usage_0, cpu_usage_1;
-	struct task_desc *task;
-	unsigned long i, ret;
-
-	sched->start_time = get_nsecs();
-	sched->cpu_usage = 0;
-	pthread_mutex_unlock(&sched->work_done_wait_mutex);
-
-	for (i = 0; i < sched->nr_tasks; i++) {
-		task = sched->tasks[i];
-		ret = sem_wait(&task->ready_for_work);
-		BUG_ON(ret);
-		sem_init(&task->ready_for_work, 0, 0);
-	}
-	ret = pthread_mutex_lock(&sched->work_done_wait_mutex);
-	BUG_ON(ret);
-
-	cpu_usage_0 = get_cpu_usage_nsec_parent();
-
-	pthread_mutex_unlock(&sched->start_work_mutex);
-
-	for (i = 0; i < sched->nr_tasks; i++) {
-		task = sched->tasks[i];
-		ret = sem_wait(&task->work_done_sem);
-		BUG_ON(ret);
-		sem_init(&task->work_done_sem, 0, 0);
-		sched->cpu_usage += task->cpu_usage;
-		task->cpu_usage = 0;
-	}
-
-	cpu_usage_1 = get_cpu_usage_nsec_parent();
-	if (!sched->runavg_cpu_usage)
-		sched->runavg_cpu_usage = sched->cpu_usage;
-	sched->runavg_cpu_usage = (sched->runavg_cpu_usage * 9 + sched->cpu_usage) / 10;
-
-	sched->parent_cpu_usage = cpu_usage_1 - cpu_usage_0;
-	if (!sched->runavg_parent_cpu_usage)
-		sched->runavg_parent_cpu_usage = sched->parent_cpu_usage;
-	sched->runavg_parent_cpu_usage = (sched->runavg_parent_cpu_usage * 9 +
-					 sched->parent_cpu_usage)/10;
-
-	ret = pthread_mutex_lock(&sched->start_work_mutex);
-	BUG_ON(ret);
-
-	for (i = 0; i < sched->nr_tasks; i++) {
-		task = sched->tasks[i];
-		sem_init(&task->sleep_sem, 0, 0);
-		task->curr_event = 0;
-	}
-}
-
-static void run_one_test(struct perf_sched *sched)
-{
-	u64 T0, T1, delta, avg_delta, fluct;
-
-	T0 = get_nsecs();
-	wait_for_tasks(sched);
-	T1 = get_nsecs();
-
-	delta = T1 - T0;
-	sched->sum_runtime += delta;
-	sched->nr_runs++;
-
-	avg_delta = sched->sum_runtime / sched->nr_runs;
-	if (delta < avg_delta)
-		fluct = avg_delta - delta;
-	else
-		fluct = delta - avg_delta;
-	sched->sum_fluct += fluct;
-	if (!sched->run_avg)
-		sched->run_avg = delta;
-	sched->run_avg = (sched->run_avg * 9 + delta) / 10;
-
-	printf("#%-3ld: %0.3f, ", sched->nr_runs, (double)delta / 1000000.0);
-
-	printf("ravg: %0.2f, ", (double)sched->run_avg / 1e6);
-
-	printf("cpu: %0.2f / %0.2f",
-		(double)sched->cpu_usage / 1e6, (double)sched->runavg_cpu_usage / 1e6);
-
-#if 0
-	/*
-	 * rusage statistics done by the parent, these are less
-	 * accurate than the sched->sum_exec_runtime based statistics:
-	 */
-	printf(" [%0.2f / %0.2f]",
-		(double)sched->parent_cpu_usage/1e6,
-		(double)sched->runavg_parent_cpu_usage/1e6);
-#endif
-
-	printf("\n");
-
-	if (sched->nr_sleep_corrections)
-		printf(" (%ld sleep corrections)\n", sched->nr_sleep_corrections);
-	sched->nr_sleep_corrections = 0;
-}
-
-static void test_calibrations(struct perf_sched *sched)
-{
-	u64 T0, T1;
-
-	T0 = get_nsecs();
-	burn_nsecs(sched, 1e6);
-	T1 = get_nsecs();
-
-	printf("the run test took %" PRIu64 " nsecs\n", T1 - T0);
-
-	T0 = get_nsecs();
-	sleep_nsecs(1e6);
-	T1 = get_nsecs();
-
-	printf("the sleep test took %" PRIu64 " nsecs\n", T1 - T0);
-}
-
-static int
-replay_wakeup_event(struct perf_sched *sched,
-		    struct perf_evsel *evsel, struct perf_sample *sample,
-		    struct machine *machine __maybe_unused)
-{
-	const char *comm = perf_evsel__strval(evsel, sample, "comm");
-	const u32 pid	 = perf_evsel__intval(evsel, sample, "pid");
-	struct task_desc *waker, *wakee;
-
-	if (verbose) {
-		printf("sched_wakeup event %p\n", evsel);
-
-		printf(" ... pid %d woke up %s/%d\n", sample->tid, comm, pid);
-	}
-
-	waker = register_pid(sched, sample->tid, "<unknown>");
-	wakee = register_pid(sched, pid, comm);
-
-	add_sched_event_wakeup(sched, waker, sample->time, wakee);
-	return 0;
-}
-
-static int replay_switch_event(struct perf_sched *sched,
-			       struct perf_evsel *evsel,
-			       struct perf_sample *sample,
-			       struct machine *machine __maybe_unused)
-{
-	const char *prev_comm  = perf_evsel__strval(evsel, sample, "prev_comm"),
-		   *next_comm  = perf_evsel__strval(evsel, sample, "next_comm");
-	const u32 prev_pid = perf_evsel__intval(evsel, sample, "prev_pid"),
-		  next_pid = perf_evsel__intval(evsel, sample, "next_pid");
-	const u64 prev_state = perf_evsel__intval(evsel, sample, "prev_state");
-	struct task_desc *prev, __maybe_unused *next;
-	u64 timestamp0, timestamp = sample->time;
-	int cpu = sample->cpu;
-	s64 delta;
-
-	if (verbose)
-		printf("sched_switch event %p\n", evsel);
-
-	if (cpu >= MAX_CPUS || cpu < 0)
-		return 0;
-
-	timestamp0 = sched->cpu_last_switched[cpu];
-	if (timestamp0)
-		delta = timestamp - timestamp0;
-	else
-		delta = 0;
-
-	if (delta < 0) {
-		pr_err("hm, delta: %" PRIu64 " < 0 ?\n", delta);
-		return -1;
-	}
-
-	pr_debug(" ... switch from %s/%d to %s/%d [ran %" PRIu64 " nsecs]\n",
-		 prev_comm, prev_pid, next_comm, next_pid, delta);
-
-	prev = register_pid(sched, prev_pid, prev_comm);
-	next = register_pid(sched, next_pid, next_comm);
-
-	sched->cpu_last_switched[cpu] = timestamp;
-
-	add_sched_event_run(sched, prev, timestamp, delta);
-	add_sched_event_sleep(sched, prev, timestamp, prev_state);
-
-	return 0;
-}
-
-static int replay_fork_event(struct perf_sched *sched,
-			     union perf_event *event,
-			     struct machine *machine)
-{
-	struct thread *child, *parent;
-
-	child = machine__findnew_thread(machine, event->fork.pid,
-					event->fork.tid);
-	parent = machine__findnew_thread(machine, event->fork.ppid,
-					 event->fork.ptid);
-
-	if (child == NULL || parent == NULL) {
-		pr_debug("thread does not exist on fork event: child %p, parent %p\n",
-				 child, parent);
-		return 0;
-	}
-
-	if (verbose) {
-		printf("fork event\n");
-		printf("... parent: %s/%d\n", parent->comm, parent->tid);
-		printf("...  child: %s/%d\n", child->comm, child->tid);
-	}
-
-	register_pid(sched, parent->tid, parent->comm);
-	register_pid(sched, child->tid, child->comm);
-	return 0;
-}
-
-struct sort_dimension {
-	const char		*name;
-	sort_fn_t		cmp;
-	struct list_head	list;
-};
-
-static int
-thread_lat_cmp(struct list_head *list, struct work_atoms *l, struct work_atoms *r)
-{
-	struct sort_dimension *sort;
-	int ret = 0;
-
-	BUG_ON(list_empty(list));
-
-	list_for_each_entry(sort, list, list) {
-		ret = sort->cmp(l, r);
-		if (ret)
-			return ret;
-	}
-
-	return ret;
-}
-
-static struct work_atoms *
-thread_atoms_search(struct rb_root *root, struct thread *thread,
-			 struct list_head *sort_list)
-{
-	struct rb_node *node = root->rb_node;
-	struct work_atoms key = { .thread = thread };
-
-	while (node) {
-		struct work_atoms *atoms;
-		int cmp;
-
-		atoms = container_of(node, struct work_atoms, node);
-
-		cmp = thread_lat_cmp(sort_list, &key, atoms);
-		if (cmp > 0)
-			node = node->rb_left;
-		else if (cmp < 0)
-			node = node->rb_right;
-		else {
-			BUG_ON(thread != atoms->thread);
-			return atoms;
-		}
-	}
-	return NULL;
-}
-
-static void
-__thread_latency_insert(struct rb_root *root, struct work_atoms *data,
-			 struct list_head *sort_list)
-{
-	struct rb_node **new = &(root->rb_node), *parent = NULL;
-
-	while (*new) {
-		struct work_atoms *this;
-		int cmp;
-
-		this = container_of(*new, struct work_atoms, node);
-		parent = *new;
-
-		cmp = thread_lat_cmp(sort_list, data, this);
-
-		if (cmp > 0)
-			new = &((*new)->rb_left);
-		else
-			new = &((*new)->rb_right);
-	}
-
-	rb_link_node(&data->node, parent, new);
-	rb_insert_color(&data->node, root);
-}
-
-static int thread_atoms_insert(struct perf_sched *sched, struct thread *thread)
-{
-	struct work_atoms *atoms = zalloc(sizeof(*atoms));
-	if (!atoms) {
-		pr_err("No memory at %s\n", __func__);
-		return -1;
-	}
-
-	atoms->thread = thread;
-	INIT_LIST_HEAD(&atoms->work_list);
-	__thread_latency_insert(&sched->atom_root, atoms, &sched->cmp_pid);
-	return 0;
-}
-
-static char sched_out_state(u64 prev_state)
-{
-	const char *str = TASK_STATE_TO_CHAR_STR;
-
-	return str[prev_state];
-}
-
-static int
-add_sched_out_event(struct work_atoms *atoms,
-		    char run_state,
-		    u64 timestamp)
-{
-	struct work_atom *atom = zalloc(sizeof(*atom));
-	if (!atom) {
-		pr_err("Non memory at %s", __func__);
-		return -1;
-	}
-
-	atom->sched_out_time = timestamp;
-
-	if (run_state == 'R') {
-		atom->state = THREAD_WAIT_CPU;
-		atom->wake_up_time = atom->sched_out_time;
-	}
-
-	list_add_tail(&atom->list, &atoms->work_list);
-	return 0;
-}
-
-static void
-add_runtime_event(struct work_atoms *atoms, u64 delta,
-		  u64 timestamp __maybe_unused)
-{
-	struct work_atom *atom;
-
-	BUG_ON(list_empty(&atoms->work_list));
-
-	atom = list_entry(atoms->work_list.prev, struct work_atom, list);
-
-	atom->runtime += delta;
-	atoms->total_runtime += delta;
-}
-
-static void
-add_sched_in_event(struct work_atoms *atoms, u64 timestamp)
-{
-	struct work_atom *atom;
-	u64 delta;
-
-	if (list_empty(&atoms->work_list))
-		return;
-
-	atom = list_entry(atoms->work_list.prev, struct work_atom, list);
-
-	if (atom->state != THREAD_WAIT_CPU)
-		return;
-
-	if (timestamp < atom->wake_up_time) {
-		atom->state = THREAD_IGNORE;
-		return;
-	}
-
-	atom->state = THREAD_SCHED_IN;
-	atom->sched_in_time = timestamp;
-
-	delta = atom->sched_in_time - atom->wake_up_time;
-	atoms->total_lat += delta;
-	if (delta > atoms->max_lat) {
-		atoms->max_lat = delta;
-		atoms->max_lat_at = timestamp;
-	}
-	atoms->nb_atoms++;
-}
-
-static int latency_switch_event(struct perf_sched *sched,
-				struct perf_evsel *evsel,
-				struct perf_sample *sample,
-				struct machine *machine)
-{
-	const u32 prev_pid = perf_evsel__intval(evsel, sample, "prev_pid"),
-		  next_pid = perf_evsel__intval(evsel, sample, "next_pid");
-	const u64 prev_state = perf_evsel__intval(evsel, sample, "prev_state");
-	struct work_atoms *out_events, *in_events;
-	struct thread *sched_out, *sched_in;
-	u64 timestamp0, timestamp = sample->time;
-	int cpu = sample->cpu;
-	s64 delta;
-
-	BUG_ON(cpu >= MAX_CPUS || cpu < 0);
-
-	timestamp0 = sched->cpu_last_switched[cpu];
-	sched->cpu_last_switched[cpu] = timestamp;
-	if (timestamp0)
-		delta = timestamp - timestamp0;
-	else
-		delta = 0;
-
-	if (delta < 0) {
-		pr_err("hm, delta: %" PRIu64 " < 0 ?\n", delta);
-		return -1;
-	}
-
-	sched_out = machine__findnew_thread(machine, 0, prev_pid);
-	sched_in = machine__findnew_thread(machine, 0, next_pid);
-
-	out_events = thread_atoms_search(&sched->atom_root, sched_out, &sched->cmp_pid);
-	if (!out_events) {
-		if (thread_atoms_insert(sched, sched_out))
-			return -1;
-		out_events = thread_atoms_search(&sched->atom_root, sched_out, &sched->cmp_pid);
-		if (!out_events) {
-			pr_err("out-event: Internal tree error");
-			return -1;
-		}
-	}
-	if (add_sched_out_event(out_events, sched_out_state(prev_state), timestamp))
-		return -1;
-
-	in_events = thread_atoms_search(&sched->atom_root, sched_in, &sched->cmp_pid);
-	if (!in_events) {
-		if (thread_atoms_insert(sched, sched_in))
-			return -1;
-		in_events = thread_atoms_search(&sched->atom_root, sched_in, &sched->cmp_pid);
-		if (!in_events) {
-			pr_err("in-event: Internal tree error");
-			return -1;
-		}
-		/*
-		 * Take came in we have not heard about yet,
-		 * add in an initial atom in runnable state:
-		 */
-		if (add_sched_out_event(in_events, 'R', timestamp))
-			return -1;
-	}
-	add_sched_in_event(in_events, timestamp);
-
-	return 0;
-}
-
-static int latency_runtime_event(struct perf_sched *sched,
-				 struct perf_evsel *evsel,
-				 struct perf_sample *sample,
-				 struct machine *machine)
-{
-	const u32 pid	   = perf_evsel__intval(evsel, sample, "pid");
-	const u64 runtime  = perf_evsel__intval(evsel, sample, "runtime");
-	struct thread *thread = machine__findnew_thread(machine, 0, pid);
-	struct work_atoms *atoms = thread_atoms_search(&sched->atom_root, thread, &sched->cmp_pid);
-	u64 timestamp = sample->time;
-	int cpu = sample->cpu;
-
-	BUG_ON(cpu >= MAX_CPUS || cpu < 0);
-	if (!atoms) {
-		if (thread_atoms_insert(sched, thread))
-			return -1;
-		atoms = thread_atoms_search(&sched->atom_root, thread, &sched->cmp_pid);
-		if (!atoms) {
-			pr_err("in-event: Internal tree error");
-			return -1;
-		}
-		if (add_sched_out_event(atoms, 'R', timestamp))
-			return -1;
-	}
-
-	add_runtime_event(atoms, runtime, timestamp);
-	return 0;
-}
-
-static int latency_wakeup_event(struct perf_sched *sched,
-				struct perf_evsel *evsel,
-				struct perf_sample *sample,
-				struct machine *machine)
-{
-	const u32 pid	  = perf_evsel__intval(evsel, sample, "pid"),
-		  success = perf_evsel__intval(evsel, sample, "success");
-	struct work_atoms *atoms;
-	struct work_atom *atom;
-	struct thread *wakee;
-	u64 timestamp = sample->time;
-
-	/* Note for later, it may be interesting to observe the failing cases */
-	if (!success)
-		return 0;
-
-	wakee = machine__findnew_thread(machine, 0, pid);
-	atoms = thread_atoms_search(&sched->atom_root, wakee, &sched->cmp_pid);
-	if (!atoms) {
-		if (thread_atoms_insert(sched, wakee))
-			return -1;
-		atoms = thread_atoms_search(&sched->atom_root, wakee, &sched->cmp_pid);
-		if (!atoms) {
-			pr_err("wakeup-event: Internal tree error");
-			return -1;
-		}
-		if (add_sched_out_event(atoms, 'S', timestamp))
-			return -1;
-	}
-
-	BUG_ON(list_empty(&atoms->work_list));
-
-	atom = list_entry(atoms->work_list.prev, struct work_atom, list);
-
-	/*
-	 * You WILL be missing events if you've recorded only
-	 * one CPU, or are only looking at only one, so don't
-	 * make useless noise.
-	 */
-	if (sched->profile_cpu == -1 && atom->state != THREAD_SLEEPING)
-		sched->nr_state_machine_bugs++;
-
-	sched->nr_timestamps++;
-	if (atom->sched_out_time > timestamp) {
-		sched->nr_unordered_timestamps++;
-		return 0;
-	}
-
-	atom->state = THREAD_WAIT_CPU;
-	atom->wake_up_time = timestamp;
-	return 0;
-}
-
-static int latency_migrate_task_event(struct perf_sched *sched,
-				      struct perf_evsel *evsel,
-				      struct perf_sample *sample,
-				      struct machine *machine)
-{
-	const u32 pid = perf_evsel__intval(evsel, sample, "pid");
-	u64 timestamp = sample->time;
-	struct work_atoms *atoms;
-	struct work_atom *atom;
-	struct thread *migrant;
-
-	/*
-	 * Only need to worry about migration when profiling one CPU.
-	 */
-	if (sched->profile_cpu == -1)
-		return 0;
-
-	migrant = machine__findnew_thread(machine, 0, pid);
-	atoms = thread_atoms_search(&sched->atom_root, migrant, &sched->cmp_pid);
-	if (!atoms) {
-		if (thread_atoms_insert(sched, migrant))
-			return -1;
-		register_pid(sched, migrant->tid, migrant->comm);
-		atoms = thread_atoms_search(&sched->atom_root, migrant, &sched->cmp_pid);
-		if (!atoms) {
-			pr_err("migration-event: Internal tree error");
-			return -1;
-		}
-		if (add_sched_out_event(atoms, 'R', timestamp))
-			return -1;
-	}
-
-	BUG_ON(list_empty(&atoms->work_list));
-
-	atom = list_entry(atoms->work_list.prev, struct work_atom, list);
-	atom->sched_in_time = atom->sched_out_time = atom->wake_up_time = timestamp;
-
-	sched->nr_timestamps++;
-
-	if (atom->sched_out_time > timestamp)
-		sched->nr_unordered_timestamps++;
-
-	return 0;
-}
-
-static void output_lat_thread(struct perf_sched *sched, struct work_atoms *work_list)
-{
-	int i;
-	int ret;
-	u64 avg;
-
-	if (!work_list->nb_atoms)
-		return;
-	/*
-	 * Ignore idle threads:
-	 */
-	if (!strcmp(work_list->thread->comm, "swapper"))
-		return;
-
-	sched->all_runtime += work_list->total_runtime;
-	sched->all_count   += work_list->nb_atoms;
-
-	ret = printf("  %s:%d ", work_list->thread->comm, work_list->thread->tid);
-
-	for (i = 0; i < 24 - ret; i++)
-		printf(" ");
-
-	avg = work_list->total_lat / work_list->nb_atoms;
-
-	printf("|%11.3f ms |%9" PRIu64 " | avg:%9.3f ms | max:%9.3f ms | max at: %9.6f s\n",
-	      (double)work_list->total_runtime / 1e6,
-		 work_list->nb_atoms, (double)avg / 1e6,
-		 (double)work_list->max_lat / 1e6,
-		 (double)work_list->max_lat_at / 1e9);
-}
-
-static int pid_cmp(struct work_atoms *l, struct work_atoms *r)
-{
-	if (l->thread->tid < r->thread->tid)
-		return -1;
-	if (l->thread->tid > r->thread->tid)
-		return 1;
-
-	return 0;
-}
-
-static int avg_cmp(struct work_atoms *l, struct work_atoms *r)
-{
-	u64 avgl, avgr;
-
-	if (!l->nb_atoms)
-		return -1;
-
-	if (!r->nb_atoms)
-		return 1;
-
-	avgl = l->total_lat / l->nb_atoms;
-	avgr = r->total_lat / r->nb_atoms;
-
-	if (avgl < avgr)
-		return -1;
-	if (avgl > avgr)
-		return 1;
-
-	return 0;
-}
-
-static int max_cmp(struct work_atoms *l, struct work_atoms *r)
-{
-	if (l->max_lat < r->max_lat)
-		return -1;
-	if (l->max_lat > r->max_lat)
-		return 1;
-
-	return 0;
-}
-
-static int switch_cmp(struct work_atoms *l, struct work_atoms *r)
-{
-	if (l->nb_atoms < r->nb_atoms)
-		return -1;
-	if (l->nb_atoms > r->nb_atoms)
-		return 1;
-
-	return 0;
-}
-
-static int runtime_cmp(struct work_atoms *l, struct work_atoms *r)
-{
-	if (l->total_runtime < r->total_runtime)
-		return -1;
-	if (l->total_runtime > r->total_runtime)
-		return 1;
-
-	return 0;
-}
-
-static int sort_dimension__add(const char *tok, struct list_head *list)
-{
-	size_t i;
-	static struct sort_dimension avg_sort_dimension = {
-		.name = "avg",
-		.cmp  = avg_cmp,
-	};
-	static struct sort_dimension max_sort_dimension = {
-		.name = "max",
-		.cmp  = max_cmp,
-	};
-	static struct sort_dimension pid_sort_dimension = {
-		.name = "pid",
-		.cmp  = pid_cmp,
-	};
-	static struct sort_dimension runtime_sort_dimension = {
-		.name = "runtime",
-		.cmp  = runtime_cmp,
-	};
-	static struct sort_dimension switch_sort_dimension = {
-		.name = "switch",
-		.cmp  = switch_cmp,
-	};
-	struct sort_dimension *available_sorts[] = {
-		&pid_sort_dimension,
-		&avg_sort_dimension,
-		&max_sort_dimension,
-		&switch_sort_dimension,
-		&runtime_sort_dimension,
-	};
-
-	for (i = 0; i < ARRAY_SIZE(available_sorts); i++) {
-		if (!strcmp(available_sorts[i]->name, tok)) {
-			list_add_tail(&available_sorts[i]->list, list);
-
-			return 0;
-		}
-	}
-
-	return -1;
-}
-
-static void perf_sched__sort_lat(struct perf_sched *sched)
-{
-	struct rb_node *node;
-
-	for (;;) {
-		struct work_atoms *data;
-		node = rb_first(&sched->atom_root);
-		if (!node)
-			break;
-
-		rb_erase(node, &sched->atom_root);
-		data = rb_entry(node, struct work_atoms, node);
-		__thread_latency_insert(&sched->sorted_atom_root, data, &sched->sort_list);
-	}
-}
-
-static int process_sched_wakeup_event(struct perf_tool *tool,
-				      struct perf_evsel *evsel,
-				      struct perf_sample *sample,
-				      struct machine *machine)
-{
-	struct perf_sched *sched = container_of(tool, struct perf_sched, tool);
-
-	if (sched->tp_handler->wakeup_event)
-		return sched->tp_handler->wakeup_event(sched, evsel, sample, machine);
-
-	return 0;
-}
-
-static int map_switch_event(struct perf_sched *sched, struct perf_evsel *evsel,
-			    struct perf_sample *sample, struct machine *machine)
-{
-	const u32 prev_pid = perf_evsel__intval(evsel, sample, "prev_pid"),
-		  next_pid = perf_evsel__intval(evsel, sample, "next_pid");
-	struct thread *sched_out __maybe_unused, *sched_in;
-	int new_shortname;
-	u64 timestamp0, timestamp = sample->time;
-	s64 delta;
-	int cpu, this_cpu = sample->cpu;
-
-	BUG_ON(this_cpu >= MAX_CPUS || this_cpu < 0);
-
-	if (this_cpu > sched->max_cpu)
-		sched->max_cpu = this_cpu;
-
-	timestamp0 = sched->cpu_last_switched[this_cpu];
-	sched->cpu_last_switched[this_cpu] = timestamp;
-	if (timestamp0)
-		delta = timestamp - timestamp0;
-	else
-		delta = 0;
-
-	if (delta < 0) {
-		pr_err("hm, delta: %" PRIu64 " < 0 ?\n", delta);
-		return -1;
-	}
-
-	sched_out = machine__findnew_thread(machine, 0, prev_pid);
-	sched_in = machine__findnew_thread(machine, 0, next_pid);
-
-	sched->curr_thread[this_cpu] = sched_in;
-
-	printf("  ");
-
-	new_shortname = 0;
-	if (!sched_in->shortname[0]) {
-		sched_in->shortname[0] = sched->next_shortname1;
-		sched_in->shortname[1] = sched->next_shortname2;
-
-		if (sched->next_shortname1 < 'Z') {
-			sched->next_shortname1++;
-		} else {
-			sched->next_shortname1='A';
-			if (sched->next_shortname2 < '9') {
-				sched->next_shortname2++;
-			} else {
-				sched->next_shortname2='0';
-			}
-		}
-		new_shortname = 1;
-	}
-
-	for (cpu = 0; cpu <= sched->max_cpu; cpu++) {
-		if (cpu != this_cpu)
-			printf(" ");
-		else
-			printf("*");
-
-		if (sched->curr_thread[cpu]) {
-			if (sched->curr_thread[cpu]->tid)
-				printf("%2s ", sched->curr_thread[cpu]->shortname);
-			else
-				printf(".  ");
-		} else
-			printf("   ");
-	}
-
-	printf("  %12.6f secs ", (double)timestamp/1e9);
-	if (new_shortname) {
-		printf("%s => %s:%d\n",
-			sched_in->shortname, sched_in->comm, sched_in->tid);
-	} else {
-		printf("\n");
-	}
-
-	return 0;
-}
-
-static int process_sched_switch_event(struct perf_tool *tool,
-				      struct perf_evsel *evsel,
-				      struct perf_sample *sample,
-				      struct machine *machine)
-{
-	struct perf_sched *sched = container_of(tool, struct perf_sched, tool);
-	int this_cpu = sample->cpu, err = 0;
-	u32 prev_pid = perf_evsel__intval(evsel, sample, "prev_pid"),
-	    next_pid = perf_evsel__intval(evsel, sample, "next_pid");
-
-	if (sched->curr_pid[this_cpu] != (u32)-1) {
-		/*
-		 * Are we trying to switch away a PID that is
-		 * not current?
-		 */
-		if (sched->curr_pid[this_cpu] != prev_pid)
-			sched->nr_context_switch_bugs++;
-	}
-
-	if (sched->tp_handler->switch_event)
-		err = sched->tp_handler->switch_event(sched, evsel, sample, machine);
-
-	sched->curr_pid[this_cpu] = next_pid;
-	return err;
-}
-
-static int process_sched_runtime_event(struct perf_tool *tool,
-				       struct perf_evsel *evsel,
-				       struct perf_sample *sample,
-				       struct machine *machine)
-{
-	struct perf_sched *sched = container_of(tool, struct perf_sched, tool);
-
-	if (sched->tp_handler->runtime_event)
-		return sched->tp_handler->runtime_event(sched, evsel, sample, machine);
-
-	return 0;
-}
-
-static int perf_sched__process_fork_event(struct perf_tool *tool,
-					  union perf_event *event,
-					  struct perf_sample *sample,
-					  struct machine *machine)
-{
-	struct perf_sched *sched = container_of(tool, struct perf_sched, tool);
-
-	/* run the fork event through the perf machineruy */
-	perf_event__process_fork(tool, event, sample, machine);
-
-	/* and then run additional processing needed for this command */
-	if (sched->tp_handler->fork_event)
-		return sched->tp_handler->fork_event(sched, event, machine);
-
-	return 0;
-}
-
-static int process_sched_migrate_task_event(struct perf_tool *tool,
-					    struct perf_evsel *evsel,
-					    struct perf_sample *sample,
-					    struct machine *machine)
-{
-	struct perf_sched *sched = container_of(tool, struct perf_sched, tool);
-
-	if (sched->tp_handler->migrate_task_event)
-		return sched->tp_handler->migrate_task_event(sched, evsel, sample, machine);
-
-	return 0;
-}
-
-typedef int (*tracepoint_handler)(struct perf_tool *tool,
-				  struct perf_evsel *evsel,
-				  struct perf_sample *sample,
-				  struct machine *machine);
-
-static int perf_sched__process_tracepoint_sample(struct perf_tool *tool __maybe_unused,
-						 union perf_event *event __maybe_unused,
-						 struct perf_sample *sample,
-						 struct perf_evsel *evsel,
-						 struct machine *machine)
-{
-	int err = 0;
-
-	evsel->hists.stats.total_period += sample->period;
-	hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE);
-
-	if (evsel->handler.func != NULL) {
-		tracepoint_handler f = evsel->handler.func;
-		err = f(tool, evsel, sample, machine);
-	}
-
-	return err;
-}
-
-static int perf_sched__read_events(struct perf_sched *sched,
-				   struct perf_session **psession)
-{
-	const struct perf_evsel_str_handler handlers[] = {
-		{ "sched:sched_switch",	      process_sched_switch_event, },
-		{ "sched:sched_stat_runtime", process_sched_runtime_event, },
-		{ "sched:sched_wakeup",	      process_sched_wakeup_event, },
-		{ "sched:sched_wakeup_new",   process_sched_wakeup_event, },
-		{ "sched:sched_migrate_task", process_sched_migrate_task_event, },
-	};
-	struct perf_session *session;
-
-	session = perf_session__new(input_name, O_RDONLY, 0, false, &sched->tool);
-	if (session == NULL) {
-		pr_debug("No Memory for session\n");
-		return -1;
-	}
-
-	if (perf_session__set_tracepoints_handlers(session, handlers))
-		goto out_delete;
-
-	if (perf_session__has_traces(session, "record -R")) {
-		int err = perf_session__process_events(session, &sched->tool);
-		if (err) {
-			pr_err("Failed to process events, error %d", err);
-			goto out_delete;
-		}
-
-		sched->nr_events      = session->stats.nr_events[0];
-		sched->nr_lost_events = session->stats.total_lost;
-		sched->nr_lost_chunks = session->stats.nr_events[PERF_RECORD_LOST];
-	}
-
-	if (psession)
-		*psession = session;
-	else
-		perf_session__delete(session);
-
-	return 0;
-
-out_delete:
-	perf_session__delete(session);
-	return -1;
-}
-
-static void print_bad_events(struct perf_sched *sched)
-{
-	if (sched->nr_unordered_timestamps && sched->nr_timestamps) {
-		printf("  INFO: %.3f%% unordered timestamps (%ld out of %ld)\n",
-			(double)sched->nr_unordered_timestamps/(double)sched->nr_timestamps*100.0,
-			sched->nr_unordered_timestamps, sched->nr_timestamps);
-	}
-	if (sched->nr_lost_events && sched->nr_events) {
-		printf("  INFO: %.3f%% lost events (%ld out of %ld, in %ld chunks)\n",
-			(double)sched->nr_lost_events/(double)sched->nr_events * 100.0,
-			sched->nr_lost_events, sched->nr_events, sched->nr_lost_chunks);
-	}
-	if (sched->nr_state_machine_bugs && sched->nr_timestamps) {
-		printf("  INFO: %.3f%% state machine bugs (%ld out of %ld)",
-			(double)sched->nr_state_machine_bugs/(double)sched->nr_timestamps*100.0,
-			sched->nr_state_machine_bugs, sched->nr_timestamps);
-		if (sched->nr_lost_events)
-			printf(" (due to lost events?)");
-		printf("\n");
-	}
-	if (sched->nr_context_switch_bugs && sched->nr_timestamps) {
-		printf("  INFO: %.3f%% context switch bugs (%ld out of %ld)",
-			(double)sched->nr_context_switch_bugs/(double)sched->nr_timestamps*100.0,
-			sched->nr_context_switch_bugs, sched->nr_timestamps);
-		if (sched->nr_lost_events)
-			printf(" (due to lost events?)");
-		printf("\n");
-	}
-}
-
-static int perf_sched__lat(struct perf_sched *sched)
-{
-	struct rb_node *next;
-	struct perf_session *session;
-
-	setup_pager();
-
-	/* save session -- references to threads are held in work_list */
-	if (perf_sched__read_events(sched, &session))
-		return -1;
-
-	perf_sched__sort_lat(sched);
-
-	printf("\n ---------------------------------------------------------------------------------------------------------------\n");
-	printf("  Task                  |   Runtime ms  | Switches | Average delay ms | Maximum delay ms | Maximum delay at     |\n");
-	printf(" ---------------------------------------------------------------------------------------------------------------\n");
-
-	next = rb_first(&sched->sorted_atom_root);
-
-	while (next) {
-		struct work_atoms *work_list;
-
-		work_list = rb_entry(next, struct work_atoms, node);
-		output_lat_thread(sched, work_list);
-		next = rb_next(next);
-	}
-
-	printf(" -----------------------------------------------------------------------------------------\n");
-	printf("  TOTAL:                |%11.3f ms |%9" PRIu64 " |\n",
-		(double)sched->all_runtime / 1e6, sched->all_count);
-
-	printf(" ---------------------------------------------------\n");
-
-	print_bad_events(sched);
-	printf("\n");
-
-	perf_session__delete(session);
-	return 0;
-}
-
-static int perf_sched__map(struct perf_sched *sched)
-{
-	sched->max_cpu = sysconf(_SC_NPROCESSORS_CONF);
-
-	setup_pager();
-	if (perf_sched__read_events(sched, NULL))
-		return -1;
-	print_bad_events(sched);
-	return 0;
-}
-
-static int perf_sched__replay(struct perf_sched *sched)
-{
-	unsigned long i;
-
-	calibrate_run_measurement_overhead(sched);
-	calibrate_sleep_measurement_overhead(sched);
-
-	test_calibrations(sched);
-
-	if (perf_sched__read_events(sched, NULL))
-		return -1;
-
-	printf("nr_run_events:        %ld\n", sched->nr_run_events);
-	printf("nr_sleep_events:      %ld\n", sched->nr_sleep_events);
-	printf("nr_wakeup_events:     %ld\n", sched->nr_wakeup_events);
-
-	if (sched->targetless_wakeups)
-		printf("target-less wakeups:  %ld\n", sched->targetless_wakeups);
-	if (sched->multitarget_wakeups)
-		printf("multi-target wakeups: %ld\n", sched->multitarget_wakeups);
-	if (sched->nr_run_events_optimized)
-		printf("run atoms optimized: %ld\n",
-			sched->nr_run_events_optimized);
-
-	print_task_traces(sched);
-	add_cross_task_wakeups(sched);
-
-	create_tasks(sched);
-	printf("------------------------------------------------------------\n");
-	for (i = 0; i < sched->replay_repeat; i++)
-		run_one_test(sched);
-
-	return 0;
-}
-
-static void setup_sorting(struct perf_sched *sched, const struct option *options,
-			  const char * const usage_msg[])
-{
-	char *tmp, *tok, *str = strdup(sched->sort_order);
-
-	for (tok = strtok_r(str, ", ", &tmp);
-			tok; tok = strtok_r(NULL, ", ", &tmp)) {
-		if (sort_dimension__add(tok, &sched->sort_list) < 0) {
-			error("Unknown --sort key: `%s'", tok);
-			usage_with_options(usage_msg, options);
-		}
-	}
-
-	free(str);
-
-	sort_dimension__add("pid", &sched->cmp_pid);
-}
-
-static int __cmd_record(int argc, const char **argv)
-{
-	unsigned int rec_argc, i, j;
-	const char **rec_argv;
-	const char * const record_args[] = {
-		"record",
-		"-a",
-		"-R",
-		"-m", "1024",
-		"-c", "1",
-		"-e", "sched:sched_switch",
-		"-e", "sched:sched_stat_wait",
-		"-e", "sched:sched_stat_sleep",
-		"-e", "sched:sched_stat_iowait",
-		"-e", "sched:sched_stat_runtime",
-		"-e", "sched:sched_process_fork",
-		"-e", "sched:sched_wakeup",
-		"-e", "sched:sched_migrate_task",
-	};
-
-	rec_argc = ARRAY_SIZE(record_args) + argc - 1;
-	rec_argv = calloc(rec_argc + 1, sizeof(char *));
-
-	if (rec_argv == NULL)
-		return -ENOMEM;
-
-	for (i = 0; i < ARRAY_SIZE(record_args); i++)
-		rec_argv[i] = strdup(record_args[i]);
-
-	for (j = 1; j < (unsigned int)argc; j++, i++)
-		rec_argv[i] = argv[j];
-
-	BUG_ON(i != rec_argc);
-
-	return cmd_record(i, rec_argv, NULL);
-}
-
-static const char default_sort_order[] = "avg, max, switch, runtime";
-static struct perf_sched sched = {
-	.tool = {
-		.sample		 = perf_sched__process_tracepoint_sample,
-		.comm		 = perf_event__process_comm,
-		.lost		 = perf_event__process_lost,
-		.fork		 = perf_sched__process_fork_event,
-		.ordered_samples = true,
-	},
-	.cmp_pid	      = LIST_HEAD_INIT(sched.cmp_pid),
-	.sort_list	      = LIST_HEAD_INIT(sched.sort_list),
-	.start_work_mutex     = PTHREAD_MUTEX_INITIALIZER,
-	.work_done_wait_mutex = PTHREAD_MUTEX_INITIALIZER,
-	.curr_pid	      = { [0 ... MAX_CPUS - 1] = -1 },
-	.sort_order	      = default_sort_order,
-	.replay_repeat	      = 10,
-	.profile_cpu	      = -1,
-	.next_shortname1      = 'A',
-	.next_shortname2      = '0',
-};
-
-int cmd_sched(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	const struct option latency_options[] = {
-	OPT_STRING('s', "sort", &sched.sort_order, "key[,key2...]",
-		   "sort by key(s): runtime, switch, avg, max"),
-	OPT_INCR('v', "verbose", &verbose,
-		    "be more verbose (show symbol address, etc)"),
-	OPT_INTEGER('C', "CPU", &sched.profile_cpu,
-		    "CPU to profile on"),
-	OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
-		    "dump raw trace in ASCII"),
-	OPT_END()
-	};
-	const struct option replay_options[] = {
-	OPT_UINTEGER('r', "repeat", &sched.replay_repeat,
-		     "repeat the workload replay N times (-1: infinite)"),
-	OPT_INCR('v', "verbose", &verbose,
-		    "be more verbose (show symbol address, etc)"),
-	OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
-		    "dump raw trace in ASCII"),
-	OPT_END()
-	};
-	const struct option sched_options[] = {
-	OPT_STRING('i', "input", &input_name, "file",
-		    "input file name"),
-	OPT_INCR('v', "verbose", &verbose,
-		    "be more verbose (show symbol address, etc)"),
-	OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
-		    "dump raw trace in ASCII"),
-	OPT_END()
-	};
-	const char * const latency_usage[] = {
-		"perf sched latency [<options>]",
-		NULL
-	};
-	const char * const replay_usage[] = {
-		"perf sched replay [<options>]",
-		NULL
-	};
-	const char * const sched_usage[] = {
-		"perf sched [<options>] {record|latency|map|replay|script}",
-		NULL
-	};
-	struct trace_sched_handler lat_ops  = {
-		.wakeup_event	    = latency_wakeup_event,
-		.switch_event	    = latency_switch_event,
-		.runtime_event	    = latency_runtime_event,
-		.migrate_task_event = latency_migrate_task_event,
-	};
-	struct trace_sched_handler map_ops  = {
-		.switch_event	    = map_switch_event,
-	};
-	struct trace_sched_handler replay_ops  = {
-		.wakeup_event	    = replay_wakeup_event,
-		.switch_event	    = replay_switch_event,
-		.fork_event	    = replay_fork_event,
-	};
-
-	argc = parse_options(argc, argv, sched_options, sched_usage,
-			     PARSE_OPT_STOP_AT_NON_OPTION);
-	if (!argc)
-		usage_with_options(sched_usage, sched_options);
-
-	/*
-	 * Aliased to 'perf script' for now:
-	 */
-	if (!strcmp(argv[0], "script"))
-		return cmd_script(argc, argv, prefix);
-
-	symbol__init();
-	if (!strncmp(argv[0], "rec", 3)) {
-		return __cmd_record(argc, argv);
-	} else if (!strncmp(argv[0], "lat", 3)) {
-		sched.tp_handler = &lat_ops;
-		if (argc > 1) {
-			argc = parse_options(argc, argv, latency_options, latency_usage, 0);
-			if (argc)
-				usage_with_options(latency_usage, latency_options);
-		}
-		setup_sorting(&sched, latency_options, latency_usage);
-		return perf_sched__lat(&sched);
-	} else if (!strcmp(argv[0], "map")) {
-		sched.tp_handler = &map_ops;
-		setup_sorting(&sched, latency_options, latency_usage);
-		return perf_sched__map(&sched);
-	} else if (!strncmp(argv[0], "rep", 3)) {
-		sched.tp_handler = &replay_ops;
-		if (argc) {
-			argc = parse_options(argc, argv, replay_options, replay_usage, 0);
-			if (argc)
-				usage_with_options(replay_usage, replay_options);
-		}
-		return perf_sched__replay(&sched);
-	} else {
-		usage_with_options(sched_usage, sched_options);
-	}
-
-	return 0;
-}
diff --git a/src/tools/perf/builtin-script.c b/src/tools/perf/builtin-script.c
deleted file mode 100644
index 9c333ff..0000000
--- a/src/tools/perf/builtin-script.c
+++ /dev/null
@@ -1,1563 +0,0 @@
-#include "builtin.h"
-
-#include "perf.h"
-#include "util/cache.h"
-#include "util/debug.h"
-#include "util/exec_cmd.h"
-#include "util/header.h"
-#include "util/parse-options.h"
-#include "util/session.h"
-#include "util/tool.h"
-#include "util/symbol.h"
-#include "util/thread.h"
-#include "util/trace-event.h"
-#include "util/util.h"
-#include "util/evlist.h"
-#include "util/evsel.h"
-#include "util/sort.h"
-#include <linux/bitmap.h>
-
-static char const		*script_name;
-static char const		*generate_script_lang;
-static bool			debug_mode;
-static u64			last_timestamp;
-static u64			nr_unordered;
-extern const struct option	record_options[];
-static bool			no_callchain;
-static bool			latency_format;
-static bool			system_wide;
-static const char		*cpu_list;
-static DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS);
-
-enum perf_output_field {
-	PERF_OUTPUT_COMM            = 1U << 0,
-	PERF_OUTPUT_TID             = 1U << 1,
-	PERF_OUTPUT_PID             = 1U << 2,
-	PERF_OUTPUT_TIME            = 1U << 3,
-	PERF_OUTPUT_CPU             = 1U << 4,
-	PERF_OUTPUT_EVNAME          = 1U << 5,
-	PERF_OUTPUT_TRACE           = 1U << 6,
-	PERF_OUTPUT_IP              = 1U << 7,
-	PERF_OUTPUT_SYM             = 1U << 8,
-	PERF_OUTPUT_DSO             = 1U << 9,
-	PERF_OUTPUT_ADDR            = 1U << 10,
-	PERF_OUTPUT_SYMOFFSET       = 1U << 11,
-};
-
-struct output_option {
-	const char *str;
-	enum perf_output_field field;
-} all_output_options[] = {
-	{.str = "comm",  .field = PERF_OUTPUT_COMM},
-	{.str = "tid",   .field = PERF_OUTPUT_TID},
-	{.str = "pid",   .field = PERF_OUTPUT_PID},
-	{.str = "time",  .field = PERF_OUTPUT_TIME},
-	{.str = "cpu",   .field = PERF_OUTPUT_CPU},
-	{.str = "event", .field = PERF_OUTPUT_EVNAME},
-	{.str = "trace", .field = PERF_OUTPUT_TRACE},
-	{.str = "ip",    .field = PERF_OUTPUT_IP},
-	{.str = "sym",   .field = PERF_OUTPUT_SYM},
-	{.str = "dso",   .field = PERF_OUTPUT_DSO},
-	{.str = "addr",  .field = PERF_OUTPUT_ADDR},
-	{.str = "symoff", .field = PERF_OUTPUT_SYMOFFSET},
-};
-
-/* default set to maintain compatibility with current format */
-static struct {
-	bool user_set;
-	bool wildcard_set;
-	unsigned int print_ip_opts;
-	u64 fields;
-	u64 invalid_fields;
-} output[PERF_TYPE_MAX] = {
-
-	[PERF_TYPE_HARDWARE] = {
-		.user_set = false,
-
-		.fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
-			      PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
-			      PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
-				  PERF_OUTPUT_SYM | PERF_OUTPUT_DSO,
-
-		.invalid_fields = PERF_OUTPUT_TRACE,
-	},
-
-	[PERF_TYPE_SOFTWARE] = {
-		.user_set = false,
-
-		.fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
-			      PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
-			      PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
-				  PERF_OUTPUT_SYM | PERF_OUTPUT_DSO,
-
-		.invalid_fields = PERF_OUTPUT_TRACE,
-	},
-
-	[PERF_TYPE_TRACEPOINT] = {
-		.user_set = false,
-
-		.fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
-				  PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
-				  PERF_OUTPUT_EVNAME | PERF_OUTPUT_TRACE,
-	},
-
-	[PERF_TYPE_RAW] = {
-		.user_set = false,
-
-		.fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
-			      PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
-			      PERF_OUTPUT_EVNAME | PERF_OUTPUT_IP |
-				  PERF_OUTPUT_SYM | PERF_OUTPUT_DSO,
-
-		.invalid_fields = PERF_OUTPUT_TRACE,
-	},
-};
-
-static bool output_set_by_user(void)
-{
-	int j;
-	for (j = 0; j < PERF_TYPE_MAX; ++j) {
-		if (output[j].user_set)
-			return true;
-	}
-	return false;
-}
-
-static const char *output_field2str(enum perf_output_field field)
-{
-	int i, imax = ARRAY_SIZE(all_output_options);
-	const char *str = "";
-
-	for (i = 0; i < imax; ++i) {
-		if (all_output_options[i].field == field) {
-			str = all_output_options[i].str;
-			break;
-		}
-	}
-	return str;
-}
-
-#define PRINT_FIELD(x)  (output[attr->type].fields & PERF_OUTPUT_##x)
-
-static int perf_evsel__check_stype(struct perf_evsel *evsel,
-				   u64 sample_type, const char *sample_msg,
-				   enum perf_output_field field)
-{
-	struct perf_event_attr *attr = &evsel->attr;
-	int type = attr->type;
-	const char *evname;
-
-	if (attr->sample_type & sample_type)
-		return 0;
-
-	if (output[type].user_set) {
-		evname = perf_evsel__name(evsel);
-		pr_err("Samples for '%s' event do not have %s attribute set. "
-		       "Cannot print '%s' field.\n",
-		       evname, sample_msg, output_field2str(field));
-		return -1;
-	}
-
-	/* user did not ask for it explicitly so remove from the default list */
-	output[type].fields &= ~field;
-	evname = perf_evsel__name(evsel);
-	pr_debug("Samples for '%s' event do not have %s attribute set. "
-		 "Skipping '%s' field.\n",
-		 evname, sample_msg, output_field2str(field));
-
-	return 0;
-}
-
-static int perf_evsel__check_attr(struct perf_evsel *evsel,
-				  struct perf_session *session)
-{
-	struct perf_event_attr *attr = &evsel->attr;
-
-	if (PRINT_FIELD(TRACE) &&
-		!perf_session__has_traces(session, "record -R"))
-		return -EINVAL;
-
-	if (PRINT_FIELD(IP)) {
-		if (perf_evsel__check_stype(evsel, PERF_SAMPLE_IP, "IP",
-					    PERF_OUTPUT_IP))
-			return -EINVAL;
-
-		if (!no_callchain &&
-		    !(attr->sample_type & PERF_SAMPLE_CALLCHAIN))
-			symbol_conf.use_callchain = false;
-	}
-
-	if (PRINT_FIELD(ADDR) &&
-		perf_evsel__check_stype(evsel, PERF_SAMPLE_ADDR, "ADDR",
-					PERF_OUTPUT_ADDR))
-		return -EINVAL;
-
-	if (PRINT_FIELD(SYM) && !PRINT_FIELD(IP) && !PRINT_FIELD(ADDR)) {
-		pr_err("Display of symbols requested but neither sample IP nor "
-			   "sample address\nis selected. Hence, no addresses to convert "
-		       "to symbols.\n");
-		return -EINVAL;
-	}
-	if (PRINT_FIELD(SYMOFFSET) && !PRINT_FIELD(SYM)) {
-		pr_err("Display of offsets requested but symbol is not"
-		       "selected.\n");
-		return -EINVAL;
-	}
-	if (PRINT_FIELD(DSO) && !PRINT_FIELD(IP) && !PRINT_FIELD(ADDR)) {
-		pr_err("Display of DSO requested but neither sample IP nor "
-			   "sample address\nis selected. Hence, no addresses to convert "
-		       "to DSO.\n");
-		return -EINVAL;
-	}
-
-	if ((PRINT_FIELD(PID) || PRINT_FIELD(TID)) &&
-		perf_evsel__check_stype(evsel, PERF_SAMPLE_TID, "TID",
-					PERF_OUTPUT_TID|PERF_OUTPUT_PID))
-		return -EINVAL;
-
-	if (PRINT_FIELD(TIME) &&
-		perf_evsel__check_stype(evsel, PERF_SAMPLE_TIME, "TIME",
-					PERF_OUTPUT_TIME))
-		return -EINVAL;
-
-	if (PRINT_FIELD(CPU) &&
-		perf_evsel__check_stype(evsel, PERF_SAMPLE_CPU, "CPU",
-					PERF_OUTPUT_CPU))
-		return -EINVAL;
-
-	return 0;
-}
-
-/*
- * verify all user requested events exist and the samples
- * have the expected data
- */
-static int perf_session__check_output_opt(struct perf_session *session)
-{
-	int j;
-	struct perf_evsel *evsel;
-	struct perf_event_attr *attr;
-
-	for (j = 0; j < PERF_TYPE_MAX; ++j) {
-		evsel = perf_session__find_first_evtype(session, j);
-
-		/*
-		 * even if fields is set to 0 (ie., show nothing) event must
-		 * exist if user explicitly includes it on the command line
-		 */
-		if (!evsel && output[j].user_set && !output[j].wildcard_set) {
-			pr_err("%s events do not exist. "
-			       "Remove corresponding -f option to proceed.\n",
-			       event_type(j));
-			return -1;
-		}
-
-		if (evsel && output[j].fields &&
-			perf_evsel__check_attr(evsel, session))
-			return -1;
-
-		if (evsel == NULL)
-			continue;
-
-		attr = &evsel->attr;
-
-		output[j].print_ip_opts = 0;
-		if (PRINT_FIELD(IP))
-			output[j].print_ip_opts |= PRINT_IP_OPT_IP;
-
-		if (PRINT_FIELD(SYM))
-			output[j].print_ip_opts |= PRINT_IP_OPT_SYM;
-
-		if (PRINT_FIELD(DSO))
-			output[j].print_ip_opts |= PRINT_IP_OPT_DSO;
-
-		if (PRINT_FIELD(SYMOFFSET))
-			output[j].print_ip_opts |= PRINT_IP_OPT_SYMOFFSET;
-	}
-
-	return 0;
-}
-
-static void print_sample_start(struct perf_sample *sample,
-			       struct thread *thread,
-			       struct perf_evsel *evsel)
-{
-	struct perf_event_attr *attr = &evsel->attr;
-	const char *evname = NULL;
-	unsigned long secs;
-	unsigned long usecs;
-	unsigned long long nsecs;
-
-	if (PRINT_FIELD(COMM)) {
-		if (latency_format)
-			printf("%8.8s ", thread->comm);
-		else if (PRINT_FIELD(IP) && symbol_conf.use_callchain)
-			printf("%s ", thread->comm);
-		else
-			printf("%16s ", thread->comm);
-	}
-
-	if (PRINT_FIELD(PID) && PRINT_FIELD(TID))
-		printf("%5d/%-5d ", sample->pid, sample->tid);
-	else if (PRINT_FIELD(PID))
-		printf("%5d ", sample->pid);
-	else if (PRINT_FIELD(TID))
-		printf("%5d ", sample->tid);
-
-	if (PRINT_FIELD(CPU)) {
-		if (latency_format)
-			printf("%3d ", sample->cpu);
-		else
-			printf("[%03d] ", sample->cpu);
-	}
-
-	if (PRINT_FIELD(TIME)) {
-		nsecs = sample->time;
-		secs = nsecs / NSECS_PER_SEC;
-		nsecs -= secs * NSECS_PER_SEC;
-		usecs = nsecs / NSECS_PER_USEC;
-		printf("%5lu.%06lu: ", secs, usecs);
-	}
-
-	if (PRINT_FIELD(EVNAME)) {
-		evname = perf_evsel__name(evsel);
-		printf("%s: ", evname ? evname : "[unknown]");
-	}
-}
-
-static bool is_bts_event(struct perf_event_attr *attr)
-{
-	return ((attr->type == PERF_TYPE_HARDWARE) &&
-		(attr->config & PERF_COUNT_HW_BRANCH_INSTRUCTIONS) &&
-		(attr->sample_period == 1));
-}
-
-static bool sample_addr_correlates_sym(struct perf_event_attr *attr)
-{
-	if ((attr->type == PERF_TYPE_SOFTWARE) &&
-	    ((attr->config == PERF_COUNT_SW_PAGE_FAULTS) ||
-	     (attr->config == PERF_COUNT_SW_PAGE_FAULTS_MIN) ||
-	     (attr->config == PERF_COUNT_SW_PAGE_FAULTS_MAJ)))
-		return true;
-
-	if (is_bts_event(attr))
-		return true;
-
-	return false;
-}
-
-static void print_sample_addr(union perf_event *event,
-			  struct perf_sample *sample,
-			  struct machine *machine,
-			  struct thread *thread,
-			  struct perf_event_attr *attr)
-{
-	struct addr_location al;
-	u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
-
-	printf("%16" PRIx64, sample->addr);
-
-	if (!sample_addr_correlates_sym(attr))
-		return;
-
-	thread__find_addr_map(thread, machine, cpumode, MAP__FUNCTION,
-			      sample->addr, &al);
-	if (!al.map)
-		thread__find_addr_map(thread, machine, cpumode, MAP__VARIABLE,
-				      sample->addr, &al);
-
-	al.cpu = sample->cpu;
-	al.sym = NULL;
-
-	if (al.map)
-		al.sym = map__find_symbol(al.map, al.addr, NULL);
-
-	if (PRINT_FIELD(SYM)) {
-		printf(" ");
-		if (PRINT_FIELD(SYMOFFSET))
-			symbol__fprintf_symname_offs(al.sym, &al, stdout);
-		else
-			symbol__fprintf_symname(al.sym, stdout);
-	}
-
-	if (PRINT_FIELD(DSO)) {
-		printf(" (");
-		map__fprintf_dsoname(al.map, stdout);
-		printf(")");
-	}
-}
-
-static void print_sample_bts(union perf_event *event,
-			     struct perf_sample *sample,
-			     struct perf_evsel *evsel,
-			     struct machine *machine,
-			     struct thread *thread)
-{
-	struct perf_event_attr *attr = &evsel->attr;
-
-	/* print branch_from information */
-	if (PRINT_FIELD(IP)) {
-		if (!symbol_conf.use_callchain)
-			printf(" ");
-		else
-			printf("\n");
-		perf_evsel__print_ip(evsel, event, sample, machine,
-				     output[attr->type].print_ip_opts,
-				     PERF_MAX_STACK_DEPTH);
-	}
-
-	printf(" => ");
-
-	/* print branch_to information */
-	if (PRINT_FIELD(ADDR))
-		print_sample_addr(event, sample, machine, thread, attr);
-
-	printf("\n");
-}
-
-static void process_event(union perf_event *event, struct perf_sample *sample,
-			  struct perf_evsel *evsel, struct machine *machine,
-			  struct thread *thread,
-			  struct addr_location *al __maybe_unused)
-{
-	struct perf_event_attr *attr = &evsel->attr;
-
-	if (output[attr->type].fields == 0)
-		return;
-
-	print_sample_start(sample, thread, evsel);
-
-	if (is_bts_event(attr)) {
-		print_sample_bts(event, sample, evsel, machine, thread);
-		return;
-	}
-
-	if (PRINT_FIELD(TRACE))
-		event_format__print(evsel->tp_format, sample->cpu,
-				    sample->raw_data, sample->raw_size);
-	if (PRINT_FIELD(ADDR))
-		print_sample_addr(event, sample, machine, thread, attr);
-
-	if (PRINT_FIELD(IP)) {
-		if (!symbol_conf.use_callchain)
-			printf(" ");
-		else
-			printf("\n");
-
-		perf_evsel__print_ip(evsel, event, sample, machine,
-				     output[attr->type].print_ip_opts,
-				     PERF_MAX_STACK_DEPTH);
-	}
-
-	printf("\n");
-}
-
-static int default_start_script(const char *script __maybe_unused,
-				int argc __maybe_unused,
-				const char **argv __maybe_unused)
-{
-	return 0;
-}
-
-static int default_stop_script(void)
-{
-	return 0;
-}
-
-static int default_generate_script(struct pevent *pevent __maybe_unused,
-				   const char *outfile __maybe_unused)
-{
-	return 0;
-}
-
-static struct scripting_ops default_scripting_ops = {
-	.start_script		= default_start_script,
-	.stop_script		= default_stop_script,
-	.process_event		= process_event,
-	.generate_script	= default_generate_script,
-};
-
-static struct scripting_ops	*scripting_ops;
-
-static void setup_scripting(void)
-{
-	setup_perl_scripting();
-	setup_python_scripting();
-
-	scripting_ops = &default_scripting_ops;
-}
-
-static int cleanup_scripting(void)
-{
-	pr_debug("\nperf script stopped\n");
-
-	return scripting_ops->stop_script();
-}
-
-static int process_sample_event(struct perf_tool *tool __maybe_unused,
-				union perf_event *event,
-				struct perf_sample *sample,
-				struct perf_evsel *evsel,
-				struct machine *machine)
-{
-	struct addr_location al;
-	struct thread *thread = machine__findnew_thread(machine, sample->pid,
-							sample->tid);
-
-	if (thread == NULL) {
-		pr_debug("problem processing %d event, skipping it.\n",
-			 event->header.type);
-		return -1;
-	}
-
-	if (debug_mode) {
-		if (sample->time < last_timestamp) {
-			pr_err("Samples misordered, previous: %" PRIu64
-				" this: %" PRIu64 "\n", last_timestamp,
-				sample->time);
-			nr_unordered++;
-		}
-		last_timestamp = sample->time;
-		return 0;
-	}
-
-	if (perf_event__preprocess_sample(event, machine, &al, sample) < 0) {
-		pr_err("problem processing %d event, skipping it.\n",
-		       event->header.type);
-		return -1;
-	}
-
-	if (al.filtered)
-		return 0;
-
-	if (cpu_list && !test_bit(sample->cpu, cpu_bitmap))
-		return 0;
-
-	scripting_ops->process_event(event, sample, evsel, machine, thread, &al);
-
-	evsel->hists.stats.total_period += sample->period;
-	return 0;
-}
-
-static struct perf_tool perf_script = {
-	.sample		 = process_sample_event,
-	.mmap		 = perf_event__process_mmap,
-	.mmap2		 = perf_event__process_mmap2,
-	.comm		 = perf_event__process_comm,
-	.exit		 = perf_event__process_exit,
-	.fork		 = perf_event__process_fork,
-	.attr		 = perf_event__process_attr,
-	.tracing_data	 = perf_event__process_tracing_data,
-	.build_id	 = perf_event__process_build_id,
-	.ordered_samples = true,
-	.ordering_requires_timestamps = true,
-};
-
-static void sig_handler(int sig __maybe_unused)
-{
-	session_done = 1;
-}
-
-static int __cmd_script(struct perf_session *session)
-{
-	int ret;
-
-	signal(SIGINT, sig_handler);
-
-	ret = perf_session__process_events(session, &perf_script);
-
-	if (debug_mode)
-		pr_err("Misordered timestamps: %" PRIu64 "\n", nr_unordered);
-
-	return ret;
-}
-
-struct script_spec {
-	struct list_head	node;
-	struct scripting_ops	*ops;
-	char			spec[0];
-};
-
-static LIST_HEAD(script_specs);
-
-static struct script_spec *script_spec__new(const char *spec,
-					    struct scripting_ops *ops)
-{
-	struct script_spec *s = malloc(sizeof(*s) + strlen(spec) + 1);
-
-	if (s != NULL) {
-		strcpy(s->spec, spec);
-		s->ops = ops;
-	}
-
-	return s;
-}
-
-static void script_spec__add(struct script_spec *s)
-{
-	list_add_tail(&s->node, &script_specs);
-}
-
-static struct script_spec *script_spec__find(const char *spec)
-{
-	struct script_spec *s;
-
-	list_for_each_entry(s, &script_specs, node)
-		if (strcasecmp(s->spec, spec) == 0)
-			return s;
-	return NULL;
-}
-
-static struct script_spec *script_spec__findnew(const char *spec,
-						struct scripting_ops *ops)
-{
-	struct script_spec *s = script_spec__find(spec);
-
-	if (s)
-		return s;
-
-	s = script_spec__new(spec, ops);
-	if (!s)
-		return NULL;
-
-	script_spec__add(s);
-
-	return s;
-}
-
-int script_spec_register(const char *spec, struct scripting_ops *ops)
-{
-	struct script_spec *s;
-
-	s = script_spec__find(spec);
-	if (s)
-		return -1;
-
-	s = script_spec__findnew(spec, ops);
-	if (!s)
-		return -1;
-
-	return 0;
-}
-
-static struct scripting_ops *script_spec__lookup(const char *spec)
-{
-	struct script_spec *s = script_spec__find(spec);
-	if (!s)
-		return NULL;
-
-	return s->ops;
-}
-
-static void list_available_languages(void)
-{
-	struct script_spec *s;
-
-	fprintf(stderr, "\n");
-	fprintf(stderr, "Scripting language extensions (used in "
-		"perf script -s [spec:]script.[spec]):\n\n");
-
-	list_for_each_entry(s, &script_specs, node)
-		fprintf(stderr, "  %-42s [%s]\n", s->spec, s->ops->name);
-
-	fprintf(stderr, "\n");
-}
-
-static int parse_scriptname(const struct option *opt __maybe_unused,
-			    const char *str, int unset __maybe_unused)
-{
-	char spec[PATH_MAX];
-	const char *script, *ext;
-	int len;
-
-	if (strcmp(str, "lang") == 0) {
-		list_available_languages();
-		exit(0);
-	}
-
-	script = strchr(str, ':');
-	if (script) {
-		len = script - str;
-		if (len >= PATH_MAX) {
-			fprintf(stderr, "invalid language specifier");
-			return -1;
-		}
-		strncpy(spec, str, len);
-		spec[len] = '\0';
-		scripting_ops = script_spec__lookup(spec);
-		if (!scripting_ops) {
-			fprintf(stderr, "invalid language specifier");
-			return -1;
-		}
-		script++;
-	} else {
-		script = str;
-		ext = strrchr(script, '.');
-		if (!ext) {
-			fprintf(stderr, "invalid script extension");
-			return -1;
-		}
-		scripting_ops = script_spec__lookup(++ext);
-		if (!scripting_ops) {
-			fprintf(stderr, "invalid script extension");
-			return -1;
-		}
-	}
-
-	script_name = strdup(script);
-
-	return 0;
-}
-
-static int parse_output_fields(const struct option *opt __maybe_unused,
-			    const char *arg, int unset __maybe_unused)
-{
-	char *tok;
-	int i, imax = ARRAY_SIZE(all_output_options);
-	int j;
-	int rc = 0;
-	char *str = strdup(arg);
-	int type = -1;
-
-	if (!str)
-		return -ENOMEM;
-
-	/* first word can state for which event type the user is specifying
-	 * the fields. If no type exists, the specified fields apply to all
-	 * event types found in the file minus the invalid fields for a type.
-	 */
-	tok = strchr(str, ':');
-	if (tok) {
-		*tok = '\0';
-		tok++;
-		if (!strcmp(str, "hw"))
-			type = PERF_TYPE_HARDWARE;
-		else if (!strcmp(str, "sw"))
-			type = PERF_TYPE_SOFTWARE;
-		else if (!strcmp(str, "trace"))
-			type = PERF_TYPE_TRACEPOINT;
-		else if (!strcmp(str, "raw"))
-			type = PERF_TYPE_RAW;
-		else {
-			fprintf(stderr, "Invalid event type in field string.\n");
-			rc = -EINVAL;
-			goto out;
-		}
-
-		if (output[type].user_set)
-			pr_warning("Overriding previous field request for %s events.\n",
-				   event_type(type));
-
-		output[type].fields = 0;
-		output[type].user_set = true;
-		output[type].wildcard_set = false;
-
-	} else {
-		tok = str;
-		if (strlen(str) == 0) {
-			fprintf(stderr,
-				"Cannot set fields to 'none' for all event types.\n");
-			rc = -EINVAL;
-			goto out;
-		}
-
-		if (output_set_by_user())
-			pr_warning("Overriding previous field request for all events.\n");
-
-		for (j = 0; j < PERF_TYPE_MAX; ++j) {
-			output[j].fields = 0;
-			output[j].user_set = true;
-			output[j].wildcard_set = true;
-		}
-	}
-
-	tok = strtok(tok, ",");
-	while (tok) {
-		for (i = 0; i < imax; ++i) {
-			if (strcmp(tok, all_output_options[i].str) == 0)
-				break;
-		}
-		if (i == imax) {
-			fprintf(stderr, "Invalid field requested.\n");
-			rc = -EINVAL;
-			goto out;
-		}
-
-		if (type == -1) {
-			/* add user option to all events types for
-			 * which it is valid
-			 */
-			for (j = 0; j < PERF_TYPE_MAX; ++j) {
-				if (output[j].invalid_fields & all_output_options[i].field) {
-					pr_warning("\'%s\' not valid for %s events. Ignoring.\n",
-						   all_output_options[i].str, event_type(j));
-				} else
-					output[j].fields |= all_output_options[i].field;
-			}
-		} else {
-			if (output[type].invalid_fields & all_output_options[i].field) {
-				fprintf(stderr, "\'%s\' not valid for %s events.\n",
-					 all_output_options[i].str, event_type(type));
-
-				rc = -EINVAL;
-				goto out;
-			}
-			output[type].fields |= all_output_options[i].field;
-		}
-
-		tok = strtok(NULL, ",");
-	}
-
-	if (type >= 0) {
-		if (output[type].fields == 0) {
-			pr_debug("No fields requested for %s type. "
-				 "Events will not be displayed.\n", event_type(type));
-		}
-	}
-
-out:
-	free(str);
-	return rc;
-}
-
-/* Helper function for filesystems that return a dent->d_type DT_UNKNOWN */
-static int is_directory(const char *base_path, const struct dirent *dent)
-{
-	char path[PATH_MAX];
-	struct stat st;
-
-	sprintf(path, "%s/%s", base_path, dent->d_name);
-	if (stat(path, &st))
-		return 0;
-
-	return S_ISDIR(st.st_mode);
-}
-
-#define for_each_lang(scripts_path, scripts_dir, lang_dirent, lang_next)\
-	while (!readdir_r(scripts_dir, &lang_dirent, &lang_next) &&	\
-	       lang_next)						\
-		if ((lang_dirent.d_type == DT_DIR ||			\
-		     (lang_dirent.d_type == DT_UNKNOWN &&		\
-		      is_directory(scripts_path, &lang_dirent))) &&	\
-		    (strcmp(lang_dirent.d_name, ".")) &&		\
-		    (strcmp(lang_dirent.d_name, "..")))
-
-#define for_each_script(lang_path, lang_dir, script_dirent, script_next)\
-	while (!readdir_r(lang_dir, &script_dirent, &script_next) &&	\
-	       script_next)						\
-		if (script_dirent.d_type != DT_DIR &&			\
-		    (script_dirent.d_type != DT_UNKNOWN ||		\
-		     !is_directory(lang_path, &script_dirent)))
-
-
-#define RECORD_SUFFIX			"-record"
-#define REPORT_SUFFIX			"-report"
-
-struct script_desc {
-	struct list_head	node;
-	char			*name;
-	char			*half_liner;
-	char			*args;
-};
-
-static LIST_HEAD(script_descs);
-
-static struct script_desc *script_desc__new(const char *name)
-{
-	struct script_desc *s = zalloc(sizeof(*s));
-
-	if (s != NULL && name)
-		s->name = strdup(name);
-
-	return s;
-}
-
-static void script_desc__delete(struct script_desc *s)
-{
-	free(s->name);
-	free(s->half_liner);
-	free(s->args);
-	free(s);
-}
-
-static void script_desc__add(struct script_desc *s)
-{
-	list_add_tail(&s->node, &script_descs);
-}
-
-static struct script_desc *script_desc__find(const char *name)
-{
-	struct script_desc *s;
-
-	list_for_each_entry(s, &script_descs, node)
-		if (strcasecmp(s->name, name) == 0)
-			return s;
-	return NULL;
-}
-
-static struct script_desc *script_desc__findnew(const char *name)
-{
-	struct script_desc *s = script_desc__find(name);
-
-	if (s)
-		return s;
-
-	s = script_desc__new(name);
-	if (!s)
-		goto out_delete_desc;
-
-	script_desc__add(s);
-
-	return s;
-
-out_delete_desc:
-	script_desc__delete(s);
-
-	return NULL;
-}
-
-static const char *ends_with(const char *str, const char *suffix)
-{
-	size_t suffix_len = strlen(suffix);
-	const char *p = str;
-
-	if (strlen(str) > suffix_len) {
-		p = str + strlen(str) - suffix_len;
-		if (!strncmp(p, suffix, suffix_len))
-			return p;
-	}
-
-	return NULL;
-}
-
-static int read_script_info(struct script_desc *desc, const char *filename)
-{
-	char line[BUFSIZ], *p;
-	FILE *fp;
-
-	fp = fopen(filename, "r");
-	if (!fp)
-		return -1;
-
-	while (fgets(line, sizeof(line), fp)) {
-		p = ltrim(line);
-		if (strlen(p) == 0)
-			continue;
-		if (*p != '#')
-			continue;
-		p++;
-		if (strlen(p) && *p == '!')
-			continue;
-
-		p = ltrim(p);
-		if (strlen(p) && p[strlen(p) - 1] == '\n')
-			p[strlen(p) - 1] = '\0';
-
-		if (!strncmp(p, "description:", strlen("description:"))) {
-			p += strlen("description:");
-			desc->half_liner = strdup(ltrim(p));
-			continue;
-		}
-
-		if (!strncmp(p, "args:", strlen("args:"))) {
-			p += strlen("args:");
-			desc->args = strdup(ltrim(p));
-			continue;
-		}
-	}
-
-	fclose(fp);
-
-	return 0;
-}
-
-static char *get_script_root(struct dirent *script_dirent, const char *suffix)
-{
-	char *script_root, *str;
-
-	script_root = strdup(script_dirent->d_name);
-	if (!script_root)
-		return NULL;
-
-	str = (char *)ends_with(script_root, suffix);
-	if (!str) {
-		free(script_root);
-		return NULL;
-	}
-
-	*str = '\0';
-	return script_root;
-}
-
-static int list_available_scripts(const struct option *opt __maybe_unused,
-				  const char *s __maybe_unused,
-				  int unset __maybe_unused)
-{
-	struct dirent *script_next, *lang_next, script_dirent, lang_dirent;
-	char scripts_path[MAXPATHLEN];
-	DIR *scripts_dir, *lang_dir;
-	char script_path[MAXPATHLEN];
-	char lang_path[MAXPATHLEN];
-	struct script_desc *desc;
-	char first_half[BUFSIZ];
-	char *script_root;
-
-	snprintf(scripts_path, MAXPATHLEN, "%s/scripts", perf_exec_path());
-
-	scripts_dir = opendir(scripts_path);
-	if (!scripts_dir)
-		return -1;
-
-	for_each_lang(scripts_path, scripts_dir, lang_dirent, lang_next) {
-		snprintf(lang_path, MAXPATHLEN, "%s/%s/bin", scripts_path,
-			 lang_dirent.d_name);
-		lang_dir = opendir(lang_path);
-		if (!lang_dir)
-			continue;
-
-		for_each_script(lang_path, lang_dir, script_dirent, script_next) {
-			script_root = get_script_root(&script_dirent, REPORT_SUFFIX);
-			if (script_root) {
-				desc = script_desc__findnew(script_root);
-				snprintf(script_path, MAXPATHLEN, "%s/%s",
-					 lang_path, script_dirent.d_name);
-				read_script_info(desc, script_path);
-				free(script_root);
-			}
-		}
-	}
-
-	fprintf(stdout, "List of available trace scripts:\n");
-	list_for_each_entry(desc, &script_descs, node) {
-		sprintf(first_half, "%s %s", desc->name,
-			desc->args ? desc->args : "");
-		fprintf(stdout, "  %-36s %s\n", first_half,
-			desc->half_liner ? desc->half_liner : "");
-	}
-
-	exit(0);
-}
-
-/*
- * Some scripts specify the required events in their "xxx-record" file,
- * this function will check if the events in perf.data match those
- * mentioned in the "xxx-record".
- *
- * Fixme: All existing "xxx-record" are all in good formats "-e event ",
- * which is covered well now. And new parsing code should be added to
- * cover the future complexing formats like event groups etc.
- */
-static int check_ev_match(char *dir_name, char *scriptname,
-			struct perf_session *session)
-{
-	char filename[MAXPATHLEN], evname[128];
-	char line[BUFSIZ], *p;
-	struct perf_evsel *pos;
-	int match, len;
-	FILE *fp;
-
-	sprintf(filename, "%s/bin/%s-record", dir_name, scriptname);
-
-	fp = fopen(filename, "r");
-	if (!fp)
-		return -1;
-
-	while (fgets(line, sizeof(line), fp)) {
-		p = ltrim(line);
-		if (*p == '#')
-			continue;
-
-		while (strlen(p)) {
-			p = strstr(p, "-e");
-			if (!p)
-				break;
-
-			p += 2;
-			p = ltrim(p);
-			len = strcspn(p, " \t");
-			if (!len)
-				break;
-
-			snprintf(evname, len + 1, "%s", p);
-
-			match = 0;
-			list_for_each_entry(pos,
-					&session->evlist->entries, node) {
-				if (!strcmp(perf_evsel__name(pos), evname)) {
-					match = 1;
-					break;
-				}
-			}
-
-			if (!match) {
-				fclose(fp);
-				return -1;
-			}
-		}
-	}
-
-	fclose(fp);
-	return 0;
-}
-
-/*
- * Return -1 if none is found, otherwise the actual scripts number.
- *
- * Currently the only user of this function is the script browser, which
- * will list all statically runnable scripts, select one, execute it and
- * show the output in a perf browser.
- */
-int find_scripts(char **scripts_array, char **scripts_path_array)
-{
-	struct dirent *script_next, *lang_next, script_dirent, lang_dirent;
-	char scripts_path[MAXPATHLEN], lang_path[MAXPATHLEN];
-	DIR *scripts_dir, *lang_dir;
-	struct perf_session *session;
-	char *temp;
-	int i = 0;
-
-	session = perf_session__new(input_name, O_RDONLY, 0, false, NULL);
-	if (!session)
-		return -1;
-
-	snprintf(scripts_path, MAXPATHLEN, "%s/scripts", perf_exec_path());
-
-	scripts_dir = opendir(scripts_path);
-	if (!scripts_dir) {
-		perf_session__delete(session);
-		return -1;
-	}
-
-	for_each_lang(scripts_path, scripts_dir, lang_dirent, lang_next) {
-		snprintf(lang_path, MAXPATHLEN, "%s/%s", scripts_path,
-			 lang_dirent.d_name);
-#ifdef NO_LIBPERL
-		if (strstr(lang_path, "perl"))
-			continue;
-#endif
-#ifdef NO_LIBPYTHON
-		if (strstr(lang_path, "python"))
-			continue;
-#endif
-
-		lang_dir = opendir(lang_path);
-		if (!lang_dir)
-			continue;
-
-		for_each_script(lang_path, lang_dir, script_dirent, script_next) {
-			/* Skip those real time scripts: xxxtop.p[yl] */
-			if (strstr(script_dirent.d_name, "top."))
-				continue;
-			sprintf(scripts_path_array[i], "%s/%s", lang_path,
-				script_dirent.d_name);
-			temp = strchr(script_dirent.d_name, '.');
-			snprintf(scripts_array[i],
-				(temp - script_dirent.d_name) + 1,
-				"%s", script_dirent.d_name);
-
-			if (check_ev_match(lang_path,
-					scripts_array[i], session))
-				continue;
-
-			i++;
-		}
-		closedir(lang_dir);
-	}
-
-	closedir(scripts_dir);
-	perf_session__delete(session);
-	return i;
-}
-
-static char *get_script_path(const char *script_root, const char *suffix)
-{
-	struct dirent *script_next, *lang_next, script_dirent, lang_dirent;
-	char scripts_path[MAXPATHLEN];
-	char script_path[MAXPATHLEN];
-	DIR *scripts_dir, *lang_dir;
-	char lang_path[MAXPATHLEN];
-	char *__script_root;
-
-	snprintf(scripts_path, MAXPATHLEN, "%s/scripts", perf_exec_path());
-
-	scripts_dir = opendir(scripts_path);
-	if (!scripts_dir)
-		return NULL;
-
-	for_each_lang(scripts_path, scripts_dir, lang_dirent, lang_next) {
-		snprintf(lang_path, MAXPATHLEN, "%s/%s/bin", scripts_path,
-			 lang_dirent.d_name);
-		lang_dir = opendir(lang_path);
-		if (!lang_dir)
-			continue;
-
-		for_each_script(lang_path, lang_dir, script_dirent, script_next) {
-			__script_root = get_script_root(&script_dirent, suffix);
-			if (__script_root && !strcmp(script_root, __script_root)) {
-				free(__script_root);
-				closedir(lang_dir);
-				closedir(scripts_dir);
-				snprintf(script_path, MAXPATHLEN, "%s/%s",
-					 lang_path, script_dirent.d_name);
-				return strdup(script_path);
-			}
-			free(__script_root);
-		}
-		closedir(lang_dir);
-	}
-	closedir(scripts_dir);
-
-	return NULL;
-}
-
-static bool is_top_script(const char *script_path)
-{
-	return ends_with(script_path, "top") == NULL ? false : true;
-}
-
-static int has_required_arg(char *script_path)
-{
-	struct script_desc *desc;
-	int n_args = 0;
-	char *p;
-
-	desc = script_desc__new(NULL);
-
-	if (read_script_info(desc, script_path))
-		goto out;
-
-	if (!desc->args)
-		goto out;
-
-	for (p = desc->args; *p; p++)
-		if (*p == '<')
-			n_args++;
-out:
-	script_desc__delete(desc);
-
-	return n_args;
-}
-
-static int have_cmd(int argc, const char **argv)
-{
-	char **__argv = malloc(sizeof(const char *) * argc);
-
-	if (!__argv) {
-		pr_err("malloc failed\n");
-		return -1;
-	}
-
-	memcpy(__argv, argv, sizeof(const char *) * argc);
-	argc = parse_options(argc, (const char **)__argv, record_options,
-			     NULL, PARSE_OPT_STOP_AT_NON_OPTION);
-	free(__argv);
-
-	system_wide = (argc == 0);
-
-	return 0;
-}
-
-int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	bool show_full_info = false;
-	char *rec_script_path = NULL;
-	char *rep_script_path = NULL;
-	struct perf_session *session;
-	char *script_path = NULL;
-	const char **__argv;
-	int i, j, err;
-	const struct option options[] = {
-	OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
-		    "dump raw trace in ASCII"),
-	OPT_INCR('v', "verbose", &verbose,
-		 "be more verbose (show symbol address, etc)"),
-	OPT_BOOLEAN('L', "Latency", &latency_format,
-		    "show latency attributes (irqs/preemption disabled, etc)"),
-	OPT_CALLBACK_NOOPT('l', "list", NULL, NULL, "list available scripts",
-			   list_available_scripts),
-	OPT_CALLBACK('s', "script", NULL, "name",
-		     "script file name (lang:script name, script name, or *)",
-		     parse_scriptname),
-	OPT_STRING('g', "gen-script", &generate_script_lang, "lang",
-		   "generate perf-script.xx script in specified language"),
-	OPT_STRING('i', "input", &input_name, "file", "input file name"),
-	OPT_BOOLEAN('d', "debug-mode", &debug_mode,
-		   "do various checks like samples ordering and lost events"),
-	OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
-		   "file", "vmlinux pathname"),
-	OPT_STRING(0, "kallsyms", &symbol_conf.kallsyms_name,
-		   "file", "kallsyms pathname"),
-	OPT_BOOLEAN('G', "hide-call-graph", &no_callchain,
-		    "When printing symbols do not display call chain"),
-	OPT_STRING(0, "symfs", &symbol_conf.symfs, "directory",
-		    "Look for files with symbols relative to this directory"),
-	OPT_CALLBACK('f', "fields", NULL, "str",
-		     "comma separated output fields prepend with 'type:'. "
-		     "Valid types: hw,sw,trace,raw. "
-		     "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso,"
-		     "addr,symoff", parse_output_fields),
-	OPT_BOOLEAN('a', "all-cpus", &system_wide,
-		    "system-wide collection from all CPUs"),
-	OPT_STRING('S', "symbols", &symbol_conf.sym_list_str, "symbol[,symbol...]",
-		   "only consider these symbols"),
-	OPT_STRING('C', "cpu", &cpu_list, "cpu", "list of cpus to profile"),
-	OPT_STRING('c', "comms", &symbol_conf.comm_list_str, "comm[,comm...]",
-		   "only display events for these comms"),
-	OPT_BOOLEAN('I', "show-info", &show_full_info,
-		    "display extended information from perf.data file"),
-	OPT_BOOLEAN('\0', "show-kernel-path", &symbol_conf.show_kernel_path,
-		    "Show the path of [kernel.kallsyms]"),
-	OPT_END()
-	};
-	const char * const script_usage[] = {
-		"perf script [<options>]",
-		"perf script [<options>] record <script> [<record-options>] <command>",
-		"perf script [<options>] report <script> [script-args]",
-		"perf script [<options>] <script> [<record-options>] <command>",
-		"perf script [<options>] <top-script> [script-args]",
-		NULL
-	};
-
-	setup_scripting();
-
-	argc = parse_options(argc, argv, options, script_usage,
-			     PARSE_OPT_STOP_AT_NON_OPTION);
-
-	if (argc > 1 && !strncmp(argv[0], "rec", strlen("rec"))) {
-		rec_script_path = get_script_path(argv[1], RECORD_SUFFIX);
-		if (!rec_script_path)
-			return cmd_record(argc, argv, NULL);
-	}
-
-	if (argc > 1 && !strncmp(argv[0], "rep", strlen("rep"))) {
-		rep_script_path = get_script_path(argv[1], REPORT_SUFFIX);
-		if (!rep_script_path) {
-			fprintf(stderr,
-				"Please specify a valid report script"
-				"(see 'perf script -l' for listing)\n");
-			return -1;
-		}
-	}
-
-	/* make sure PERF_EXEC_PATH is set for scripts */
-	perf_set_argv_exec_path(perf_exec_path());
-
-	if (argc && !script_name && !rec_script_path && !rep_script_path) {
-		int live_pipe[2];
-		int rep_args;
-		pid_t pid;
-
-		rec_script_path = get_script_path(argv[0], RECORD_SUFFIX);
-		rep_script_path = get_script_path(argv[0], REPORT_SUFFIX);
-
-		if (!rec_script_path && !rep_script_path) {
-			fprintf(stderr, " Couldn't find script %s\n\n See perf"
-				" script -l for available scripts.\n", argv[0]);
-			usage_with_options(script_usage, options);
-		}
-
-		if (is_top_script(argv[0])) {
-			rep_args = argc - 1;
-		} else {
-			int rec_args;
-
-			rep_args = has_required_arg(rep_script_path);
-			rec_args = (argc - 1) - rep_args;
-			if (rec_args < 0) {
-				fprintf(stderr, " %s script requires options."
-					"\n\n See perf script -l for available "
-					"scripts and options.\n", argv[0]);
-				usage_with_options(script_usage, options);
-			}
-		}
-
-		if (pipe(live_pipe) < 0) {
-			perror("failed to create pipe");
-			return -1;
-		}
-
-		pid = fork();
-		if (pid < 0) {
-			perror("failed to fork");
-			return -1;
-		}
-
-		if (!pid) {
-			j = 0;
-
-			dup2(live_pipe[1], 1);
-			close(live_pipe[0]);
-
-			if (is_top_script(argv[0])) {
-				system_wide = true;
-			} else if (!system_wide) {
-				if (have_cmd(argc - rep_args, &argv[rep_args]) != 0) {
-					err = -1;
-					goto out;
-				}
-			}
-
-			__argv = malloc((argc + 6) * sizeof(const char *));
-			if (!__argv) {
-				pr_err("malloc failed\n");
-				err = -ENOMEM;
-				goto out;
-			}
-
-			__argv[j++] = "/bin/sh";
-			__argv[j++] = rec_script_path;
-			if (system_wide)
-				__argv[j++] = "-a";
-			__argv[j++] = "-q";
-			__argv[j++] = "-o";
-			__argv[j++] = "-";
-			for (i = rep_args + 1; i < argc; i++)
-				__argv[j++] = argv[i];
-			__argv[j++] = NULL;
-
-			execvp("/bin/sh", (char **)__argv);
-			free(__argv);
-			exit(-1);
-		}
-
-		dup2(live_pipe[0], 0);
-		close(live_pipe[1]);
-
-		__argv = malloc((argc + 4) * sizeof(const char *));
-		if (!__argv) {
-			pr_err("malloc failed\n");
-			err = -ENOMEM;
-			goto out;
-		}
-
-		j = 0;
-		__argv[j++] = "/bin/sh";
-		__argv[j++] = rep_script_path;
-		for (i = 1; i < rep_args + 1; i++)
-			__argv[j++] = argv[i];
-		__argv[j++] = "-i";
-		__argv[j++] = "-";
-		__argv[j++] = NULL;
-
-		execvp("/bin/sh", (char **)__argv);
-		free(__argv);
-		exit(-1);
-	}
-
-	if (rec_script_path)
-		script_path = rec_script_path;
-	if (rep_script_path)
-		script_path = rep_script_path;
-
-	if (script_path) {
-		j = 0;
-
-		if (!rec_script_path)
-			system_wide = false;
-		else if (!system_wide) {
-			if (have_cmd(argc - 1, &argv[1]) != 0) {
-				err = -1;
-				goto out;
-			}
-		}
-
-		__argv = malloc((argc + 2) * sizeof(const char *));
-		if (!__argv) {
-			pr_err("malloc failed\n");
-			err = -ENOMEM;
-			goto out;
-		}
-
-		__argv[j++] = "/bin/sh";
-		__argv[j++] = script_path;
-		if (system_wide)
-			__argv[j++] = "-a";
-		for (i = 2; i < argc; i++)
-			__argv[j++] = argv[i];
-		__argv[j++] = NULL;
-
-		execvp("/bin/sh", (char **)__argv);
-		free(__argv);
-		exit(-1);
-	}
-
-	if (symbol__init() < 0)
-		return -1;
-	if (!script_name)
-		setup_pager();
-
-	session = perf_session__new(input_name, O_RDONLY, 0, false,
-				    &perf_script);
-	if (session == NULL)
-		return -ENOMEM;
-
-	if (cpu_list) {
-		if (perf_session__cpu_bitmap(session, cpu_list, cpu_bitmap))
-			return -1;
-	}
-
-	if (!script_name && !generate_script_lang)
-		perf_session__fprintf_info(session, stdout, show_full_info);
-
-	if (!no_callchain)
-		symbol_conf.use_callchain = true;
-	else
-		symbol_conf.use_callchain = false;
-
-	if (generate_script_lang) {
-		struct stat perf_stat;
-		int input;
-
-		if (output_set_by_user()) {
-			fprintf(stderr,
-				"custom fields not supported for generated scripts");
-			return -1;
-		}
-
-		input = open(session->filename, O_RDONLY);	/* input_name */
-		if (input < 0) {
-			perror("failed to open file");
-			return -1;
-		}
-
-		err = fstat(input, &perf_stat);
-		if (err < 0) {
-			perror("failed to stat file");
-			return -1;
-		}
-
-		if (!perf_stat.st_size) {
-			fprintf(stderr, "zero-sized file, nothing to do!\n");
-			return 0;
-		}
-
-		scripting_ops = script_spec__lookup(generate_script_lang);
-		if (!scripting_ops) {
-			fprintf(stderr, "invalid language specifier");
-			return -1;
-		}
-
-		err = scripting_ops->generate_script(session->pevent,
-						     "perf-script");
-		goto out;
-	}
-
-	if (script_name) {
-		err = scripting_ops->start_script(script_name, argc, argv);
-		if (err)
-			goto out;
-		pr_debug("perf script started with script %s\n\n", script_name);
-	}
-
-
-	err = perf_session__check_output_opt(session);
-	if (err < 0)
-		goto out;
-
-	err = __cmd_script(session);
-
-	perf_session__delete(session);
-	cleanup_scripting();
-out:
-	return err;
-}
diff --git a/src/tools/perf/builtin-stat.c b/src/tools/perf/builtin-stat.c
deleted file mode 100644
index 5098f14..0000000
--- a/src/tools/perf/builtin-stat.c
+++ /dev/null
@@ -1,1597 +0,0 @@
-/*
- * builtin-stat.c
- *
- * Builtin stat command: Give a precise performance counters summary
- * overview about any workload, CPU or specific PID.
- *
- * Sample output:
-
-   $ perf stat ./hackbench 10
-
-  Time: 0.118
-
-  Performance counter stats for './hackbench 10':
-
-       1708.761321 task-clock                #   11.037 CPUs utilized
-            41,190 context-switches          #    0.024 M/sec
-             6,735 CPU-migrations            #    0.004 M/sec
-            17,318 page-faults               #    0.010 M/sec
-     5,205,202,243 cycles                    #    3.046 GHz
-     3,856,436,920 stalled-cycles-frontend   #   74.09% frontend cycles idle
-     1,600,790,871 stalled-cycles-backend    #   30.75% backend  cycles idle
-     2,603,501,247 instructions              #    0.50  insns per cycle
-                                             #    1.48  stalled cycles per insn
-       484,357,498 branches                  #  283.455 M/sec
-         6,388,934 branch-misses             #    1.32% of all branches
-
-        0.154822978  seconds time elapsed
-
- *
- * Copyright (C) 2008-2011, Red Hat Inc, Ingo Molnar <mingo@redhat.com>
- *
- * Improvements and fixes by:
- *
- *   Arjan van de Ven <arjan@linux.intel.com>
- *   Yanmin Zhang <yanmin.zhang@intel.com>
- *   Wu Fengguang <fengguang.wu@intel.com>
- *   Mike Galbraith <efault@gmx.de>
- *   Paul Mackerras <paulus@samba.org>
- *   Jaswinder Singh Rajput <jaswinder@kernel.org>
- *
- * Released under the GPL v2. (and only v2, not any later version)
- */
-
-#include "perf.h"
-#include "builtin.h"
-#include "util/util.h"
-#include "util/parse-options.h"
-#include "util/parse-events.h"
-#include "util/event.h"
-#include "util/evlist.h"
-#include "util/evsel.h"
-#include "util/debug.h"
-#include "util/color.h"
-#include "util/stat.h"
-#include "util/header.h"
-#include "util/cpumap.h"
-#include "util/thread.h"
-#include "util/thread_map.h"
-
-#include <stdlib.h>
-#include <sys/prctl.h>
-#include <locale.h>
-
-#define DEFAULT_SEPARATOR	" "
-#define CNTR_NOT_SUPPORTED	"<not supported>"
-#define CNTR_NOT_COUNTED	"<not counted>"
-
-static void print_stat(int argc, const char **argv);
-static void print_counter_aggr(struct perf_evsel *counter, char *prefix);
-static void print_counter(struct perf_evsel *counter, char *prefix);
-static void print_aggr(char *prefix);
-
-static struct perf_evlist	*evsel_list;
-
-static struct perf_target	target = {
-	.uid	= UINT_MAX,
-};
-
-enum aggr_mode {
-	AGGR_NONE,
-	AGGR_GLOBAL,
-	AGGR_SOCKET,
-	AGGR_CORE,
-};
-
-static int			run_count			=  1;
-static bool			no_inherit			= false;
-static bool			scale				=  true;
-static enum aggr_mode		aggr_mode			= AGGR_GLOBAL;
-static volatile pid_t		child_pid			= -1;
-static bool			null_run			=  false;
-static int			detailed_run			=  0;
-static bool			big_num				=  true;
-static int			big_num_opt			=  -1;
-static const char		*csv_sep			= NULL;
-static bool			csv_output			= false;
-static bool			group				= false;
-static FILE			*output				= NULL;
-static const char		*pre_cmd			= NULL;
-static const char		*post_cmd			= NULL;
-static bool			sync_run			= false;
-static unsigned int		interval			= 0;
-static unsigned int		initial_delay			= 0;
-static bool			forever				= false;
-static struct timespec		ref_time;
-static struct cpu_map		*aggr_map;
-static int			(*aggr_get_id)(struct cpu_map *m, int cpu);
-
-static volatile int done = 0;
-
-struct perf_stat {
-	struct stats	  res_stats[3];
-};
-
-static inline void diff_timespec(struct timespec *r, struct timespec *a,
-				 struct timespec *b)
-{
-	r->tv_sec = a->tv_sec - b->tv_sec;
-	if (a->tv_nsec < b->tv_nsec) {
-		r->tv_nsec = a->tv_nsec + 1000000000L - b->tv_nsec;
-		r->tv_sec--;
-	} else {
-		r->tv_nsec = a->tv_nsec - b->tv_nsec ;
-	}
-}
-
-static inline struct cpu_map *perf_evsel__cpus(struct perf_evsel *evsel)
-{
-	return (evsel->cpus && !target.cpu_list) ? evsel->cpus : evsel_list->cpus;
-}
-
-static inline int perf_evsel__nr_cpus(struct perf_evsel *evsel)
-{
-	return perf_evsel__cpus(evsel)->nr;
-}
-
-static void perf_evsel__reset_stat_priv(struct perf_evsel *evsel)
-{
-	memset(evsel->priv, 0, sizeof(struct perf_stat));
-}
-
-static int perf_evsel__alloc_stat_priv(struct perf_evsel *evsel)
-{
-	evsel->priv = zalloc(sizeof(struct perf_stat));
-	return evsel->priv == NULL ? -ENOMEM : 0;
-}
-
-static void perf_evsel__free_stat_priv(struct perf_evsel *evsel)
-{
-	free(evsel->priv);
-	evsel->priv = NULL;
-}
-
-static int perf_evsel__alloc_prev_raw_counts(struct perf_evsel *evsel)
-{
-	void *addr;
-	size_t sz;
-
-	sz = sizeof(*evsel->counts) +
-	     (perf_evsel__nr_cpus(evsel) * sizeof(struct perf_counts_values));
-
-	addr = zalloc(sz);
-	if (!addr)
-		return -ENOMEM;
-
-	evsel->prev_raw_counts =  addr;
-
-	return 0;
-}
-
-static void perf_evsel__free_prev_raw_counts(struct perf_evsel *evsel)
-{
-	free(evsel->prev_raw_counts);
-	evsel->prev_raw_counts = NULL;
-}
-
-static void perf_evlist__free_stats(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel;
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		perf_evsel__free_stat_priv(evsel);
-		perf_evsel__free_counts(evsel);
-		perf_evsel__free_prev_raw_counts(evsel);
-	}
-}
-
-static int perf_evlist__alloc_stats(struct perf_evlist *evlist, bool alloc_raw)
-{
-	struct perf_evsel *evsel;
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		if (perf_evsel__alloc_stat_priv(evsel) < 0 ||
-		    perf_evsel__alloc_counts(evsel, perf_evsel__nr_cpus(evsel)) < 0 ||
-		    (alloc_raw && perf_evsel__alloc_prev_raw_counts(evsel) < 0))
-			goto out_free;
-	}
-
-	return 0;
-
-out_free:
-	perf_evlist__free_stats(evlist);
-	return -1;
-}
-
-static struct stats runtime_nsecs_stats[MAX_NR_CPUS];
-static struct stats runtime_cycles_stats[MAX_NR_CPUS];
-static struct stats runtime_stalled_cycles_front_stats[MAX_NR_CPUS];
-static struct stats runtime_stalled_cycles_back_stats[MAX_NR_CPUS];
-static struct stats runtime_branches_stats[MAX_NR_CPUS];
-static struct stats runtime_cacherefs_stats[MAX_NR_CPUS];
-static struct stats runtime_l1_dcache_stats[MAX_NR_CPUS];
-static struct stats runtime_l1_icache_stats[MAX_NR_CPUS];
-static struct stats runtime_ll_cache_stats[MAX_NR_CPUS];
-static struct stats runtime_itlb_cache_stats[MAX_NR_CPUS];
-static struct stats runtime_dtlb_cache_stats[MAX_NR_CPUS];
-static struct stats walltime_nsecs_stats;
-
-static void perf_stat__reset_stats(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel;
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		perf_evsel__reset_stat_priv(evsel);
-		perf_evsel__reset_counts(evsel, perf_evsel__nr_cpus(evsel));
-	}
-
-	memset(runtime_nsecs_stats, 0, sizeof(runtime_nsecs_stats));
-	memset(runtime_cycles_stats, 0, sizeof(runtime_cycles_stats));
-	memset(runtime_stalled_cycles_front_stats, 0, sizeof(runtime_stalled_cycles_front_stats));
-	memset(runtime_stalled_cycles_back_stats, 0, sizeof(runtime_stalled_cycles_back_stats));
-	memset(runtime_branches_stats, 0, sizeof(runtime_branches_stats));
-	memset(runtime_cacherefs_stats, 0, sizeof(runtime_cacherefs_stats));
-	memset(runtime_l1_dcache_stats, 0, sizeof(runtime_l1_dcache_stats));
-	memset(runtime_l1_icache_stats, 0, sizeof(runtime_l1_icache_stats));
-	memset(runtime_ll_cache_stats, 0, sizeof(runtime_ll_cache_stats));
-	memset(runtime_itlb_cache_stats, 0, sizeof(runtime_itlb_cache_stats));
-	memset(runtime_dtlb_cache_stats, 0, sizeof(runtime_dtlb_cache_stats));
-	memset(&walltime_nsecs_stats, 0, sizeof(walltime_nsecs_stats));
-}
-
-static int create_perf_stat_counter(struct perf_evsel *evsel)
-{
-	struct perf_event_attr *attr = &evsel->attr;
-
-	if (scale)
-		attr->read_format = PERF_FORMAT_TOTAL_TIME_ENABLED |
-				    PERF_FORMAT_TOTAL_TIME_RUNNING;
-
-	attr->inherit = !no_inherit;
-
-	if (perf_target__has_cpu(&target))
-		return perf_evsel__open_per_cpu(evsel, perf_evsel__cpus(evsel));
-
-	if (!perf_target__has_task(&target) &&
-	    perf_evsel__is_group_leader(evsel)) {
-		attr->disabled = 1;
-		if (!initial_delay)
-			attr->enable_on_exec = 1;
-	}
-
-	return perf_evsel__open_per_thread(evsel, evsel_list->threads);
-}
-
-/*
- * Does the counter have nsecs as a unit?
- */
-static inline int nsec_counter(struct perf_evsel *evsel)
-{
-	if (perf_evsel__match(evsel, SOFTWARE, SW_CPU_CLOCK) ||
-	    perf_evsel__match(evsel, SOFTWARE, SW_TASK_CLOCK))
-		return 1;
-
-	return 0;
-}
-
-/*
- * Update various tracking values we maintain to print
- * more semantic information such as miss/hit ratios,
- * instruction rates, etc:
- */
-static void update_shadow_stats(struct perf_evsel *counter, u64 *count)
-{
-	if (perf_evsel__match(counter, SOFTWARE, SW_TASK_CLOCK))
-		update_stats(&runtime_nsecs_stats[0], count[0]);
-	else if (perf_evsel__match(counter, HARDWARE, HW_CPU_CYCLES))
-		update_stats(&runtime_cycles_stats[0], count[0]);
-	else if (perf_evsel__match(counter, HARDWARE, HW_STALLED_CYCLES_FRONTEND))
-		update_stats(&runtime_stalled_cycles_front_stats[0], count[0]);
-	else if (perf_evsel__match(counter, HARDWARE, HW_STALLED_CYCLES_BACKEND))
-		update_stats(&runtime_stalled_cycles_back_stats[0], count[0]);
-	else if (perf_evsel__match(counter, HARDWARE, HW_BRANCH_INSTRUCTIONS))
-		update_stats(&runtime_branches_stats[0], count[0]);
-	else if (perf_evsel__match(counter, HARDWARE, HW_CACHE_REFERENCES))
-		update_stats(&runtime_cacherefs_stats[0], count[0]);
-	else if (perf_evsel__match(counter, HW_CACHE, HW_CACHE_L1D))
-		update_stats(&runtime_l1_dcache_stats[0], count[0]);
-	else if (perf_evsel__match(counter, HW_CACHE, HW_CACHE_L1I))
-		update_stats(&runtime_l1_icache_stats[0], count[0]);
-	else if (perf_evsel__match(counter, HW_CACHE, HW_CACHE_LL))
-		update_stats(&runtime_ll_cache_stats[0], count[0]);
-	else if (perf_evsel__match(counter, HW_CACHE, HW_CACHE_DTLB))
-		update_stats(&runtime_dtlb_cache_stats[0], count[0]);
-	else if (perf_evsel__match(counter, HW_CACHE, HW_CACHE_ITLB))
-		update_stats(&runtime_itlb_cache_stats[0], count[0]);
-}
-
-/*
- * Read out the results of a single counter:
- * aggregate counts across CPUs in system-wide mode
- */
-static int read_counter_aggr(struct perf_evsel *counter)
-{
-	struct perf_stat *ps = counter->priv;
-	u64 *count = counter->counts->aggr.values;
-	int i;
-
-	if (__perf_evsel__read(counter, perf_evsel__nr_cpus(counter),
-			       thread_map__nr(evsel_list->threads), scale) < 0)
-		return -1;
-
-	for (i = 0; i < 3; i++)
-		update_stats(&ps->res_stats[i], count[i]);
-
-	if (verbose) {
-		fprintf(output, "%s: %" PRIu64 " %" PRIu64 " %" PRIu64 "\n",
-			perf_evsel__name(counter), count[0], count[1], count[2]);
-	}
-
-	/*
-	 * Save the full runtime - to allow normalization during printout:
-	 */
-	update_shadow_stats(counter, count);
-
-	return 0;
-}
-
-/*
- * Read out the results of a single counter:
- * do not aggregate counts across CPUs in system-wide mode
- */
-static int read_counter(struct perf_evsel *counter)
-{
-	u64 *count;
-	int cpu;
-
-	for (cpu = 0; cpu < perf_evsel__nr_cpus(counter); cpu++) {
-		if (__perf_evsel__read_on_cpu(counter, cpu, 0, scale) < 0)
-			return -1;
-
-		count = counter->counts->cpu[cpu].values;
-
-		update_shadow_stats(counter, count);
-	}
-
-	return 0;
-}
-
-static void print_interval(void)
-{
-	static int num_print_interval;
-	struct perf_evsel *counter;
-	struct perf_stat *ps;
-	struct timespec ts, rs;
-	char prefix[64];
-
-	if (aggr_mode == AGGR_GLOBAL) {
-		list_for_each_entry(counter, &evsel_list->entries, node) {
-			ps = counter->priv;
-			memset(ps->res_stats, 0, sizeof(ps->res_stats));
-			read_counter_aggr(counter);
-		}
-	} else	{
-		list_for_each_entry(counter, &evsel_list->entries, node) {
-			ps = counter->priv;
-			memset(ps->res_stats, 0, sizeof(ps->res_stats));
-			read_counter(counter);
-		}
-	}
-
-	clock_gettime(CLOCK_MONOTONIC, &ts);
-	diff_timespec(&rs, &ts, &ref_time);
-	sprintf(prefix, "%6lu.%09lu%s", rs.tv_sec, rs.tv_nsec, csv_sep);
-
-	if (num_print_interval == 0 && !csv_output) {
-		switch (aggr_mode) {
-		case AGGR_SOCKET:
-			fprintf(output, "#           time socket cpus             counts events\n");
-			break;
-		case AGGR_CORE:
-			fprintf(output, "#           time core         cpus             counts events\n");
-			break;
-		case AGGR_NONE:
-			fprintf(output, "#           time CPU                 counts events\n");
-			break;
-		case AGGR_GLOBAL:
-		default:
-			fprintf(output, "#           time             counts events\n");
-		}
-	}
-
-	if (++num_print_interval == 25)
-		num_print_interval = 0;
-
-	switch (aggr_mode) {
-	case AGGR_CORE:
-	case AGGR_SOCKET:
-		print_aggr(prefix);
-		break;
-	case AGGR_NONE:
-		list_for_each_entry(counter, &evsel_list->entries, node)
-			print_counter(counter, prefix);
-		break;
-	case AGGR_GLOBAL:
-	default:
-		list_for_each_entry(counter, &evsel_list->entries, node)
-			print_counter_aggr(counter, prefix);
-	}
-
-	fflush(output);
-}
-
-static void handle_initial_delay(void)
-{
-	struct perf_evsel *counter;
-
-	if (initial_delay) {
-		const int ncpus = cpu_map__nr(evsel_list->cpus),
-			nthreads = thread_map__nr(evsel_list->threads);
-
-		usleep(initial_delay * 1000);
-		list_for_each_entry(counter, &evsel_list->entries, node)
-			perf_evsel__enable(counter, ncpus, nthreads);
-	}
-}
-
-static int __run_perf_stat(int argc, const char **argv)
-{
-	char msg[512];
-	unsigned long long t0, t1;
-	struct perf_evsel *counter;
-	struct timespec ts;
-	int status = 0;
-	const bool forks = (argc > 0);
-
-	if (interval) {
-		ts.tv_sec  = interval / 1000;
-		ts.tv_nsec = (interval % 1000) * 1000000;
-	} else {
-		ts.tv_sec  = 1;
-		ts.tv_nsec = 0;
-	}
-
-	if (forks) {
-		if (perf_evlist__prepare_workload(evsel_list, &target, argv,
-						  false, false) < 0) {
-			perror("failed to prepare workload");
-			return -1;
-		}
-		child_pid = evsel_list->workload.pid;
-	}
-
-	if (group)
-		perf_evlist__set_leader(evsel_list);
-
-	list_for_each_entry(counter, &evsel_list->entries, node) {
-		if (create_perf_stat_counter(counter) < 0) {
-			/*
-			 * PPC returns ENXIO for HW counters until 2.6.37
-			 * (behavior changed with commit b0a873e).
-			 */
-			if (errno == EINVAL || errno == ENOSYS ||
-			    errno == ENOENT || errno == EOPNOTSUPP ||
-			    errno == ENXIO) {
-				if (verbose)
-					ui__warning("%s event is not supported by the kernel.\n",
-						    perf_evsel__name(counter));
-				counter->supported = false;
-				continue;
-			}
-
-			perf_evsel__open_strerror(counter, &target,
-						  errno, msg, sizeof(msg));
-			ui__error("%s\n", msg);
-
-			if (child_pid != -1)
-				kill(child_pid, SIGTERM);
-
-			return -1;
-		}
-		counter->supported = true;
-	}
-
-	if (perf_evlist__apply_filters(evsel_list)) {
-		error("failed to set filter with %d (%s)\n", errno,
-			strerror(errno));
-		return -1;
-	}
-
-	/*
-	 * Enable counters and exec the command:
-	 */
-	t0 = rdclock();
-	clock_gettime(CLOCK_MONOTONIC, &ref_time);
-
-	if (forks) {
-		perf_evlist__start_workload(evsel_list);
-		handle_initial_delay();
-
-		if (interval) {
-			while (!waitpid(child_pid, &status, WNOHANG)) {
-				nanosleep(&ts, NULL);
-				print_interval();
-			}
-		}
-		wait(&status);
-		if (WIFSIGNALED(status))
-			psignal(WTERMSIG(status), argv[0]);
-	} else {
-		handle_initial_delay();
-		while (!done) {
-			nanosleep(&ts, NULL);
-			if (interval)
-				print_interval();
-		}
-	}
-
-	t1 = rdclock();
-
-	update_stats(&walltime_nsecs_stats, t1 - t0);
-
-	if (aggr_mode == AGGR_GLOBAL) {
-		list_for_each_entry(counter, &evsel_list->entries, node) {
-			read_counter_aggr(counter);
-			perf_evsel__close_fd(counter, perf_evsel__nr_cpus(counter),
-					     thread_map__nr(evsel_list->threads));
-		}
-	} else {
-		list_for_each_entry(counter, &evsel_list->entries, node) {
-			read_counter(counter);
-			perf_evsel__close_fd(counter, perf_evsel__nr_cpus(counter), 1);
-		}
-	}
-
-	return WEXITSTATUS(status);
-}
-
-static int run_perf_stat(int argc __maybe_unused, const char **argv)
-{
-	int ret;
-
-	if (pre_cmd) {
-		ret = system(pre_cmd);
-		if (ret)
-			return ret;
-	}
-
-	if (sync_run)
-		sync();
-
-	ret = __run_perf_stat(argc, argv);
-	if (ret)
-		return ret;
-
-	if (post_cmd) {
-		ret = system(post_cmd);
-		if (ret)
-			return ret;
-	}
-
-	return ret;
-}
-
-static void print_noise_pct(double total, double avg)
-{
-	double pct = rel_stddev_stats(total, avg);
-
-	if (csv_output)
-		fprintf(output, "%s%.2f%%", csv_sep, pct);
-	else if (pct)
-		fprintf(output, "  ( +-%6.2f%% )", pct);
-}
-
-static void print_noise(struct perf_evsel *evsel, double avg)
-{
-	struct perf_stat *ps;
-
-	if (run_count == 1)
-		return;
-
-	ps = evsel->priv;
-	print_noise_pct(stddev_stats(&ps->res_stats[0]), avg);
-}
-
-static void aggr_printout(struct perf_evsel *evsel, int id, int nr)
-{
-	switch (aggr_mode) {
-	case AGGR_CORE:
-		fprintf(output, "S%d-C%*d%s%*d%s",
-			cpu_map__id_to_socket(id),
-			csv_output ? 0 : -8,
-			cpu_map__id_to_cpu(id),
-			csv_sep,
-			csv_output ? 0 : 4,
-			nr,
-			csv_sep);
-		break;
-	case AGGR_SOCKET:
-		fprintf(output, "S%*d%s%*d%s",
-			csv_output ? 0 : -5,
-			id,
-			csv_sep,
-			csv_output ? 0 : 4,
-			nr,
-			csv_sep);
-			break;
-	case AGGR_NONE:
-		fprintf(output, "CPU%*d%s",
-			csv_output ? 0 : -4,
-			perf_evsel__cpus(evsel)->map[id], csv_sep);
-		break;
-	case AGGR_GLOBAL:
-	default:
-		break;
-	}
-}
-
-static void nsec_printout(int cpu, int nr, struct perf_evsel *evsel, double avg)
-{
-	double msecs = avg / 1e6;
-	const char *fmt = csv_output ? "%.6f%s%s" : "%18.6f%s%-25s";
-
-	aggr_printout(evsel, cpu, nr);
-
-	fprintf(output, fmt, msecs, csv_sep, perf_evsel__name(evsel));
-
-	if (evsel->cgrp)
-		fprintf(output, "%s%s", csv_sep, evsel->cgrp->name);
-
-	if (csv_output || interval)
-		return;
-
-	if (perf_evsel__match(evsel, SOFTWARE, SW_TASK_CLOCK))
-		fprintf(output, " # %8.3f CPUs utilized          ",
-			avg / avg_stats(&walltime_nsecs_stats));
-	else
-		fprintf(output, "                                   ");
-}
-
-/* used for get_ratio_color() */
-enum grc_type {
-	GRC_STALLED_CYCLES_FE,
-	GRC_STALLED_CYCLES_BE,
-	GRC_CACHE_MISSES,
-	GRC_MAX_NR
-};
-
-static const char *get_ratio_color(enum grc_type type, double ratio)
-{
-	static const double grc_table[GRC_MAX_NR][3] = {
-		[GRC_STALLED_CYCLES_FE] = { 50.0, 30.0, 10.0 },
-		[GRC_STALLED_CYCLES_BE] = { 75.0, 50.0, 20.0 },
-		[GRC_CACHE_MISSES] 	= { 20.0, 10.0, 5.0 },
-	};
-	const char *color = PERF_COLOR_NORMAL;
-
-	if (ratio > grc_table[type][0])
-		color = PERF_COLOR_RED;
-	else if (ratio > grc_table[type][1])
-		color = PERF_COLOR_MAGENTA;
-	else if (ratio > grc_table[type][2])
-		color = PERF_COLOR_YELLOW;
-
-	return color;
-}
-
-static void print_stalled_cycles_frontend(int cpu,
-					  struct perf_evsel *evsel
-					  __maybe_unused, double avg)
-{
-	double total, ratio = 0.0;
-	const char *color;
-
-	total = avg_stats(&runtime_cycles_stats[cpu]);
-
-	if (total)
-		ratio = avg / total * 100.0;
-
-	color = get_ratio_color(GRC_STALLED_CYCLES_FE, ratio);
-
-	fprintf(output, " #  ");
-	color_fprintf(output, color, "%6.2f%%", ratio);
-	fprintf(output, " frontend cycles idle   ");
-}
-
-static void print_stalled_cycles_backend(int cpu,
-					 struct perf_evsel *evsel
-					 __maybe_unused, double avg)
-{
-	double total, ratio = 0.0;
-	const char *color;
-
-	total = avg_stats(&runtime_cycles_stats[cpu]);
-
-	if (total)
-		ratio = avg / total * 100.0;
-
-	color = get_ratio_color(GRC_STALLED_CYCLES_BE, ratio);
-
-	fprintf(output, " #  ");
-	color_fprintf(output, color, "%6.2f%%", ratio);
-	fprintf(output, " backend  cycles idle   ");
-}
-
-static void print_branch_misses(int cpu,
-				struct perf_evsel *evsel __maybe_unused,
-				double avg)
-{
-	double total, ratio = 0.0;
-	const char *color;
-
-	total = avg_stats(&runtime_branches_stats[cpu]);
-
-	if (total)
-		ratio = avg / total * 100.0;
-
-	color = get_ratio_color(GRC_CACHE_MISSES, ratio);
-
-	fprintf(output, " #  ");
-	color_fprintf(output, color, "%6.2f%%", ratio);
-	fprintf(output, " of all branches        ");
-}
-
-static void print_l1_dcache_misses(int cpu,
-				   struct perf_evsel *evsel __maybe_unused,
-				   double avg)
-{
-	double total, ratio = 0.0;
-	const char *color;
-
-	total = avg_stats(&runtime_l1_dcache_stats[cpu]);
-
-	if (total)
-		ratio = avg / total * 100.0;
-
-	color = get_ratio_color(GRC_CACHE_MISSES, ratio);
-
-	fprintf(output, " #  ");
-	color_fprintf(output, color, "%6.2f%%", ratio);
-	fprintf(output, " of all L1-dcache hits  ");
-}
-
-static void print_l1_icache_misses(int cpu,
-				   struct perf_evsel *evsel __maybe_unused,
-				   double avg)
-{
-	double total, ratio = 0.0;
-	const char *color;
-
-	total = avg_stats(&runtime_l1_icache_stats[cpu]);
-
-	if (total)
-		ratio = avg / total * 100.0;
-
-	color = get_ratio_color(GRC_CACHE_MISSES, ratio);
-
-	fprintf(output, " #  ");
-	color_fprintf(output, color, "%6.2f%%", ratio);
-	fprintf(output, " of all L1-icache hits  ");
-}
-
-static void print_dtlb_cache_misses(int cpu,
-				    struct perf_evsel *evsel __maybe_unused,
-				    double avg)
-{
-	double total, ratio = 0.0;
-	const char *color;
-
-	total = avg_stats(&runtime_dtlb_cache_stats[cpu]);
-
-	if (total)
-		ratio = avg / total * 100.0;
-
-	color = get_ratio_color(GRC_CACHE_MISSES, ratio);
-
-	fprintf(output, " #  ");
-	color_fprintf(output, color, "%6.2f%%", ratio);
-	fprintf(output, " of all dTLB cache hits ");
-}
-
-static void print_itlb_cache_misses(int cpu,
-				    struct perf_evsel *evsel __maybe_unused,
-				    double avg)
-{
-	double total, ratio = 0.0;
-	const char *color;
-
-	total = avg_stats(&runtime_itlb_cache_stats[cpu]);
-
-	if (total)
-		ratio = avg / total * 100.0;
-
-	color = get_ratio_color(GRC_CACHE_MISSES, ratio);
-
-	fprintf(output, " #  ");
-	color_fprintf(output, color, "%6.2f%%", ratio);
-	fprintf(output, " of all iTLB cache hits ");
-}
-
-static void print_ll_cache_misses(int cpu,
-				  struct perf_evsel *evsel __maybe_unused,
-				  double avg)
-{
-	double total, ratio = 0.0;
-	const char *color;
-
-	total = avg_stats(&runtime_ll_cache_stats[cpu]);
-
-	if (total)
-		ratio = avg / total * 100.0;
-
-	color = get_ratio_color(GRC_CACHE_MISSES, ratio);
-
-	fprintf(output, " #  ");
-	color_fprintf(output, color, "%6.2f%%", ratio);
-	fprintf(output, " of all LL-cache hits   ");
-}
-
-static void abs_printout(int cpu, int nr, struct perf_evsel *evsel, double avg)
-{
-	double total, ratio = 0.0;
-	const char *fmt;
-
-	if (csv_output)
-		fmt = "%.0f%s%s";
-	else if (big_num)
-		fmt = "%'18.0f%s%-25s";
-	else
-		fmt = "%18.0f%s%-25s";
-
-	aggr_printout(evsel, cpu, nr);
-
-	if (aggr_mode == AGGR_GLOBAL)
-		cpu = 0;
-
-	fprintf(output, fmt, avg, csv_sep, perf_evsel__name(evsel));
-
-	if (evsel->cgrp)
-		fprintf(output, "%s%s", csv_sep, evsel->cgrp->name);
-
-	if (csv_output || interval)
-		return;
-
-	if (perf_evsel__match(evsel, HARDWARE, HW_INSTRUCTIONS)) {
-		total = avg_stats(&runtime_cycles_stats[cpu]);
-		if (total)
-			ratio = avg / total;
-
-		fprintf(output, " #   %5.2f  insns per cycle        ", ratio);
-
-		total = avg_stats(&runtime_stalled_cycles_front_stats[cpu]);
-		total = max(total, avg_stats(&runtime_stalled_cycles_back_stats[cpu]));
-
-		if (total && avg) {
-			ratio = total / avg;
-			fprintf(output, "\n                                             #   %5.2f  stalled cycles per insn", ratio);
-		}
-
-	} else if (perf_evsel__match(evsel, HARDWARE, HW_BRANCH_MISSES) &&
-			runtime_branches_stats[cpu].n != 0) {
-		print_branch_misses(cpu, evsel, avg);
-	} else if (
-		evsel->attr.type == PERF_TYPE_HW_CACHE &&
-		evsel->attr.config ==  ( PERF_COUNT_HW_CACHE_L1D |
-					((PERF_COUNT_HW_CACHE_OP_READ) << 8) |
-					((PERF_COUNT_HW_CACHE_RESULT_MISS) << 16)) &&
-			runtime_l1_dcache_stats[cpu].n != 0) {
-		print_l1_dcache_misses(cpu, evsel, avg);
-	} else if (
-		evsel->attr.type == PERF_TYPE_HW_CACHE &&
-		evsel->attr.config ==  ( PERF_COUNT_HW_CACHE_L1I |
-					((PERF_COUNT_HW_CACHE_OP_READ) << 8) |
-					((PERF_COUNT_HW_CACHE_RESULT_MISS) << 16)) &&
-			runtime_l1_icache_stats[cpu].n != 0) {
-		print_l1_icache_misses(cpu, evsel, avg);
-	} else if (
-		evsel->attr.type == PERF_TYPE_HW_CACHE &&
-		evsel->attr.config ==  ( PERF_COUNT_HW_CACHE_DTLB |
-					((PERF_COUNT_HW_CACHE_OP_READ) << 8) |
-					((PERF_COUNT_HW_CACHE_RESULT_MISS) << 16)) &&
-			runtime_dtlb_cache_stats[cpu].n != 0) {
-		print_dtlb_cache_misses(cpu, evsel, avg);
-	} else if (
-		evsel->attr.type == PERF_TYPE_HW_CACHE &&
-		evsel->attr.config ==  ( PERF_COUNT_HW_CACHE_ITLB |
-					((PERF_COUNT_HW_CACHE_OP_READ) << 8) |
-					((PERF_COUNT_HW_CACHE_RESULT_MISS) << 16)) &&
-			runtime_itlb_cache_stats[cpu].n != 0) {
-		print_itlb_cache_misses(cpu, evsel, avg);
-	} else if (
-		evsel->attr.type == PERF_TYPE_HW_CACHE &&
-		evsel->attr.config ==  ( PERF_COUNT_HW_CACHE_LL |
-					((PERF_COUNT_HW_CACHE_OP_READ) << 8) |
-					((PERF_COUNT_HW_CACHE_RESULT_MISS) << 16)) &&
-			runtime_ll_cache_stats[cpu].n != 0) {
-		print_ll_cache_misses(cpu, evsel, avg);
-	} else if (perf_evsel__match(evsel, HARDWARE, HW_CACHE_MISSES) &&
-			runtime_cacherefs_stats[cpu].n != 0) {
-		total = avg_stats(&runtime_cacherefs_stats[cpu]);
-
-		if (total)
-			ratio = avg * 100 / total;
-
-		fprintf(output, " # %8.3f %% of all cache refs    ", ratio);
-
-	} else if (perf_evsel__match(evsel, HARDWARE, HW_STALLED_CYCLES_FRONTEND)) {
-		print_stalled_cycles_frontend(cpu, evsel, avg);
-	} else if (perf_evsel__match(evsel, HARDWARE, HW_STALLED_CYCLES_BACKEND)) {
-		print_stalled_cycles_backend(cpu, evsel, avg);
-	} else if (perf_evsel__match(evsel, HARDWARE, HW_CPU_CYCLES)) {
-		total = avg_stats(&runtime_nsecs_stats[cpu]);
-
-		if (total)
-			ratio = 1.0 * avg / total;
-
-		fprintf(output, " # %8.3f GHz                    ", ratio);
-	} else if (runtime_nsecs_stats[cpu].n != 0) {
-		char unit = 'M';
-
-		total = avg_stats(&runtime_nsecs_stats[cpu]);
-
-		if (total)
-			ratio = 1000.0 * avg / total;
-		if (ratio < 0.001) {
-			ratio *= 1000;
-			unit = 'K';
-		}
-
-		fprintf(output, " # %8.3f %c/sec                  ", ratio, unit);
-	} else {
-		fprintf(output, "                                   ");
-	}
-}
-
-static void print_aggr(char *prefix)
-{
-	struct perf_evsel *counter;
-	int cpu, cpu2, s, s2, id, nr;
-	u64 ena, run, val;
-
-	if (!(aggr_map || aggr_get_id))
-		return;
-
-	for (s = 0; s < aggr_map->nr; s++) {
-		id = aggr_map->map[s];
-		list_for_each_entry(counter, &evsel_list->entries, node) {
-			val = ena = run = 0;
-			nr = 0;
-			for (cpu = 0; cpu < perf_evsel__nr_cpus(counter); cpu++) {
-				cpu2 = perf_evsel__cpus(counter)->map[cpu];
-				s2 = aggr_get_id(evsel_list->cpus, cpu2);
-				if (s2 != id)
-					continue;
-				val += counter->counts->cpu[cpu].val;
-				ena += counter->counts->cpu[cpu].ena;
-				run += counter->counts->cpu[cpu].run;
-				nr++;
-			}
-			if (prefix)
-				fprintf(output, "%s", prefix);
-
-			if (run == 0 || ena == 0) {
-				aggr_printout(counter, id, nr);
-
-				fprintf(output, "%*s%s%*s",
-					csv_output ? 0 : 18,
-					counter->supported ? CNTR_NOT_COUNTED : CNTR_NOT_SUPPORTED,
-					csv_sep,
-					csv_output ? 0 : -24,
-					perf_evsel__name(counter));
-
-				if (counter->cgrp)
-					fprintf(output, "%s%s",
-						csv_sep, counter->cgrp->name);
-
-				fputc('\n', output);
-				continue;
-			}
-
-			if (nsec_counter(counter))
-				nsec_printout(id, nr, counter, val);
-			else
-				abs_printout(id, nr, counter, val);
-
-			if (!csv_output) {
-				print_noise(counter, 1.0);
-
-				if (run != ena)
-					fprintf(output, "  (%.2f%%)",
-						100.0 * run / ena);
-			}
-			fputc('\n', output);
-		}
-	}
-}
-
-/*
- * Print out the results of a single counter:
- * aggregated counts in system-wide mode
- */
-static void print_counter_aggr(struct perf_evsel *counter, char *prefix)
-{
-	struct perf_stat *ps = counter->priv;
-	double avg = avg_stats(&ps->res_stats[0]);
-	int scaled = counter->counts->scaled;
-
-	if (prefix)
-		fprintf(output, "%s", prefix);
-
-	if (scaled == -1) {
-		fprintf(output, "%*s%s%*s",
-			csv_output ? 0 : 18,
-			counter->supported ? CNTR_NOT_COUNTED : CNTR_NOT_SUPPORTED,
-			csv_sep,
-			csv_output ? 0 : -24,
-			perf_evsel__name(counter));
-
-		if (counter->cgrp)
-			fprintf(output, "%s%s", csv_sep, counter->cgrp->name);
-
-		fputc('\n', output);
-		return;
-	}
-
-	if (nsec_counter(counter))
-		nsec_printout(-1, 0, counter, avg);
-	else
-		abs_printout(-1, 0, counter, avg);
-
-	print_noise(counter, avg);
-
-	if (csv_output) {
-		fputc('\n', output);
-		return;
-	}
-
-	if (scaled) {
-		double avg_enabled, avg_running;
-
-		avg_enabled = avg_stats(&ps->res_stats[1]);
-		avg_running = avg_stats(&ps->res_stats[2]);
-
-		fprintf(output, " [%5.2f%%]", 100 * avg_running / avg_enabled);
-	}
-	fprintf(output, "\n");
-}
-
-/*
- * Print out the results of a single counter:
- * does not use aggregated count in system-wide
- */
-static void print_counter(struct perf_evsel *counter, char *prefix)
-{
-	u64 ena, run, val;
-	int cpu;
-
-	for (cpu = 0; cpu < perf_evsel__nr_cpus(counter); cpu++) {
-		val = counter->counts->cpu[cpu].val;
-		ena = counter->counts->cpu[cpu].ena;
-		run = counter->counts->cpu[cpu].run;
-
-		if (prefix)
-			fprintf(output, "%s", prefix);
-
-		if (run == 0 || ena == 0) {
-			fprintf(output, "CPU%*d%s%*s%s%*s",
-				csv_output ? 0 : -4,
-				perf_evsel__cpus(counter)->map[cpu], csv_sep,
-				csv_output ? 0 : 18,
-				counter->supported ? CNTR_NOT_COUNTED : CNTR_NOT_SUPPORTED,
-				csv_sep,
-				csv_output ? 0 : -24,
-				perf_evsel__name(counter));
-
-			if (counter->cgrp)
-				fprintf(output, "%s%s",
-					csv_sep, counter->cgrp->name);
-
-			fputc('\n', output);
-			continue;
-		}
-
-		if (nsec_counter(counter))
-			nsec_printout(cpu, 0, counter, val);
-		else
-			abs_printout(cpu, 0, counter, val);
-
-		if (!csv_output) {
-			print_noise(counter, 1.0);
-
-			if (run != ena)
-				fprintf(output, "  (%.2f%%)",
-					100.0 * run / ena);
-		}
-		fputc('\n', output);
-	}
-}
-
-static void print_stat(int argc, const char **argv)
-{
-	struct perf_evsel *counter;
-	int i;
-
-	fflush(stdout);
-
-	if (!csv_output) {
-		fprintf(output, "\n");
-		fprintf(output, " Performance counter stats for ");
-		if (!perf_target__has_task(&target)) {
-			fprintf(output, "\'%s", argv[0]);
-			for (i = 1; i < argc; i++)
-				fprintf(output, " %s", argv[i]);
-		} else if (target.pid)
-			fprintf(output, "process id \'%s", target.pid);
-		else
-			fprintf(output, "thread id \'%s", target.tid);
-
-		fprintf(output, "\'");
-		if (run_count > 1)
-			fprintf(output, " (%d runs)", run_count);
-		fprintf(output, ":\n\n");
-	}
-
-	switch (aggr_mode) {
-	case AGGR_CORE:
-	case AGGR_SOCKET:
-		print_aggr(NULL);
-		break;
-	case AGGR_GLOBAL:
-		list_for_each_entry(counter, &evsel_list->entries, node)
-			print_counter_aggr(counter, NULL);
-		break;
-	case AGGR_NONE:
-		list_for_each_entry(counter, &evsel_list->entries, node)
-			print_counter(counter, NULL);
-		break;
-	default:
-		break;
-	}
-
-	if (!csv_output) {
-		if (!null_run)
-			fprintf(output, "\n");
-		fprintf(output, " %17.9f seconds time elapsed",
-				avg_stats(&walltime_nsecs_stats)/1e9);
-		if (run_count > 1) {
-			fprintf(output, "                                        ");
-			print_noise_pct(stddev_stats(&walltime_nsecs_stats),
-					avg_stats(&walltime_nsecs_stats));
-		}
-		fprintf(output, "\n\n");
-	}
-}
-
-static volatile int signr = -1;
-
-static void skip_signal(int signo)
-{
-	if ((child_pid == -1) || interval)
-		done = 1;
-
-	signr = signo;
-	/*
-	 * render child_pid harmless
-	 * won't send SIGTERM to a random
-	 * process in case of race condition
-	 * and fast PID recycling
-	 */
-	child_pid = -1;
-}
-
-static void sig_atexit(void)
-{
-	sigset_t set, oset;
-
-	/*
-	 * avoid race condition with SIGCHLD handler
-	 * in skip_signal() which is modifying child_pid
-	 * goal is to avoid send SIGTERM to a random
-	 * process
-	 */
-	sigemptyset(&set);
-	sigaddset(&set, SIGCHLD);
-	sigprocmask(SIG_BLOCK, &set, &oset);
-
-	if (child_pid != -1)
-		kill(child_pid, SIGTERM);
-
-	sigprocmask(SIG_SETMASK, &oset, NULL);
-
-	if (signr == -1)
-		return;
-
-	signal(signr, SIG_DFL);
-	kill(getpid(), signr);
-}
-
-static int stat__set_big_num(const struct option *opt __maybe_unused,
-			     const char *s __maybe_unused, int unset)
-{
-	big_num_opt = unset ? 0 : 1;
-	return 0;
-}
-
-static int perf_stat_init_aggr_mode(void)
-{
-	switch (aggr_mode) {
-	case AGGR_SOCKET:
-		if (cpu_map__build_socket_map(evsel_list->cpus, &aggr_map)) {
-			perror("cannot build socket map");
-			return -1;
-		}
-		aggr_get_id = cpu_map__get_socket;
-		break;
-	case AGGR_CORE:
-		if (cpu_map__build_core_map(evsel_list->cpus, &aggr_map)) {
-			perror("cannot build core map");
-			return -1;
-		}
-		aggr_get_id = cpu_map__get_core;
-		break;
-	case AGGR_NONE:
-	case AGGR_GLOBAL:
-	default:
-		break;
-	}
-	return 0;
-}
-
-
-/*
- * Add default attributes, if there were no attributes specified or
- * if -d/--detailed, -d -d or -d -d -d is used:
- */
-static int add_default_attributes(void)
-{
-	struct perf_event_attr default_attrs[] = {
-
-  { .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_TASK_CLOCK		},
-  { .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_CONTEXT_SWITCHES	},
-  { .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_CPU_MIGRATIONS		},
-  { .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_PAGE_FAULTS		},
-
-  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_CPU_CYCLES		},
-  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_STALLED_CYCLES_FRONTEND	},
-  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_STALLED_CYCLES_BACKEND	},
-  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_INSTRUCTIONS		},
-  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_BRANCH_INSTRUCTIONS	},
-  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_BRANCH_MISSES		},
-
-};
-
-/*
- * Detailed stats (-d), covering the L1 and last level data caches:
- */
-	struct perf_event_attr detailed_attrs[] = {
-
-  { .type = PERF_TYPE_HW_CACHE,
-    .config =
-	 PERF_COUNT_HW_CACHE_L1D		<<  0  |
-	(PERF_COUNT_HW_CACHE_OP_READ		<<  8) |
-	(PERF_COUNT_HW_CACHE_RESULT_ACCESS	<< 16)				},
-
-  { .type = PERF_TYPE_HW_CACHE,
-    .config =
-	 PERF_COUNT_HW_CACHE_L1D		<<  0  |
-	(PERF_COUNT_HW_CACHE_OP_READ		<<  8) |
-	(PERF_COUNT_HW_CACHE_RESULT_MISS	<< 16)				},
-
-  { .type = PERF_TYPE_HW_CACHE,
-    .config =
-	 PERF_COUNT_HW_CACHE_LL			<<  0  |
-	(PERF_COUNT_HW_CACHE_OP_READ		<<  8) |
-	(PERF_COUNT_HW_CACHE_RESULT_ACCESS	<< 16)				},
-
-  { .type = PERF_TYPE_HW_CACHE,
-    .config =
-	 PERF_COUNT_HW_CACHE_LL			<<  0  |
-	(PERF_COUNT_HW_CACHE_OP_READ		<<  8) |
-	(PERF_COUNT_HW_CACHE_RESULT_MISS	<< 16)				},
-};
-
-/*
- * Very detailed stats (-d -d), covering the instruction cache and the TLB caches:
- */
-	struct perf_event_attr very_detailed_attrs[] = {
-
-  { .type = PERF_TYPE_HW_CACHE,
-    .config =
-	 PERF_COUNT_HW_CACHE_L1I		<<  0  |
-	(PERF_COUNT_HW_CACHE_OP_READ		<<  8) |
-	(PERF_COUNT_HW_CACHE_RESULT_ACCESS	<< 16)				},
-
-  { .type = PERF_TYPE_HW_CACHE,
-    .config =
-	 PERF_COUNT_HW_CACHE_L1I		<<  0  |
-	(PERF_COUNT_HW_CACHE_OP_READ		<<  8) |
-	(PERF_COUNT_HW_CACHE_RESULT_MISS	<< 16)				},
-
-  { .type = PERF_TYPE_HW_CACHE,
-    .config =
-	 PERF_COUNT_HW_CACHE_DTLB		<<  0  |
-	(PERF_COUNT_HW_CACHE_OP_READ		<<  8) |
-	(PERF_COUNT_HW_CACHE_RESULT_ACCESS	<< 16)				},
-
-  { .type = PERF_TYPE_HW_CACHE,
-    .config =
-	 PERF_COUNT_HW_CACHE_DTLB		<<  0  |
-	(PERF_COUNT_HW_CACHE_OP_READ		<<  8) |
-	(PERF_COUNT_HW_CACHE_RESULT_MISS	<< 16)				},
-
-  { .type = PERF_TYPE_HW_CACHE,
-    .config =
-	 PERF_COUNT_HW_CACHE_ITLB		<<  0  |
-	(PERF_COUNT_HW_CACHE_OP_READ		<<  8) |
-	(PERF_COUNT_HW_CACHE_RESULT_ACCESS	<< 16)				},
-
-  { .type = PERF_TYPE_HW_CACHE,
-    .config =
-	 PERF_COUNT_HW_CACHE_ITLB		<<  0  |
-	(PERF_COUNT_HW_CACHE_OP_READ		<<  8) |
-	(PERF_COUNT_HW_CACHE_RESULT_MISS	<< 16)				},
-
-};
-
-/*
- * Very, very detailed stats (-d -d -d), adding prefetch events:
- */
-	struct perf_event_attr very_very_detailed_attrs[] = {
-
-  { .type = PERF_TYPE_HW_CACHE,
-    .config =
-	 PERF_COUNT_HW_CACHE_L1D		<<  0  |
-	(PERF_COUNT_HW_CACHE_OP_PREFETCH	<<  8) |
-	(PERF_COUNT_HW_CACHE_RESULT_ACCESS	<< 16)				},
-
-  { .type = PERF_TYPE_HW_CACHE,
-    .config =
-	 PERF_COUNT_HW_CACHE_L1D		<<  0  |
-	(PERF_COUNT_HW_CACHE_OP_PREFETCH	<<  8) |
-	(PERF_COUNT_HW_CACHE_RESULT_MISS	<< 16)				},
-};
-
-	/* Set attrs if no event is selected and !null_run: */
-	if (null_run)
-		return 0;
-
-	if (!evsel_list->nr_entries) {
-		if (perf_evlist__add_default_attrs(evsel_list, default_attrs) < 0)
-			return -1;
-	}
-
-	/* Detailed events get appended to the event list: */
-
-	if (detailed_run <  1)
-		return 0;
-
-	/* Append detailed run extra attributes: */
-	if (perf_evlist__add_default_attrs(evsel_list, detailed_attrs) < 0)
-		return -1;
-
-	if (detailed_run < 2)
-		return 0;
-
-	/* Append very detailed run extra attributes: */
-	if (perf_evlist__add_default_attrs(evsel_list, very_detailed_attrs) < 0)
-		return -1;
-
-	if (detailed_run < 3)
-		return 0;
-
-	/* Append very, very detailed run extra attributes: */
-	return perf_evlist__add_default_attrs(evsel_list, very_very_detailed_attrs);
-}
-
-int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	bool append_file = false;
-	int output_fd = 0;
-	const char *output_name	= NULL;
-	const struct option options[] = {
-	OPT_CALLBACK('e', "event", &evsel_list, "event",
-		     "event selector. use 'perf list' to list available events",
-		     parse_events_option),
-	OPT_CALLBACK(0, "filter", &evsel_list, "filter",
-		     "event filter", parse_filter),
-	OPT_BOOLEAN('i', "no-inherit", &no_inherit,
-		    "child tasks do not inherit counters"),
-	OPT_STRING('p', "pid", &target.pid, "pid",
-		   "stat events on existing process id"),
-	OPT_STRING('t', "tid", &target.tid, "tid",
-		   "stat events on existing thread id"),
-	OPT_BOOLEAN('a', "all-cpus", &target.system_wide,
-		    "system-wide collection from all CPUs"),
-	OPT_BOOLEAN('g', "group", &group,
-		    "put the counters into a counter group"),
-	OPT_BOOLEAN('c', "scale", &scale, "scale/normalize counters"),
-	OPT_INCR('v', "verbose", &verbose,
-		    "be more verbose (show counter open errors, etc)"),
-	OPT_INTEGER('r', "repeat", &run_count,
-		    "repeat command and print average + stddev (max: 100, forever: 0)"),
-	OPT_BOOLEAN('n', "null", &null_run,
-		    "null run - dont start any counters"),
-	OPT_INCR('d', "detailed", &detailed_run,
-		    "detailed run - start a lot of events"),
-	OPT_BOOLEAN('S', "sync", &sync_run,
-		    "call sync() before starting a run"),
-	OPT_CALLBACK_NOOPT('B', "big-num", NULL, NULL, 
-			   "print large numbers with thousands\' separators",
-			   stat__set_big_num),
-	OPT_STRING('C', "cpu", &target.cpu_list, "cpu",
-		    "list of cpus to monitor in system-wide"),
-	OPT_SET_UINT('A', "no-aggr", &aggr_mode,
-		    "disable CPU count aggregation", AGGR_NONE),
-	OPT_STRING('x', "field-separator", &csv_sep, "separator",
-		   "print counts with custom separator"),
-	OPT_CALLBACK('G', "cgroup", &evsel_list, "name",
-		     "monitor event in cgroup name only", parse_cgroups),
-	OPT_STRING('o', "output", &output_name, "file", "output file name"),
-	OPT_BOOLEAN(0, "append", &append_file, "append to the output file"),
-	OPT_INTEGER(0, "log-fd", &output_fd,
-		    "log output to fd, instead of stderr"),
-	OPT_STRING(0, "pre", &pre_cmd, "command",
-			"command to run prior to the measured command"),
-	OPT_STRING(0, "post", &post_cmd, "command",
-			"command to run after to the measured command"),
-	OPT_UINTEGER('I', "interval-print", &interval,
-		    "print counts at regular interval in ms (>= 100)"),
-	OPT_SET_UINT(0, "per-socket", &aggr_mode,
-		     "aggregate counts per processor socket", AGGR_SOCKET),
-	OPT_SET_UINT(0, "per-core", &aggr_mode,
-		     "aggregate counts per physical processor core", AGGR_CORE),
-	OPT_UINTEGER('D', "delay", &initial_delay,
-		     "ms to wait before starting measurement after program start"),
-	OPT_END()
-	};
-	const char * const stat_usage[] = {
-		"perf stat [<options>] [<command>]",
-		NULL
-	};
-	int status = -ENOMEM, run_idx;
-	const char *mode;
-
-	setlocale(LC_ALL, "");
-
-	evsel_list = perf_evlist__new();
-	if (evsel_list == NULL)
-		return -ENOMEM;
-
-	argc = parse_options(argc, argv, options, stat_usage,
-		PARSE_OPT_STOP_AT_NON_OPTION);
-
-	output = stderr;
-	if (output_name && strcmp(output_name, "-"))
-		output = NULL;
-
-	if (output_name && output_fd) {
-		fprintf(stderr, "cannot use both --output and --log-fd\n");
-		usage_with_options(stat_usage, options);
-	}
-
-	if (output_fd < 0) {
-		fprintf(stderr, "argument to --log-fd must be a > 0\n");
-		usage_with_options(stat_usage, options);
-	}
-
-	if (!output) {
-		struct timespec tm;
-		mode = append_file ? "a" : "w";
-
-		output = fopen(output_name, mode);
-		if (!output) {
-			perror("failed to create output file");
-			return -1;
-		}
-		clock_gettime(CLOCK_REALTIME, &tm);
-		fprintf(output, "# started on %s\n", ctime(&tm.tv_sec));
-	} else if (output_fd > 0) {
-		mode = append_file ? "a" : "w";
-		output = fdopen(output_fd, mode);
-		if (!output) {
-			perror("Failed opening logfd");
-			return -errno;
-		}
-	}
-
-	if (csv_sep) {
-		csv_output = true;
-		if (!strcmp(csv_sep, "\\t"))
-			csv_sep = "\t";
-	} else
-		csv_sep = DEFAULT_SEPARATOR;
-
-	/*
-	 * let the spreadsheet do the pretty-printing
-	 */
-	if (csv_output) {
-		/* User explicitly passed -B? */
-		if (big_num_opt == 1) {
-			fprintf(stderr, "-B option not supported with -x\n");
-			usage_with_options(stat_usage, options);
-		} else /* Nope, so disable big number formatting */
-			big_num = false;
-	} else if (big_num_opt == 0) /* User passed --no-big-num */
-		big_num = false;
-
-	if (!argc && !perf_target__has_task(&target))
-		usage_with_options(stat_usage, options);
-	if (run_count < 0) {
-		usage_with_options(stat_usage, options);
-	} else if (run_count == 0) {
-		forever = true;
-		run_count = 1;
-	}
-
-	/* no_aggr, cgroup are for system-wide only */
-	if ((aggr_mode != AGGR_GLOBAL || nr_cgroups)
-	     && !perf_target__has_cpu(&target)) {
-		fprintf(stderr, "both cgroup and no-aggregation "
-			"modes only available in system-wide mode\n");
-
-		usage_with_options(stat_usage, options);
-		return -1;
-	}
-
-	if (add_default_attributes())
-		goto out;
-
-	perf_target__validate(&target);
-
-	if (perf_evlist__create_maps(evsel_list, &target) < 0) {
-		if (perf_target__has_task(&target))
-			pr_err("Problems finding threads of monitor\n");
-		if (perf_target__has_cpu(&target))
-			perror("failed to parse CPUs map");
-
-		usage_with_options(stat_usage, options);
-		return -1;
-	}
-	if (interval && interval < 100) {
-		pr_err("print interval must be >= 100ms\n");
-		usage_with_options(stat_usage, options);
-		return -1;
-	}
-
-	if (perf_evlist__alloc_stats(evsel_list, interval))
-		goto out_free_maps;
-
-	if (perf_stat_init_aggr_mode())
-		goto out;
-
-	/*
-	 * We dont want to block the signals - that would cause
-	 * child tasks to inherit that and Ctrl-C would not work.
-	 * What we want is for Ctrl-C to work in the exec()-ed
-	 * task, but being ignored by perf stat itself:
-	 */
-	atexit(sig_atexit);
-	if (!forever)
-		signal(SIGINT,  skip_signal);
-	signal(SIGCHLD, skip_signal);
-	signal(SIGALRM, skip_signal);
-	signal(SIGABRT, skip_signal);
-
-	status = 0;
-	for (run_idx = 0; forever || run_idx < run_count; run_idx++) {
-		if (run_count != 1 && verbose)
-			fprintf(output, "[ perf stat: executing run #%d ... ]\n",
-				run_idx + 1);
-
-		status = run_perf_stat(argc, argv);
-		if (forever && status != -1) {
-			print_stat(argc, argv);
-			perf_stat__reset_stats(evsel_list);
-		}
-	}
-
-	if (!forever && status != -1 && !interval)
-		print_stat(argc, argv);
-
-	perf_evlist__free_stats(evsel_list);
-out_free_maps:
-	perf_evlist__delete_maps(evsel_list);
-out:
-	perf_evlist__delete(evsel_list);
-	return status;
-}
diff --git a/src/tools/perf/builtin-timechart.c b/src/tools/perf/builtin-timechart.c
deleted file mode 100644
index c2e0231..0000000
--- a/src/tools/perf/builtin-timechart.c
+++ /dev/null
@@ -1,1117 +0,0 @@
-/*
- * builtin-timechart.c - make an svg timechart of system activity
- *
- * (C) Copyright 2009 Intel Corporation
- *
- * Authors:
- *     Arjan van de Ven <arjan@linux.intel.com>
- *
- * 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; version 2
- * of the License.
- */
-
-#include <traceevent/event-parse.h>
-
-#include "builtin.h"
-
-#include "util/util.h"
-
-#include "util/color.h"
-#include <linux/list.h>
-#include "util/cache.h"
-#include "util/evlist.h"
-#include "util/evsel.h"
-#include <linux/rbtree.h>
-#include "util/symbol.h"
-#include "util/callchain.h"
-#include "util/strlist.h"
-
-#include "perf.h"
-#include "util/header.h"
-#include "util/parse-options.h"
-#include "util/parse-events.h"
-#include "util/event.h"
-#include "util/session.h"
-#include "util/svghelper.h"
-#include "util/tool.h"
-
-#define SUPPORT_OLD_POWER_EVENTS 1
-#define PWR_EVENT_EXIT -1
-
-
-static unsigned int	numcpus;
-static u64		min_freq;	/* Lowest CPU frequency seen */
-static u64		max_freq;	/* Highest CPU frequency seen */
-static u64		turbo_frequency;
-
-static u64		first_time, last_time;
-
-static bool		power_only;
-
-
-struct per_pid;
-struct per_pidcomm;
-
-struct cpu_sample;
-struct power_event;
-struct wake_event;
-
-struct sample_wrapper;
-
-/*
- * Datastructure layout:
- * We keep an list of "pid"s, matching the kernels notion of a task struct.
- * Each "pid" entry, has a list of "comm"s.
- *	this is because we want to track different programs different, while
- *	exec will reuse the original pid (by design).
- * Each comm has a list of samples that will be used to draw
- * final graph.
- */
-
-struct per_pid {
-	struct per_pid *next;
-
-	int		pid;
-	int		ppid;
-
-	u64		start_time;
-	u64		end_time;
-	u64		total_time;
-	int		display;
-
-	struct per_pidcomm *all;
-	struct per_pidcomm *current;
-};
-
-
-struct per_pidcomm {
-	struct per_pidcomm *next;
-
-	u64		start_time;
-	u64		end_time;
-	u64		total_time;
-
-	int		Y;
-	int		display;
-
-	long		state;
-	u64		state_since;
-
-	char		*comm;
-
-	struct cpu_sample *samples;
-};
-
-struct sample_wrapper {
-	struct sample_wrapper *next;
-
-	u64		timestamp;
-	unsigned char	data[0];
-};
-
-#define TYPE_NONE	0
-#define TYPE_RUNNING	1
-#define TYPE_WAITING	2
-#define TYPE_BLOCKED	3
-
-struct cpu_sample {
-	struct cpu_sample *next;
-
-	u64 start_time;
-	u64 end_time;
-	int type;
-	int cpu;
-};
-
-static struct per_pid *all_data;
-
-#define CSTATE 1
-#define PSTATE 2
-
-struct power_event {
-	struct power_event *next;
-	int type;
-	int state;
-	u64 start_time;
-	u64 end_time;
-	int cpu;
-};
-
-struct wake_event {
-	struct wake_event *next;
-	int waker;
-	int wakee;
-	u64 time;
-};
-
-static struct power_event    *power_events;
-static struct wake_event     *wake_events;
-
-struct process_filter;
-struct process_filter {
-	char			*name;
-	int			pid;
-	struct process_filter	*next;
-};
-
-static struct process_filter *process_filter;
-
-
-static struct per_pid *find_create_pid(int pid)
-{
-	struct per_pid *cursor = all_data;
-
-	while (cursor) {
-		if (cursor->pid == pid)
-			return cursor;
-		cursor = cursor->next;
-	}
-	cursor = zalloc(sizeof(*cursor));
-	assert(cursor != NULL);
-	cursor->pid = pid;
-	cursor->next = all_data;
-	all_data = cursor;
-	return cursor;
-}
-
-static void pid_set_comm(int pid, char *comm)
-{
-	struct per_pid *p;
-	struct per_pidcomm *c;
-	p = find_create_pid(pid);
-	c = p->all;
-	while (c) {
-		if (c->comm && strcmp(c->comm, comm) == 0) {
-			p->current = c;
-			return;
-		}
-		if (!c->comm) {
-			c->comm = strdup(comm);
-			p->current = c;
-			return;
-		}
-		c = c->next;
-	}
-	c = zalloc(sizeof(*c));
-	assert(c != NULL);
-	c->comm = strdup(comm);
-	p->current = c;
-	c->next = p->all;
-	p->all = c;
-}
-
-static void pid_fork(int pid, int ppid, u64 timestamp)
-{
-	struct per_pid *p, *pp;
-	p = find_create_pid(pid);
-	pp = find_create_pid(ppid);
-	p->ppid = ppid;
-	if (pp->current && pp->current->comm && !p->current)
-		pid_set_comm(pid, pp->current->comm);
-
-	p->start_time = timestamp;
-	if (p->current) {
-		p->current->start_time = timestamp;
-		p->current->state_since = timestamp;
-	}
-}
-
-static void pid_exit(int pid, u64 timestamp)
-{
-	struct per_pid *p;
-	p = find_create_pid(pid);
-	p->end_time = timestamp;
-	if (p->current)
-		p->current->end_time = timestamp;
-}
-
-static void
-pid_put_sample(int pid, int type, unsigned int cpu, u64 start, u64 end)
-{
-	struct per_pid *p;
-	struct per_pidcomm *c;
-	struct cpu_sample *sample;
-
-	p = find_create_pid(pid);
-	c = p->current;
-	if (!c) {
-		c = zalloc(sizeof(*c));
-		assert(c != NULL);
-		p->current = c;
-		c->next = p->all;
-		p->all = c;
-	}
-
-	sample = zalloc(sizeof(*sample));
-	assert(sample != NULL);
-	sample->start_time = start;
-	sample->end_time = end;
-	sample->type = type;
-	sample->next = c->samples;
-	sample->cpu = cpu;
-	c->samples = sample;
-
-	if (sample->type == TYPE_RUNNING && end > start && start > 0) {
-		c->total_time += (end-start);
-		p->total_time += (end-start);
-	}
-
-	if (c->start_time == 0 || c->start_time > start)
-		c->start_time = start;
-	if (p->start_time == 0 || p->start_time > start)
-		p->start_time = start;
-}
-
-#define MAX_CPUS 4096
-
-static u64 cpus_cstate_start_times[MAX_CPUS];
-static int cpus_cstate_state[MAX_CPUS];
-static u64 cpus_pstate_start_times[MAX_CPUS];
-static u64 cpus_pstate_state[MAX_CPUS];
-
-static int process_comm_event(struct perf_tool *tool __maybe_unused,
-			      union perf_event *event,
-			      struct perf_sample *sample __maybe_unused,
-			      struct machine *machine __maybe_unused)
-{
-	pid_set_comm(event->comm.tid, event->comm.comm);
-	return 0;
-}
-
-static int process_fork_event(struct perf_tool *tool __maybe_unused,
-			      union perf_event *event,
-			      struct perf_sample *sample __maybe_unused,
-			      struct machine *machine __maybe_unused)
-{
-	pid_fork(event->fork.pid, event->fork.ppid, event->fork.time);
-	return 0;
-}
-
-static int process_exit_event(struct perf_tool *tool __maybe_unused,
-			      union perf_event *event,
-			      struct perf_sample *sample __maybe_unused,
-			      struct machine *machine __maybe_unused)
-{
-	pid_exit(event->fork.pid, event->fork.time);
-	return 0;
-}
-
-struct trace_entry {
-	unsigned short		type;
-	unsigned char		flags;
-	unsigned char		preempt_count;
-	int			pid;
-	int			lock_depth;
-};
-
-#ifdef SUPPORT_OLD_POWER_EVENTS
-static int use_old_power_events;
-struct power_entry_old {
-	struct trace_entry te;
-	u64	type;
-	u64	value;
-	u64	cpu_id;
-};
-#endif
-
-struct power_processor_entry {
-	struct trace_entry te;
-	u32	state;
-	u32	cpu_id;
-};
-
-#define TASK_COMM_LEN 16
-struct wakeup_entry {
-	struct trace_entry te;
-	char comm[TASK_COMM_LEN];
-	int   pid;
-	int   prio;
-	int   success;
-};
-
-struct sched_switch {
-	struct trace_entry te;
-	char prev_comm[TASK_COMM_LEN];
-	int  prev_pid;
-	int  prev_prio;
-	long prev_state; /* Arjan weeps. */
-	char next_comm[TASK_COMM_LEN];
-	int  next_pid;
-	int  next_prio;
-};
-
-static void c_state_start(int cpu, u64 timestamp, int state)
-{
-	cpus_cstate_start_times[cpu] = timestamp;
-	cpus_cstate_state[cpu] = state;
-}
-
-static void c_state_end(int cpu, u64 timestamp)
-{
-	struct power_event *pwr = zalloc(sizeof(*pwr));
-
-	if (!pwr)
-		return;
-
-	pwr->state = cpus_cstate_state[cpu];
-	pwr->start_time = cpus_cstate_start_times[cpu];
-	pwr->end_time = timestamp;
-	pwr->cpu = cpu;
-	pwr->type = CSTATE;
-	pwr->next = power_events;
-
-	power_events = pwr;
-}
-
-static void p_state_change(int cpu, u64 timestamp, u64 new_freq)
-{
-	struct power_event *pwr;
-
-	if (new_freq > 8000000) /* detect invalid data */
-		return;
-
-	pwr = zalloc(sizeof(*pwr));
-	if (!pwr)
-		return;
-
-	pwr->state = cpus_pstate_state[cpu];
-	pwr->start_time = cpus_pstate_start_times[cpu];
-	pwr->end_time = timestamp;
-	pwr->cpu = cpu;
-	pwr->type = PSTATE;
-	pwr->next = power_events;
-
-	if (!pwr->start_time)
-		pwr->start_time = first_time;
-
-	power_events = pwr;
-
-	cpus_pstate_state[cpu] = new_freq;
-	cpus_pstate_start_times[cpu] = timestamp;
-
-	if ((u64)new_freq > max_freq)
-		max_freq = new_freq;
-
-	if (new_freq < min_freq || min_freq == 0)
-		min_freq = new_freq;
-
-	if (new_freq == max_freq - 1000)
-			turbo_frequency = max_freq;
-}
-
-static void
-sched_wakeup(int cpu, u64 timestamp, int pid, struct trace_entry *te)
-{
-	struct per_pid *p;
-	struct wakeup_entry *wake = (void *)te;
-	struct wake_event *we = zalloc(sizeof(*we));
-
-	if (!we)
-		return;
-
-	we->time = timestamp;
-	we->waker = pid;
-
-	if ((te->flags & TRACE_FLAG_HARDIRQ) || (te->flags & TRACE_FLAG_SOFTIRQ))
-		we->waker = -1;
-
-	we->wakee = wake->pid;
-	we->next = wake_events;
-	wake_events = we;
-	p = find_create_pid(we->wakee);
-
-	if (p && p->current && p->current->state == TYPE_NONE) {
-		p->current->state_since = timestamp;
-		p->current->state = TYPE_WAITING;
-	}
-	if (p && p->current && p->current->state == TYPE_BLOCKED) {
-		pid_put_sample(p->pid, p->current->state, cpu, p->current->state_since, timestamp);
-		p->current->state_since = timestamp;
-		p->current->state = TYPE_WAITING;
-	}
-}
-
-static void sched_switch(int cpu, u64 timestamp, struct trace_entry *te)
-{
-	struct per_pid *p = NULL, *prev_p;
-	struct sched_switch *sw = (void *)te;
-
-
-	prev_p = find_create_pid(sw->prev_pid);
-
-	p = find_create_pid(sw->next_pid);
-
-	if (prev_p->current && prev_p->current->state != TYPE_NONE)
-		pid_put_sample(sw->prev_pid, TYPE_RUNNING, cpu, prev_p->current->state_since, timestamp);
-	if (p && p->current) {
-		if (p->current->state != TYPE_NONE)
-			pid_put_sample(sw->next_pid, p->current->state, cpu, p->current->state_since, timestamp);
-
-		p->current->state_since = timestamp;
-		p->current->state = TYPE_RUNNING;
-	}
-
-	if (prev_p->current) {
-		prev_p->current->state = TYPE_NONE;
-		prev_p->current->state_since = timestamp;
-		if (sw->prev_state & 2)
-			prev_p->current->state = TYPE_BLOCKED;
-		if (sw->prev_state == 0)
-			prev_p->current->state = TYPE_WAITING;
-	}
-}
-
-typedef int (*tracepoint_handler)(struct perf_evsel *evsel,
-				  struct perf_sample *sample);
-
-static int process_sample_event(struct perf_tool *tool __maybe_unused,
-				union perf_event *event __maybe_unused,
-				struct perf_sample *sample,
-				struct perf_evsel *evsel,
-				struct machine *machine __maybe_unused)
-{
-	if (evsel->attr.sample_type & PERF_SAMPLE_TIME) {
-		if (!first_time || first_time > sample->time)
-			first_time = sample->time;
-		if (last_time < sample->time)
-			last_time = sample->time;
-	}
-
-	if (sample->cpu > numcpus)
-		numcpus = sample->cpu;
-
-	if (evsel->handler.func != NULL) {
-		tracepoint_handler f = evsel->handler.func;
-		return f(evsel, sample);
-	}
-
-	return 0;
-}
-
-static int
-process_sample_cpu_idle(struct perf_evsel *evsel __maybe_unused,
-			struct perf_sample *sample)
-{
-	struct power_processor_entry *ppe = sample->raw_data;
-
-	if (ppe->state == (u32) PWR_EVENT_EXIT)
-		c_state_end(ppe->cpu_id, sample->time);
-	else
-		c_state_start(ppe->cpu_id, sample->time, ppe->state);
-	return 0;
-}
-
-static int
-process_sample_cpu_frequency(struct perf_evsel *evsel __maybe_unused,
-			     struct perf_sample *sample)
-{
-	struct power_processor_entry *ppe = sample->raw_data;
-
-	p_state_change(ppe->cpu_id, sample->time, ppe->state);
-	return 0;
-}
-
-static int
-process_sample_sched_wakeup(struct perf_evsel *evsel __maybe_unused,
-			    struct perf_sample *sample)
-{
-	struct trace_entry *te = sample->raw_data;
-
-	sched_wakeup(sample->cpu, sample->time, sample->pid, te);
-	return 0;
-}
-
-static int
-process_sample_sched_switch(struct perf_evsel *evsel __maybe_unused,
-			    struct perf_sample *sample)
-{
-	struct trace_entry *te = sample->raw_data;
-
-	sched_switch(sample->cpu, sample->time, te);
-	return 0;
-}
-
-#ifdef SUPPORT_OLD_POWER_EVENTS
-static int
-process_sample_power_start(struct perf_evsel *evsel __maybe_unused,
-			   struct perf_sample *sample)
-{
-	struct power_entry_old *peo = sample->raw_data;
-
-	c_state_start(peo->cpu_id, sample->time, peo->value);
-	return 0;
-}
-
-static int
-process_sample_power_end(struct perf_evsel *evsel __maybe_unused,
-			 struct perf_sample *sample)
-{
-	c_state_end(sample->cpu, sample->time);
-	return 0;
-}
-
-static int
-process_sample_power_frequency(struct perf_evsel *evsel __maybe_unused,
-			       struct perf_sample *sample)
-{
-	struct power_entry_old *peo = sample->raw_data;
-
-	p_state_change(peo->cpu_id, sample->time, peo->value);
-	return 0;
-}
-#endif /* SUPPORT_OLD_POWER_EVENTS */
-
-/*
- * After the last sample we need to wrap up the current C/P state
- * and close out each CPU for these.
- */
-static void end_sample_processing(void)
-{
-	u64 cpu;
-	struct power_event *pwr;
-
-	for (cpu = 0; cpu <= numcpus; cpu++) {
-		/* C state */
-#if 0
-		pwr = zalloc(sizeof(*pwr));
-		if (!pwr)
-			return;
-
-		pwr->state = cpus_cstate_state[cpu];
-		pwr->start_time = cpus_cstate_start_times[cpu];
-		pwr->end_time = last_time;
-		pwr->cpu = cpu;
-		pwr->type = CSTATE;
-		pwr->next = power_events;
-
-		power_events = pwr;
-#endif
-		/* P state */
-
-		pwr = zalloc(sizeof(*pwr));
-		if (!pwr)
-			return;
-
-		pwr->state = cpus_pstate_state[cpu];
-		pwr->start_time = cpus_pstate_start_times[cpu];
-		pwr->end_time = last_time;
-		pwr->cpu = cpu;
-		pwr->type = PSTATE;
-		pwr->next = power_events;
-
-		if (!pwr->start_time)
-			pwr->start_time = first_time;
-		if (!pwr->state)
-			pwr->state = min_freq;
-		power_events = pwr;
-	}
-}
-
-/*
- * Sort the pid datastructure
- */
-static void sort_pids(void)
-{
-	struct per_pid *new_list, *p, *cursor, *prev;
-	/* sort by ppid first, then by pid, lowest to highest */
-
-	new_list = NULL;
-
-	while (all_data) {
-		p = all_data;
-		all_data = p->next;
-		p->next = NULL;
-
-		if (new_list == NULL) {
-			new_list = p;
-			p->next = NULL;
-			continue;
-		}
-		prev = NULL;
-		cursor = new_list;
-		while (cursor) {
-			if (cursor->ppid > p->ppid ||
-				(cursor->ppid == p->ppid && cursor->pid > p->pid)) {
-				/* must insert before */
-				if (prev) {
-					p->next = prev->next;
-					prev->next = p;
-					cursor = NULL;
-					continue;
-				} else {
-					p->next = new_list;
-					new_list = p;
-					cursor = NULL;
-					continue;
-				}
-			}
-
-			prev = cursor;
-			cursor = cursor->next;
-			if (!cursor)
-				prev->next = p;
-		}
-	}
-	all_data = new_list;
-}
-
-
-static void draw_c_p_states(void)
-{
-	struct power_event *pwr;
-	pwr = power_events;
-
-	/*
-	 * two pass drawing so that the P state bars are on top of the C state blocks
-	 */
-	while (pwr) {
-		if (pwr->type == CSTATE)
-			svg_cstate(pwr->cpu, pwr->start_time, pwr->end_time, pwr->state);
-		pwr = pwr->next;
-	}
-
-	pwr = power_events;
-	while (pwr) {
-		if (pwr->type == PSTATE) {
-			if (!pwr->state)
-				pwr->state = min_freq;
-			svg_pstate(pwr->cpu, pwr->start_time, pwr->end_time, pwr->state);
-		}
-		pwr = pwr->next;
-	}
-}
-
-static void draw_wakeups(void)
-{
-	struct wake_event *we;
-	struct per_pid *p;
-	struct per_pidcomm *c;
-
-	we = wake_events;
-	while (we) {
-		int from = 0, to = 0;
-		char *task_from = NULL, *task_to = NULL;
-
-		/* locate the column of the waker and wakee */
-		p = all_data;
-		while (p) {
-			if (p->pid == we->waker || p->pid == we->wakee) {
-				c = p->all;
-				while (c) {
-					if (c->Y && c->start_time <= we->time && c->end_time >= we->time) {
-						if (p->pid == we->waker && !from) {
-							from = c->Y;
-							task_from = strdup(c->comm);
-						}
-						if (p->pid == we->wakee && !to) {
-							to = c->Y;
-							task_to = strdup(c->comm);
-						}
-					}
-					c = c->next;
-				}
-				c = p->all;
-				while (c) {
-					if (p->pid == we->waker && !from) {
-						from = c->Y;
-						task_from = strdup(c->comm);
-					}
-					if (p->pid == we->wakee && !to) {
-						to = c->Y;
-						task_to = strdup(c->comm);
-					}
-					c = c->next;
-				}
-			}
-			p = p->next;
-		}
-
-		if (!task_from) {
-			task_from = malloc(40);
-			sprintf(task_from, "[%i]", we->waker);
-		}
-		if (!task_to) {
-			task_to = malloc(40);
-			sprintf(task_to, "[%i]", we->wakee);
-		}
-
-		if (we->waker == -1)
-			svg_interrupt(we->time, to);
-		else if (from && to && abs(from - to) == 1)
-			svg_wakeline(we->time, from, to);
-		else
-			svg_partial_wakeline(we->time, from, task_from, to, task_to);
-		we = we->next;
-
-		free(task_from);
-		free(task_to);
-	}
-}
-
-static void draw_cpu_usage(void)
-{
-	struct per_pid *p;
-	struct per_pidcomm *c;
-	struct cpu_sample *sample;
-	p = all_data;
-	while (p) {
-		c = p->all;
-		while (c) {
-			sample = c->samples;
-			while (sample) {
-				if (sample->type == TYPE_RUNNING)
-					svg_process(sample->cpu, sample->start_time, sample->end_time, "sample", c->comm);
-
-				sample = sample->next;
-			}
-			c = c->next;
-		}
-		p = p->next;
-	}
-}
-
-static void draw_process_bars(void)
-{
-	struct per_pid *p;
-	struct per_pidcomm *c;
-	struct cpu_sample *sample;
-	int Y = 0;
-
-	Y = 2 * numcpus + 2;
-
-	p = all_data;
-	while (p) {
-		c = p->all;
-		while (c) {
-			if (!c->display) {
-				c->Y = 0;
-				c = c->next;
-				continue;
-			}
-
-			svg_box(Y, c->start_time, c->end_time, "process");
-			sample = c->samples;
-			while (sample) {
-				if (sample->type == TYPE_RUNNING)
-					svg_sample(Y, sample->cpu, sample->start_time, sample->end_time);
-				if (sample->type == TYPE_BLOCKED)
-					svg_box(Y, sample->start_time, sample->end_time, "blocked");
-				if (sample->type == TYPE_WAITING)
-					svg_waiting(Y, sample->start_time, sample->end_time);
-				sample = sample->next;
-			}
-
-			if (c->comm) {
-				char comm[256];
-				if (c->total_time > 5000000000) /* 5 seconds */
-					sprintf(comm, "%s:%i (%2.2fs)", c->comm, p->pid, c->total_time / 1000000000.0);
-				else
-					sprintf(comm, "%s:%i (%3.1fms)", c->comm, p->pid, c->total_time / 1000000.0);
-
-				svg_text(Y, c->start_time, comm);
-			}
-			c->Y = Y;
-			Y++;
-			c = c->next;
-		}
-		p = p->next;
-	}
-}
-
-static void add_process_filter(const char *string)
-{
-	int pid = strtoull(string, NULL, 10);
-	struct process_filter *filt = malloc(sizeof(*filt));
-
-	if (!filt)
-		return;
-
-	filt->name = strdup(string);
-	filt->pid  = pid;
-	filt->next = process_filter;
-
-	process_filter = filt;
-}
-
-static int passes_filter(struct per_pid *p, struct per_pidcomm *c)
-{
-	struct process_filter *filt;
-	if (!process_filter)
-		return 1;
-
-	filt = process_filter;
-	while (filt) {
-		if (filt->pid && p->pid == filt->pid)
-			return 1;
-		if (strcmp(filt->name, c->comm) == 0)
-			return 1;
-		filt = filt->next;
-	}
-	return 0;
-}
-
-static int determine_display_tasks_filtered(void)
-{
-	struct per_pid *p;
-	struct per_pidcomm *c;
-	int count = 0;
-
-	p = all_data;
-	while (p) {
-		p->display = 0;
-		if (p->start_time == 1)
-			p->start_time = first_time;
-
-		/* no exit marker, task kept running to the end */
-		if (p->end_time == 0)
-			p->end_time = last_time;
-
-		c = p->all;
-
-		while (c) {
-			c->display = 0;
-
-			if (c->start_time == 1)
-				c->start_time = first_time;
-
-			if (passes_filter(p, c)) {
-				c->display = 1;
-				p->display = 1;
-				count++;
-			}
-
-			if (c->end_time == 0)
-				c->end_time = last_time;
-
-			c = c->next;
-		}
-		p = p->next;
-	}
-	return count;
-}
-
-static int determine_display_tasks(u64 threshold)
-{
-	struct per_pid *p;
-	struct per_pidcomm *c;
-	int count = 0;
-
-	if (process_filter)
-		return determine_display_tasks_filtered();
-
-	p = all_data;
-	while (p) {
-		p->display = 0;
-		if (p->start_time == 1)
-			p->start_time = first_time;
-
-		/* no exit marker, task kept running to the end */
-		if (p->end_time == 0)
-			p->end_time = last_time;
-		if (p->total_time >= threshold && !power_only)
-			p->display = 1;
-
-		c = p->all;
-
-		while (c) {
-			c->display = 0;
-
-			if (c->start_time == 1)
-				c->start_time = first_time;
-
-			if (c->total_time >= threshold && !power_only) {
-				c->display = 1;
-				count++;
-			}
-
-			if (c->end_time == 0)
-				c->end_time = last_time;
-
-			c = c->next;
-		}
-		p = p->next;
-	}
-	return count;
-}
-
-
-
-#define TIME_THRESH 10000000
-
-static void write_svg_file(const char *filename)
-{
-	u64 i;
-	int count;
-
-	numcpus++;
-
-
-	count = determine_display_tasks(TIME_THRESH);
-
-	/* We'd like to show at least 15 tasks; be less picky if we have fewer */
-	if (count < 15)
-		count = determine_display_tasks(TIME_THRESH / 10);
-
-	open_svg(filename, numcpus, count, first_time, last_time);
-
-	svg_time_grid();
-	svg_legenda();
-
-	for (i = 0; i < numcpus; i++)
-		svg_cpu_box(i, max_freq, turbo_frequency);
-
-	draw_cpu_usage();
-	draw_process_bars();
-	draw_c_p_states();
-	draw_wakeups();
-
-	svg_close();
-}
-
-static int __cmd_timechart(const char *output_name)
-{
-	struct perf_tool perf_timechart = {
-		.comm		 = process_comm_event,
-		.fork		 = process_fork_event,
-		.exit		 = process_exit_event,
-		.sample		 = process_sample_event,
-		.ordered_samples = true,
-	};
-	const struct perf_evsel_str_handler power_tracepoints[] = {
-		{ "power:cpu_idle",		process_sample_cpu_idle },
-		{ "power:cpu_frequency",	process_sample_cpu_frequency },
-		{ "sched:sched_wakeup",		process_sample_sched_wakeup },
-		{ "sched:sched_switch",		process_sample_sched_switch },
-#ifdef SUPPORT_OLD_POWER_EVENTS
-		{ "power:power_start",		process_sample_power_start },
-		{ "power:power_end",		process_sample_power_end },
-		{ "power:power_frequency",	process_sample_power_frequency },
-#endif
-	};
-	struct perf_session *session = perf_session__new(input_name, O_RDONLY,
-							 0, false, &perf_timechart);
-	int ret = -EINVAL;
-
-	if (session == NULL)
-		return -ENOMEM;
-
-	if (!perf_session__has_traces(session, "timechart record"))
-		goto out_delete;
-
-	if (perf_session__set_tracepoints_handlers(session,
-						   power_tracepoints)) {
-		pr_err("Initializing session tracepoint handlers failed\n");
-		goto out_delete;
-	}
-
-	ret = perf_session__process_events(session, &perf_timechart);
-	if (ret)
-		goto out_delete;
-
-	end_sample_processing();
-
-	sort_pids();
-
-	write_svg_file(output_name);
-
-	pr_info("Written %2.1f seconds of trace to %s.\n",
-		(last_time - first_time) / 1000000000.0, output_name);
-out_delete:
-	perf_session__delete(session);
-	return ret;
-}
-
-static int __cmd_record(int argc, const char **argv)
-{
-#ifdef SUPPORT_OLD_POWER_EVENTS
-	const char * const record_old_args[] = {
-		"record", "-a", "-R", "-c", "1",
-		"-e", "power:power_start",
-		"-e", "power:power_end",
-		"-e", "power:power_frequency",
-		"-e", "sched:sched_wakeup",
-		"-e", "sched:sched_switch",
-	};
-#endif
-	const char * const record_new_args[] = {
-		"record", "-a", "-R", "-c", "1",
-		"-e", "power:cpu_frequency",
-		"-e", "power:cpu_idle",
-		"-e", "sched:sched_wakeup",
-		"-e", "sched:sched_switch",
-	};
-	unsigned int rec_argc, i, j;
-	const char **rec_argv;
-	const char * const *record_args = record_new_args;
-	unsigned int record_elems = ARRAY_SIZE(record_new_args);
-
-#ifdef SUPPORT_OLD_POWER_EVENTS
-	if (!is_valid_tracepoint("power:cpu_idle") &&
-	    is_valid_tracepoint("power:power_start")) {
-		use_old_power_events = 1;
-		record_args = record_old_args;
-		record_elems = ARRAY_SIZE(record_old_args);
-	}
-#endif
-
-	rec_argc = record_elems + argc - 1;
-	rec_argv = calloc(rec_argc + 1, sizeof(char *));
-
-	if (rec_argv == NULL)
-		return -ENOMEM;
-
-	for (i = 0; i < record_elems; i++)
-		rec_argv[i] = strdup(record_args[i]);
-
-	for (j = 1; j < (unsigned int)argc; j++, i++)
-		rec_argv[i] = argv[j];
-
-	return cmd_record(i, rec_argv, NULL);
-}
-
-static int
-parse_process(const struct option *opt __maybe_unused, const char *arg,
-	      int __maybe_unused unset)
-{
-	if (arg)
-		add_process_filter(arg);
-	return 0;
-}
-
-int cmd_timechart(int argc, const char **argv,
-		  const char *prefix __maybe_unused)
-{
-	const char *output_name = "output.svg";
-	const struct option options[] = {
-	OPT_STRING('i', "input", &input_name, "file", "input file name"),
-	OPT_STRING('o', "output", &output_name, "file", "output file name"),
-	OPT_INTEGER('w', "width", &svg_page_width, "page width"),
-	OPT_BOOLEAN('P', "power-only", &power_only, "output power data only"),
-	OPT_CALLBACK('p', "process", NULL, "process",
-		      "process selector. Pass a pid or process name.",
-		       parse_process),
-	OPT_STRING(0, "symfs", &symbol_conf.symfs, "directory",
-		    "Look for files with symbols relative to this directory"),
-	OPT_END()
-	};
-	const char * const timechart_usage[] = {
-		"perf timechart [<options>] {record}",
-		NULL
-	};
-
-	argc = parse_options(argc, argv, options, timechart_usage,
-			PARSE_OPT_STOP_AT_NON_OPTION);
-
-	symbol__init();
-
-	if (argc && !strncmp(argv[0], "rec", 3))
-		return __cmd_record(argc, argv);
-	else if (argc)
-		usage_with_options(timechart_usage, options);
-
-	setup_pager();
-
-	return __cmd_timechart(output_name);
-}
diff --git a/src/tools/perf/builtin-top.c b/src/tools/perf/builtin-top.c
deleted file mode 100644
index 5a11f13..0000000
--- a/src/tools/perf/builtin-top.c
+++ /dev/null
@@ -1,1250 +0,0 @@
-/*
- * builtin-top.c
- *
- * Builtin top command: Display a continuously updated profile of
- * any workload, CPU or specific PID.
- *
- * Copyright (C) 2008, Red Hat Inc, Ingo Molnar <mingo@redhat.com>
- *		 2011, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
- *
- * Improvements and fixes by:
- *
- *   Arjan van de Ven <arjan@linux.intel.com>
- *   Yanmin Zhang <yanmin.zhang@intel.com>
- *   Wu Fengguang <fengguang.wu@intel.com>
- *   Mike Galbraith <efault@gmx.de>
- *   Paul Mackerras <paulus@samba.org>
- *
- * Released under the GPL v2. (and only v2, not any later version)
- */
-#include "builtin.h"
-
-#include "perf.h"
-
-#include "util/annotate.h"
-#include "util/cache.h"
-#include "util/color.h"
-#include "util/evlist.h"
-#include "util/evsel.h"
-#include "util/machine.h"
-#include "util/session.h"
-#include "util/symbol.h"
-#include "util/thread.h"
-#include "util/thread_map.h"
-#include "util/top.h"
-#include "util/util.h"
-#include <linux/rbtree.h>
-#include "util/parse-options.h"
-#include "util/parse-events.h"
-#include "util/cpumap.h"
-#include "util/xyarray.h"
-#include "util/sort.h"
-#include "util/intlist.h"
-#include "arch/common.h"
-
-#include "util/debug.h"
-
-#include <assert.h>
-#include <elf.h>
-#include <fcntl.h>
-
-#include <stdio.h>
-#include <termios.h>
-#include <unistd.h>
-#include <inttypes.h>
-
-#include <errno.h>
-#include <time.h>
-#include <sched.h>
-
-#include <sys/syscall.h>
-#include <sys/ioctl.h>
-#include <sys/poll.h>
-#include <sys/prctl.h>
-#include <sys/wait.h>
-#include <sys/uio.h>
-#include <sys/utsname.h>
-#include <sys/mman.h>
-
-#include <linux/unistd.h>
-#include <linux/types.h>
-
-static volatile int done;
-
-#define HEADER_LINE_NR  5
-
-static void perf_top__update_print_entries(struct perf_top *top)
-{
-	top->print_entries = top->winsize.ws_row - HEADER_LINE_NR;
-}
-
-static void perf_top__sig_winch(int sig __maybe_unused,
-				siginfo_t *info __maybe_unused, void *arg)
-{
-	struct perf_top *top = arg;
-
-	get_term_dimensions(&top->winsize);
-	perf_top__update_print_entries(top);
-}
-
-static int perf_top__parse_source(struct perf_top *top, struct hist_entry *he)
-{
-	struct symbol *sym;
-	struct annotation *notes;
-	struct map *map;
-	int err = -1;
-
-	if (!he || !he->ms.sym)
-		return -1;
-
-	sym = he->ms.sym;
-	map = he->ms.map;
-
-	/*
-	 * We can't annotate with just /proc/kallsyms
-	 */
-	if (map->dso->symtab_type == DSO_BINARY_TYPE__KALLSYMS &&
-	    !dso__is_kcore(map->dso)) {
-		pr_err("Can't annotate %s: No vmlinux file was found in the "
-		       "path\n", sym->name);
-		sleep(1);
-		return -1;
-	}
-
-	notes = symbol__annotation(sym);
-	if (notes->src != NULL) {
-		pthread_mutex_lock(&notes->lock);
-		goto out_assign;
-	}
-
-	pthread_mutex_lock(&notes->lock);
-
-	if (symbol__alloc_hist(sym) < 0) {
-		pthread_mutex_unlock(&notes->lock);
-		pr_err("Not enough memory for annotating '%s' symbol!\n",
-		       sym->name);
-		sleep(1);
-		return err;
-	}
-
-	err = symbol__annotate(sym, map, 0);
-	if (err == 0) {
-out_assign:
-		top->sym_filter_entry = he;
-	}
-
-	pthread_mutex_unlock(&notes->lock);
-	return err;
-}
-
-static void __zero_source_counters(struct hist_entry *he)
-{
-	struct symbol *sym = he->ms.sym;
-	symbol__annotate_zero_histograms(sym);
-}
-
-static void ui__warn_map_erange(struct map *map, struct symbol *sym, u64 ip)
-{
-	struct utsname uts;
-	int err = uname(&uts);
-
-	ui__warning("Out of bounds address found:\n\n"
-		    "Addr:   %" PRIx64 "\n"
-		    "DSO:    %s %c\n"
-		    "Map:    %" PRIx64 "-%" PRIx64 "\n"
-		    "Symbol: %" PRIx64 "-%" PRIx64 " %c %s\n"
-		    "Arch:   %s\n"
-		    "Kernel: %s\n"
-		    "Tools:  %s\n\n"
-		    "Not all samples will be on the annotation output.\n\n"
-		    "Please report to linux-kernel@vger.kernel.org\n",
-		    ip, map->dso->long_name, dso__symtab_origin(map->dso),
-		    map->start, map->end, sym->start, sym->end,
-		    sym->binding == STB_GLOBAL ? 'g' :
-		    sym->binding == STB_LOCAL  ? 'l' : 'w', sym->name,
-		    err ? "[unknown]" : uts.machine,
-		    err ? "[unknown]" : uts.release, perf_version_string);
-	if (use_browser <= 0)
-		sleep(5);
-	
-	map->erange_warned = true;
-}
-
-static void perf_top__record_precise_ip(struct perf_top *top,
-					struct hist_entry *he,
-					int counter, u64 ip)
-{
-	struct annotation *notes;
-	struct symbol *sym;
-	int err;
-
-	if (he == NULL || he->ms.sym == NULL ||
-	    ((top->sym_filter_entry == NULL ||
-	      top->sym_filter_entry->ms.sym != he->ms.sym) && use_browser != 1))
-		return;
-
-	sym = he->ms.sym;
-	notes = symbol__annotation(sym);
-
-	if (pthread_mutex_trylock(&notes->lock))
-		return;
-
-	if (notes->src == NULL && symbol__alloc_hist(sym) < 0) {
-		pthread_mutex_unlock(&notes->lock);
-		pr_err("Not enough memory for annotating '%s' symbol!\n",
-		       sym->name);
-		sleep(1);
-		return;
-	}
-
-	ip = he->ms.map->map_ip(he->ms.map, ip);
-	err = symbol__inc_addr_samples(sym, he->ms.map, counter, ip);
-
-	pthread_mutex_unlock(&notes->lock);
-
-	if (err == -ERANGE && !he->ms.map->erange_warned)
-		ui__warn_map_erange(he->ms.map, sym, ip);
-}
-
-static void perf_top__show_details(struct perf_top *top)
-{
-	struct hist_entry *he = top->sym_filter_entry;
-	struct annotation *notes;
-	struct symbol *symbol;
-	int more;
-
-	if (!he)
-		return;
-
-	symbol = he->ms.sym;
-	notes = symbol__annotation(symbol);
-
-	pthread_mutex_lock(&notes->lock);
-
-	if (notes->src == NULL)
-		goto out_unlock;
-
-	printf("Showing %s for %s\n", perf_evsel__name(top->sym_evsel), symbol->name);
-	printf("  Events  Pcnt (>=%d%%)\n", top->sym_pcnt_filter);
-
-	more = symbol__annotate_printf(symbol, he->ms.map, top->sym_evsel,
-				       0, top->sym_pcnt_filter, top->print_entries, 4);
-	if (top->zero)
-		symbol__annotate_zero_histogram(symbol, top->sym_evsel->idx);
-	else
-		symbol__annotate_decay_histogram(symbol, top->sym_evsel->idx);
-	if (more != 0)
-		printf("%d lines not displayed, maybe increase display entries [e]\n", more);
-out_unlock:
-	pthread_mutex_unlock(&notes->lock);
-}
-
-static struct hist_entry *perf_evsel__add_hist_entry(struct perf_evsel *evsel,
-						     struct addr_location *al,
-						     struct perf_sample *sample)
-{
-	struct hist_entry *he;
-
-	pthread_mutex_lock(&evsel->hists.lock);
-	he = __hists__add_entry(&evsel->hists, al, NULL, sample->period,
-				sample->weight);
-	pthread_mutex_unlock(&evsel->hists.lock);
-
-	if (he == NULL)
-		return NULL;
-
-	hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE);
-	return he;
-}
-
-static void perf_top__print_sym_table(struct perf_top *top)
-{
-	char bf[160];
-	int printed = 0;
-	const int win_width = top->winsize.ws_col - 1;
-
-	puts(CONSOLE_CLEAR);
-
-	perf_top__header_snprintf(top, bf, sizeof(bf));
-	printf("%s\n", bf);
-
-	perf_top__reset_sample_counters(top);
-
-	printf("%-*.*s\n", win_width, win_width, graph_dotted_line);
-
-	if (top->sym_evsel->hists.stats.nr_lost_warned !=
-	    top->sym_evsel->hists.stats.nr_events[PERF_RECORD_LOST]) {
-		top->sym_evsel->hists.stats.nr_lost_warned =
-			top->sym_evsel->hists.stats.nr_events[PERF_RECORD_LOST];
-		color_fprintf(stdout, PERF_COLOR_RED,
-			      "WARNING: LOST %d chunks, Check IO/CPU overload",
-			      top->sym_evsel->hists.stats.nr_lost_warned);
-		++printed;
-	}
-
-	if (top->sym_filter_entry) {
-		perf_top__show_details(top);
-		return;
-	}
-
-	hists__collapse_resort(&top->sym_evsel->hists);
-	hists__output_resort(&top->sym_evsel->hists);
-	hists__decay_entries(&top->sym_evsel->hists,
-			     top->hide_user_symbols,
-			     top->hide_kernel_symbols);
-	hists__output_recalc_col_len(&top->sym_evsel->hists,
-				     top->print_entries - printed);
-	putchar('\n');
-	hists__fprintf(&top->sym_evsel->hists, false,
-		       top->print_entries - printed, win_width,
-		       top->min_percent, stdout);
-}
-
-static void prompt_integer(int *target, const char *msg)
-{
-	char *buf = malloc(0), *p;
-	size_t dummy = 0;
-	int tmp;
-
-	fprintf(stdout, "\n%s: ", msg);
-	if (getline(&buf, &dummy, stdin) < 0)
-		return;
-
-	p = strchr(buf, '\n');
-	if (p)
-		*p = 0;
-
-	p = buf;
-	while(*p) {
-		if (!isdigit(*p))
-			goto out_free;
-		p++;
-	}
-	tmp = strtoul(buf, NULL, 10);
-	*target = tmp;
-out_free:
-	free(buf);
-}
-
-static void prompt_percent(int *target, const char *msg)
-{
-	int tmp = 0;
-
-	prompt_integer(&tmp, msg);
-	if (tmp >= 0 && tmp <= 100)
-		*target = tmp;
-}
-
-static void perf_top__prompt_symbol(struct perf_top *top, const char *msg)
-{
-	char *buf = malloc(0), *p;
-	struct hist_entry *syme = top->sym_filter_entry, *n, *found = NULL;
-	struct rb_node *next;
-	size_t dummy = 0;
-
-	/* zero counters of active symbol */
-	if (syme) {
-		__zero_source_counters(syme);
-		top->sym_filter_entry = NULL;
-	}
-
-	fprintf(stdout, "\n%s: ", msg);
-	if (getline(&buf, &dummy, stdin) < 0)
-		goto out_free;
-
-	p = strchr(buf, '\n');
-	if (p)
-		*p = 0;
-
-	next = rb_first(&top->sym_evsel->hists.entries);
-	while (next) {
-		n = rb_entry(next, struct hist_entry, rb_node);
-		if (n->ms.sym && !strcmp(buf, n->ms.sym->name)) {
-			found = n;
-			break;
-		}
-		next = rb_next(&n->rb_node);
-	}
-
-	if (!found) {
-		fprintf(stderr, "Sorry, %s is not active.\n", buf);
-		sleep(1);
-	} else
-		perf_top__parse_source(top, found);
-
-out_free:
-	free(buf);
-}
-
-static void perf_top__print_mapped_keys(struct perf_top *top)
-{
-	char *name = NULL;
-
-	if (top->sym_filter_entry) {
-		struct symbol *sym = top->sym_filter_entry->ms.sym;
-		name = sym->name;
-	}
-
-	fprintf(stdout, "\nMapped keys:\n");
-	fprintf(stdout, "\t[d]     display refresh delay.             \t(%d)\n", top->delay_secs);
-	fprintf(stdout, "\t[e]     display entries (lines).           \t(%d)\n", top->print_entries);
-
-	if (top->evlist->nr_entries > 1)
-		fprintf(stdout, "\t[E]     active event counter.              \t(%s)\n", perf_evsel__name(top->sym_evsel));
-
-	fprintf(stdout, "\t[f]     profile display filter (count).    \t(%d)\n", top->count_filter);
-
-	fprintf(stdout, "\t[F]     annotate display filter (percent). \t(%d%%)\n", top->sym_pcnt_filter);
-	fprintf(stdout, "\t[s]     annotate symbol.                   \t(%s)\n", name?: "NULL");
-	fprintf(stdout, "\t[S]     stop annotation.\n");
-
-	fprintf(stdout,
-		"\t[K]     hide kernel_symbols symbols.     \t(%s)\n",
-		top->hide_kernel_symbols ? "yes" : "no");
-	fprintf(stdout,
-		"\t[U]     hide user symbols.               \t(%s)\n",
-		top->hide_user_symbols ? "yes" : "no");
-	fprintf(stdout, "\t[z]     toggle sample zeroing.             \t(%d)\n", top->zero ? 1 : 0);
-	fprintf(stdout, "\t[qQ]    quit.\n");
-}
-
-static int perf_top__key_mapped(struct perf_top *top, int c)
-{
-	switch (c) {
-		case 'd':
-		case 'e':
-		case 'f':
-		case 'z':
-		case 'q':
-		case 'Q':
-		case 'K':
-		case 'U':
-		case 'F':
-		case 's':
-		case 'S':
-			return 1;
-		case 'E':
-			return top->evlist->nr_entries > 1 ? 1 : 0;
-		default:
-			break;
-	}
-
-	return 0;
-}
-
-static bool perf_top__handle_keypress(struct perf_top *top, int c)
-{
-	bool ret = true;
-
-	if (!perf_top__key_mapped(top, c)) {
-		struct pollfd stdin_poll = { .fd = 0, .events = POLLIN };
-		struct termios tc, save;
-
-		perf_top__print_mapped_keys(top);
-		fprintf(stdout, "\nEnter selection, or unmapped key to continue: ");
-		fflush(stdout);
-
-		tcgetattr(0, &save);
-		tc = save;
-		tc.c_lflag &= ~(ICANON | ECHO);
-		tc.c_cc[VMIN] = 0;
-		tc.c_cc[VTIME] = 0;
-		tcsetattr(0, TCSANOW, &tc);
-
-		poll(&stdin_poll, 1, -1);
-		c = getc(stdin);
-
-		tcsetattr(0, TCSAFLUSH, &save);
-		if (!perf_top__key_mapped(top, c))
-			return ret;
-	}
-
-	switch (c) {
-		case 'd':
-			prompt_integer(&top->delay_secs, "Enter display delay");
-			if (top->delay_secs < 1)
-				top->delay_secs = 1;
-			break;
-		case 'e':
-			prompt_integer(&top->print_entries, "Enter display entries (lines)");
-			if (top->print_entries == 0) {
-				struct sigaction act = {
-					.sa_sigaction = perf_top__sig_winch,
-					.sa_flags     = SA_SIGINFO,
-				};
-				perf_top__sig_winch(SIGWINCH, NULL, top);
-				sigaction(SIGWINCH, &act, NULL);
-			} else {
-				signal(SIGWINCH, SIG_DFL);
-			}
-			break;
-		case 'E':
-			if (top->evlist->nr_entries > 1) {
-				/* Select 0 as the default event: */
-				int counter = 0;
-
-				fprintf(stderr, "\nAvailable events:");
-
-				list_for_each_entry(top->sym_evsel, &top->evlist->entries, node)
-					fprintf(stderr, "\n\t%d %s", top->sym_evsel->idx, perf_evsel__name(top->sym_evsel));
-
-				prompt_integer(&counter, "Enter details event counter");
-
-				if (counter >= top->evlist->nr_entries) {
-					top->sym_evsel = perf_evlist__first(top->evlist);
-					fprintf(stderr, "Sorry, no such event, using %s.\n", perf_evsel__name(top->sym_evsel));
-					sleep(1);
-					break;
-				}
-				list_for_each_entry(top->sym_evsel, &top->evlist->entries, node)
-					if (top->sym_evsel->idx == counter)
-						break;
-			} else
-				top->sym_evsel = perf_evlist__first(top->evlist);
-			break;
-		case 'f':
-			prompt_integer(&top->count_filter, "Enter display event count filter");
-			break;
-		case 'F':
-			prompt_percent(&top->sym_pcnt_filter,
-				       "Enter details display event filter (percent)");
-			break;
-		case 'K':
-			top->hide_kernel_symbols = !top->hide_kernel_symbols;
-			break;
-		case 'q':
-		case 'Q':
-			printf("exiting.\n");
-			if (top->dump_symtab)
-				perf_session__fprintf_dsos(top->session, stderr);
-			ret = false;
-			break;
-		case 's':
-			perf_top__prompt_symbol(top, "Enter details symbol");
-			break;
-		case 'S':
-			if (!top->sym_filter_entry)
-				break;
-			else {
-				struct hist_entry *syme = top->sym_filter_entry;
-
-				top->sym_filter_entry = NULL;
-				__zero_source_counters(syme);
-			}
-			break;
-		case 'U':
-			top->hide_user_symbols = !top->hide_user_symbols;
-			break;
-		case 'z':
-			top->zero = !top->zero;
-			break;
-		default:
-			break;
-	}
-
-	return ret;
-}
-
-static void perf_top__sort_new_samples(void *arg)
-{
-	struct perf_top *t = arg;
-	perf_top__reset_sample_counters(t);
-
-	if (t->evlist->selected != NULL)
-		t->sym_evsel = t->evlist->selected;
-
-	hists__collapse_resort(&t->sym_evsel->hists);
-	hists__output_resort(&t->sym_evsel->hists);
-	hists__decay_entries(&t->sym_evsel->hists,
-			     t->hide_user_symbols,
-			     t->hide_kernel_symbols);
-}
-
-static void *display_thread_tui(void *arg)
-{
-	struct perf_evsel *pos;
-	struct perf_top *top = arg;
-	const char *help = "For a higher level overview, try: perf top --sort comm,dso";
-	struct hist_browser_timer hbt = {
-		.timer		= perf_top__sort_new_samples,
-		.arg		= top,
-		.refresh	= top->delay_secs,
-	};
-
-	perf_top__sort_new_samples(top);
-
-	/*
-	 * Initialize the uid_filter_str, in the future the TUI will allow
-	 * Zooming in/out UIDs. For now juse use whatever the user passed
-	 * via --uid.
-	 */
-	list_for_each_entry(pos, &top->evlist->entries, node)
-		pos->hists.uid_filter_str = top->record_opts.target.uid_str;
-
-	perf_evlist__tui_browse_hists(top->evlist, help, &hbt, top->min_percent,
-				      &top->session->header.env);
-
-	done = 1;
-	return NULL;
-}
-
-static void *display_thread(void *arg)
-{
-	struct pollfd stdin_poll = { .fd = 0, .events = POLLIN };
-	struct termios tc, save;
-	struct perf_top *top = arg;
-	int delay_msecs, c;
-
-	tcgetattr(0, &save);
-	tc = save;
-	tc.c_lflag &= ~(ICANON | ECHO);
-	tc.c_cc[VMIN] = 0;
-	tc.c_cc[VTIME] = 0;
-
-	pthread__unblock_sigwinch();
-repeat:
-	delay_msecs = top->delay_secs * 1000;
-	tcsetattr(0, TCSANOW, &tc);
-	/* trash return*/
-	getc(stdin);
-
-	while (!done) {
-		perf_top__print_sym_table(top);
-		/*
-		 * Either timeout expired or we got an EINTR due to SIGWINCH,
-		 * refresh screen in both cases.
-		 */
-		switch (poll(&stdin_poll, 1, delay_msecs)) {
-		case 0:
-			continue;
-		case -1:
-			if (errno == EINTR)
-				continue;
-			/* Fall trhu */
-		default:
-			c = getc(stdin);
-			tcsetattr(0, TCSAFLUSH, &save);
-
-			if (perf_top__handle_keypress(top, c))
-				goto repeat;
-			done = 1;
-		}
-	}
-
-	return NULL;
-}
-
-/* Tag samples to be skipped. */
-static const char *skip_symbols[] = {
-	"intel_idle",
-	"default_idle",
-	"native_safe_halt",
-	"cpu_idle",
-	"enter_idle",
-	"exit_idle",
-	"mwait_idle",
-	"mwait_idle_with_hints",
-	"poll_idle",
-	"ppc64_runlatch_off",
-	"pseries_dedicated_idle_sleep",
-	NULL
-};
-
-static int symbol_filter(struct map *map __maybe_unused, struct symbol *sym)
-{
-	const char *name = sym->name;
-	int i;
-
-	/*
-	 * ppc64 uses function descriptors and appends a '.' to the
-	 * start of every instruction address. Remove it.
-	 */
-	if (name[0] == '.')
-		name++;
-
-	if (!strcmp(name, "_text") ||
-	    !strcmp(name, "_etext") ||
-	    !strcmp(name, "_sinittext") ||
-	    !strncmp("init_module", name, 11) ||
-	    !strncmp("cleanup_module", name, 14) ||
-	    strstr(name, "_text_start") ||
-	    strstr(name, "_text_end"))
-		return 1;
-
-	for (i = 0; skip_symbols[i]; i++) {
-		if (!strcmp(skip_symbols[i], name)) {
-			sym->ignore = true;
-			break;
-		}
-	}
-
-	return 0;
-}
-
-static void perf_event__process_sample(struct perf_tool *tool,
-				       const union perf_event *event,
-				       struct perf_evsel *evsel,
-				       struct perf_sample *sample,
-				       struct machine *machine)
-{
-	struct perf_top *top = container_of(tool, struct perf_top, tool);
-	struct symbol *parent = NULL;
-	u64 ip = sample->ip;
-	struct addr_location al;
-	int err;
-
-	if (!machine && perf_guest) {
-		static struct intlist *seen;
-
-		if (!seen)
-			seen = intlist__new(NULL);
-
-		if (!intlist__has_entry(seen, sample->pid)) {
-			pr_err("Can't find guest [%d]'s kernel information\n",
-				sample->pid);
-			intlist__add(seen, sample->pid);
-		}
-		return;
-	}
-
-	if (!machine) {
-		pr_err("%u unprocessable samples recorded.\r",
-		       top->session->stats.nr_unprocessable_samples++);
-		return;
-	}
-
-	if (event->header.misc & PERF_RECORD_MISC_EXACT_IP)
-		top->exact_samples++;
-
-	if (perf_event__preprocess_sample(event, machine, &al, sample) < 0 ||
-	    al.filtered)
-		return;
-
-	if (!top->kptr_restrict_warned &&
-	    symbol_conf.kptr_restrict &&
-	    al.cpumode == PERF_RECORD_MISC_KERNEL) {
-		ui__warning(
-"Kernel address maps (/proc/{kallsyms,modules}) are restricted.\n\n"
-"Check /proc/sys/kernel/kptr_restrict.\n\n"
-"Kernel%s samples will not be resolved.\n",
-			  !RB_EMPTY_ROOT(&al.map->dso->symbols[MAP__FUNCTION]) ?
-			  " modules" : "");
-		if (use_browser <= 0)
-			sleep(5);
-		top->kptr_restrict_warned = true;
-	}
-
-	if (al.sym == NULL) {
-		const char *msg = "Kernel samples will not be resolved.\n";
-		/*
-		 * As we do lazy loading of symtabs we only will know if the
-		 * specified vmlinux file is invalid when we actually have a
-		 * hit in kernel space and then try to load it. So if we get
-		 * here and there are _no_ symbols in the DSO backing the
-		 * kernel map, bail out.
-		 *
-		 * We may never get here, for instance, if we use -K/
-		 * --hide-kernel-symbols, even if the user specifies an
-		 * invalid --vmlinux ;-)
-		 */
-		if (!top->kptr_restrict_warned && !top->vmlinux_warned &&
-		    al.map == machine->vmlinux_maps[MAP__FUNCTION] &&
-		    RB_EMPTY_ROOT(&al.map->dso->symbols[MAP__FUNCTION])) {
-			if (symbol_conf.vmlinux_name) {
-				ui__warning("The %s file can't be used.\n%s",
-					    symbol_conf.vmlinux_name, msg);
-			} else {
-				ui__warning("A vmlinux file was not found.\n%s",
-					    msg);
-			}
-
-			if (use_browser <= 0)
-				sleep(5);
-			top->vmlinux_warned = true;
-		}
-	}
-
-	if (al.sym == NULL || !al.sym->ignore) {
-		struct hist_entry *he;
-
-		if ((sort__has_parent || symbol_conf.use_callchain) &&
-		    sample->callchain) {
-			err = machine__resolve_callchain(machine, evsel,
-							 al.thread, sample,
-							 &parent, &al);
-			if (err)
-				return;
-		}
-
-		he = perf_evsel__add_hist_entry(evsel, &al, sample);
-		if (he == NULL) {
-			pr_err("Problem incrementing symbol period, skipping event\n");
-			return;
-		}
-
-		if (symbol_conf.use_callchain) {
-			err = callchain_append(he->callchain, &callchain_cursor,
-					       sample->period);
-			if (err)
-				return;
-		}
-
-		if (sort__has_sym)
-			perf_top__record_precise_ip(top, he, evsel->idx, ip);
-	}
-
-	return;
-}
-
-static void perf_top__mmap_read_idx(struct perf_top *top, int idx)
-{
-	struct perf_sample sample;
-	struct perf_evsel *evsel;
-	struct perf_session *session = top->session;
-	union perf_event *event;
-	struct machine *machine;
-	u8 origin;
-	int ret;
-
-	while ((event = perf_evlist__mmap_read(top->evlist, idx)) != NULL) {
-		ret = perf_evlist__parse_sample(top->evlist, event, &sample);
-		if (ret) {
-			pr_err("Can't parse sample, err = %d\n", ret);
-			goto next_event;
-		}
-
-		evsel = perf_evlist__id2evsel(session->evlist, sample.id);
-		assert(evsel != NULL);
-
-		origin = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
-
-		if (event->header.type == PERF_RECORD_SAMPLE)
-			++top->samples;
-
-		switch (origin) {
-		case PERF_RECORD_MISC_USER:
-			++top->us_samples;
-			if (top->hide_user_symbols)
-				goto next_event;
-			machine = &session->machines.host;
-			break;
-		case PERF_RECORD_MISC_KERNEL:
-			++top->kernel_samples;
-			if (top->hide_kernel_symbols)
-				goto next_event;
-			machine = &session->machines.host;
-			break;
-		case PERF_RECORD_MISC_GUEST_KERNEL:
-			++top->guest_kernel_samples;
-			machine = perf_session__find_machine(session,
-							     sample.pid);
-			break;
-		case PERF_RECORD_MISC_GUEST_USER:
-			++top->guest_us_samples;
-			/*
-			 * TODO: we don't process guest user from host side
-			 * except simple counting.
-			 */
-			/* Fall thru */
-		default:
-			goto next_event;
-		}
-
-
-		if (event->header.type == PERF_RECORD_SAMPLE) {
-			perf_event__process_sample(&top->tool, event, evsel,
-						   &sample, machine);
-		} else if (event->header.type < PERF_RECORD_MAX) {
-			hists__inc_nr_events(&evsel->hists, event->header.type);
-			machine__process_event(machine, event);
-		} else
-			++session->stats.nr_unknown_events;
-next_event:
-		perf_evlist__mmap_consume(top->evlist, idx);
-	}
-}
-
-static void perf_top__mmap_read(struct perf_top *top)
-{
-	int i;
-
-	for (i = 0; i < top->evlist->nr_mmaps; i++)
-		perf_top__mmap_read_idx(top, i);
-}
-
-static int perf_top__start_counters(struct perf_top *top)
-{
-	char msg[512];
-	struct perf_evsel *counter;
-	struct perf_evlist *evlist = top->evlist;
-	struct perf_record_opts *opts = &top->record_opts;
-
-	perf_evlist__config(evlist, opts);
-
-	list_for_each_entry(counter, &evlist->entries, node) {
-try_again:
-		if (perf_evsel__open(counter, top->evlist->cpus,
-				     top->evlist->threads) < 0) {
-			if (perf_evsel__fallback(counter, errno, msg, sizeof(msg))) {
-				if (verbose)
-					ui__warning("%s\n", msg);
-				goto try_again;
-			}
-
-			perf_evsel__open_strerror(counter, &opts->target,
-						  errno, msg, sizeof(msg));
-			ui__error("%s\n", msg);
-			goto out_err;
-		}
-	}
-
-	if (perf_evlist__mmap(evlist, opts->mmap_pages, false) < 0) {
-		ui__error("Failed to mmap with %d (%s)\n",
-			    errno, strerror(errno));
-		goto out_err;
-	}
-
-	return 0;
-
-out_err:
-	return -1;
-}
-
-static int perf_top__setup_sample_type(struct perf_top *top __maybe_unused)
-{
-	if (!sort__has_sym) {
-		if (symbol_conf.use_callchain) {
-			ui__error("Selected -g but \"sym\" not present in --sort/-s.");
-			return -EINVAL;
-		}
-	} else if (callchain_param.mode != CHAIN_NONE) {
-		if (callchain_register_param(&callchain_param) < 0) {
-			ui__error("Can't register callchain params.\n");
-			return -EINVAL;
-		}
-	}
-
-	return 0;
-}
-
-static int __cmd_top(struct perf_top *top)
-{
-	struct perf_record_opts *opts = &top->record_opts;
-	pthread_t thread;
-	int ret;
-	/*
-	 * FIXME: perf_session__new should allow passing a O_MMAP, so that all this
-	 * mmap reading, etc is encapsulated in it. Use O_WRONLY for now.
-	 */
-	top->session = perf_session__new(NULL, O_WRONLY, false, false, NULL);
-	if (top->session == NULL)
-		return -ENOMEM;
-
-	machines__set_symbol_filter(&top->session->machines, symbol_filter);
-
-	if (!objdump_path) {
-		ret = perf_session_env__lookup_objdump(&top->session->header.env);
-		if (ret)
-			goto out_delete;
-	}
-
-	ret = perf_top__setup_sample_type(top);
-	if (ret)
-		goto out_delete;
-
-	if (perf_target__has_task(&opts->target))
-		perf_event__synthesize_thread_map(&top->tool, top->evlist->threads,
-						  perf_event__process,
-						  &top->session->machines.host);
-	else
-		perf_event__synthesize_threads(&top->tool, perf_event__process,
-					       &top->session->machines.host);
-
-	ret = perf_top__start_counters(top);
-	if (ret)
-		goto out_delete;
-
-	top->session->evlist = top->evlist;
-	perf_session__set_id_hdr_size(top->session);
-
-	/*
-	 * When perf is starting the traced process, all the events (apart from
-	 * group members) have enable_on_exec=1 set, so don't spoil it by
-	 * prematurely enabling them.
-	 *
-	 * XXX 'top' still doesn't start workloads like record, trace, but should,
-	 * so leave the check here.
-	 */
-        if (!perf_target__none(&opts->target))
-                perf_evlist__enable(top->evlist);
-
-	/* Wait for a minimal set of events before starting the snapshot */
-	poll(top->evlist->pollfd, top->evlist->nr_fds, 100);
-
-	perf_top__mmap_read(top);
-
-	ret = -1;
-	if (pthread_create(&thread, NULL, (use_browser > 0 ? display_thread_tui :
-							    display_thread), top)) {
-		ui__error("Could not create display thread.\n");
-		goto out_delete;
-	}
-
-	if (top->realtime_prio) {
-		struct sched_param param;
-
-		param.sched_priority = top->realtime_prio;
-		if (sched_setscheduler(0, SCHED_FIFO, &param)) {
-			ui__error("Could not set realtime priority.\n");
-			goto out_delete;
-		}
-	}
-
-	while (!done) {
-		u64 hits = top->samples;
-
-		perf_top__mmap_read(top);
-
-		if (hits == top->samples)
-			ret = poll(top->evlist->pollfd, top->evlist->nr_fds, 100);
-	}
-
-	ret = 0;
-out_delete:
-	perf_session__delete(top->session);
-	top->session = NULL;
-
-	return ret;
-}
-
-static int
-callchain_opt(const struct option *opt, const char *arg, int unset)
-{
-	symbol_conf.use_callchain = true;
-	return record_callchain_opt(opt, arg, unset);
-}
-
-static int
-parse_callchain_opt(const struct option *opt, const char *arg, int unset)
-{
-	symbol_conf.use_callchain = true;
-	return record_parse_callchain_opt(opt, arg, unset);
-}
-
-static int
-parse_percent_limit(const struct option *opt, const char *arg,
-		    int unset __maybe_unused)
-{
-	struct perf_top *top = opt->value;
-
-	top->min_percent = strtof(arg, NULL);
-	return 0;
-}
-
-int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	int status;
-	char errbuf[BUFSIZ];
-	struct perf_top top = {
-		.count_filter	     = 5,
-		.delay_secs	     = 2,
-		.record_opts = {
-			.mmap_pages	= UINT_MAX,
-			.user_freq	= UINT_MAX,
-			.user_interval	= ULLONG_MAX,
-			.freq		= 4000, /* 4 KHz */
-			.target		     = {
-				.uses_mmap   = true,
-			},
-		},
-		.sym_pcnt_filter     = 5,
-	};
-	struct perf_record_opts *opts = &top.record_opts;
-	struct perf_target *target = &opts->target;
-	const struct option options[] = {
-	OPT_CALLBACK('e', "event", &top.evlist, "event",
-		     "event selector. use 'perf list' to list available events",
-		     parse_events_option),
-	OPT_U64('c', "count", &opts->user_interval, "event period to sample"),
-	OPT_STRING('p', "pid", &target->pid, "pid",
-		    "profile events on existing process id"),
-	OPT_STRING('t', "tid", &target->tid, "tid",
-		    "profile events on existing thread id"),
-	OPT_BOOLEAN('a', "all-cpus", &target->system_wide,
-			    "system-wide collection from all CPUs"),
-	OPT_STRING('C', "cpu", &target->cpu_list, "cpu",
-		    "list of cpus to monitor"),
-	OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
-		   "file", "vmlinux pathname"),
-	OPT_BOOLEAN('K', "hide_kernel_symbols", &top.hide_kernel_symbols,
-		    "hide kernel symbols"),
-	OPT_UINTEGER('m', "mmap-pages", &opts->mmap_pages,
-		     "number of mmap data pages"),
-	OPT_INTEGER('r', "realtime", &top.realtime_prio,
-		    "collect data with this RT SCHED_FIFO priority"),
-	OPT_INTEGER('d', "delay", &top.delay_secs,
-		    "number of seconds to delay between refreshes"),
-	OPT_BOOLEAN('D', "dump-symtab", &top.dump_symtab,
-			    "dump the symbol table used for profiling"),
-	OPT_INTEGER('f', "count-filter", &top.count_filter,
-		    "only display functions with more events than this"),
-	OPT_BOOLEAN('g', "group", &opts->group,
-			    "put the counters into a counter group"),
-	OPT_BOOLEAN('i', "no-inherit", &opts->no_inherit,
-		    "child tasks do not inherit counters"),
-	OPT_STRING(0, "sym-annotate", &top.sym_filter, "symbol name",
-		    "symbol to annotate"),
-	OPT_BOOLEAN('z', "zero", &top.zero, "zero history across updates"),
-	OPT_UINTEGER('F', "freq", &opts->user_freq, "profile at this frequency"),
-	OPT_INTEGER('E', "entries", &top.print_entries,
-		    "display this many functions"),
-	OPT_BOOLEAN('U', "hide_user_symbols", &top.hide_user_symbols,
-		    "hide user symbols"),
-	OPT_BOOLEAN(0, "tui", &top.use_tui, "Use the TUI interface"),
-	OPT_BOOLEAN(0, "stdio", &top.use_stdio, "Use the stdio interface"),
-	OPT_INCR('v', "verbose", &verbose,
-		    "be more verbose (show counter open errors, etc)"),
-	OPT_STRING('s', "sort", &sort_order, "key[,key2...]",
-		   "sort by key(s): pid, comm, dso, symbol, parent, weight, local_weight"),
-	OPT_BOOLEAN('n', "show-nr-samples", &symbol_conf.show_nr_samples,
-		    "Show a column with the number of samples"),
-	OPT_CALLBACK_NOOPT('G', NULL, &top.record_opts,
-			   NULL, "enables call-graph recording",
-			   &callchain_opt),
-	OPT_CALLBACK(0, "call-graph", &top.record_opts,
-		     "mode[,dump_size]", record_callchain_help,
-		     &parse_callchain_opt),
-	OPT_CALLBACK(0, "ignore-callees", NULL, "regex",
-		   "ignore callees of these functions in call graphs",
-		   report_parse_ignore_callees_opt),
-	OPT_BOOLEAN(0, "show-total-period", &symbol_conf.show_total_period,
-		    "Show a column with the sum of periods"),
-	OPT_STRING(0, "dsos", &symbol_conf.dso_list_str, "dso[,dso...]",
-		   "only consider symbols in these dsos"),
-	OPT_STRING(0, "comms", &symbol_conf.comm_list_str, "comm[,comm...]",
-		   "only consider symbols in these comms"),
-	OPT_STRING(0, "symbols", &symbol_conf.sym_list_str, "symbol[,symbol...]",
-		   "only consider these symbols"),
-	OPT_BOOLEAN(0, "source", &symbol_conf.annotate_src,
-		    "Interleave source code with assembly code (default)"),
-	OPT_BOOLEAN(0, "asm-raw", &symbol_conf.annotate_asm_raw,
-		    "Display raw encoding of assembly instructions (default)"),
-	OPT_STRING(0, "objdump", &objdump_path, "path",
-		    "objdump binary to use for disassembly and annotations"),
-	OPT_STRING('M', "disassembler-style", &disassembler_style, "disassembler style",
-		   "Specify disassembler style (e.g. -M intel for intel syntax)"),
-	OPT_STRING('u', "uid", &target->uid_str, "user", "user to profile"),
-	OPT_CALLBACK(0, "percent-limit", &top, "percent",
-		     "Don't show entries under that percent", parse_percent_limit),
-	OPT_END()
-	};
-	const char * const top_usage[] = {
-		"perf top [<options>]",
-		NULL
-	};
-
-	top.evlist = perf_evlist__new();
-	if (top.evlist == NULL)
-		return -ENOMEM;
-
-	argc = parse_options(argc, argv, options, top_usage, 0);
-	if (argc)
-		usage_with_options(top_usage, options);
-
-	if (sort_order == default_sort_order)
-		sort_order = "dso,symbol";
-
-	if (setup_sorting() < 0)
-		usage_with_options(top_usage, options);
-
-	/* display thread wants entries to be collapsed in a different tree */
-	sort__need_collapse = 1;
-
-	if (top.use_stdio)
-		use_browser = 0;
-	else if (top.use_tui)
-		use_browser = 1;
-
-	setup_browser(false);
-
-	status = perf_target__validate(target);
-	if (status) {
-		perf_target__strerror(target, status, errbuf, BUFSIZ);
-		ui__warning("%s", errbuf);
-	}
-
-	status = perf_target__parse_uid(target);
-	if (status) {
-		int saved_errno = errno;
-
-		perf_target__strerror(target, status, errbuf, BUFSIZ);
-		ui__error("%s", errbuf);
-
-		status = -saved_errno;
-		goto out_delete_evlist;
-	}
-
-	if (perf_target__none(target))
-		target->system_wide = true;
-
-	if (perf_evlist__create_maps(top.evlist, target) < 0)
-		usage_with_options(top_usage, options);
-
-	if (!top.evlist->nr_entries &&
-	    perf_evlist__add_default(top.evlist) < 0) {
-		ui__error("Not enough memory for event selector list\n");
-		goto out_delete_maps;
-	}
-
-	symbol_conf.nr_events = top.evlist->nr_entries;
-
-	if (top.delay_secs < 1)
-		top.delay_secs = 1;
-
-	if (opts->user_interval != ULLONG_MAX)
-		opts->default_interval = opts->user_interval;
-	if (opts->user_freq != UINT_MAX)
-		opts->freq = opts->user_freq;
-
-	/*
-	 * User specified count overrides default frequency.
-	 */
-	if (opts->default_interval)
-		opts->freq = 0;
-	else if (opts->freq) {
-		opts->default_interval = opts->freq;
-	} else {
-		ui__error("frequency and count are zero, aborting\n");
-		status = -EINVAL;
-		goto out_delete_maps;
-	}
-
-	top.sym_evsel = perf_evlist__first(top.evlist);
-
-	symbol_conf.priv_size = sizeof(struct annotation);
-
-	symbol_conf.try_vmlinux_path = (symbol_conf.vmlinux_name == NULL);
-	if (symbol__init() < 0)
-		return -1;
-
-	sort__setup_elide(stdout);
-
-	get_term_dimensions(&top.winsize);
-	if (top.print_entries == 0) {
-		struct sigaction act = {
-			.sa_sigaction = perf_top__sig_winch,
-			.sa_flags     = SA_SIGINFO,
-		};
-		perf_top__update_print_entries(&top);
-		sigaction(SIGWINCH, &act, NULL);
-	}
-
-	status = __cmd_top(&top);
-
-out_delete_maps:
-	perf_evlist__delete_maps(top.evlist);
-out_delete_evlist:
-	perf_evlist__delete(top.evlist);
-
-	return status;
-}
diff --git a/src/tools/perf/builtin-trace.c b/src/tools/perf/builtin-trace.c
deleted file mode 100644
index 99c8d9a..0000000
--- a/src/tools/perf/builtin-trace.c
+++ /dev/null
@@ -1,1293 +0,0 @@
-#include <traceevent/event-parse.h>
-#include "builtin.h"
-#include "util/color.h"
-#include "util/debug.h"
-#include "util/evlist.h"
-#include "util/machine.h"
-#include "util/session.h"
-#include "util/thread.h"
-#include "util/parse-options.h"
-#include "util/strlist.h"
-#include "util/intlist.h"
-#include "util/thread_map.h"
-
-#include <libaudit.h>
-#include <stdlib.h>
-#include <sys/mman.h>
-#include <linux/futex.h>
-
-/* For older distros: */
-#ifndef MAP_STACK
-# define MAP_STACK		0x20000
-#endif
-
-#ifndef MADV_HWPOISON
-# define MADV_HWPOISON		100
-#endif
-
-#ifndef MADV_MERGEABLE
-# define MADV_MERGEABLE		12
-#endif
-
-#ifndef MADV_UNMERGEABLE
-# define MADV_UNMERGEABLE	13
-#endif
-
-static size_t syscall_arg__scnprintf_hex(char *bf, size_t size,
-					 unsigned long arg,
-					 u8 arg_idx __maybe_unused,
-					 u8 *arg_mask __maybe_unused)
-{
-	return scnprintf(bf, size, "%#lx", arg);
-}
-
-#define SCA_HEX syscall_arg__scnprintf_hex
-
-static size_t syscall_arg__scnprintf_whence(char *bf, size_t size,
-					    unsigned long arg,
-					    u8 arg_idx __maybe_unused,
-					    u8 *arg_mask __maybe_unused)
-{
-	int whence = arg;
-
-	switch (whence) {
-#define P_WHENCE(n) case SEEK_##n: return scnprintf(bf, size, #n)
-	P_WHENCE(SET);
-	P_WHENCE(CUR);
-	P_WHENCE(END);
-#ifdef SEEK_DATA
-	P_WHENCE(DATA);
-#endif
-#ifdef SEEK_HOLE
-	P_WHENCE(HOLE);
-#endif
-#undef P_WHENCE
-	default: break;
-	}
-
-	return scnprintf(bf, size, "%#x", whence);
-}
-
-#define SCA_WHENCE syscall_arg__scnprintf_whence
-
-static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size,
-					       unsigned long arg,
-					       u8 arg_idx __maybe_unused,
-					       u8 *arg_mask __maybe_unused)
-{
-	int printed = 0, prot = arg;
-
-	if (prot == PROT_NONE)
-		return scnprintf(bf, size, "NONE");
-#define	P_MMAP_PROT(n) \
-	if (prot & PROT_##n) { \
-		printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
-		prot &= ~PROT_##n; \
-	}
-
-	P_MMAP_PROT(EXEC);
-	P_MMAP_PROT(READ);
-	P_MMAP_PROT(WRITE);
-#ifdef PROT_SEM
-	P_MMAP_PROT(SEM);
-#endif
-	P_MMAP_PROT(GROWSDOWN);
-	P_MMAP_PROT(GROWSUP);
-#undef P_MMAP_PROT
-
-	if (prot)
-		printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", prot);
-
-	return printed;
-}
-
-#define SCA_MMAP_PROT syscall_arg__scnprintf_mmap_prot
-
-static size_t syscall_arg__scnprintf_mmap_flags(char *bf, size_t size,
-						unsigned long arg, u8 arg_idx __maybe_unused,
-						u8 *arg_mask __maybe_unused)
-{
-	int printed = 0, flags = arg;
-
-#define	P_MMAP_FLAG(n) \
-	if (flags & MAP_##n) { \
-		printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
-		flags &= ~MAP_##n; \
-	}
-
-	P_MMAP_FLAG(SHARED);
-	P_MMAP_FLAG(PRIVATE);
-#ifdef MAP_32BIT
-	P_MMAP_FLAG(32BIT);
-#endif
-	P_MMAP_FLAG(ANONYMOUS);
-	P_MMAP_FLAG(DENYWRITE);
-	P_MMAP_FLAG(EXECUTABLE);
-	P_MMAP_FLAG(FILE);
-	P_MMAP_FLAG(FIXED);
-	P_MMAP_FLAG(GROWSDOWN);
-#ifdef MAP_HUGETLB
-	P_MMAP_FLAG(HUGETLB);
-#endif
-	P_MMAP_FLAG(LOCKED);
-	P_MMAP_FLAG(NONBLOCK);
-	P_MMAP_FLAG(NORESERVE);
-	P_MMAP_FLAG(POPULATE);
-	P_MMAP_FLAG(STACK);
-#ifdef MAP_UNINITIALIZED
-	P_MMAP_FLAG(UNINITIALIZED);
-#endif
-#undef P_MMAP_FLAG
-
-	if (flags)
-		printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
-
-	return printed;
-}
-
-#define SCA_MMAP_FLAGS syscall_arg__scnprintf_mmap_flags
-
-static size_t syscall_arg__scnprintf_madvise_behavior(char *bf, size_t size,
-						      unsigned long arg, u8 arg_idx __maybe_unused,
-						      u8 *arg_mask __maybe_unused)
-{
-	int behavior = arg;
-
-	switch (behavior) {
-#define	P_MADV_BHV(n) case MADV_##n: return scnprintf(bf, size, #n)
-	P_MADV_BHV(NORMAL);
-	P_MADV_BHV(RANDOM);
-	P_MADV_BHV(SEQUENTIAL);
-	P_MADV_BHV(WILLNEED);
-	P_MADV_BHV(DONTNEED);
-	P_MADV_BHV(REMOVE);
-	P_MADV_BHV(DONTFORK);
-	P_MADV_BHV(DOFORK);
-	P_MADV_BHV(HWPOISON);
-#ifdef MADV_SOFT_OFFLINE
-	P_MADV_BHV(SOFT_OFFLINE);
-#endif
-	P_MADV_BHV(MERGEABLE);
-	P_MADV_BHV(UNMERGEABLE);
-#ifdef MADV_HUGEPAGE
-	P_MADV_BHV(HUGEPAGE);
-#endif
-#ifdef MADV_NOHUGEPAGE
-	P_MADV_BHV(NOHUGEPAGE);
-#endif
-#ifdef MADV_DONTDUMP
-	P_MADV_BHV(DONTDUMP);
-#endif
-#ifdef MADV_DODUMP
-	P_MADV_BHV(DODUMP);
-#endif
-#undef P_MADV_PHV
-	default: break;
-	}
-
-	return scnprintf(bf, size, "%#x", behavior);
-}
-
-#define SCA_MADV_BHV syscall_arg__scnprintf_madvise_behavior
-
-static size_t syscall_arg__scnprintf_futex_op(char *bf, size_t size, unsigned long arg,
-					      u8 arg_idx __maybe_unused, u8 *arg_mask)
-{
-	enum syscall_futex_args {
-		SCF_UADDR   = (1 << 0),
-		SCF_OP	    = (1 << 1),
-		SCF_VAL	    = (1 << 2),
-		SCF_TIMEOUT = (1 << 3),
-		SCF_UADDR2  = (1 << 4),
-		SCF_VAL3    = (1 << 5),
-	};
-	int op = arg;
-	int cmd = op & FUTEX_CMD_MASK;
-	size_t printed = 0;
-
-	switch (cmd) {
-#define	P_FUTEX_OP(n) case FUTEX_##n: printed = scnprintf(bf, size, #n);
-	P_FUTEX_OP(WAIT);	    *arg_mask |= SCF_VAL3|SCF_UADDR2;		  break;
-	P_FUTEX_OP(WAKE);	    *arg_mask |= SCF_VAL3|SCF_UADDR2|SCF_TIMEOUT; break;
-	P_FUTEX_OP(FD);		    *arg_mask |= SCF_VAL3|SCF_UADDR2|SCF_TIMEOUT; break;
-	P_FUTEX_OP(REQUEUE);	    *arg_mask |= SCF_VAL3|SCF_TIMEOUT;	          break;
-	P_FUTEX_OP(CMP_REQUEUE);    *arg_mask |= SCF_TIMEOUT;			  break;
-	P_FUTEX_OP(CMP_REQUEUE_PI); *arg_mask |= SCF_TIMEOUT;			  break;
-	P_FUTEX_OP(WAKE_OP);							  break;
-	P_FUTEX_OP(LOCK_PI);	    *arg_mask |= SCF_VAL3|SCF_UADDR2|SCF_TIMEOUT; break;
-	P_FUTEX_OP(UNLOCK_PI);	    *arg_mask |= SCF_VAL3|SCF_UADDR2|SCF_TIMEOUT; break;
-	P_FUTEX_OP(TRYLOCK_PI);	    *arg_mask |= SCF_VAL3|SCF_UADDR2;		  break;
-	P_FUTEX_OP(WAIT_BITSET);    *arg_mask |= SCF_UADDR2;			  break;
-	P_FUTEX_OP(WAKE_BITSET);    *arg_mask |= SCF_UADDR2;			  break;
-	P_FUTEX_OP(WAIT_REQUEUE_PI);						  break;
-	default: printed = scnprintf(bf, size, "%#x", cmd);			  break;
-	}
-
-	if (op & FUTEX_PRIVATE_FLAG)
-		printed += scnprintf(bf + printed, size - printed, "|PRIV");
-
-	if (op & FUTEX_CLOCK_REALTIME)
-		printed += scnprintf(bf + printed, size - printed, "|CLKRT");
-
-	return printed;
-}
-
-#define SCA_FUTEX_OP  syscall_arg__scnprintf_futex_op
-
-static size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size,
-					       unsigned long arg,
-					       u8 arg_idx, u8 *arg_mask)
-{
-	int printed = 0, flags = arg;
-
-	if (!(flags & O_CREAT))
-		*arg_mask |= 1 << (arg_idx + 1); /* Mask the mode parm */
-
-	if (flags == 0)
-		return scnprintf(bf, size, "RDONLY");
-#define	P_FLAG(n) \
-	if (flags & O_##n) { \
-		printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
-		flags &= ~O_##n; \
-	}
-
-	P_FLAG(APPEND);
-	P_FLAG(ASYNC);
-	P_FLAG(CLOEXEC);
-	P_FLAG(CREAT);
-	P_FLAG(DIRECT);
-	P_FLAG(DIRECTORY);
-	P_FLAG(EXCL);
-	P_FLAG(LARGEFILE);
-	P_FLAG(NOATIME);
-	P_FLAG(NOCTTY);
-#ifdef O_NONBLOCK
-	P_FLAG(NONBLOCK);
-#elif O_NDELAY
-	P_FLAG(NDELAY);
-#endif
-#ifdef O_PATH
-	P_FLAG(PATH);
-#endif
-	P_FLAG(RDWR);
-#ifdef O_DSYNC
-	if ((flags & O_SYNC) == O_SYNC)
-		printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", "SYNC");
-	else {
-		P_FLAG(DSYNC);
-	}
-#else
-	P_FLAG(SYNC);
-#endif
-	P_FLAG(TRUNC);
-	P_FLAG(WRONLY);
-#undef P_FLAG
-
-	if (flags)
-		printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
-
-	return printed;
-}
-
-#define SCA_OPEN_FLAGS syscall_arg__scnprintf_open_flags
-
-static struct syscall_fmt {
-	const char *name;
-	const char *alias;
-	size_t	   (*arg_scnprintf[6])(char *bf, size_t size, unsigned long arg, u8 arg_idx, u8 *arg_mask);
-	bool	   errmsg;
-	bool	   timeout;
-	bool	   hexret;
-} syscall_fmts[] = {
-	{ .name	    = "access",	    .errmsg = true, },
-	{ .name	    = "arch_prctl", .errmsg = true, .alias = "prctl", },
-	{ .name	    = "brk",	    .hexret = true,
-	  .arg_scnprintf = { [0] = SCA_HEX, /* brk */ }, },
-	{ .name	    = "mmap",	    .hexret = true, },
-	{ .name	    = "connect",    .errmsg = true, },
-	{ .name	    = "fstat",	    .errmsg = true, .alias = "newfstat", },
-	{ .name	    = "fstatat",    .errmsg = true, .alias = "newfstatat", },
-	{ .name	    = "futex",	    .errmsg = true,
-	  .arg_scnprintf = { [1] = SCA_FUTEX_OP, /* op */ }, },
-	{ .name	    = "ioctl",	    .errmsg = true,
-	  .arg_scnprintf = { [2] = SCA_HEX, /* arg */ }, },
-	{ .name	    = "lseek",	    .errmsg = true,
-	  .arg_scnprintf = { [2] = SCA_WHENCE, /* whence */ }, },
-	{ .name	    = "lstat",	    .errmsg = true, .alias = "newlstat", },
-	{ .name     = "madvise",    .errmsg = true,
-	  .arg_scnprintf = { [0] = SCA_HEX,	 /* start */
-			     [2] = SCA_MADV_BHV, /* behavior */ }, },
-	{ .name	    = "mmap",	    .hexret = true,
-	  .arg_scnprintf = { [0] = SCA_HEX,	  /* addr */
-			     [2] = SCA_MMAP_PROT, /* prot */
-			     [3] = SCA_MMAP_FLAGS, /* flags */ }, },
-	{ .name	    = "mprotect",   .errmsg = true,
-	  .arg_scnprintf = { [0] = SCA_HEX, /* start */
-			     [2] = SCA_MMAP_PROT, /* prot */ }, },
-	{ .name	    = "mremap",	    .hexret = true,
-	  .arg_scnprintf = { [0] = SCA_HEX, /* addr */
-			     [4] = SCA_HEX, /* new_addr */ }, },
-	{ .name	    = "munmap",	    .errmsg = true,
-	  .arg_scnprintf = { [0] = SCA_HEX, /* addr */ }, },
-	{ .name	    = "open",	    .errmsg = true,
-	  .arg_scnprintf = { [1] = SCA_OPEN_FLAGS, /* flags */ }, },
-	{ .name	    = "open_by_handle_at", .errmsg = true,
-	  .arg_scnprintf = { [2] = SCA_OPEN_FLAGS, /* flags */ }, },
-	{ .name	    = "openat",	    .errmsg = true,
-	  .arg_scnprintf = { [2] = SCA_OPEN_FLAGS, /* flags */ }, },
-	{ .name	    = "poll",	    .errmsg = true, .timeout = true, },
-	{ .name	    = "ppoll",	    .errmsg = true, .timeout = true, },
-	{ .name	    = "pread",	    .errmsg = true, .alias = "pread64", },
-	{ .name	    = "pwrite",	    .errmsg = true, .alias = "pwrite64", },
-	{ .name	    = "read",	    .errmsg = true, },
-	{ .name	    = "recvfrom",   .errmsg = true, },
-	{ .name	    = "select",	    .errmsg = true, .timeout = true, },
-	{ .name	    = "socket",	    .errmsg = true, },
-	{ .name	    = "stat",	    .errmsg = true, .alias = "newstat", },
-	{ .name	    = "uname",	    .errmsg = true, .alias = "newuname", },
-};
-
-static int syscall_fmt__cmp(const void *name, const void *fmtp)
-{
-	const struct syscall_fmt *fmt = fmtp;
-	return strcmp(name, fmt->name);
-}
-
-static struct syscall_fmt *syscall_fmt__find(const char *name)
-{
-	const int nmemb = ARRAY_SIZE(syscall_fmts);
-	return bsearch(name, syscall_fmts, nmemb, sizeof(struct syscall_fmt), syscall_fmt__cmp);
-}
-
-struct syscall {
-	struct event_format *tp_format;
-	const char	    *name;
-	bool		    filtered;
-	struct syscall_fmt  *fmt;
-	size_t		    (**arg_scnprintf)(char *bf, size_t size,
-					      unsigned long arg, u8 arg_idx, u8 *args_mask);
-};
-
-static size_t fprintf_duration(unsigned long t, FILE *fp)
-{
-	double duration = (double)t / NSEC_PER_MSEC;
-	size_t printed = fprintf(fp, "(");
-
-	if (duration >= 1.0)
-		printed += color_fprintf(fp, PERF_COLOR_RED, "%6.3f ms", duration);
-	else if (duration >= 0.01)
-		printed += color_fprintf(fp, PERF_COLOR_YELLOW, "%6.3f ms", duration);
-	else
-		printed += color_fprintf(fp, PERF_COLOR_NORMAL, "%6.3f ms", duration);
-	return printed + fprintf(fp, "): ");
-}
-
-struct thread_trace {
-	u64		  entry_time;
-	u64		  exit_time;
-	bool		  entry_pending;
-	unsigned long	  nr_events;
-	char		  *entry_str;
-	double		  runtime_ms;
-};
-
-static struct thread_trace *thread_trace__new(void)
-{
-	return zalloc(sizeof(struct thread_trace));
-}
-
-static struct thread_trace *thread__trace(struct thread *thread, FILE *fp)
-{
-	struct thread_trace *ttrace;
-
-	if (thread == NULL)
-		goto fail;
-
-	if (thread->priv == NULL)
-		thread->priv = thread_trace__new();
-		
-	if (thread->priv == NULL)
-		goto fail;
-
-	ttrace = thread->priv;
-	++ttrace->nr_events;
-
-	return ttrace;
-fail:
-	color_fprintf(fp, PERF_COLOR_RED,
-		      "WARNING: not enough memory, dropping samples!\n");
-	return NULL;
-}
-
-struct trace {
-	struct perf_tool	tool;
-	int			audit_machine;
-	struct {
-		int		max;
-		struct syscall  *table;
-	} syscalls;
-	struct perf_record_opts opts;
-	struct machine		host;
-	u64			base_time;
-	FILE			*output;
-	unsigned long		nr_events;
-	struct strlist		*ev_qualifier;
-	bool			not_ev_qualifier;
-	struct intlist		*tid_list;
-	struct intlist		*pid_list;
-	bool			sched;
-	bool			multiple_threads;
-	double			duration_filter;
-	double			runtime_ms;
-};
-
-static bool trace__filter_duration(struct trace *trace, double t)
-{
-	return t < (trace->duration_filter * NSEC_PER_MSEC);
-}
-
-static size_t trace__fprintf_tstamp(struct trace *trace, u64 tstamp, FILE *fp)
-{
-	double ts = (double)(tstamp - trace->base_time) / NSEC_PER_MSEC;
-
-	return fprintf(fp, "%10.3f ", ts);
-}
-
-static bool done = false;
-
-static void sig_handler(int sig __maybe_unused)
-{
-	done = true;
-}
-
-static size_t trace__fprintf_entry_head(struct trace *trace, struct thread *thread,
-					u64 duration, u64 tstamp, FILE *fp)
-{
-	size_t printed = trace__fprintf_tstamp(trace, tstamp, fp);
-	printed += fprintf_duration(duration, fp);
-
-	if (trace->multiple_threads)
-		printed += fprintf(fp, "%d ", thread->tid);
-
-	return printed;
-}
-
-static int trace__process_event(struct trace *trace, struct machine *machine,
-				union perf_event *event)
-{
-	int ret = 0;
-
-	switch (event->header.type) {
-	case PERF_RECORD_LOST:
-		color_fprintf(trace->output, PERF_COLOR_RED,
-			      "LOST %" PRIu64 " events!\n", event->lost.lost);
-		ret = machine__process_lost_event(machine, event);
-	default:
-		ret = machine__process_event(machine, event);
-		break;
-	}
-
-	return ret;
-}
-
-static int trace__tool_process(struct perf_tool *tool,
-			       union perf_event *event,
-			       struct perf_sample *sample __maybe_unused,
-			       struct machine *machine)
-{
-	struct trace *trace = container_of(tool, struct trace, tool);
-	return trace__process_event(trace, machine, event);
-}
-
-static int trace__symbols_init(struct trace *trace, struct perf_evlist *evlist)
-{
-	int err = symbol__init();
-
-	if (err)
-		return err;
-
-	machine__init(&trace->host, "", HOST_KERNEL_ID);
-	machine__create_kernel_maps(&trace->host);
-
-	if (perf_target__has_task(&trace->opts.target)) {
-		err = perf_event__synthesize_thread_map(&trace->tool, evlist->threads,
-							trace__tool_process,
-							&trace->host);
-	} else {
-		err = perf_event__synthesize_threads(&trace->tool, trace__tool_process,
-						     &trace->host);
-	}
-
-	if (err)
-		symbol__exit();
-
-	return err;
-}
-
-static int syscall__set_arg_fmts(struct syscall *sc)
-{
-	struct format_field *field;
-	int idx = 0;
-
-	sc->arg_scnprintf = calloc(sc->tp_format->format.nr_fields - 1, sizeof(void *));
-	if (sc->arg_scnprintf == NULL)
-		return -1;
-
-	for (field = sc->tp_format->format.fields->next; field; field = field->next) {
-		if (sc->fmt && sc->fmt->arg_scnprintf[idx])
-			sc->arg_scnprintf[idx] = sc->fmt->arg_scnprintf[idx];
-		else if (field->flags & FIELD_IS_POINTER)
-			sc->arg_scnprintf[idx] = syscall_arg__scnprintf_hex;
-		++idx;
-	}
-
-	return 0;
-}
-
-static int trace__read_syscall_info(struct trace *trace, int id)
-{
-	char tp_name[128];
-	struct syscall *sc;
-	const char *name = audit_syscall_to_name(id, trace->audit_machine);
-
-	if (name == NULL)
-		return -1;
-
-	if (id > trace->syscalls.max) {
-		struct syscall *nsyscalls = realloc(trace->syscalls.table, (id + 1) * sizeof(*sc));
-
-		if (nsyscalls == NULL)
-			return -1;
-
-		if (trace->syscalls.max != -1) {
-			memset(nsyscalls + trace->syscalls.max + 1, 0,
-			       (id - trace->syscalls.max) * sizeof(*sc));
-		} else {
-			memset(nsyscalls, 0, (id + 1) * sizeof(*sc));
-		}
-
-		trace->syscalls.table = nsyscalls;
-		trace->syscalls.max   = id;
-	}
-
-	sc = trace->syscalls.table + id;
-	sc->name = name;
-
-	if (trace->ev_qualifier) {
-		bool in = strlist__find(trace->ev_qualifier, name) != NULL;
-
-		if (!(in ^ trace->not_ev_qualifier)) {
-			sc->filtered = true;
-			/*
-			 * No need to do read tracepoint information since this will be
-			 * filtered out.
-			 */
-			return 0;
-		}
-	}
-
-	sc->fmt  = syscall_fmt__find(sc->name);
-
-	snprintf(tp_name, sizeof(tp_name), "sys_enter_%s", sc->name);
-	sc->tp_format = event_format__new("syscalls", tp_name);
-
-	if (sc->tp_format == NULL && sc->fmt && sc->fmt->alias) {
-		snprintf(tp_name, sizeof(tp_name), "sys_enter_%s", sc->fmt->alias);
-		sc->tp_format = event_format__new("syscalls", tp_name);
-	}
-
-	if (sc->tp_format == NULL)
-		return -1;
-
-	return syscall__set_arg_fmts(sc);
-}
-
-static size_t syscall__scnprintf_args(struct syscall *sc, char *bf, size_t size,
-				      unsigned long *args)
-{
-	int i = 0;
-	size_t printed = 0;
-
-	if (sc->tp_format != NULL) {
-		struct format_field *field;
-		u8 mask = 0, bit = 1;
-
-		for (field = sc->tp_format->format.fields->next; field;
-		     field = field->next, ++i, bit <<= 1) {
-			if (mask & bit)
-				continue;
-
-			printed += scnprintf(bf + printed, size - printed,
-					     "%s%s: ", printed ? ", " : "", field->name);
-
-			if (sc->arg_scnprintf && sc->arg_scnprintf[i]) {
-				printed += sc->arg_scnprintf[i](bf + printed, size - printed,
-								args[i], i, &mask);
-			} else {
-				printed += scnprintf(bf + printed, size - printed,
-						     "%ld", args[i]);
-			}
-		}
-	} else {
-		while (i < 6) {
-			printed += scnprintf(bf + printed, size - printed,
-					     "%sarg%d: %ld",
-					     printed ? ", " : "", i, args[i]);
-			++i;
-		}
-	}
-
-	return printed;
-}
-
-typedef int (*tracepoint_handler)(struct trace *trace, struct perf_evsel *evsel,
-				  struct perf_sample *sample);
-
-static struct syscall *trace__syscall_info(struct trace *trace,
-					   struct perf_evsel *evsel,
-					   struct perf_sample *sample)
-{
-	int id = perf_evsel__intval(evsel, sample, "id");
-
-	if (id < 0) {
-
-		/*
-		 * XXX: Noticed on x86_64, reproduced as far back as 3.0.36, haven't tried
-		 * before that, leaving at a higher verbosity level till that is
-		 * explained. Reproduced with plain ftrace with:
-		 *
-		 * echo 1 > /t/events/raw_syscalls/sys_exit/enable
-		 * grep "NR -1 " /t/trace_pipe
-		 *
-		 * After generating some load on the machine.
- 		 */
-		if (verbose > 1) {
-			static u64 n;
-			fprintf(trace->output, "Invalid syscall %d id, skipping (%s, %" PRIu64 ") ...\n",
-				id, perf_evsel__name(evsel), ++n);
-		}
-		return NULL;
-	}
-
-	if ((id > trace->syscalls.max || trace->syscalls.table[id].name == NULL) &&
-	    trace__read_syscall_info(trace, id))
-		goto out_cant_read;
-
-	if ((id > trace->syscalls.max || trace->syscalls.table[id].name == NULL))
-		goto out_cant_read;
-
-	return &trace->syscalls.table[id];
-
-out_cant_read:
-	if (verbose) {
-		fprintf(trace->output, "Problems reading syscall %d", id);
-		if (id <= trace->syscalls.max && trace->syscalls.table[id].name != NULL)
-			fprintf(trace->output, "(%s)", trace->syscalls.table[id].name);
-		fputs(" information\n", trace->output);
-	}
-	return NULL;
-}
-
-static int trace__sys_enter(struct trace *trace, struct perf_evsel *evsel,
-			    struct perf_sample *sample)
-{
-	char *msg;
-	void *args;
-	size_t printed = 0;
-	struct thread *thread;
-	struct syscall *sc = trace__syscall_info(trace, evsel, sample);
-	struct thread_trace *ttrace;
-
-	if (sc == NULL)
-		return -1;
-
-	if (sc->filtered)
-		return 0;
-
-	thread = machine__findnew_thread(&trace->host, sample->pid,
-					 sample->tid);
-	ttrace = thread__trace(thread, trace->output);
-	if (ttrace == NULL)
-		return -1;
-
-	args = perf_evsel__rawptr(evsel, sample, "args");
-	if (args == NULL) {
-		fprintf(trace->output, "Problems reading syscall arguments\n");
-		return -1;
-	}
-
-	ttrace = thread->priv;
-
-	if (ttrace->entry_str == NULL) {
-		ttrace->entry_str = malloc(1024);
-		if (!ttrace->entry_str)
-			return -1;
-	}
-
-	ttrace->entry_time = sample->time;
-	msg = ttrace->entry_str;
-	printed += scnprintf(msg + printed, 1024 - printed, "%s(", sc->name);
-
-	printed += syscall__scnprintf_args(sc, msg + printed, 1024 - printed,  args);
-
-	if (!strcmp(sc->name, "exit_group") || !strcmp(sc->name, "exit")) {
-		if (!trace->duration_filter) {
-			trace__fprintf_entry_head(trace, thread, 1, sample->time, trace->output);
-			fprintf(trace->output, "%-70s\n", ttrace->entry_str);
-		}
-	} else
-		ttrace->entry_pending = true;
-
-	return 0;
-}
-
-static int trace__sys_exit(struct trace *trace, struct perf_evsel *evsel,
-			   struct perf_sample *sample)
-{
-	int ret;
-	u64 duration = 0;
-	struct thread *thread;
-	struct syscall *sc = trace__syscall_info(trace, evsel, sample);
-	struct thread_trace *ttrace;
-
-	if (sc == NULL)
-		return -1;
-
-	if (sc->filtered)
-		return 0;
-
-	thread = machine__findnew_thread(&trace->host, sample->pid,
-					 sample->tid);
-	ttrace = thread__trace(thread, trace->output);
-	if (ttrace == NULL)
-		return -1;
-
-	ret = perf_evsel__intval(evsel, sample, "ret");
-
-	ttrace = thread->priv;
-
-	ttrace->exit_time = sample->time;
-
-	if (ttrace->entry_time) {
-		duration = sample->time - ttrace->entry_time;
-		if (trace__filter_duration(trace, duration))
-			goto out;
-	} else if (trace->duration_filter)
-		goto out;
-
-	trace__fprintf_entry_head(trace, thread, duration, sample->time, trace->output);
-
-	if (ttrace->entry_pending) {
-		fprintf(trace->output, "%-70s", ttrace->entry_str);
-	} else {
-		fprintf(trace->output, " ... [");
-		color_fprintf(trace->output, PERF_COLOR_YELLOW, "continued");
-		fprintf(trace->output, "]: %s()", sc->name);
-	}
-
-	if (sc->fmt == NULL) {
-signed_print:
-		fprintf(trace->output, ") = %d", ret);
-	} else if (ret < 0 && sc->fmt->errmsg) {
-		char bf[256];
-		const char *emsg = strerror_r(-ret, bf, sizeof(bf)),
-			   *e = audit_errno_to_name(-ret);
-
-		fprintf(trace->output, ") = -1 %s %s", e, emsg);
-	} else if (ret == 0 && sc->fmt->timeout)
-		fprintf(trace->output, ") = 0 Timeout");
-	else if (sc->fmt->hexret)
-		fprintf(trace->output, ") = %#x", ret);
-	else
-		goto signed_print;
-
-	fputc('\n', trace->output);
-out:
-	ttrace->entry_pending = false;
-
-	return 0;
-}
-
-static int trace__sched_stat_runtime(struct trace *trace, struct perf_evsel *evsel,
-				     struct perf_sample *sample)
-{
-        u64 runtime = perf_evsel__intval(evsel, sample, "runtime");
-	double runtime_ms = (double)runtime / NSEC_PER_MSEC;
-	struct thread *thread = machine__findnew_thread(&trace->host,
-							sample->pid,
-							sample->tid);
-	struct thread_trace *ttrace = thread__trace(thread, trace->output);
-
-	if (ttrace == NULL)
-		goto out_dump;
-
-	ttrace->runtime_ms += runtime_ms;
-	trace->runtime_ms += runtime_ms;
-	return 0;
-
-out_dump:
-	fprintf(trace->output, "%s: comm=%s,pid=%u,runtime=%" PRIu64 ",vruntime=%" PRIu64 ")\n",
-	       evsel->name,
-	       perf_evsel__strval(evsel, sample, "comm"),
-	       (pid_t)perf_evsel__intval(evsel, sample, "pid"),
-	       runtime,
-	       perf_evsel__intval(evsel, sample, "vruntime"));
-	return 0;
-}
-
-static bool skip_sample(struct trace *trace, struct perf_sample *sample)
-{
-	if ((trace->pid_list && intlist__find(trace->pid_list, sample->pid)) ||
-	    (trace->tid_list && intlist__find(trace->tid_list, sample->tid)))
-		return false;
-
-	if (trace->pid_list || trace->tid_list)
-		return true;
-
-	return false;
-}
-
-static int trace__process_sample(struct perf_tool *tool,
-				 union perf_event *event __maybe_unused,
-				 struct perf_sample *sample,
-				 struct perf_evsel *evsel,
-				 struct machine *machine __maybe_unused)
-{
-	struct trace *trace = container_of(tool, struct trace, tool);
-	int err = 0;
-
-	tracepoint_handler handler = evsel->handler.func;
-
-	if (skip_sample(trace, sample))
-		return 0;
-
-	if (trace->base_time == 0)
-		trace->base_time = sample->time;
-
-	if (handler)
-		handler(trace, evsel, sample);
-
-	return err;
-}
-
-static bool
-perf_session__has_tp(struct perf_session *session, const char *name)
-{
-	struct perf_evsel *evsel;
-
-	evsel = perf_evlist__find_tracepoint_by_name(session->evlist, name);
-
-	return evsel != NULL;
-}
-
-static int parse_target_str(struct trace *trace)
-{
-	if (trace->opts.target.pid) {
-		trace->pid_list = intlist__new(trace->opts.target.pid);
-		if (trace->pid_list == NULL) {
-			pr_err("Error parsing process id string\n");
-			return -EINVAL;
-		}
-	}
-
-	if (trace->opts.target.tid) {
-		trace->tid_list = intlist__new(trace->opts.target.tid);
-		if (trace->tid_list == NULL) {
-			pr_err("Error parsing thread id string\n");
-			return -EINVAL;
-		}
-	}
-
-	return 0;
-}
-
-static int trace__run(struct trace *trace, int argc, const char **argv)
-{
-	struct perf_evlist *evlist = perf_evlist__new();
-	struct perf_evsel *evsel;
-	int err = -1, i;
-	unsigned long before;
-	const bool forks = argc > 0;
-
-	if (evlist == NULL) {
-		fprintf(trace->output, "Not enough memory to run!\n");
-		goto out;
-	}
-
-	if (perf_evlist__add_newtp(evlist, "raw_syscalls", "sys_enter", trace__sys_enter) ||
-	    perf_evlist__add_newtp(evlist, "raw_syscalls", "sys_exit", trace__sys_exit)) {
-		fprintf(trace->output, "Couldn't read the raw_syscalls tracepoints information!\n");
-		goto out_delete_evlist;
-	}
-
-	if (trace->sched &&
-	    perf_evlist__add_newtp(evlist, "sched", "sched_stat_runtime",
-				   trace__sched_stat_runtime)) {
-		fprintf(trace->output, "Couldn't read the sched_stat_runtime tracepoint information!\n");
-		goto out_delete_evlist;
-	}
-
-	err = perf_evlist__create_maps(evlist, &trace->opts.target);
-	if (err < 0) {
-		fprintf(trace->output, "Problems parsing the target to trace, check your options!\n");
-		goto out_delete_evlist;
-	}
-
-	err = trace__symbols_init(trace, evlist);
-	if (err < 0) {
-		fprintf(trace->output, "Problems initializing symbol libraries!\n");
-		goto out_delete_maps;
-	}
-
-	perf_evlist__config(evlist, &trace->opts);
-
-	signal(SIGCHLD, sig_handler);
-	signal(SIGINT, sig_handler);
-
-	if (forks) {
-		err = perf_evlist__prepare_workload(evlist, &trace->opts.target,
-						    argv, false, false);
-		if (err < 0) {
-			fprintf(trace->output, "Couldn't run the workload!\n");
-			goto out_delete_maps;
-		}
-	}
-
-	err = perf_evlist__open(evlist);
-	if (err < 0) {
-		fprintf(trace->output, "Couldn't create the events: %s\n", strerror(errno));
-		goto out_delete_maps;
-	}
-
-	err = perf_evlist__mmap(evlist, UINT_MAX, false);
-	if (err < 0) {
-		fprintf(trace->output, "Couldn't mmap the events: %s\n", strerror(errno));
-		goto out_close_evlist;
-	}
-
-	perf_evlist__enable(evlist);
-
-	if (forks)
-		perf_evlist__start_workload(evlist);
-
-	trace->multiple_threads = evlist->threads->map[0] == -1 || evlist->threads->nr > 1;
-again:
-	before = trace->nr_events;
-
-	for (i = 0; i < evlist->nr_mmaps; i++) {
-		union perf_event *event;
-
-		while ((event = perf_evlist__mmap_read(evlist, i)) != NULL) {
-			const u32 type = event->header.type;
-			tracepoint_handler handler;
-			struct perf_sample sample;
-
-			++trace->nr_events;
-
-			err = perf_evlist__parse_sample(evlist, event, &sample);
-			if (err) {
-				fprintf(trace->output, "Can't parse sample, err = %d, skipping...\n", err);
-				goto next_event;
-			}
-
-			if (trace->base_time == 0)
-				trace->base_time = sample.time;
-
-			if (type != PERF_RECORD_SAMPLE) {
-				trace__process_event(trace, &trace->host, event);
-				continue;
-			}
-
-			evsel = perf_evlist__id2evsel(evlist, sample.id);
-			if (evsel == NULL) {
-				fprintf(trace->output, "Unknown tp ID %" PRIu64 ", skipping...\n", sample.id);
-				goto next_event;
-			}
-
-			if (sample.raw_data == NULL) {
-				fprintf(trace->output, "%s sample with no payload for tid: %d, cpu %d, raw_size=%d, skipping...\n",
-				       perf_evsel__name(evsel), sample.tid,
-				       sample.cpu, sample.raw_size);
-				goto next_event;
-			}
-
-			handler = evsel->handler.func;
-			handler(trace, evsel, &sample);
-next_event:
-			perf_evlist__mmap_consume(evlist, i);
-
-			if (done)
-				goto out_unmap_evlist;
-		}
-	}
-
-	if (trace->nr_events == before) {
-		if (done)
-			goto out_unmap_evlist;
-
-		poll(evlist->pollfd, evlist->nr_fds, -1);
-	}
-
-	if (done)
-		perf_evlist__disable(evlist);
-
-	goto again;
-
-out_unmap_evlist:
-	perf_evlist__munmap(evlist);
-out_close_evlist:
-	perf_evlist__close(evlist);
-out_delete_maps:
-	perf_evlist__delete_maps(evlist);
-out_delete_evlist:
-	perf_evlist__delete(evlist);
-out:
-	return err;
-}
-
-static int trace__replay(struct trace *trace)
-{
-	const struct perf_evsel_str_handler handlers[] = {
-		{ "raw_syscalls:sys_enter",  trace__sys_enter, },
-		{ "raw_syscalls:sys_exit",   trace__sys_exit, },
-	};
-
-	struct perf_session *session;
-	int err = -1;
-
-	trace->tool.sample	  = trace__process_sample;
-	trace->tool.mmap	  = perf_event__process_mmap;
-	trace->tool.mmap2	  = perf_event__process_mmap2;
-	trace->tool.comm	  = perf_event__process_comm;
-	trace->tool.exit	  = perf_event__process_exit;
-	trace->tool.fork	  = perf_event__process_fork;
-	trace->tool.attr	  = perf_event__process_attr;
-	trace->tool.tracing_data = perf_event__process_tracing_data;
-	trace->tool.build_id	  = perf_event__process_build_id;
-
-	trace->tool.ordered_samples = true;
-	trace->tool.ordering_requires_timestamps = true;
-
-	/* add tid to output */
-	trace->multiple_threads = true;
-
-	if (symbol__init() < 0)
-		return -1;
-
-	session = perf_session__new(input_name, O_RDONLY, 0, false,
-				    &trace->tool);
-	if (session == NULL)
-		return -ENOMEM;
-
-	err = perf_session__set_tracepoints_handlers(session, handlers);
-	if (err)
-		goto out;
-
-	if (!perf_session__has_tp(session, "raw_syscalls:sys_enter")) {
-		pr_err("Data file does not have raw_syscalls:sys_enter events\n");
-		goto out;
-	}
-
-	if (!perf_session__has_tp(session, "raw_syscalls:sys_exit")) {
-		pr_err("Data file does not have raw_syscalls:sys_exit events\n");
-		goto out;
-	}
-
-	err = parse_target_str(trace);
-	if (err != 0)
-		goto out;
-
-	setup_pager();
-
-	err = perf_session__process_events(session, &trace->tool);
-	if (err)
-		pr_err("Failed to process events, error %d", err);
-
-out:
-	perf_session__delete(session);
-
-	return err;
-}
-
-static size_t trace__fprintf_threads_header(FILE *fp)
-{
-	size_t printed;
-
-	printed  = fprintf(fp, "\n _____________________________________________________________________\n");
-	printed += fprintf(fp," __)    Summary of events    (__\n\n");
-	printed += fprintf(fp,"              [ task - pid ]     [ events ] [ ratio ]  [ runtime ]\n");
-	printed += fprintf(fp," _____________________________________________________________________\n\n");
-
-	return printed;
-}
-
-static size_t trace__fprintf_thread_summary(struct trace *trace, FILE *fp)
-{
-	size_t printed = trace__fprintf_threads_header(fp);
-	struct rb_node *nd;
-
-	for (nd = rb_first(&trace->host.threads); nd; nd = rb_next(nd)) {
-		struct thread *thread = rb_entry(nd, struct thread, rb_node);
-		struct thread_trace *ttrace = thread->priv;
-		const char *color;
-		double ratio;
-
-		if (ttrace == NULL)
-			continue;
-
-		ratio = (double)ttrace->nr_events / trace->nr_events * 100.0;
-
-		color = PERF_COLOR_NORMAL;
-		if (ratio > 50.0)
-			color = PERF_COLOR_RED;
-		else if (ratio > 25.0)
-			color = PERF_COLOR_GREEN;
-		else if (ratio > 5.0)
-			color = PERF_COLOR_YELLOW;
-
-		printed += color_fprintf(fp, color, "%20s", thread->comm);
-		printed += fprintf(fp, " - %-5d :%11lu   [", thread->tid, ttrace->nr_events);
-		printed += color_fprintf(fp, color, "%5.1f%%", ratio);
-		printed += fprintf(fp, " ] %10.3f ms\n", ttrace->runtime_ms);
-	}
-
-	return printed;
-}
-
-static int trace__set_duration(const struct option *opt, const char *str,
-			       int unset __maybe_unused)
-{
-	struct trace *trace = opt->value;
-
-	trace->duration_filter = atof(str);
-	return 0;
-}
-
-static int trace__open_output(struct trace *trace, const char *filename)
-{
-	struct stat st;
-
-	if (!stat(filename, &st) && st.st_size) {
-		char oldname[PATH_MAX];
-
-		scnprintf(oldname, sizeof(oldname), "%s.old", filename);
-		unlink(oldname);
-		rename(filename, oldname);
-	}
-
-	trace->output = fopen(filename, "w");
-
-	return trace->output == NULL ? -errno : 0;
-}
-
-int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	const char * const trace_usage[] = {
-		"perf trace [<options>] [<command>]",
-		"perf trace [<options>] -- <command> [<options>]",
-		NULL
-	};
-	struct trace trace = {
-		.audit_machine = audit_detect_machine(),
-		.syscalls = {
-			. max = -1,
-		},
-		.opts = {
-			.target = {
-				.uid	   = UINT_MAX,
-				.uses_mmap = true,
-			},
-			.user_freq     = UINT_MAX,
-			.user_interval = ULLONG_MAX,
-			.no_delay      = true,
-			.mmap_pages    = 1024,
-		},
-		.output = stdout,
-	};
-	const char *output_name = NULL;
-	const char *ev_qualifier_str = NULL;
-	const struct option trace_options[] = {
-	OPT_STRING('e', "expr", &ev_qualifier_str, "expr",
-		    "list of events to trace"),
-	OPT_STRING('o', "output", &output_name, "file", "output file name"),
-	OPT_STRING('i', "input", &input_name, "file", "Analyze events in file"),
-	OPT_STRING('p', "pid", &trace.opts.target.pid, "pid",
-		    "trace events on existing process id"),
-	OPT_STRING('t', "tid", &trace.opts.target.tid, "tid",
-		    "trace events on existing thread id"),
-	OPT_BOOLEAN('a', "all-cpus", &trace.opts.target.system_wide,
-		    "system-wide collection from all CPUs"),
-	OPT_STRING('C', "cpu", &trace.opts.target.cpu_list, "cpu",
-		    "list of cpus to monitor"),
-	OPT_BOOLEAN(0, "no-inherit", &trace.opts.no_inherit,
-		    "child tasks do not inherit counters"),
-	OPT_UINTEGER('m', "mmap-pages", &trace.opts.mmap_pages,
-		     "number of mmap data pages"),
-	OPT_STRING('u', "uid", &trace.opts.target.uid_str, "user",
-		   "user to profile"),
-	OPT_CALLBACK(0, "duration", &trace, "float",
-		     "show only events with duration > N.M ms",
-		     trace__set_duration),
-	OPT_BOOLEAN(0, "sched", &trace.sched, "show blocking scheduler events"),
-	OPT_INCR('v', "verbose", &verbose, "be more verbose"),
-	OPT_END()
-	};
-	int err;
-	char bf[BUFSIZ];
-
-	argc = parse_options(argc, argv, trace_options, trace_usage, 0);
-
-	if (output_name != NULL) {
-		err = trace__open_output(&trace, output_name);
-		if (err < 0) {
-			perror("failed to create output file");
-			goto out;
-		}
-	}
-
-	if (ev_qualifier_str != NULL) {
-		const char *s = ev_qualifier_str;
-
-		trace.not_ev_qualifier = *s == '!';
-		if (trace.not_ev_qualifier)
-			++s;
-		trace.ev_qualifier = strlist__new(true, s);
-		if (trace.ev_qualifier == NULL) {
-			fputs("Not enough memory to parse event qualifier",
-			      trace.output);
-			err = -ENOMEM;
-			goto out_close;
-		}
-	}
-
-	err = perf_target__validate(&trace.opts.target);
-	if (err) {
-		perf_target__strerror(&trace.opts.target, err, bf, sizeof(bf));
-		fprintf(trace.output, "%s", bf);
-		goto out_close;
-	}
-
-	err = perf_target__parse_uid(&trace.opts.target);
-	if (err) {
-		perf_target__strerror(&trace.opts.target, err, bf, sizeof(bf));
-		fprintf(trace.output, "%s", bf);
-		goto out_close;
-	}
-
-	if (!argc && perf_target__none(&trace.opts.target))
-		trace.opts.target.system_wide = true;
-
-	if (input_name)
-		err = trace__replay(&trace);
-	else
-		err = trace__run(&trace, argc, argv);
-
-	if (trace.sched && !err)
-		trace__fprintf_thread_summary(&trace, trace.output);
-
-out_close:
-	if (output_name != NULL)
-		fclose(trace.output);
-out:
-	return err;
-}
diff --git a/src/tools/perf/builtin.h b/src/tools/perf/builtin.h
deleted file mode 100644
index b210d62..0000000
--- a/src/tools/perf/builtin.h
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef BUILTIN_H
-#define BUILTIN_H
-
-#include "util/util.h"
-#include "util/strbuf.h"
-
-extern const char perf_usage_string[];
-extern const char perf_more_info_string[];
-
-extern void list_common_cmds_help(void);
-extern const char *help_unknown_cmd(const char *cmd);
-extern void prune_packed_objects(int);
-extern int read_line_with_nul(char *buf, int size, FILE *file);
-extern int check_pager_config(const char *cmd);
-
-extern int cmd_annotate(int argc, const char **argv, const char *prefix);
-extern int cmd_bench(int argc, const char **argv, const char *prefix);
-extern int cmd_buildid_cache(int argc, const char **argv, const char *prefix);
-extern int cmd_buildid_list(int argc, const char **argv, const char *prefix);
-extern int cmd_diff(int argc, const char **argv, const char *prefix);
-extern int cmd_evlist(int argc, const char **argv, const char *prefix);
-extern int cmd_help(int argc, const char **argv, const char *prefix);
-extern int cmd_sched(int argc, const char **argv, const char *prefix);
-extern int cmd_list(int argc, const char **argv, const char *prefix);
-extern int cmd_record(int argc, const char **argv, const char *prefix);
-extern int cmd_report(int argc, const char **argv, const char *prefix);
-extern int cmd_stat(int argc, const char **argv, const char *prefix);
-extern int cmd_timechart(int argc, const char **argv, const char *prefix);
-extern int cmd_top(int argc, const char **argv, const char *prefix);
-extern int cmd_script(int argc, const char **argv, const char *prefix);
-extern int cmd_version(int argc, const char **argv, const char *prefix);
-extern int cmd_probe(int argc, const char **argv, const char *prefix);
-extern int cmd_kmem(int argc, const char **argv, const char *prefix);
-extern int cmd_lock(int argc, const char **argv, const char *prefix);
-extern int cmd_kvm(int argc, const char **argv, const char *prefix);
-extern int cmd_test(int argc, const char **argv, const char *prefix);
-extern int cmd_trace(int argc, const char **argv, const char *prefix);
-extern int cmd_inject(int argc, const char **argv, const char *prefix);
-extern int cmd_mem(int argc, const char **argv, const char *prefix);
-
-extern int find_scripts(char **scripts_array, char **scripts_path_array);
-#endif
diff --git a/src/tools/perf/command-list.txt b/src/tools/perf/command-list.txt
deleted file mode 100644
index 0906fc4..0000000
--- a/src/tools/perf/command-list.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# List of known perf commands.
-# command name			category [deprecated] [common]
-#
-perf-annotate			mainporcelain common
-perf-archive			mainporcelain common
-perf-bench			mainporcelain common
-perf-buildid-cache		mainporcelain common
-perf-buildid-list		mainporcelain common
-perf-diff			mainporcelain common
-perf-evlist			mainporcelain common
-perf-inject			mainporcelain common
-perf-kmem			mainporcelain common
-perf-kvm			mainporcelain common
-perf-list			mainporcelain common
-perf-lock			mainporcelain common
-perf-mem			mainporcelain common
-perf-probe			mainporcelain full
-perf-record			mainporcelain common
-perf-report			mainporcelain common
-perf-sched			mainporcelain common
-perf-script			mainporcelain common
-perf-stat			mainporcelain common
-perf-test			mainporcelain common
-perf-timechart			mainporcelain common
-perf-top			mainporcelain common
-perf-trace			mainporcelain common
diff --git a/src/tools/perf/common-cmds.h b/src/tools/perf/common-cmds.h
deleted file mode 100644
index 28a621d..0000000
--- a/src/tools/perf/common-cmds.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Automatically generated by /bin/sh */
-struct cmdname_help
-{
-    char name[16];
-    char help[80];
-};
-
-static struct cmdname_help common_cmds[] = {
-  {"annotate", "Read perf.data (created by perf record) and display annotated code"},
-  {"archive", "Create archive with object files with build-ids found in perf.data file"},
-  {"bench", "General framework for benchmark suites"},
-  {"buildid-cache", "Manage build-id cache."},
-  {"buildid-list", "List the buildids in a perf.data file"},
-  {"diff", "Read perf.data files and display the differential profile"},
-  {"evlist", "List the event names in a perf.data file"},
-  {"inject", "Filter to augment the events stream with additional information"},
-  {"kmem", "Tool to trace/measure kernel memory(slab) properties"},
-  {"kvm", "Tool to trace/measure kvm guest os"},
-  {"list", "List all symbolic event types"},
-  {"lock", "Analyze lock events"},
-  {"mem", "Profile memory accesses"},
-  {"record", "Run a command and record its profile into perf.data"},
-  {"report", "Read perf.data (created by perf record) and display the profile"},
-  {"sched", "Tool to trace/measure scheduler properties (latencies)"},
-  {"script", "Read perf.data (created by perf record) and display trace output"},
-  {"stat", "Run a command and gather performance counter statistics"},
-  {"test", "Runs sanity tests."},
-  {"timechart", "Tool to visualize total system behavior during a workload"},
-  {"top", "System profiling tool."},
-  {"trace", "strace inspired tool"},
-#ifdef LIBELF_SUPPORT
-  {"probe", "Define new dynamic tracepoints"},
-#endif /* LIBELF_SUPPORT */
-};
diff --git a/src/tools/perf/config/Makefile b/src/tools/perf/config/Makefile
deleted file mode 100644
index 5f6f9b3..0000000
--- a/src/tools/perf/config/Makefile
+++ /dev/null
@@ -1,481 +0,0 @@
-uname_M := $(shell uname -m 2>/dev/null || echo not)
-
-ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
-                                  -e s/arm.*/arm/ -e s/sa110/arm/ \
-                                  -e s/s390x/s390/ -e s/parisc64/parisc/ \
-                                  -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
-                                  -e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ )
-NO_PERF_REGS := 1
-CFLAGS := $(EXTRA_CFLAGS) $(EXTRA_WARNINGS)
-
-# Additional ARCH settings for x86
-ifeq ($(ARCH),i386)
-  override ARCH := x86
-  NO_PERF_REGS := 0
-  LIBUNWIND_LIBS = -lunwind -lunwind-x86
-endif
-
-ifeq ($(ARCH),x86_64)
-  override ARCH := x86
-  IS_X86_64 := 0
-  ifeq (, $(findstring m32,$(CFLAGS)))
-    IS_X86_64 := $(shell echo __x86_64__ | ${CC} -E -x c - | tail -n 1)
-  endif
-  ifeq (${IS_X86_64}, 1)
-    RAW_ARCH := x86_64
-    CFLAGS += -DARCH_X86_64
-    ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S
-  endif
-  NO_PERF_REGS := 0
-  LIBUNWIND_LIBS = -lunwind -lunwind-x86_64
-endif
-
-ifeq ($(NO_PERF_REGS),0)
-  CFLAGS += -DHAVE_PERF_REGS
-endif
-
-ifeq ($(src-perf),)
-src-perf := $(srctree)/tools/perf
-endif
-
-ifeq ($(obj-perf),)
-obj-perf := $(OUTPUT)
-endif
-
-ifneq ($(obj-perf),)
-obj-perf := $(abspath $(obj-perf))/
-endif
-
-LIB_INCLUDE := $(srctree)/tools/lib/
-
-# include ARCH specific config
--include $(src-perf)/arch/$(ARCH)/Makefile
-
-include $(src-perf)/config/feature-tests.mak
-include $(src-perf)/config/utilities.mak
-
-ifeq ($(call get-executable,$(FLEX)),)
-  dummy := $(error Error: $(FLEX) is missing on this system, please install it)
-endif
-
-ifeq ($(call get-executable,$(BISON)),)
-  dummy := $(error Error: $(BISON) is missing on this system, please install it)
-endif
-
-# Treat warnings as errors unless directed not to
-ifneq ($(WERROR),0)
-  CFLAGS += -Werror
-endif
-
-ifeq ("$(origin DEBUG)", "command line")
-  PERF_DEBUG = $(DEBUG)
-endif
-ifndef PERF_DEBUG
-  CFLAGS += -O6
-endif
-
-ifdef PARSER_DEBUG
-  PARSER_DEBUG_BISON := -t
-  PARSER_DEBUG_FLEX  := -d
-  CFLAGS             += -DPARSER_DEBUG
-endif
-
-CFLAGS += -fno-omit-frame-pointer
-CFLAGS += -ggdb3
-CFLAGS += -funwind-tables
-CFLAGS += -Wall
-CFLAGS += -Wextra
-CFLAGS += -std=gnu99
-
-EXTLIBS = -lelf -lpthread -lrt -lm -ldl
-
-ifeq ($(call try-cc,$(SOURCE_HELLO),$(CFLAGS) -Werror -fstack-protector-all,-fstack-protector-all),y)
-  CFLAGS += -fstack-protector-all
-endif
-
-ifeq ($(call try-cc,$(SOURCE_HELLO),$(CFLAGS) -Werror -Wstack-protector,-Wstack-protector),y)
-  CFLAGS += -Wstack-protector
-endif
-
-ifeq ($(call try-cc,$(SOURCE_HELLO),$(CFLAGS) -Werror -Wvolatile-register-var,-Wvolatile-register-var),y)
-  CFLAGS += -Wvolatile-register-var
-endif
-
-ifndef PERF_DEBUG
-  ifeq ($(call try-cc,$(SOURCE_HELLO),$(CFLAGS) -D_FORTIFY_SOURCE=2,-D_FORTIFY_SOURCE=2),y)
-    CFLAGS += -D_FORTIFY_SOURCE=2
-  endif
-endif
-
-CFLAGS += -I$(src-perf)/util/include
-CFLAGS += -I$(src-perf)/arch/$(ARCH)/include
-CFLAGS += -I$(srctree)/arch/$(ARCH)/include/uapi
-CFLAGS += -I$(srctree)/arch/$(ARCH)/include
-CFLAGS += -I$(srctree)/include/uapi
-CFLAGS += -I$(srctree)/include
-
-# $(obj-perf)      for generated common-cmds.h
-# $(obj-perf)/util for generated bison/flex headers
-ifneq ($(OUTPUT),)
-CFLAGS += -I$(obj-perf)/util
-CFLAGS += -I$(obj-perf)
-endif
-
-CFLAGS += -I$(src-perf)/util
-CFLAGS += -I$(src-perf)
-CFLAGS += -I$(LIB_INCLUDE)
-
-CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
-
-ifndef NO_BIONIC
-ifeq ($(call try-cc,$(SOURCE_BIONIC),$(CFLAGS),bionic),y)
-  BIONIC := 1
-  EXTLIBS := $(filter-out -lrt,$(EXTLIBS))
-  EXTLIBS := $(filter-out -lpthread,$(EXTLIBS))
-endif
-endif # NO_BIONIC
-
-ifdef NO_LIBELF
-  NO_DWARF := 1
-  NO_DEMANGLE := 1
-  NO_LIBUNWIND := 1
-else
-FLAGS_LIBELF=$(CFLAGS) $(LDFLAGS) $(EXTLIBS)
-ifneq ($(call try-cc,$(SOURCE_LIBELF),$(FLAGS_LIBELF),libelf),y)
-  FLAGS_GLIBC=$(CFLAGS) $(LDFLAGS)
-  ifeq ($(call try-cc,$(SOURCE_GLIBC),$(FLAGS_GLIBC),glibc),y)
-    LIBC_SUPPORT := 1
-  endif
-  ifeq ($(BIONIC),1)
-    LIBC_SUPPORT := 1
-  endif
-  ifeq ($(LIBC_SUPPORT),1)
-    msg := $(warning No libelf found, disables 'probe' tool, please install elfutils-libelf-devel/libelf-dev);
-
-    NO_LIBELF := 1
-    NO_DWARF := 1
-    NO_DEMANGLE := 1
-  else
-    msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static);
-  endif
-else
-  # for linking with debug library, run like:
-  # make DEBUG=1 LIBDW_DIR=/opt/libdw/
-  ifdef LIBDW_DIR
-    LIBDW_CFLAGS  := -I$(LIBDW_DIR)/include
-    LIBDW_LDFLAGS := -L$(LIBDW_DIR)/lib
-  endif
-
-  FLAGS_DWARF=$(CFLAGS) $(LIBDW_CFLAGS) -ldw -lz -lelf $(LIBDW_LDFLAGS) $(LDFLAGS) $(EXTLIBS)
-  ifneq ($(call try-cc,$(SOURCE_DWARF),$(FLAGS_DWARF),libdw),y)
-    msg := $(warning No libdw.h found or old libdw.h found or elfutils is older than 0.138, disables dwarf support. Please install new elfutils-devel/libdw-dev);
-    NO_DWARF := 1
-  endif # Dwarf support
-endif # SOURCE_LIBELF
-endif # NO_LIBELF
-
-ifndef NO_LIBELF
-CFLAGS += -DLIBELF_SUPPORT
-FLAGS_LIBELF=$(CFLAGS) $(LDFLAGS) $(EXTLIBS)
-ifeq ($(call try-cc,$(SOURCE_ELF_MMAP),$(FLAGS_LIBELF),-DLIBELF_MMAP),y)
-  CFLAGS += -DLIBELF_MMAP
-endif
-ifeq ($(call try-cc,$(SOURCE_ELF_GETPHDRNUM),$(FLAGS_LIBELF),-DHAVE_ELF_GETPHDRNUM),y)
-  CFLAGS += -DHAVE_ELF_GETPHDRNUM
-endif
-
-# include ARCH specific config
--include $(src-perf)/arch/$(ARCH)/Makefile
-
-ifndef NO_DWARF
-ifeq ($(origin PERF_HAVE_DWARF_REGS), undefined)
-  msg := $(warning DWARF register mappings have not been defined for architecture $(ARCH), DWARF support disabled);
-  NO_DWARF := 1
-else
-  CFLAGS += -DDWARF_SUPPORT $(LIBDW_CFLAGS)
-  LDFLAGS += $(LIBDW_LDFLAGS)
-  EXTLIBS += -lelf -ldw
-endif # PERF_HAVE_DWARF_REGS
-endif # NO_DWARF
-
-endif # NO_LIBELF
-
-ifndef NO_LIBELF
-CFLAGS += -DLIBELF_SUPPORT
-FLAGS_LIBELF=$(CFLAGS) $(LDFLAGS) $(EXTLIBS)
-ifeq ($(call try-cc,$(SOURCE_ELF_MMAP),$(FLAGS_LIBELF),-DLIBELF_MMAP),y)
-  CFLAGS += -DLIBELF_MMAP
-endif # try-cc
-endif # NO_LIBELF
-
-# There's only x86 (both 32 and 64) support for CFI unwind so far
-ifneq ($(ARCH),x86)
-  NO_LIBUNWIND := 1
-endif
-
-ifndef NO_LIBUNWIND
-# for linking with debug library, run like:
-# make DEBUG=1 LIBUNWIND_DIR=/opt/libunwind/
-ifdef LIBUNWIND_DIR
-  LIBUNWIND_CFLAGS  := -I$(LIBUNWIND_DIR)/include
-  LIBUNWIND_LDFLAGS := -L$(LIBUNWIND_DIR)/lib
-endif
-
-FLAGS_UNWIND=$(LIBUNWIND_CFLAGS) $(CFLAGS) $(LIBUNWIND_LDFLAGS) $(LDFLAGS) $(EXTLIBS) $(LIBUNWIND_LIBS)
-ifneq ($(call try-cc,$(SOURCE_LIBUNWIND),$(FLAGS_UNWIND),libunwind),y)
-  msg := $(warning No libunwind found, disabling post unwind support. Please install libunwind-dev[el] >= 0.99);
-  NO_LIBUNWIND := 1
-endif # Libunwind support
-endif # NO_LIBUNWIND
-
-ifndef NO_LIBUNWIND
-  CFLAGS += -DLIBUNWIND_SUPPORT
-  EXTLIBS += $(LIBUNWIND_LIBS)
-  CFLAGS += $(LIBUNWIND_CFLAGS)
-  LDFLAGS += $(LIBUNWIND_LDFLAGS)
-endif # NO_LIBUNWIND
-
-ifndef NO_LIBAUDIT
-  FLAGS_LIBAUDIT = $(CFLAGS) $(LDFLAGS) -laudit
-  ifneq ($(call try-cc,$(SOURCE_LIBAUDIT),$(FLAGS_LIBAUDIT),libaudit),y)
-    msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
-    NO_LIBAUDIT := 1
-  else
-    CFLAGS += -DLIBAUDIT_SUPPORT
-    EXTLIBS += -laudit
-  endif
-endif
-
-ifdef NO_NEWT
-  NO_SLANG=1
-endif
-
-ifndef NO_SLANG
-  FLAGS_SLANG=$(CFLAGS) $(LDFLAGS) $(EXTLIBS) -I/usr/include/slang -lslang
-  ifneq ($(call try-cc,$(SOURCE_SLANG),$(FLAGS_SLANG),libslang),y)
-    msg := $(warning slang not found, disables TUI support. Please install slang-devel or libslang-dev);
-    NO_SLANG := 1
-  else
-    # Fedora has /usr/include/slang/slang.h, but ubuntu /usr/include/slang.h
-    CFLAGS += -I/usr/include/slang
-    CFLAGS += -DSLANG_SUPPORT
-    EXTLIBS += -lslang
-  endif
-endif
-
-ifndef NO_GTK2
-  FLAGS_GTK2=$(CFLAGS) $(LDFLAGS) $(EXTLIBS) $(shell pkg-config --libs --cflags gtk+-2.0 2>/dev/null)
-  ifneq ($(call try-cc,$(SOURCE_GTK2),$(FLAGS_GTK2),gtk2),y)
-    msg := $(warning GTK2 not found, disables GTK2 support. Please install gtk2-devel or libgtk2.0-dev);
-    NO_GTK2 := 1
-  else
-    ifeq ($(call try-cc,$(SOURCE_GTK2_INFOBAR),$(FLAGS_GTK2),-DHAVE_GTK_INFO_BAR),y)
-      CFLAGS += -DHAVE_GTK_INFO_BAR
-    endif
-    CFLAGS += -DGTK2_SUPPORT
-    CFLAGS += $(shell pkg-config --cflags gtk+-2.0 2>/dev/null)
-    EXTLIBS += $(shell pkg-config --libs gtk+-2.0 2>/dev/null)
-  endif
-endif
-
-grep-libs  = $(filter -l%,$(1))
-strip-libs = $(filter-out -l%,$(1))
-
-ifdef NO_LIBPERL
-  CFLAGS += -DNO_LIBPERL
-else
-  PERL_EMBED_LDOPTS = $(shell perl -MExtUtils::Embed -e ldopts 2>/dev/null)
-  PERL_EMBED_LDFLAGS = $(call strip-libs,$(PERL_EMBED_LDOPTS))
-  PERL_EMBED_LIBADD = $(call grep-libs,$(PERL_EMBED_LDOPTS))
-  PERL_EMBED_CCOPTS = `perl -MExtUtils::Embed -e ccopts 2>/dev/null`
-  FLAGS_PERL_EMBED=$(PERL_EMBED_CCOPTS) $(PERL_EMBED_LDOPTS)
-
-  ifneq ($(call try-cc,$(SOURCE_PERL_EMBED),$(FLAGS_PERL_EMBED),perl),y)
-    CFLAGS += -DNO_LIBPERL
-    NO_LIBPERL := 1
-  else
-    LDFLAGS += $(PERL_EMBED_LDFLAGS)
-    EXTLIBS += $(PERL_EMBED_LIBADD)
-  endif
-endif
-
-disable-python = $(eval $(disable-python_code))
-define disable-python_code
-  CFLAGS += -DNO_LIBPYTHON
-  $(if $(1),$(warning No $(1) was found))
-  $(warning Python support will not be built)
-  NO_LIBPYTHON := 1
-endef
-
-override PYTHON := \
-  $(call get-executable-or-default,PYTHON,python)
-
-ifndef PYTHON
-  $(call disable-python,python interpreter)
-else
-
-  PYTHON_WORD := $(call shell-wordify,$(PYTHON))
-
-  ifdef NO_LIBPYTHON
-    $(call disable-python)
-  else
-
-    override PYTHON_CONFIG := \
-      $(call get-executable-or-default,PYTHON_CONFIG,$(PYTHON)-config)
-
-    ifndef PYTHON_CONFIG
-      $(call disable-python,python-config tool)
-    else
-
-      PYTHON_CONFIG_SQ := $(call shell-sq,$(PYTHON_CONFIG))
-
-      PYTHON_EMBED_LDOPTS := $(shell $(PYTHON_CONFIG_SQ) --ldflags 2>/dev/null)
-      PYTHON_EMBED_LDFLAGS := $(call strip-libs,$(PYTHON_EMBED_LDOPTS))
-      PYTHON_EMBED_LIBADD := $(call grep-libs,$(PYTHON_EMBED_LDOPTS))
-      PYTHON_EMBED_CCOPTS := $(shell $(PYTHON_CONFIG_SQ) --cflags 2>/dev/null)
-      FLAGS_PYTHON_EMBED := $(PYTHON_EMBED_CCOPTS) $(PYTHON_EMBED_LDOPTS)
-
-      ifneq ($(call try-cc,$(SOURCE_PYTHON_EMBED),$(FLAGS_PYTHON_EMBED),python),y)
-        $(call disable-python,Python.h (for Python 2.x))
-      else
-
-        ifneq ($(call try-cc,$(SOURCE_PYTHON_VERSION),$(FLAGS_PYTHON_EMBED),python version),y)
-          $(warning Python 3 is not yet supported; please set)
-          $(warning PYTHON and/or PYTHON_CONFIG appropriately.)
-          $(warning If you also have Python 2 installed, then)
-          $(warning try something like:)
-          $(warning $(and ,))
-          $(warning $(and ,)  make PYTHON=python2)
-          $(warning $(and ,))
-          $(warning Otherwise, disable Python support entirely:)
-          $(warning $(and ,))
-          $(warning $(and ,)  make NO_LIBPYTHON=1)
-          $(warning $(and ,))
-          $(error   $(and ,))
-        else
-          LDFLAGS += $(PYTHON_EMBED_LDFLAGS)
-          EXTLIBS += $(PYTHON_EMBED_LIBADD)
-          LANG_BINDINGS += $(obj-perf)python/perf.so
-        endif
-      endif
-    endif
-  endif
-endif
-
-ifdef NO_DEMANGLE
-  CFLAGS += -DNO_DEMANGLE
-else
-  ifdef HAVE_CPLUS_DEMANGLE
-    EXTLIBS += -liberty
-    CFLAGS += -DHAVE_CPLUS_DEMANGLE
-  else
-    FLAGS_BFD=$(CFLAGS) $(LDFLAGS) $(EXTLIBS) -DPACKAGE='perf' -lbfd
-    has_bfd := $(call try-cc,$(SOURCE_BFD),$(FLAGS_BFD),libbfd)
-    ifeq ($(has_bfd),y)
-      EXTLIBS += -lbfd
-    else
-      FLAGS_BFD_IBERTY=$(FLAGS_BFD) -liberty
-      has_bfd_iberty := $(call try-cc,$(SOURCE_BFD),$(FLAGS_BFD_IBERTY),liberty)
-      ifeq ($(has_bfd_iberty),y)
-        EXTLIBS += -lbfd -liberty
-      else
-        FLAGS_BFD_IBERTY_Z=$(FLAGS_BFD_IBERTY) -lz
-        has_bfd_iberty_z := $(call try-cc,$(SOURCE_BFD),$(FLAGS_BFD_IBERTY_Z),libz)
-        ifeq ($(has_bfd_iberty_z),y)
-          EXTLIBS += -lbfd -liberty -lz
-        else
-          FLAGS_CPLUS_DEMANGLE=$(CFLAGS) $(LDFLAGS) $(EXTLIBS) -liberty
-          has_cplus_demangle := $(call try-cc,$(SOURCE_CPLUS_DEMANGLE),$(FLAGS_CPLUS_DEMANGLE),demangle)
-          ifeq ($(has_cplus_demangle),y)
-            EXTLIBS += -liberty
-            CFLAGS += -DHAVE_CPLUS_DEMANGLE
-          else
-            msg := $(warning No bfd.h/libbfd found, install binutils-dev[el]/zlib-static to gain symbol demangling)
-            CFLAGS += -DNO_DEMANGLE
-          endif
-        endif
-      endif
-    endif
-  endif
-endif
-
-ifndef NO_STRLCPY
-  ifeq ($(call try-cc,$(SOURCE_STRLCPY),,-DHAVE_STRLCPY),y)
-    CFLAGS += -DHAVE_STRLCPY
-  endif
-endif
-
-ifndef NO_ON_EXIT
-  ifeq ($(call try-cc,$(SOURCE_ON_EXIT),,-DHAVE_ON_EXIT),y)
-    CFLAGS += -DHAVE_ON_EXIT
-  endif
-endif
-
-ifndef NO_BACKTRACE
-  ifeq ($(call try-cc,$(SOURCE_BACKTRACE),,-DBACKTRACE_SUPPORT),y)
-    CFLAGS += -DBACKTRACE_SUPPORT
-  endif
-endif
-
-ifndef NO_LIBNUMA
-  FLAGS_LIBNUMA = $(CFLAGS) $(LDFLAGS) -lnuma
-  ifneq ($(call try-cc,$(SOURCE_LIBNUMA),$(FLAGS_LIBNUMA),libnuma),y)
-    msg := $(warning No numa.h found, disables 'perf bench numa mem' benchmark, please install numa-libs-devel or libnuma-dev);
-    NO_LIBNUMA := 1
-  else
-    CFLAGS += -DLIBNUMA_SUPPORT
-    EXTLIBS += -lnuma
-  endif
-endif
-
-# Among the variables below, these:
-#   perfexecdir
-#   template_dir
-#   mandir
-#   infodir
-#   htmldir
-#   ETC_PERFCONFIG (but not sysconfdir)
-# can be specified as a relative path some/where/else;
-# this is interpreted as relative to $(prefix) and "perf" at
-# runtime figures out where they are based on the path to the executable.
-# This can help installing the suite in a relocatable way.
-
-# Make the path relative to DESTDIR, not to prefix
-ifndef DESTDIR
-prefix = $(HOME)
-endif
-bindir_relative = bin
-bindir = $(prefix)/$(bindir_relative)
-mandir = share/man
-infodir = share/info
-perfexecdir = libexec/perf-core
-sharedir = $(prefix)/share
-template_dir = share/perf-core/templates
-htmldir = share/doc/perf-doc
-ifeq ($(prefix),/usr)
-sysconfdir = /etc
-ETC_PERFCONFIG = $(sysconfdir)/perfconfig
-else
-sysconfdir = $(prefix)/etc
-ETC_PERFCONFIG = etc/perfconfig
-endif
-lib = lib
-
-# Shell quote (do not use $(call) to accommodate ancient setups);
-ETC_PERFCONFIG_SQ = $(subst ','\'',$(ETC_PERFCONFIG))
-DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
-bindir_SQ = $(subst ','\'',$(bindir))
-mandir_SQ = $(subst ','\'',$(mandir))
-infodir_SQ = $(subst ','\'',$(infodir))
-perfexecdir_SQ = $(subst ','\'',$(perfexecdir))
-template_dir_SQ = $(subst ','\'',$(template_dir))
-htmldir_SQ = $(subst ','\'',$(htmldir))
-prefix_SQ = $(subst ','\'',$(prefix))
-sysconfdir_SQ = $(subst ','\'',$(sysconfdir))
-
-ifneq ($(filter /%,$(firstword $(perfexecdir))),)
-perfexec_instdir = $(perfexecdir)
-else
-perfexec_instdir = $(prefix)/$(perfexecdir)
-endif
-perfexec_instdir_SQ = $(subst ','\'',$(perfexec_instdir))
diff --git a/src/tools/perf/config/feature-tests.mak b/src/tools/perf/config/feature-tests.mak
deleted file mode 100644
index f793057..0000000
--- a/src/tools/perf/config/feature-tests.mak
+++ /dev/null
@@ -1,246 +0,0 @@
-define SOURCE_HELLO
-#include <stdio.h>
-int main(void)
-{
-	return puts(\"hi\");
-}
-endef
-
-ifndef NO_DWARF
-define SOURCE_DWARF
-#include <dwarf.h>
-#include <elfutils/libdw.h>
-#include <elfutils/version.h>
-#ifndef _ELFUTILS_PREREQ
-#error
-#endif
-
-int main(void)
-{
-	Dwarf *dbg = dwarf_begin(0, DWARF_C_READ);
-	return (long)dbg;
-}
-endef
-endif
-
-define SOURCE_LIBELF
-#include <libelf.h>
-
-int main(void)
-{
-	Elf *elf = elf_begin(0, ELF_C_READ, 0);
-	return (long)elf;
-}
-endef
-
-define SOURCE_GLIBC
-#include <gnu/libc-version.h>
-
-int main(void)
-{
-	const char *version = gnu_get_libc_version();
-	return (long)version;
-}
-endef
-
-define SOURCE_BIONIC
-#include <android/api-level.h>
-
-int main(void)
-{
-	return __ANDROID_API__;
-}
-endef
-
-define SOURCE_ELF_MMAP
-#include <libelf.h>
-int main(void)
-{
-	Elf *elf = elf_begin(0, ELF_C_READ_MMAP, 0);
-	return (long)elf;
-}
-endef
-
-define SOURCE_ELF_GETPHDRNUM
-#include <libelf.h>
-int main(void)
-{
-	size_t dst;
-	return elf_getphdrnum(0, &dst);
-}
-endef
-
-ifndef NO_SLANG
-define SOURCE_SLANG
-#include <slang.h>
-
-int main(void)
-{
-	return SLsmg_init_smg();
-}
-endef
-endif
-
-ifndef NO_GTK2
-define SOURCE_GTK2
-#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
-#include <gtk/gtk.h>
-#pragma GCC diagnostic error \"-Wstrict-prototypes\"
-
-int main(int argc, char *argv[])
-{
-        gtk_init(&argc, &argv);
-
-        return 0;
-}
-endef
-
-define SOURCE_GTK2_INFOBAR
-#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
-#include <gtk/gtk.h>
-#pragma GCC diagnostic error \"-Wstrict-prototypes\"
-
-int main(void)
-{
-	gtk_info_bar_new();
-
-	return 0;
-}
-endef
-endif
-
-ifndef NO_LIBPERL
-define SOURCE_PERL_EMBED
-#include <EXTERN.h>
-#include <perl.h>
-
-int main(void)
-{
-perl_alloc();
-return 0;
-}
-endef
-endif
-
-ifndef NO_LIBPYTHON
-define SOURCE_PYTHON_VERSION
-#include <Python.h>
-#if PY_VERSION_HEX >= 0x03000000
-	#error
-#endif
-int main(void)
-{
-	return 0;
-}
-endef
-define SOURCE_PYTHON_EMBED
-#include <Python.h>
-int main(void)
-{
-	Py_Initialize();
-	return 0;
-}
-endef
-endif
-
-define SOURCE_BFD
-#include <bfd.h>
-
-int main(void)
-{
-	bfd_demangle(0, 0, 0);
-	return 0;
-}
-endef
-
-define SOURCE_CPLUS_DEMANGLE
-extern char *cplus_demangle(const char *, int);
-
-int main(void)
-{
-	cplus_demangle(0, 0);
-	return 0;
-}
-endef
-
-define SOURCE_STRLCPY
-#include <stdlib.h>
-extern size_t strlcpy(char *dest, const char *src, size_t size);
-
-int main(void)
-{
-	strlcpy(NULL, NULL, 0);
-	return 0;
-}
-endef
-
-ifndef NO_LIBUNWIND
-define SOURCE_LIBUNWIND
-#include <libunwind.h>
-#include <stdlib.h>
-
-extern int UNW_OBJ(dwarf_search_unwind_table) (unw_addr_space_t as,
-                                      unw_word_t ip,
-                                      unw_dyn_info_t *di,
-                                      unw_proc_info_t *pi,
-                                      int need_unwind_info, void *arg);
-
-
-#define dwarf_search_unwind_table UNW_OBJ(dwarf_search_unwind_table)
-
-int main(void)
-{
-	unw_addr_space_t addr_space;
-	addr_space = unw_create_addr_space(NULL, 0);
-	unw_init_remote(NULL, addr_space, NULL);
-	dwarf_search_unwind_table(addr_space, 0, NULL, NULL, 0, NULL);
-	return 0;
-}
-endef
-endif
-
-ifndef NO_BACKTRACE
-define SOURCE_BACKTRACE
-#include <execinfo.h>
-#include <stdio.h>
-
-int main(void)
-{
-	backtrace(NULL, 0);
-	backtrace_symbols(NULL, 0);
-	return 0;
-}
-endef
-endif
-
-ifndef NO_LIBAUDIT
-define SOURCE_LIBAUDIT
-#include <libaudit.h>
-
-int main(void)
-{
-	printf(\"error message: %s\", audit_errno_to_name(0));
-	return audit_open();
-}
-endef
-endif
-
-define SOURCE_ON_EXIT
-#include <stdio.h>
-
-int main(void)
-{
-	return on_exit(NULL, NULL);
-}
-endef
-
-define SOURCE_LIBNUMA
-#include <numa.h>
-#include <numaif.h>
-
-int main(void)
-{
-	numa_available();
-	return 0;
-}
-endef
diff --git a/src/tools/perf/config/utilities.mak b/src/tools/perf/config/utilities.mak
deleted file mode 100644
index 94d2d4f..0000000
--- a/src/tools/perf/config/utilities.mak
+++ /dev/null
@@ -1,194 +0,0 @@
-# This allows us to work with the newline character:
-define newline
-
-
-endef
-newline := $(newline)
-
-# nl-escape
-#
-# Usage: escape = $(call nl-escape[,escape])
-#
-# This is used as the common way to specify
-# what should replace a newline when escaping
-# newlines; the default is a bizarre string.
-#
-nl-escape = $(if $(1),$(1),m822df3020w6a44id34bt574ctac44eb9f4n)
-
-# escape-nl
-#
-# Usage: escaped-text = $(call escape-nl,text[,escape])
-#
-# GNU make's $(shell ...) function converts to a
-# single space each newline character in the output
-# produced during the expansion; this may not be
-# desirable.
-#
-# The only solution is to change each newline into
-# something that won't be converted, so that the
-# information can be recovered later with
-# $(call unescape-nl...)
-#
-escape-nl = $(subst $(newline),$(call nl-escape,$(2)),$(1))
-
-# unescape-nl
-#
-# Usage: text = $(call unescape-nl,escaped-text[,escape])
-#
-# See escape-nl.
-#
-unescape-nl = $(subst $(call nl-escape,$(2)),$(newline),$(1))
-
-# shell-escape-nl
-#
-# Usage: $(shell some-command | $(call shell-escape-nl[,escape]))
-#
-# Use this to escape newlines from within a shell call;
-# the default escape is a bizarre string.
-#
-# NOTE: The escape is used directly as a string constant
-#       in an `awk' program that is delimited by shell
-#       single-quotes, so be wary of the characters
-#       that are chosen.
-#
-define shell-escape-nl
-awk 'NR==1 {t=$$0} NR>1 {t=t "$(nl-escape)" $$0} END {printf t}'
-endef
-
-# shell-unescape-nl
-#
-# Usage: $(shell some-command | $(call shell-unescape-nl[,escape]))
-#
-# Use this to unescape newlines from within a shell call;
-# the default escape is a bizarre string.
-#
-# NOTE: The escape is used directly as an extended regular
-#       expression constant in an `awk' program that is
-#       delimited by shell single-quotes, so be wary
-#       of the characters that are chosen.
-#
-# (The bash shell has a bug where `{gsub(...),...}' is
-#  misinterpreted as a brace expansion; this can be
-#  overcome by putting a space between `{' and `gsub').
-#
-define shell-unescape-nl
-awk 'NR==1 {t=$$0} NR>1 {t=t "\n" $$0} END { gsub(/$(nl-escape)/,"\n",t); printf t }'
-endef
-
-# escape-for-shell-sq
-#
-# Usage: embeddable-text = $(call escape-for-shell-sq,text)
-#
-# This function produces text that is suitable for
-# embedding in a shell string that is delimited by
-# single-quotes.
-#
-escape-for-shell-sq =  $(subst ','\'',$(1))
-
-# shell-sq
-#
-# Usage: single-quoted-and-escaped-text = $(call shell-sq,text)
-#
-shell-sq = '$(escape-for-shell-sq)'
-
-# shell-wordify
-#
-# Usage: wordified-text = $(call shell-wordify,text)
-#
-# For instance:
-#
-#  |define text
-#  |hello
-#  |world
-#  |endef
-#  |
-#  |target:
-#  |	echo $(call shell-wordify,$(text))
-#
-# At least GNU make gets confused by expanding a newline
-# within the context of a command line of a makefile rule
-# (this is in constrast to a `$(shell ...)' function call,
-# which can handle it just fine).
-#
-# This function avoids the problem by producing a string
-# that works as a shell word, regardless of whether or
-# not it contains a newline.
-#
-# If the text to be wordified contains a newline, then
-# an intrictate shell command substitution is constructed
-# to render the text as a single line; when the shell
-# processes the resulting escaped text, it transforms
-# it into the original unescaped text.
-#
-# If the text does not contain a newline, then this function
-# produces the same results as the `$(shell-sq)' function.
-#
-shell-wordify = $(if $(findstring $(newline),$(1)),$(_sw-esc-nl),$(shell-sq))
-define _sw-esc-nl
-"$$(echo $(call escape-nl,$(shell-sq),$(2)) | $(call shell-unescape-nl,$(2)))"
-endef
-
-# is-absolute
-#
-# Usage: bool-value = $(call is-absolute,path)
-#
-is-absolute = $(shell echo $(shell-sq) | grep ^/ -q && echo y)
-
-# lookup
-#
-# Usage: absolute-executable-path-or-empty = $(call lookup,path)
-#
-# (It's necessary to use `sh -c' because GNU make messes up by
-#  trying too hard and getting things wrong).
-#
-lookup = $(call unescape-nl,$(shell sh -c $(_l-sh)))
-_l-sh = $(call shell-sq,command -v $(shell-sq) | $(call shell-escape-nl,))
-
-# is-executable
-#
-# Usage: bool-value = $(call is-executable,path)
-#
-# (It's necessary to use `sh -c' because GNU make messes up by
-#  trying too hard and getting things wrong).
-#
-is-executable = $(call _is-executable-helper,$(shell-sq))
-_is-executable-helper = $(shell sh -c $(_is-executable-sh))
-_is-executable-sh = $(call shell-sq,test -f $(1) -a -x $(1) && echo y)
-
-# get-executable
-#
-# Usage: absolute-executable-path-or-empty = $(call get-executable,path)
-#
-# The goal is to get an absolute path for an executable;
-# the `command -v' is defined by POSIX, but it's not
-# necessarily very portable, so it's only used if
-# relative path resolution is requested, as determined
-# by the presence of a leading `/'.
-#
-get-executable = $(if $(1),$(if $(is-absolute),$(_ge-abspath),$(lookup)))
-_ge-abspath = $(if $(is-executable),$(1))
-
-# get-supplied-or-default-executable
-#
-# Usage: absolute-executable-path-or-empty = $(call get-executable-or-default,variable,default)
-#
-define get-executable-or-default
-$(if $($(1)),$(call _ge_attempt,$($(1)),$(1)),$(call _ge_attempt,$(2)))
-endef
-_ge_attempt = $(if $(get-executable),$(get-executable),$(_gea_warn)$(call _gea_err,$(2)))
-_gea_warn = $(warning The path '$(1)' is not executable.)
-_gea_err  = $(if $(1),$(error Please set '$(1)' appropriately))
-
-# try-cc
-# Usage: option = $(call try-cc, source-to-build, cc-options, msg)
-ifneq ($(V),1)
-TRY_CC_OUTPUT= > /dev/null 2>&1
-endif
-TRY_CC_MSG=echo "    CHK $(3)" 1>&2;
-
-try-cc = $(shell sh -c						  \
-	'TMP="$(OUTPUT)$(TMPOUT).$$$$";				  \
-	 $(TRY_CC_MSG)						  \
-	 echo "$(1)" |						  \
-	 $(CC) -x c - $(2) -o "$$TMP" $(TRY_CC_OUTPUT) && echo y; \
-	 rm -f "$$TMP"')
diff --git a/src/tools/perf/design.txt b/src/tools/perf/design.txt
deleted file mode 100644
index 67e5d0c..0000000
--- a/src/tools/perf/design.txt
+++ /dev/null
@@ -1,463 +0,0 @@
-
-Performance Counters for Linux
-------------------------------
-
-Performance counters are special hardware registers available on most modern
-CPUs. These registers count the number of certain types of hw events: such
-as instructions executed, cachemisses suffered, or branches mis-predicted -
-without slowing down the kernel or applications. These registers can also
-trigger interrupts when a threshold number of events have passed - and can
-thus be used to profile the code that runs on that CPU.
-
-The Linux Performance Counter subsystem provides an abstraction of these
-hardware capabilities. It provides per task and per CPU counters, counter
-groups, and it provides event capabilities on top of those.  It
-provides "virtual" 64-bit counters, regardless of the width of the
-underlying hardware counters.
-
-Performance counters are accessed via special file descriptors.
-There's one file descriptor per virtual counter used.
-
-The special file descriptor is opened via the perf_event_open()
-system call:
-
-   int sys_perf_event_open(struct perf_event_attr *hw_event_uptr,
-			     pid_t pid, int cpu, int group_fd,
-			     unsigned long flags);
-
-The syscall returns the new fd. The fd can be used via the normal
-VFS system calls: read() can be used to read the counter, fcntl()
-can be used to set the blocking mode, etc.
-
-Multiple counters can be kept open at a time, and the counters
-can be poll()ed.
-
-When creating a new counter fd, 'perf_event_attr' is:
-
-struct perf_event_attr {
-        /*
-         * The MSB of the config word signifies if the rest contains cpu
-         * specific (raw) counter configuration data, if unset, the next
-         * 7 bits are an event type and the rest of the bits are the event
-         * identifier.
-         */
-        __u64                   config;
-
-        __u64                   irq_period;
-        __u32                   record_type;
-        __u32                   read_format;
-
-        __u64                   disabled       :  1, /* off by default        */
-                                inherit        :  1, /* children inherit it   */
-                                pinned         :  1, /* must always be on PMU */
-                                exclusive      :  1, /* only group on PMU     */
-                                exclude_user   :  1, /* don't count user      */
-                                exclude_kernel :  1, /* ditto kernel          */
-                                exclude_hv     :  1, /* ditto hypervisor      */
-                                exclude_idle   :  1, /* don't count when idle */
-                                mmap           :  1, /* include mmap data     */
-                                munmap         :  1, /* include munmap data   */
-                                comm           :  1, /* include comm data     */
-
-                                __reserved_1   : 52;
-
-        __u32                   extra_config_len;
-        __u32                   wakeup_events;  /* wakeup every n events */
-
-        __u64                   __reserved_2;
-        __u64                   __reserved_3;
-};
-
-The 'config' field specifies what the counter should count.  It
-is divided into 3 bit-fields:
-
-raw_type: 1 bit   (most significant bit)	0x8000_0000_0000_0000
-type:	  7 bits  (next most significant)	0x7f00_0000_0000_0000
-event_id: 56 bits (least significant)		0x00ff_ffff_ffff_ffff
-
-If 'raw_type' is 1, then the counter will count a hardware event
-specified by the remaining 63 bits of event_config.  The encoding is
-machine-specific.
-
-If 'raw_type' is 0, then the 'type' field says what kind of counter
-this is, with the following encoding:
-
-enum perf_event_types {
-	PERF_TYPE_HARDWARE		= 0,
-	PERF_TYPE_SOFTWARE		= 1,
-	PERF_TYPE_TRACEPOINT		= 2,
-};
-
-A counter of PERF_TYPE_HARDWARE will count the hardware event
-specified by 'event_id':
-
-/*
- * Generalized performance counter event types, used by the hw_event.event_id
- * parameter of the sys_perf_event_open() syscall:
- */
-enum hw_event_ids {
-	/*
-	 * Common hardware events, generalized by the kernel:
-	 */
-	PERF_COUNT_HW_CPU_CYCLES		= 0,
-	PERF_COUNT_HW_INSTRUCTIONS		= 1,
-	PERF_COUNT_HW_CACHE_REFERENCES		= 2,
-	PERF_COUNT_HW_CACHE_MISSES		= 3,
-	PERF_COUNT_HW_BRANCH_INSTRUCTIONS	= 4,
-	PERF_COUNT_HW_BRANCH_MISSES		= 5,
-	PERF_COUNT_HW_BUS_CYCLES		= 6,
-};
-
-These are standardized types of events that work relatively uniformly
-on all CPUs that implement Performance Counters support under Linux,
-although there may be variations (e.g., different CPUs might count
-cache references and misses at different levels of the cache hierarchy).
-If a CPU is not able to count the selected event, then the system call
-will return -EINVAL.
-
-More hw_event_types are supported as well, but they are CPU-specific
-and accessed as raw events.  For example, to count "External bus
-cycles while bus lock signal asserted" events on Intel Core CPUs, pass
-in a 0x4064 event_id value and set hw_event.raw_type to 1.
-
-A counter of type PERF_TYPE_SOFTWARE will count one of the available
-software events, selected by 'event_id':
-
-/*
- * Special "software" counters provided by the kernel, even if the hardware
- * does not support performance counters. These counters measure various
- * physical and sw events of the kernel (and allow the profiling of them as
- * well):
- */
-enum sw_event_ids {
-	PERF_COUNT_SW_CPU_CLOCK		= 0,
-	PERF_COUNT_SW_TASK_CLOCK	= 1,
-	PERF_COUNT_SW_PAGE_FAULTS	= 2,
-	PERF_COUNT_SW_CONTEXT_SWITCHES	= 3,
-	PERF_COUNT_SW_CPU_MIGRATIONS	= 4,
-	PERF_COUNT_SW_PAGE_FAULTS_MIN	= 5,
-	PERF_COUNT_SW_PAGE_FAULTS_MAJ	= 6,
-	PERF_COUNT_SW_ALIGNMENT_FAULTS	= 7,
-	PERF_COUNT_SW_EMULATION_FAULTS	= 8,
-};
-
-Counters of the type PERF_TYPE_TRACEPOINT are available when the ftrace event
-tracer is available, and event_id values can be obtained from
-/debug/tracing/events/*/*/id
-
-
-Counters come in two flavours: counting counters and sampling
-counters.  A "counting" counter is one that is used for counting the
-number of events that occur, and is characterised by having
-irq_period = 0.
-
-
-A read() on a counter returns the current value of the counter and possible
-additional values as specified by 'read_format', each value is a u64 (8 bytes)
-in size.
-
-/*
- * Bits that can be set in hw_event.read_format to request that
- * reads on the counter should return the indicated quantities,
- * in increasing order of bit value, after the counter value.
- */
-enum perf_event_read_format {
-        PERF_FORMAT_TOTAL_TIME_ENABLED  =  1,
-        PERF_FORMAT_TOTAL_TIME_RUNNING  =  2,
-};
-
-Using these additional values one can establish the overcommit ratio for a
-particular counter allowing one to take the round-robin scheduling effect
-into account.
-
-
-A "sampling" counter is one that is set up to generate an interrupt
-every N events, where N is given by 'irq_period'.  A sampling counter
-has irq_period > 0. The record_type controls what data is recorded on each
-interrupt:
-
-/*
- * Bits that can be set in hw_event.record_type to request information
- * in the overflow packets.
- */
-enum perf_event_record_format {
-        PERF_RECORD_IP          = 1U << 0,
-        PERF_RECORD_TID         = 1U << 1,
-        PERF_RECORD_TIME        = 1U << 2,
-        PERF_RECORD_ADDR        = 1U << 3,
-        PERF_RECORD_GROUP       = 1U << 4,
-        PERF_RECORD_CALLCHAIN   = 1U << 5,
-};
-
-Such (and other) events will be recorded in a ring-buffer, which is
-available to user-space using mmap() (see below).
-
-The 'disabled' bit specifies whether the counter starts out disabled
-or enabled.  If it is initially disabled, it can be enabled by ioctl
-or prctl (see below).
-
-The 'inherit' bit, if set, specifies that this counter should count
-events on descendant tasks as well as the task specified.  This only
-applies to new descendents, not to any existing descendents at the
-time the counter is created (nor to any new descendents of existing
-descendents).
-
-The 'pinned' bit, if set, specifies that the counter should always be
-on the CPU if at all possible.  It only applies to hardware counters
-and only to group leaders.  If a pinned counter cannot be put onto the
-CPU (e.g. because there are not enough hardware counters or because of
-a conflict with some other event), then the counter goes into an
-'error' state, where reads return end-of-file (i.e. read() returns 0)
-until the counter is subsequently enabled or disabled.
-
-The 'exclusive' bit, if set, specifies that when this counter's group
-is on the CPU, it should be the only group using the CPU's counters.
-In future, this will allow sophisticated monitoring programs to supply
-extra configuration information via 'extra_config_len' to exploit
-advanced features of the CPU's Performance Monitor Unit (PMU) that are
-not otherwise accessible and that might disrupt other hardware
-counters.
-
-The 'exclude_user', 'exclude_kernel' and 'exclude_hv' bits provide a
-way to request that counting of events be restricted to times when the
-CPU is in user, kernel and/or hypervisor mode.
-
-The 'mmap' and 'munmap' bits allow recording of PROT_EXEC mmap/munmap
-operations, these can be used to relate userspace IP addresses to actual
-code, even after the mapping (or even the whole process) is gone,
-these events are recorded in the ring-buffer (see below).
-
-The 'comm' bit allows tracking of process comm data on process creation.
-This too is recorded in the ring-buffer (see below).
-
-The 'pid' parameter to the perf_event_open() system call allows the
-counter to be specific to a task:
-
- pid == 0: if the pid parameter is zero, the counter is attached to the
- current task.
-
- pid > 0: the counter is attached to a specific task (if the current task
- has sufficient privilege to do so)
-
- pid < 0: all tasks are counted (per cpu counters)
-
-The 'cpu' parameter allows a counter to be made specific to a CPU:
-
- cpu >= 0: the counter is restricted to a specific CPU
- cpu == -1: the counter counts on all CPUs
-
-(Note: the combination of 'pid == -1' and 'cpu == -1' is not valid.)
-
-A 'pid > 0' and 'cpu == -1' counter is a per task counter that counts
-events of that task and 'follows' that task to whatever CPU the task
-gets schedule to. Per task counters can be created by any user, for
-their own tasks.
-
-A 'pid == -1' and 'cpu == x' counter is a per CPU counter that counts
-all events on CPU-x. Per CPU counters need CAP_SYS_ADMIN privilege.
-
-The 'flags' parameter is currently unused and must be zero.
-
-The 'group_fd' parameter allows counter "groups" to be set up.  A
-counter group has one counter which is the group "leader".  The leader
-is created first, with group_fd = -1 in the perf_event_open call
-that creates it.  The rest of the group members are created
-subsequently, with group_fd giving the fd of the group leader.
-(A single counter on its own is created with group_fd = -1 and is
-considered to be a group with only 1 member.)
-
-A counter group is scheduled onto the CPU as a unit, that is, it will
-only be put onto the CPU if all of the counters in the group can be
-put onto the CPU.  This means that the values of the member counters
-can be meaningfully compared, added, divided (to get ratios), etc.,
-with each other, since they have counted events for the same set of
-executed instructions.
-
-
-Like stated, asynchronous events, like counter overflow or PROT_EXEC mmap
-tracking are logged into a ring-buffer. This ring-buffer is created and
-accessed through mmap().
-
-The mmap size should be 1+2^n pages, where the first page is a meta-data page
-(struct perf_event_mmap_page) that contains various bits of information such
-as where the ring-buffer head is.
-
-/*
- * Structure of the page that can be mapped via mmap
- */
-struct perf_event_mmap_page {
-        __u32   version;                /* version number of this structure */
-        __u32   compat_version;         /* lowest version this is compat with */
-
-        /*
-         * Bits needed to read the hw counters in user-space.
-         *
-         *   u32 seq;
-         *   s64 count;
-         *
-         *   do {
-         *     seq = pc->lock;
-         *
-         *     barrier()
-         *     if (pc->index) {
-         *       count = pmc_read(pc->index - 1);
-         *       count += pc->offset;
-         *     } else
-         *       goto regular_read;
-         *
-         *     barrier();
-         *   } while (pc->lock != seq);
-         *
-         * NOTE: for obvious reason this only works on self-monitoring
-         *       processes.
-         */
-        __u32   lock;                   /* seqlock for synchronization */
-        __u32   index;                  /* hardware counter identifier */
-        __s64   offset;                 /* add to hardware counter value */
-
-        /*
-         * Control data for the mmap() data buffer.
-         *
-         * User-space reading this value should issue an rmb(), on SMP capable
-         * platforms, after reading this value -- see perf_event_wakeup().
-         */
-        __u32   data_head;              /* head in the data section */
-};
-
-NOTE: the hw-counter userspace bits are arch specific and are currently only
-      implemented on powerpc.
-
-The following 2^n pages are the ring-buffer which contains events of the form:
-
-#define PERF_RECORD_MISC_KERNEL          (1 << 0)
-#define PERF_RECORD_MISC_USER            (1 << 1)
-#define PERF_RECORD_MISC_OVERFLOW        (1 << 2)
-
-struct perf_event_header {
-        __u32   type;
-        __u16   misc;
-        __u16   size;
-};
-
-enum perf_event_type {
-
-        /*
-         * The MMAP events record the PROT_EXEC mappings so that we can
-         * correlate userspace IPs to code. They have the following structure:
-         *
-         * struct {
-         *      struct perf_event_header        header;
-         *
-         *      u32                             pid, tid;
-         *      u64                             addr;
-         *      u64                             len;
-         *      u64                             pgoff;
-         *      char                            filename[];
-         * };
-         */
-        PERF_RECORD_MMAP                 = 1,
-        PERF_RECORD_MUNMAP               = 2,
-
-        /*
-         * struct {
-         *      struct perf_event_header        header;
-         *
-         *      u32                             pid, tid;
-         *      char                            comm[];
-         * };
-         */
-        PERF_RECORD_COMM                 = 3,
-
-        /*
-         * When header.misc & PERF_RECORD_MISC_OVERFLOW the event_type field
-         * will be PERF_RECORD_*
-         *
-         * struct {
-         *      struct perf_event_header        header;
-         *
-         *      { u64                   ip;       } && PERF_RECORD_IP
-         *      { u32                   pid, tid; } && PERF_RECORD_TID
-         *      { u64                   time;     } && PERF_RECORD_TIME
-         *      { u64                   addr;     } && PERF_RECORD_ADDR
-         *
-         *      { u64                   nr;
-         *        { u64 event, val; }   cnt[nr];  } && PERF_RECORD_GROUP
-         *
-         *      { u16                   nr,
-         *                              hv,
-         *                              kernel,
-         *                              user;
-         *        u64                   ips[nr];  } && PERF_RECORD_CALLCHAIN
-         * };
-         */
-};
-
-NOTE: PERF_RECORD_CALLCHAIN is arch specific and currently only implemented
-      on x86.
-
-Notification of new events is possible through poll()/select()/epoll() and
-fcntl() managing signals.
-
-Normally a notification is generated for every page filled, however one can
-additionally set perf_event_attr.wakeup_events to generate one every
-so many counter overflow events.
-
-Future work will include a splice() interface to the ring-buffer.
-
-
-Counters can be enabled and disabled in two ways: via ioctl and via
-prctl.  When a counter is disabled, it doesn't count or generate
-events but does continue to exist and maintain its count value.
-
-An individual counter can be enabled with
-
-	ioctl(fd, PERF_EVENT_IOC_ENABLE, 0);
-
-or disabled with
-
-	ioctl(fd, PERF_EVENT_IOC_DISABLE, 0);
-
-For a counter group, pass PERF_IOC_FLAG_GROUP as the third argument.
-Enabling or disabling the leader of a group enables or disables the
-whole group; that is, while the group leader is disabled, none of the
-counters in the group will count.  Enabling or disabling a member of a
-group other than the leader only affects that counter - disabling an
-non-leader stops that counter from counting but doesn't affect any
-other counter.
-
-Additionally, non-inherited overflow counters can use
-
-	ioctl(fd, PERF_EVENT_IOC_REFRESH, nr);
-
-to enable a counter for 'nr' events, after which it gets disabled again.
-
-A process can enable or disable all the counter groups that are
-attached to it, using prctl:
-
-	prctl(PR_TASK_PERF_EVENTS_ENABLE);
-
-	prctl(PR_TASK_PERF_EVENTS_DISABLE);
-
-This applies to all counters on the current process, whether created
-by this process or by another, and doesn't affect any counters that
-this process has created on other processes.  It only enables or
-disables the group leaders, not any other members in the groups.
-
-
-Arch requirements
------------------
-
-If your architecture does not have hardware performance metrics, you can
-still use the generic software counters based on hrtimers for sampling.
-
-So to start with, in order to add HAVE_PERF_EVENTS to your Kconfig, you
-will need at least this:
-	- asm/perf_event.h - a basic stub will suffice at first
-	- support for atomic64 types (and associated helper functions)
-	- set_perf_event_pending() implemented
-
-If your architecture does have hardware capabilities, you can override the
-weak stub hw_perf_event_init() to register hardware counters.
-
-Architectures that have d-cache aliassing issues, such as Sparc and ARM,
-should select PERF_USE_VMALLOC in order to avoid these for perf mmap().
diff --git a/src/tools/perf/perf-archive.sh b/src/tools/perf/perf-archive.sh
deleted file mode 100644
index e919306..0000000
--- a/src/tools/perf/perf-archive.sh
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/bash
-# perf archive
-# Arnaldo Carvalho de Melo <acme@redhat.com>
-
-PERF_DATA=perf.data
-if [ $# -ne 0 ] ; then
-	PERF_DATA=$1
-fi
-
-#
-# PERF_BUILDID_DIR environment variable set by perf
-# path to buildid directory, default to $HOME/.debug
-#
-if [ -z $PERF_BUILDID_DIR ]; then
-	PERF_BUILDID_DIR=~/.debug/
-else
-        # append / to make substitutions work
-        PERF_BUILDID_DIR=$PERF_BUILDID_DIR/
-fi
-
-BUILDIDS=$(mktemp /tmp/perf-archive-buildids.XXXXXX)
-NOBUILDID=0000000000000000000000000000000000000000
-
-perf buildid-list -i $PERF_DATA --with-hits | grep -v "^$NOBUILDID " > $BUILDIDS
-if [ ! -s $BUILDIDS ] ; then
-	echo "perf archive: no build-ids found"
-	rm $BUILDIDS || true
-	exit 1
-fi
-
-MANIFEST=$(mktemp /tmp/perf-archive-manifest.XXXXXX)
-PERF_BUILDID_LINKDIR=$(readlink -f $PERF_BUILDID_DIR)/
-
-cut -d ' ' -f 1 $BUILDIDS | \
-while read build_id ; do
-	linkname=$PERF_BUILDID_DIR.build-id/${build_id:0:2}/${build_id:2}
-	filename=$(readlink -f $linkname)
-	echo ${linkname#$PERF_BUILDID_DIR} >> $MANIFEST
-	echo ${filename#$PERF_BUILDID_LINKDIR} >> $MANIFEST
-done
-
-tar cjf $PERF_DATA.tar.bz2 -C $PERF_BUILDID_DIR -T $MANIFEST
-rm $MANIFEST $BUILDIDS || true
-echo -e "Now please run:\n"
-echo -e "$ tar xvf $PERF_DATA.tar.bz2 -C ~/.debug\n"
-echo "wherever you need to run 'perf report' on."
-exit 0
diff --git a/src/tools/perf/perf.c b/src/tools/perf/perf.c
deleted file mode 100644
index 85e1aed..0000000
--- a/src/tools/perf/perf.c
+++ /dev/null
@@ -1,543 +0,0 @@
-/*
- * perf.c
- *
- * Performance analysis utility.
- *
- * This is the main hub from which the sub-commands (perf stat,
- * perf top, perf record, perf report, etc.) are started.
- */
-#include "builtin.h"
-
-#include "util/exec_cmd.h"
-#include "util/cache.h"
-#include "util/quote.h"
-#include "util/run-command.h"
-#include "util/parse-events.h"
-#include <lk/debugfs.h>
-#include <pthread.h>
-
-const char perf_usage_string[] =
-	"perf [--version] [--help] COMMAND [ARGS]";
-
-const char perf_more_info_string[] =
-	"See 'perf help COMMAND' for more information on a specific command.";
-
-int use_browser = -1;
-static int use_pager = -1;
-const char *input_name;
-
-struct cmd_struct {
-	const char *cmd;
-	int (*fn)(int, const char **, const char *);
-	int option;
-};
-
-static struct cmd_struct commands[] = {
-	{ "buildid-cache", cmd_buildid_cache, 0 },
-	{ "buildid-list", cmd_buildid_list, 0 },
-	{ "diff",	cmd_diff,	0 },
-	{ "evlist",	cmd_evlist,	0 },
-	{ "help",	cmd_help,	0 },
-	{ "list",	cmd_list,	0 },
-	{ "record",	cmd_record,	0 },
-	{ "report",	cmd_report,	0 },
-	{ "bench",	cmd_bench,	0 },
-	{ "stat",	cmd_stat,	0 },
-	{ "timechart",	cmd_timechart,	0 },
-	{ "top",	cmd_top,	0 },
-	{ "annotate",	cmd_annotate,	0 },
-	{ "version",	cmd_version,	0 },
-	{ "script",	cmd_script,	0 },
-	{ "sched",	cmd_sched,	0 },
-#ifdef LIBELF_SUPPORT
-	{ "probe",	cmd_probe,	0 },
-#endif
-	{ "kmem",	cmd_kmem,	0 },
-	{ "lock",	cmd_lock,	0 },
-	{ "kvm",	cmd_kvm,	0 },
-	{ "test",	cmd_test,	0 },
-#ifdef LIBAUDIT_SUPPORT
-	{ "trace",	cmd_trace,	0 },
-#endif
-	{ "inject",	cmd_inject,	0 },
-	{ "mem",	cmd_mem,	0 },
-};
-
-struct pager_config {
-	const char *cmd;
-	int val;
-};
-
-static int pager_command_config(const char *var, const char *value, void *data)
-{
-	struct pager_config *c = data;
-	if (!prefixcmp(var, "pager.") && !strcmp(var + 6, c->cmd))
-		c->val = perf_config_bool(var, value);
-	return 0;
-}
-
-/* returns 0 for "no pager", 1 for "use pager", and -1 for "not specified" */
-int check_pager_config(const char *cmd)
-{
-	struct pager_config c;
-	c.cmd = cmd;
-	c.val = -1;
-	perf_config(pager_command_config, &c);
-	return c.val;
-}
-
-static int browser_command_config(const char *var, const char *value, void *data)
-{
-	struct pager_config *c = data;
-	if (!prefixcmp(var, "tui.") && !strcmp(var + 4, c->cmd))
-		c->val = perf_config_bool(var, value);
-	if (!prefixcmp(var, "gtk.") && !strcmp(var + 4, c->cmd))
-		c->val = perf_config_bool(var, value) ? 2 : 0;
-	return 0;
-}
-
-/*
- * returns 0 for "no tui", 1 for "use tui", 2 for "use gtk",
- * and -1 for "not specified"
- */
-static int check_browser_config(const char *cmd)
-{
-	struct pager_config c;
-	c.cmd = cmd;
-	c.val = -1;
-	perf_config(browser_command_config, &c);
-	return c.val;
-}
-
-static void commit_pager_choice(void)
-{
-	switch (use_pager) {
-	case 0:
-		setenv("PERF_PAGER", "cat", 1);
-		break;
-	case 1:
-		/* setup_pager(); */
-		break;
-	default:
-		break;
-	}
-}
-
-static int handle_options(const char ***argv, int *argc, int *envchanged)
-{
-	int handled = 0;
-
-	while (*argc > 0) {
-		const char *cmd = (*argv)[0];
-		if (cmd[0] != '-')
-			break;
-
-		/*
-		 * For legacy reasons, the "version" and "help"
-		 * commands can be written with "--" prepended
-		 * to make them look like flags.
-		 */
-		if (!strcmp(cmd, "--help") || !strcmp(cmd, "--version"))
-			break;
-
-		/*
-		 * Check remaining flags.
-		 */
-		if (!prefixcmp(cmd, CMD_EXEC_PATH)) {
-			cmd += strlen(CMD_EXEC_PATH);
-			if (*cmd == '=')
-				perf_set_argv_exec_path(cmd + 1);
-			else {
-				puts(perf_exec_path());
-				exit(0);
-			}
-		} else if (!strcmp(cmd, "--html-path")) {
-			puts(system_path(PERF_HTML_PATH));
-			exit(0);
-		} else if (!strcmp(cmd, "-p") || !strcmp(cmd, "--paginate")) {
-			use_pager = 1;
-		} else if (!strcmp(cmd, "--no-pager")) {
-			use_pager = 0;
-			if (envchanged)
-				*envchanged = 1;
-		} else if (!strcmp(cmd, "--perf-dir")) {
-			if (*argc < 2) {
-				fprintf(stderr, "No directory given for --perf-dir.\n");
-				usage(perf_usage_string);
-			}
-			setenv(PERF_DIR_ENVIRONMENT, (*argv)[1], 1);
-			if (envchanged)
-				*envchanged = 1;
-			(*argv)++;
-			(*argc)--;
-			handled++;
-		} else if (!prefixcmp(cmd, CMD_PERF_DIR)) {
-			setenv(PERF_DIR_ENVIRONMENT, cmd + strlen(CMD_PERF_DIR), 1);
-			if (envchanged)
-				*envchanged = 1;
-		} else if (!strcmp(cmd, "--work-tree")) {
-			if (*argc < 2) {
-				fprintf(stderr, "No directory given for --work-tree.\n");
-				usage(perf_usage_string);
-			}
-			setenv(PERF_WORK_TREE_ENVIRONMENT, (*argv)[1], 1);
-			if (envchanged)
-				*envchanged = 1;
-			(*argv)++;
-			(*argc)--;
-		} else if (!prefixcmp(cmd, CMD_WORK_TREE)) {
-			setenv(PERF_WORK_TREE_ENVIRONMENT, cmd + strlen(CMD_WORK_TREE), 1);
-			if (envchanged)
-				*envchanged = 1;
-		} else if (!strcmp(cmd, "--debugfs-dir")) {
-			if (*argc < 2) {
-				fprintf(stderr, "No directory given for --debugfs-dir.\n");
-				usage(perf_usage_string);
-			}
-			perf_debugfs_set_path((*argv)[1]);
-			if (envchanged)
-				*envchanged = 1;
-			(*argv)++;
-			(*argc)--;
-		} else if (!prefixcmp(cmd, CMD_DEBUGFS_DIR)) {
-			perf_debugfs_set_path(cmd + strlen(CMD_DEBUGFS_DIR));
-			fprintf(stderr, "dir: %s\n", debugfs_mountpoint);
-			if (envchanged)
-				*envchanged = 1;
-		} else if (!strcmp(cmd, "--list-cmds")) {
-			unsigned int i;
-
-			for (i = 0; i < ARRAY_SIZE(commands); i++) {
-				struct cmd_struct *p = commands+i;
-				printf("%s ", p->cmd);
-			}
-			exit(0);
-		} else {
-			fprintf(stderr, "Unknown option: %s\n", cmd);
-			usage(perf_usage_string);
-		}
-
-		(*argv)++;
-		(*argc)--;
-		handled++;
-	}
-	return handled;
-}
-
-static int handle_alias(int *argcp, const char ***argv)
-{
-	int envchanged = 0, ret = 0, saved_errno = errno;
-	int count, option_count;
-	const char **new_argv;
-	const char *alias_command;
-	char *alias_string;
-
-	alias_command = (*argv)[0];
-	alias_string = alias_lookup(alias_command);
-	if (alias_string) {
-		if (alias_string[0] == '!') {
-			if (*argcp > 1) {
-				struct strbuf buf;
-
-				strbuf_init(&buf, PATH_MAX);
-				strbuf_addstr(&buf, alias_string);
-				sq_quote_argv(&buf, (*argv) + 1, PATH_MAX);
-				free(alias_string);
-				alias_string = buf.buf;
-			}
-			ret = system(alias_string + 1);
-			if (ret >= 0 && WIFEXITED(ret) &&
-			    WEXITSTATUS(ret) != 127)
-				exit(WEXITSTATUS(ret));
-			die("Failed to run '%s' when expanding alias '%s'",
-			    alias_string + 1, alias_command);
-		}
-		count = split_cmdline(alias_string, &new_argv);
-		if (count < 0)
-			die("Bad alias.%s string", alias_command);
-		option_count = handle_options(&new_argv, &count, &envchanged);
-		if (envchanged)
-			die("alias '%s' changes environment variables\n"
-				 "You can use '!perf' in the alias to do this.",
-				 alias_command);
-		memmove(new_argv - option_count, new_argv,
-				count * sizeof(char *));
-		new_argv -= option_count;
-
-		if (count < 1)
-			die("empty alias for %s", alias_command);
-
-		if (!strcmp(alias_command, new_argv[0]))
-			die("recursive alias: %s", alias_command);
-
-		new_argv = realloc(new_argv, sizeof(char *) *
-				    (count + *argcp + 1));
-		/* insert after command name */
-		memcpy(new_argv + count, *argv + 1, sizeof(char *) * *argcp);
-		new_argv[count + *argcp] = NULL;
-
-		*argv = new_argv;
-		*argcp += count - 1;
-
-		ret = 1;
-	}
-
-	errno = saved_errno;
-
-	return ret;
-}
-
-const char perf_version_string[] = PERF_VERSION;
-
-#define RUN_SETUP	(1<<0)
-#define USE_PAGER	(1<<1)
-/*
- * require working tree to be present -- anything uses this needs
- * RUN_SETUP for reading from the configuration file.
- */
-#define NEED_WORK_TREE	(1<<2)
-
-static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
-{
-	int status;
-	struct stat st;
-	const char *prefix;
-
-	prefix = NULL;
-	if (p->option & RUN_SETUP)
-		prefix = NULL; /* setup_perf_directory(); */
-
-	if (use_browser == -1)
-		use_browser = check_browser_config(p->cmd);
-
-	if (use_pager == -1 && p->option & RUN_SETUP)
-		use_pager = check_pager_config(p->cmd);
-	if (use_pager == -1 && p->option & USE_PAGER)
-		use_pager = 1;
-	commit_pager_choice();
-
-	status = p->fn(argc, argv, prefix);
-	exit_browser(status);
-
-	if (status)
-		return status & 0xff;
-
-	/* Somebody closed stdout? */
-	if (fstat(fileno(stdout), &st))
-		return 0;
-	/* Ignore write errors for pipes and sockets.. */
-	if (S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode))
-		return 0;
-
-	status = 1;
-	/* Check for ENOSPC and EIO errors.. */
-	if (fflush(stdout)) {
-		fprintf(stderr, "write failure on standard output: %s", strerror(errno));
-		goto out;
-	}
-	if (ferror(stdout)) {
-		fprintf(stderr, "unknown write failure on standard output");
-		goto out;
-	}
-	if (fclose(stdout)) {
-		fprintf(stderr, "close failed on standard output: %s", strerror(errno));
-		goto out;
-	}
-	status = 0;
-out:
-	return status;
-}
-
-static void handle_internal_command(int argc, const char **argv)
-{
-	const char *cmd = argv[0];
-	unsigned int i;
-	static const char ext[] = STRIP_EXTENSION;
-
-	if (sizeof(ext) > 1) {
-		i = strlen(argv[0]) - strlen(ext);
-		if (i > 0 && !strcmp(argv[0] + i, ext)) {
-			char *argv0 = strdup(argv[0]);
-			argv[0] = cmd = argv0;
-			argv0[i] = '\0';
-		}
-	}
-
-	/* Turn "perf cmd --help" into "perf help cmd" */
-	if (argc > 1 && !strcmp(argv[1], "--help")) {
-		argv[1] = argv[0];
-		argv[0] = cmd = "help";
-	}
-
-	for (i = 0; i < ARRAY_SIZE(commands); i++) {
-		struct cmd_struct *p = commands+i;
-		if (strcmp(p->cmd, cmd))
-			continue;
-		exit(run_builtin(p, argc, argv));
-	}
-}
-
-static void execv_dashed_external(const char **argv)
-{
-	struct strbuf cmd = STRBUF_INIT;
-	const char *tmp;
-	int status;
-
-	strbuf_addf(&cmd, "perf-%s", argv[0]);
-
-	/*
-	 * argv[0] must be the perf command, but the argv array
-	 * belongs to the caller, and may be reused in
-	 * subsequent loop iterations. Save argv[0] and
-	 * restore it on error.
-	 */
-	tmp = argv[0];
-	argv[0] = cmd.buf;
-
-	/*
-	 * if we fail because the command is not found, it is
-	 * OK to return. Otherwise, we just pass along the status code.
-	 */
-	status = run_command_v_opt(argv, 0);
-	if (status != -ERR_RUN_COMMAND_EXEC) {
-		if (IS_RUN_COMMAND_ERR(status))
-			die("unable to run '%s'", argv[0]);
-		exit(-status);
-	}
-	errno = ENOENT; /* as if we called execvp */
-
-	argv[0] = tmp;
-
-	strbuf_release(&cmd);
-}
-
-static int run_argv(int *argcp, const char ***argv)
-{
-	int done_alias = 0;
-
-	while (1) {
-		/* See if it's an internal command */
-		handle_internal_command(*argcp, *argv);
-
-		/* .. then try the external ones */
-		execv_dashed_external(*argv);
-
-		/* It could be an alias -- this works around the insanity
-		 * of overriding "perf log" with "perf show" by having
-		 * alias.log = show
-		 */
-		if (done_alias || !handle_alias(argcp, argv))
-			break;
-		done_alias = 1;
-	}
-
-	return done_alias;
-}
-
-static void pthread__block_sigwinch(void)
-{
-	sigset_t set;
-
-	sigemptyset(&set);
-	sigaddset(&set, SIGWINCH);
-	pthread_sigmask(SIG_BLOCK, &set, NULL);
-}
-
-void pthread__unblock_sigwinch(void)
-{
-	sigset_t set;
-
-	sigemptyset(&set);
-	sigaddset(&set, SIGWINCH);
-	pthread_sigmask(SIG_UNBLOCK, &set, NULL);
-}
-
-int main(int argc, const char **argv)
-{
-	const char *cmd;
-
-	page_size = sysconf(_SC_PAGE_SIZE);
-
-	cmd = perf_extract_argv0_path(argv[0]);
-	if (!cmd)
-		cmd = "perf-help";
-	/* get debugfs mount point from /proc/mounts */
-	perf_debugfs_mount(NULL);
-	/*
-	 * "perf-xxxx" is the same as "perf xxxx", but we obviously:
-	 *
-	 *  - cannot take flags in between the "perf" and the "xxxx".
-	 *  - cannot execute it externally (since it would just do
-	 *    the same thing over again)
-	 *
-	 * So we just directly call the internal command handler, and
-	 * die if that one cannot handle it.
-	 */
-	if (!prefixcmp(cmd, "perf-")) {
-		cmd += 5;
-		argv[0] = cmd;
-		handle_internal_command(argc, argv);
-		fprintf(stderr, "cannot handle %s internally", cmd);
-		goto out;
-	}
-
-	/* Look for flags.. */
-	argv++;
-	argc--;
-	handle_options(&argv, &argc, NULL);
-	commit_pager_choice();
-	set_buildid_dir();
-
-	if (argc > 0) {
-		if (!prefixcmp(argv[0], "--"))
-			argv[0] += 2;
-	} else {
-		/* The user didn't specify a command; give them help */
-		printf("\n usage: %s\n\n", perf_usage_string);
-		list_common_cmds_help();
-		printf("\n %s\n\n", perf_more_info_string);
-		goto out;
-	}
-	cmd = argv[0];
-
-	test_attr__init();
-
-	/*
-	 * We use PATH to find perf commands, but we prepend some higher
-	 * precedence paths: the "--exec-path" option, the PERF_EXEC_PATH
-	 * environment, and the $(perfexecdir) from the Makefile at build
-	 * time.
-	 */
-	setup_path();
-	/*
-	 * Block SIGWINCH notifications so that the thread that wants it can
-	 * unblock and get syscalls like select interrupted instead of waiting
-	 * forever while the signal goes to some other non interested thread.
-	 */
-	pthread__block_sigwinch();
-
-	while (1) {
-		static int done_help;
-		int was_alias = run_argv(&argc, &argv);
-
-		if (errno != ENOENT)
-			break;
-
-		if (was_alias) {
-			fprintf(stderr, "Expansion of alias '%s' failed; "
-				"'%s' is not a perf-command\n",
-				cmd, argv[0]);
-			goto out;
-		}
-		if (!done_help) {
-			cmd = argv[0] = help_unknown_cmd(cmd);
-			done_help = 1;
-		} else
-			break;
-	}
-
-	fprintf(stderr, "Failed to run command '%s': %s\n",
-		cmd, strerror(errno));
-out:
-	return 1;
-}
diff --git a/src/tools/perf/perf.h b/src/tools/perf/perf.h
deleted file mode 100644
index cf20187..0000000
--- a/src/tools/perf/perf.h
+++ /dev/null
@@ -1,236 +0,0 @@
-#ifndef _PERF_PERF_H
-#define _PERF_PERF_H
-
-#include <asm/unistd.h>
-
-#if defined(__i386__)
-#define rmb()		asm volatile("lock; addl $0,0(%%esp)" ::: "memory")
-#define cpu_relax()	asm volatile("rep; nop" ::: "memory");
-#define CPUINFO_PROC	"model name"
-#ifndef __NR_perf_event_open
-# define __NR_perf_event_open 336
-#endif
-#endif
-
-#if defined(__x86_64__)
-#define rmb()		asm volatile("lfence" ::: "memory")
-#define cpu_relax()	asm volatile("rep; nop" ::: "memory");
-#define CPUINFO_PROC	"model name"
-#ifndef __NR_perf_event_open
-# define __NR_perf_event_open 298
-#endif
-#endif
-
-#ifdef __powerpc__
-#include "../../arch/powerpc/include/uapi/asm/unistd.h"
-#define rmb()		asm volatile ("sync" ::: "memory")
-#define cpu_relax()	asm volatile ("" ::: "memory");
-#define CPUINFO_PROC	"cpu"
-#endif
-
-#ifdef __s390__
-#define rmb()		asm volatile("bcr 15,0" ::: "memory")
-#define cpu_relax()	asm volatile("" ::: "memory");
-#endif
-
-#ifdef __sh__
-#if defined(__SH4A__) || defined(__SH5__)
-# define rmb()		asm volatile("synco" ::: "memory")
-#else
-# define rmb()		asm volatile("" ::: "memory")
-#endif
-#define cpu_relax()	asm volatile("" ::: "memory")
-#define CPUINFO_PROC	"cpu type"
-#endif
-
-#ifdef __hppa__
-#define rmb()		asm volatile("" ::: "memory")
-#define cpu_relax()	asm volatile("" ::: "memory");
-#define CPUINFO_PROC	"cpu"
-#endif
-
-#ifdef __sparc__
-#define rmb()		asm volatile("":::"memory")
-#define cpu_relax()	asm volatile("":::"memory")
-#define CPUINFO_PROC	"cpu"
-#endif
-
-#ifdef __alpha__
-#define rmb()		asm volatile("mb" ::: "memory")
-#define cpu_relax()	asm volatile("" ::: "memory")
-#define CPUINFO_PROC	"cpu model"
-#endif
-
-#ifdef __ia64__
-#define rmb()		asm volatile ("mf" ::: "memory")
-#define cpu_relax()	asm volatile ("hint @pause" ::: "memory")
-#define CPUINFO_PROC	"model name"
-#endif
-
-#ifdef __arm__
-/*
- * Use the __kuser_memory_barrier helper in the CPU helper page. See
- * arch/arm/kernel/entry-armv.S in the kernel source for details.
- */
-#define rmb()		((void(*)(void))0xffff0fa0)()
-#define cpu_relax()	asm volatile("":::"memory")
-#define CPUINFO_PROC	"Processor"
-#endif
-
-#ifdef __aarch64__
-#define rmb()		asm volatile("dmb ld" ::: "memory")
-#define cpu_relax()	asm volatile("yield" ::: "memory")
-#endif
-
-#ifdef __mips__
-#define rmb()		asm volatile(					\
-				".set	mips2\n\t"			\
-				"sync\n\t"				\
-				".set	mips0"				\
-				: /* no output */			\
-				: /* no input */			\
-				: "memory")
-#define cpu_relax()	asm volatile("" ::: "memory")
-#define CPUINFO_PROC	"cpu model"
-#endif
-
-#ifdef __arc__
-#define rmb()		asm volatile("" ::: "memory")
-#define cpu_relax()	rmb()
-#define CPUINFO_PROC	"Processor"
-#endif
-
-#ifdef __metag__
-#define rmb()		asm volatile("" ::: "memory")
-#define cpu_relax()	asm volatile("" ::: "memory")
-#define CPUINFO_PROC	"CPU"
-#endif
-
-#include <time.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/syscall.h>
-
-#include <linux/perf_event.h>
-#include "util/types.h"
-#include <stdbool.h>
-
-/*
- * prctl(PR_TASK_PERF_EVENTS_DISABLE) will (cheaply) disable all
- * counters in the current task.
- */
-#define PR_TASK_PERF_EVENTS_DISABLE   31
-#define PR_TASK_PERF_EVENTS_ENABLE    32
-
-#ifndef NSEC_PER_SEC
-# define NSEC_PER_SEC			1000000000ULL
-#endif
-#ifndef NSEC_PER_USEC
-# define NSEC_PER_USEC			1000ULL
-#endif
-
-static inline unsigned long long rdclock(void)
-{
-	struct timespec ts;
-
-	clock_gettime(CLOCK_MONOTONIC, &ts);
-	return ts.tv_sec * 1000000000ULL + ts.tv_nsec;
-}
-
-/*
- * Pick up some kernel type conventions:
- */
-#define __user
-#define asmlinkage
-
-#define unlikely(x)	__builtin_expect(!!(x), 0)
-#define min(x, y) ({				\
-	typeof(x) _min1 = (x);			\
-	typeof(y) _min2 = (y);			\
-	(void) (&_min1 == &_min2);		\
-	_min1 < _min2 ? _min1 : _min2; })
-
-extern bool test_attr__enabled;
-void test_attr__init(void);
-void test_attr__open(struct perf_event_attr *attr, pid_t pid, int cpu,
-		     int fd, int group_fd, unsigned long flags);
-
-static inline int
-sys_perf_event_open(struct perf_event_attr *attr,
-		      pid_t pid, int cpu, int group_fd,
-		      unsigned long flags)
-{
-	int fd;
-
-	fd = syscall(__NR_perf_event_open, attr, pid, cpu,
-		     group_fd, flags);
-
-	if (unlikely(test_attr__enabled))
-		test_attr__open(attr, pid, cpu, fd, group_fd, flags);
-
-	return fd;
-}
-
-#define MAX_COUNTERS			256
-#define MAX_NR_CPUS			256
-
-struct ip_callchain {
-	u64 nr;
-	u64 ips[0];
-};
-
-struct branch_flags {
-	u64 mispred:1;
-	u64 predicted:1;
-	u64 reserved:62;
-};
-
-struct branch_entry {
-	u64				from;
-	u64				to;
-	struct branch_flags flags;
-};
-
-struct branch_stack {
-	u64				nr;
-	struct branch_entry	entries[0];
-};
-
-extern const char *input_name;
-extern bool perf_host, perf_guest;
-extern const char perf_version_string[];
-
-void pthread__unblock_sigwinch(void);
-
-#include "util/target.h"
-
-enum perf_call_graph_mode {
-	CALLCHAIN_NONE,
-	CALLCHAIN_FP,
-	CALLCHAIN_DWARF
-};
-
-struct perf_record_opts {
-	struct perf_target target;
-	int	     call_graph;
-	bool	     group;
-	bool	     inherit_stat;
-	bool	     no_delay;
-	bool	     no_inherit;
-	bool	     no_samples;
-	bool	     pipe_output;
-	bool	     raw_samples;
-	bool	     sample_address;
-	bool	     sample_weight;
-	bool	     sample_time;
-	bool	     period;
-	unsigned int freq;
-	unsigned int mmap_pages;
-	unsigned int user_freq;
-	u64          branch_stack;
-	u64	     default_interval;
-	u64	     user_interval;
-	u16	     stack_dump_size;
-};
-
-#endif
diff --git a/src/tools/perf/python/twatch.py b/src/tools/perf/python/twatch.py
deleted file mode 100755
index 2225162..0000000
--- a/src/tools/perf/python/twatch.py
+++ /dev/null
@@ -1,41 +0,0 @@
-#! /usr/bin/python
-# -*- python -*-
-# -*- coding: utf-8 -*-
-#   twatch - Experimental use of the perf python interface
-#   Copyright (C) 2011 Arnaldo Carvalho de Melo <acme@redhat.com>
-#
-#   This application 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; version 2.
-#
-#   This application 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.
-
-import perf
-
-def main():
-	cpus = perf.cpu_map()
-	threads = perf.thread_map()
-	evsel = perf.evsel(task = 1, comm = 1, mmap = 0,
-			   wakeup_events = 1, watermark = 1,
-			   sample_id_all = 1,
-			   sample_type = perf.SAMPLE_PERIOD | perf.SAMPLE_TID | perf.SAMPLE_CPU)
-	evsel.open(cpus = cpus, threads = threads);
-	evlist = perf.evlist(cpus, threads)
-	evlist.add(evsel)
-	evlist.mmap()
-	while True:
-		evlist.poll(timeout = -1)
-		for cpu in cpus:
-			event = evlist.read_on_cpu(cpu)
-			if not event:
-				continue
-			print "cpu: %2d, pid: %4d, tid: %4d" % (event.sample_cpu,
-								event.sample_pid,
-								event.sample_tid),
-			print event
-
-if __name__ == '__main__':
-    main()
diff --git a/src/tools/perf/scripts/perl/Perf-Trace-Util/Context.c b/src/tools/perf/scripts/perl/Perf-Trace-Util/Context.c
deleted file mode 100644
index 790ceba..0000000
--- a/src/tools/perf/scripts/perl/Perf-Trace-Util/Context.c
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * This file was generated automatically by ExtUtils::ParseXS version 2.18_02 from the
- * contents of Context.xs. Do not edit this file, edit Context.xs instead.
- *
- *	ANY CHANGES MADE HERE WILL BE LOST! 
- *
- */
-
-#line 1 "Context.xs"
-/*
- * Context.xs.  XS interfaces for perf script.
- *
- * Copyright (C) 2009 Tom Zanussi <tzanussi@gmail.com>
- *
- *  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, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-
-#include "EXTERN.h"
-#include "perl.h"
-#include "XSUB.h"
-#include "../../../perf.h"
-#include "../../../util/trace-event.h"
-
-#ifndef PERL_UNUSED_VAR
-#  define PERL_UNUSED_VAR(var) if (0) var = var
-#endif
-
-#line 42 "Context.c"
-
-XS(XS_Perf__Trace__Context_common_pc); /* prototype to pass -Wmissing-prototypes */
-XS(XS_Perf__Trace__Context_common_pc)
-{
-#ifdef dVAR
-    dVAR; dXSARGS;
-#else
-    dXSARGS;
-#endif
-    if (items != 1)
-       Perl_croak(aTHX_ "Usage: %s(%s)", "Perf::Trace::Context::common_pc", "context");
-    PERL_UNUSED_VAR(cv); /* -W */
-    {
-	struct scripting_context *	context = INT2PTR(struct scripting_context *,SvIV(ST(0)));
-	int	RETVAL;
-	dXSTARG;
-
-	RETVAL = common_pc(context);
-	XSprePUSH; PUSHi((IV)RETVAL);
-    }
-    XSRETURN(1);
-}
-
-
-XS(XS_Perf__Trace__Context_common_flags); /* prototype to pass -Wmissing-prototypes */
-XS(XS_Perf__Trace__Context_common_flags)
-{
-#ifdef dVAR
-    dVAR; dXSARGS;
-#else
-    dXSARGS;
-#endif
-    if (items != 1)
-       Perl_croak(aTHX_ "Usage: %s(%s)", "Perf::Trace::Context::common_flags", "context");
-    PERL_UNUSED_VAR(cv); /* -W */
-    {
-	struct scripting_context *	context = INT2PTR(struct scripting_context *,SvIV(ST(0)));
-	int	RETVAL;
-	dXSTARG;
-
-	RETVAL = common_flags(context);
-	XSprePUSH; PUSHi((IV)RETVAL);
-    }
-    XSRETURN(1);
-}
-
-
-XS(XS_Perf__Trace__Context_common_lock_depth); /* prototype to pass -Wmissing-prototypes */
-XS(XS_Perf__Trace__Context_common_lock_depth)
-{
-#ifdef dVAR
-    dVAR; dXSARGS;
-#else
-    dXSARGS;
-#endif
-    if (items != 1)
-       Perl_croak(aTHX_ "Usage: %s(%s)", "Perf::Trace::Context::common_lock_depth", "context");
-    PERL_UNUSED_VAR(cv); /* -W */
-    {
-	struct scripting_context *	context = INT2PTR(struct scripting_context *,SvIV(ST(0)));
-	int	RETVAL;
-	dXSTARG;
-
-	RETVAL = common_lock_depth(context);
-	XSprePUSH; PUSHi((IV)RETVAL);
-    }
-    XSRETURN(1);
-}
-
-#ifdef __cplusplus
-extern "C"
-#endif
-XS(boot_Perf__Trace__Context); /* prototype to pass -Wmissing-prototypes */
-XS(boot_Perf__Trace__Context)
-{
-#ifdef dVAR
-    dVAR; dXSARGS;
-#else
-    dXSARGS;
-#endif
-    const char* file = __FILE__;
-
-    PERL_UNUSED_VAR(cv); /* -W */
-    PERL_UNUSED_VAR(items); /* -W */
-    XS_VERSION_BOOTCHECK ;
-
-        newXSproto("Perf::Trace::Context::common_pc", XS_Perf__Trace__Context_common_pc, file, "$");
-        newXSproto("Perf::Trace::Context::common_flags", XS_Perf__Trace__Context_common_flags, file, "$");
-        newXSproto("Perf::Trace::Context::common_lock_depth", XS_Perf__Trace__Context_common_lock_depth, file, "$");
-    if (PL_unitcheckav)
-         call_list(PL_scopestack_ix, PL_unitcheckav);
-    XSRETURN_YES;
-}
-
diff --git a/src/tools/perf/scripts/perl/Perf-Trace-Util/Context.xs b/src/tools/perf/scripts/perl/Perf-Trace-Util/Context.xs
deleted file mode 100644
index 8c7ea42..0000000
--- a/src/tools/perf/scripts/perl/Perf-Trace-Util/Context.xs
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Context.xs.  XS interfaces for perf script.
- *
- * Copyright (C) 2009 Tom Zanussi <tzanussi@gmail.com>
- *
- *  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, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-
-#include "EXTERN.h"
-#include "perl.h"
-#include "XSUB.h"
-#include "../../../perf.h"
-#include "../../../util/trace-event.h"
-
-MODULE = Perf::Trace::Context		PACKAGE = Perf::Trace::Context
-PROTOTYPES: ENABLE
-
-int
-common_pc(context)
-	struct scripting_context * context
-
-int
-common_flags(context)
-	struct scripting_context * context
-
-int
-common_lock_depth(context)
-	struct scripting_context * context
-
diff --git a/src/tools/perf/scripts/perl/Perf-Trace-Util/Makefile.PL b/src/tools/perf/scripts/perl/Perf-Trace-Util/Makefile.PL
deleted file mode 100644
index decdeb0..0000000
--- a/src/tools/perf/scripts/perl/Perf-Trace-Util/Makefile.PL
+++ /dev/null
@@ -1,17 +0,0 @@
-use 5.010000;
-use ExtUtils::MakeMaker;
-# See lib/ExtUtils/MakeMaker.pm for details of how to influence
-# the contents of the Makefile that is written.
-WriteMakefile(
-    NAME              => 'Perf::Trace::Context',
-    VERSION_FROM      => 'lib/Perf/Trace/Context.pm', # finds $VERSION
-    PREREQ_PM         => {}, # e.g., Module::Name => 1.1
-    ($] >= 5.005 ?     ## Add these new keywords supported since 5.005
-      (ABSTRACT_FROM  => 'lib/Perf/Trace/Context.pm', # retrieve abstract from module
-       AUTHOR         => 'Tom Zanussi <tzanussi@gmail.com>') : ()),
-    LIBS              => [''], # e.g., '-lm'
-    DEFINE            => '-I ../..', # e.g., '-DHAVE_SOMETHING'
-    INC               => '-I.', # e.g., '-I. -I/usr/include/other'
-	# Un-comment this if you add C files to link with later:
-    OBJECT            => 'Context.o', # link all the C files too
-);
diff --git a/src/tools/perf/scripts/perl/Perf-Trace-Util/README b/src/tools/perf/scripts/perl/Perf-Trace-Util/README
deleted file mode 100644
index 2f0c7f3..0000000
--- a/src/tools/perf/scripts/perl/Perf-Trace-Util/README
+++ /dev/null
@@ -1,59 +0,0 @@
-Perf-Trace-Util version 0.01
-============================
-
-This module contains utility functions for use with perf script.
-
-Core.pm and Util.pm are pure Perl modules; Core.pm contains routines
-that the core perf support for Perl calls on and should always be
-'used', while Util.pm contains useful but optional utility functions
-that scripts may want to use.  Context.pm contains the Perl->C
-interface that allows scripts to access data in the embedding perf
-executable; scripts wishing to do that should 'use Context.pm'.
-
-The Perl->C perf interface is completely driven by Context.xs.  If you
-want to add new Perl functions that end up accessing C data in the
-perf executable, you add desciptions of the new functions here.
-scripting_context is a pointer to the perf data in the perf executable
-that you want to access - it's passed as the second parameter,
-$context, to all handler functions.
-
-After you do that:
-
-  perl Makefile.PL   # to create a Makefile for the next step
-  make               # to create Context.c
-
-  edit Context.c to add const to the char* file = __FILE__ line in
-  XS(boot_Perf__Trace__Context) to silence a warning/error.
-
-  You can delete the Makefile, object files and anything else that was
-  generated e.g. blib and shared library, etc, except for of course
-  Context.c
-
-  You should then be able to run the normal perf make as usual.
-
-INSTALLATION
-
-Building perf with perf script Perl scripting should install this
-module in the right place.
-
-You should make sure libperl and ExtUtils/Embed.pm are installed first
-e.g. apt-get install libperl-dev or yum install perl-ExtUtils-Embed.
-
-DEPENDENCIES
-
-This module requires these other modules and libraries:
-
-  None
-
-COPYRIGHT AND LICENCE
-
-Copyright (C) 2009 by Tom Zanussi <tzanussi@gmail.com>
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself, either Perl version 5.10.0 or,
-at your option, any later version of Perl 5 you may have available.
-
-Alternatively, this software may be distributed under the terms of the
-GNU General Public License ("GPL") version 2 as published by the Free
-Software Foundation.
-
diff --git a/src/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Context.pm b/src/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Context.pm
deleted file mode 100644
index 4e2f603..0000000
--- a/src/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Context.pm
+++ /dev/null
@@ -1,55 +0,0 @@
-package Perf::Trace::Context;
-
-use 5.010000;
-use strict;
-use warnings;
-
-require Exporter;
-
-our @ISA = qw(Exporter);
-
-our %EXPORT_TAGS = ( 'all' => [ qw(
-) ] );
-
-our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
-
-our @EXPORT = qw(
-	common_pc common_flags common_lock_depth
-);
-
-our $VERSION = '0.01';
-
-require XSLoader;
-XSLoader::load('Perf::Trace::Context', $VERSION);
-
-1;
-__END__
-=head1 NAME
-
-Perf::Trace::Context - Perl extension for accessing functions in perf.
-
-=head1 SYNOPSIS
-
-  use Perf::Trace::Context;
-
-=head1 SEE ALSO
-
-Perf (script) documentation
-
-=head1 AUTHOR
-
-Tom Zanussi, E<lt>tzanussi@gmail.com<gt>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright (C) 2009 by Tom Zanussi
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself, either Perl version 5.10.0 or,
-at your option, any later version of Perl 5 you may have available.
-
-Alternatively, this software may be distributed under the terms of the
-GNU General Public License ("GPL") version 2 as published by the Free
-Software Foundation.
-
-=cut
diff --git a/src/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Core.pm b/src/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Core.pm
deleted file mode 100644
index 9158458..0000000
--- a/src/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Core.pm
+++ /dev/null
@@ -1,192 +0,0 @@
-package Perf::Trace::Core;
-
-use 5.010000;
-use strict;
-use warnings;
-
-require Exporter;
-
-our @ISA = qw(Exporter);
-
-our %EXPORT_TAGS = ( 'all' => [ qw(
-) ] );
-
-our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
-
-our @EXPORT = qw(
-define_flag_field define_flag_value flag_str dump_flag_fields
-define_symbolic_field define_symbolic_value symbol_str dump_symbolic_fields
-trace_flag_str
-);
-
-our $VERSION = '0.01';
-
-my %trace_flags = (0x00 => "NONE",
-		   0x01 => "IRQS_OFF",
-		   0x02 => "IRQS_NOSUPPORT",
-		   0x04 => "NEED_RESCHED",
-		   0x08 => "HARDIRQ",
-		   0x10 => "SOFTIRQ");
-
-sub trace_flag_str
-{
-    my ($value) = @_;
-
-    my $string;
-
-    my $print_delim = 0;
-
-    foreach my $idx (sort {$a <=> $b} keys %trace_flags) {
-	if (!$value && !$idx) {
-	    $string .= "NONE";
-	    last;
-	}
-
-	if ($idx && ($value & $idx) == $idx) {
-	    if ($print_delim) {
-		$string .= " | ";
-	    }
-	    $string .= "$trace_flags{$idx}";
-	    $print_delim = 1;
-	    $value &= ~$idx;
-	}
-    }
-
-    return $string;
-}
-
-my %flag_fields;
-my %symbolic_fields;
-
-sub flag_str
-{
-    my ($event_name, $field_name, $value) = @_;
-
-    my $string;
-
-    if ($flag_fields{$event_name}{$field_name}) {
-	my $print_delim = 0;
-	foreach my $idx (sort {$a <=> $b} keys %{$flag_fields{$event_name}{$field_name}{"values"}}) {
-	    if (!$value && !$idx) {
-		$string .= "$flag_fields{$event_name}{$field_name}{'values'}{$idx}";
-		last;
-	    }
-	    if ($idx && ($value & $idx) == $idx) {
-		if ($print_delim && $flag_fields{$event_name}{$field_name}{'delim'}) {
-		    $string .= " $flag_fields{$event_name}{$field_name}{'delim'} ";
-		}
-		$string .= "$flag_fields{$event_name}{$field_name}{'values'}{$idx}";
-		$print_delim = 1;
-		$value &= ~$idx;
-	    }
-	}
-    }
-
-    return $string;
-}
-
-sub define_flag_field
-{
-    my ($event_name, $field_name, $delim) = @_;
-
-    $flag_fields{$event_name}{$field_name}{"delim"} = $delim;
-}
-
-sub define_flag_value
-{
-    my ($event_name, $field_name, $value, $field_str) = @_;
-
-    $flag_fields{$event_name}{$field_name}{"values"}{$value} = $field_str;
-}
-
-sub dump_flag_fields
-{
-    for my $event (keys %flag_fields) {
-	print "event $event:\n";
-	for my $field (keys %{$flag_fields{$event}}) {
-	    print "    field: $field:\n";
-	    print "        delim: $flag_fields{$event}{$field}{'delim'}\n";
-	    foreach my $idx (sort {$a <=> $b} keys %{$flag_fields{$event}{$field}{"values"}}) {
-		print "        value $idx: $flag_fields{$event}{$field}{'values'}{$idx}\n";
-	    }
-	}
-    }
-}
-
-sub symbol_str
-{
-    my ($event_name, $field_name, $value) = @_;
-
-    if ($symbolic_fields{$event_name}{$field_name}) {
-	foreach my $idx (sort {$a <=> $b} keys %{$symbolic_fields{$event_name}{$field_name}{"values"}}) {
-	    if (!$value && !$idx) {
-		return "$symbolic_fields{$event_name}{$field_name}{'values'}{$idx}";
-		last;
-	    }
-	    if ($value == $idx) {
-		return "$symbolic_fields{$event_name}{$field_name}{'values'}{$idx}";
-	    }
-	}
-    }
-
-    return undef;
-}
-
-sub define_symbolic_field
-{
-    my ($event_name, $field_name) = @_;
-
-    # nothing to do, really
-}
-
-sub define_symbolic_value
-{
-    my ($event_name, $field_name, $value, $field_str) = @_;
-
-    $symbolic_fields{$event_name}{$field_name}{"values"}{$value} = $field_str;
-}
-
-sub dump_symbolic_fields
-{
-    for my $event (keys %symbolic_fields) {
-	print "event $event:\n";
-	for my $field (keys %{$symbolic_fields{$event}}) {
-	    print "    field: $field:\n";
-	    foreach my $idx (sort {$a <=> $b} keys %{$symbolic_fields{$event}{$field}{"values"}}) {
-		print "        value $idx: $symbolic_fields{$event}{$field}{'values'}{$idx}\n";
-	    }
-	}
-    }
-}
-
-1;
-__END__
-=head1 NAME
-
-Perf::Trace::Core - Perl extension for perf script
-
-=head1 SYNOPSIS
-
-  use Perf::Trace::Core
-
-=head1 SEE ALSO
-
-Perf (script) documentation
-
-=head1 AUTHOR
-
-Tom Zanussi, E<lt>tzanussi@gmail.com<gt>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright (C) 2009 by Tom Zanussi
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself, either Perl version 5.10.0 or,
-at your option, any later version of Perl 5 you may have available.
-
-Alternatively, this software may be distributed under the terms of the
-GNU General Public License ("GPL") version 2 as published by the Free
-Software Foundation.
-
-=cut
diff --git a/src/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Util.pm b/src/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Util.pm
deleted file mode 100644
index 0535001..0000000
--- a/src/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Util.pm
+++ /dev/null
@@ -1,94 +0,0 @@
-package Perf::Trace::Util;
-
-use 5.010000;
-use strict;
-use warnings;
-
-require Exporter;
-
-our @ISA = qw(Exporter);
-
-our %EXPORT_TAGS = ( 'all' => [ qw(
-) ] );
-
-our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
-
-our @EXPORT = qw(
-avg nsecs nsecs_secs nsecs_nsecs nsecs_usecs print_nsecs
-clear_term
-);
-
-our $VERSION = '0.01';
-
-sub avg
-{
-    my ($total, $n) = @_;
-
-    return $total / $n;
-}
-
-my $NSECS_PER_SEC    = 1000000000;
-
-sub nsecs
-{
-    my ($secs, $nsecs) = @_;
-
-    return $secs * $NSECS_PER_SEC + $nsecs;
-}
-
-sub nsecs_secs {
-    my ($nsecs) = @_;
-
-    return $nsecs / $NSECS_PER_SEC;
-}
-
-sub nsecs_nsecs {
-    my ($nsecs) = @_;
-
-    return $nsecs % $NSECS_PER_SEC;
-}
-
-sub nsecs_str {
-    my ($nsecs) = @_;
-
-    my $str = sprintf("%5u.%09u", nsecs_secs($nsecs), nsecs_nsecs($nsecs));
-
-    return $str;
-}
-
-sub clear_term
-{
-    print "\x1b[H\x1b[2J";
-}
-
-1;
-__END__
-=head1 NAME
-
-Perf::Trace::Util - Perl extension for perf script
-
-=head1 SYNOPSIS
-
-  use Perf::Trace::Util;
-
-=head1 SEE ALSO
-
-Perf (script) documentation
-
-=head1 AUTHOR
-
-Tom Zanussi, E<lt>tzanussi@gmail.com<gt>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright (C) 2009 by Tom Zanussi
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself, either Perl version 5.10.0 or,
-at your option, any later version of Perl 5 you may have available.
-
-Alternatively, this software may be distributed under the terms of the
-GNU General Public License ("GPL") version 2 as published by the Free
-Software Foundation.
-
-=cut
diff --git a/src/tools/perf/scripts/perl/Perf-Trace-Util/typemap b/src/tools/perf/scripts/perl/Perf-Trace-Util/typemap
deleted file mode 100644
index 8408368..0000000
--- a/src/tools/perf/scripts/perl/Perf-Trace-Util/typemap
+++ /dev/null
@@ -1 +0,0 @@
-struct scripting_context * T_PTR
diff --git a/src/tools/perf/scripts/perl/bin/check-perf-trace-record b/src/tools/perf/scripts/perl/bin/check-perf-trace-record
deleted file mode 100644
index 423ad6a..0000000
--- a/src/tools/perf/scripts/perl/bin/check-perf-trace-record
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-perf record -a -e kmem:kmalloc -e irq:softirq_entry -e kmem:kfree
diff --git a/src/tools/perf/scripts/perl/bin/failed-syscalls-record b/src/tools/perf/scripts/perl/bin/failed-syscalls-record
deleted file mode 100644
index 8104895..0000000
--- a/src/tools/perf/scripts/perl/bin/failed-syscalls-record
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-perf record -e raw_syscalls:sys_exit $@
diff --git a/src/tools/perf/scripts/perl/bin/failed-syscalls-report b/src/tools/perf/scripts/perl/bin/failed-syscalls-report
deleted file mode 100644
index 9f83cc1..0000000
--- a/src/tools/perf/scripts/perl/bin/failed-syscalls-report
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-# description: system-wide failed syscalls
-# args: [comm]
-if [ $# -gt 0 ] ; then
-    if ! expr match "$1" "-" > /dev/null ; then
-	comm=$1
-	shift
-    fi
-fi
-perf script $@ -s "$PERF_EXEC_PATH"/scripts/perl/failed-syscalls.pl $comm
diff --git a/src/tools/perf/scripts/perl/bin/rw-by-file-record b/src/tools/perf/scripts/perl/bin/rw-by-file-record
deleted file mode 100644
index 33efc86..0000000
--- a/src/tools/perf/scripts/perl/bin/rw-by-file-record
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-perf record -e syscalls:sys_enter_read -e syscalls:sys_enter_write $@
-
diff --git a/src/tools/perf/scripts/perl/bin/rw-by-file-report b/src/tools/perf/scripts/perl/bin/rw-by-file-report
deleted file mode 100644
index 77200b3..0000000
--- a/src/tools/perf/scripts/perl/bin/rw-by-file-report
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-# description: r/w activity for a program, by file
-# args: <comm>
-if [ $# -lt 1 ] ; then
-    echo "usage: rw-by-file <comm>"
-    exit
-fi
-comm=$1
-shift
-perf script $@ -s "$PERF_EXEC_PATH"/scripts/perl/rw-by-file.pl $comm
diff --git a/src/tools/perf/scripts/perl/bin/rw-by-pid-record b/src/tools/perf/scripts/perl/bin/rw-by-pid-record
deleted file mode 100644
index 7cb9db2..0000000
--- a/src/tools/perf/scripts/perl/bin/rw-by-pid-record
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-perf record -e syscalls:sys_enter_read -e syscalls:sys_exit_read -e syscalls:sys_enter_write -e syscalls:sys_exit_write $@
diff --git a/src/tools/perf/scripts/perl/bin/rw-by-pid-report b/src/tools/perf/scripts/perl/bin/rw-by-pid-report
deleted file mode 100644
index a27b9f3..0000000
--- a/src/tools/perf/scripts/perl/bin/rw-by-pid-report
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-# description: system-wide r/w activity
-perf script $@ -s "$PERF_EXEC_PATH"/scripts/perl/rw-by-pid.pl
diff --git a/src/tools/perf/scripts/perl/bin/rwtop-record b/src/tools/perf/scripts/perl/bin/rwtop-record
deleted file mode 100644
index 7cb9db2..0000000
--- a/src/tools/perf/scripts/perl/bin/rwtop-record
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-perf record -e syscalls:sys_enter_read -e syscalls:sys_exit_read -e syscalls:sys_enter_write -e syscalls:sys_exit_write $@
diff --git a/src/tools/perf/scripts/perl/bin/rwtop-report b/src/tools/perf/scripts/perl/bin/rwtop-report
deleted file mode 100644
index 83e11ec..0000000
--- a/src/tools/perf/scripts/perl/bin/rwtop-report
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-# description: system-wide r/w top
-# args: [interval]
-n_args=0
-for i in "$@"
-do
-    if expr match "$i" "-" > /dev/null ; then
-	break
-    fi
-    n_args=$(( $n_args + 1 ))
-done
-if [ "$n_args" -gt 1 ] ; then
-    echo "usage: rwtop-report [interval]"
-    exit
-fi
-if [ "$n_args" -gt 0 ] ; then
-    interval=$1
-    shift
-fi
-perf script $@ -s "$PERF_EXEC_PATH"/scripts/perl/rwtop.pl $interval
diff --git a/src/tools/perf/scripts/perl/bin/wakeup-latency-record b/src/tools/perf/scripts/perl/bin/wakeup-latency-record
deleted file mode 100644
index 464251a..0000000
--- a/src/tools/perf/scripts/perl/bin/wakeup-latency-record
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/bash
-perf record -e sched:sched_switch -e sched:sched_wakeup $@
-
-
-
-
diff --git a/src/tools/perf/scripts/perl/bin/wakeup-latency-report b/src/tools/perf/scripts/perl/bin/wakeup-latency-report
deleted file mode 100644
index 889e813..0000000
--- a/src/tools/perf/scripts/perl/bin/wakeup-latency-report
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-# description: system-wide min/max/avg wakeup latency
-perf script $@ -s "$PERF_EXEC_PATH"/scripts/perl/wakeup-latency.pl
diff --git a/src/tools/perf/scripts/perl/check-perf-trace.pl b/src/tools/perf/scripts/perl/check-perf-trace.pl
deleted file mode 100644
index 4e7076c..0000000
--- a/src/tools/perf/scripts/perl/check-perf-trace.pl
+++ /dev/null
@@ -1,106 +0,0 @@
-# perf script event handlers, generated by perf script -g perl
-# (c) 2009, Tom Zanussi <tzanussi@gmail.com>
-# Licensed under the terms of the GNU GPL License version 2
-
-# This script tests basic functionality such as flag and symbol
-# strings, common_xxx() calls back into perf, begin, end, unhandled
-# events, etc.  Basically, if this script runs successfully and
-# displays expected results, perl scripting support should be ok.
-
-use lib "$ENV{'PERF_EXEC_PATH'}/scripts/perl/Perf-Trace-Util/lib";
-use lib "./Perf-Trace-Util/lib";
-use Perf::Trace::Core;
-use Perf::Trace::Context;
-use Perf::Trace::Util;
-
-sub trace_begin
-{
-    print "trace_begin\n";
-}
-
-sub trace_end
-{
-    print "trace_end\n";
-
-    print_unhandled();
-}
-
-sub irq::softirq_entry
-{
-	my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	    $common_pid, $common_comm,
-	    $vec) = @_;
-
-	print_header($event_name, $common_cpu, $common_secs, $common_nsecs,
-		     $common_pid, $common_comm);
-
-	print_uncommon($context);
-
-	printf("vec=%s\n",
-	       symbol_str("irq::softirq_entry", "vec", $vec));
-}
-
-sub kmem::kmalloc
-{
-	my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	    $common_pid, $common_comm,
-	    $call_site, $ptr, $bytes_req, $bytes_alloc,
-	    $gfp_flags) = @_;
-
-	print_header($event_name, $common_cpu, $common_secs, $common_nsecs,
-		     $common_pid, $common_comm);
-
-	print_uncommon($context);
-
-	printf("call_site=%p, ptr=%p, bytes_req=%u, bytes_alloc=%u, ".
-	       "gfp_flags=%s\n",
-	       $call_site, $ptr, $bytes_req, $bytes_alloc,
-
-	       flag_str("kmem::kmalloc", "gfp_flags", $gfp_flags));
-}
-
-# print trace fields not included in handler args
-sub print_uncommon
-{
-    my ($context) = @_;
-
-    printf("common_preempt_count=%d, common_flags=%s, common_lock_depth=%d, ",
-	   common_pc($context), trace_flag_str(common_flags($context)),
-	   common_lock_depth($context));
-
-}
-
-my %unhandled;
-
-sub print_unhandled
-{
-    if ((scalar keys %unhandled) == 0) {
-	return;
-    }
-
-    print "\nunhandled events:\n\n";
-
-    printf("%-40s  %10s\n", "event", "count");
-    printf("%-40s  %10s\n", "----------------------------------------",
-	   "-----------");
-
-    foreach my $event_name (keys %unhandled) {
-	printf("%-40s  %10d\n", $event_name, $unhandled{$event_name});
-    }
-}
-
-sub trace_unhandled
-{
-    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	$common_pid, $common_comm) = @_;
-
-    $unhandled{$event_name}++;
-}
-
-sub print_header
-{
-	my ($event_name, $cpu, $secs, $nsecs, $pid, $comm) = @_;
-
-	printf("%-20s %5u %05u.%09u %8u %-20s ",
-	       $event_name, $cpu, $secs, $nsecs, $pid, $comm);
-}
diff --git a/src/tools/perf/scripts/perl/failed-syscalls.pl b/src/tools/perf/scripts/perl/failed-syscalls.pl
deleted file mode 100644
index 94bc25a..0000000
--- a/src/tools/perf/scripts/perl/failed-syscalls.pl
+++ /dev/null
@@ -1,42 +0,0 @@
-# failed system call counts
-# (c) 2010, Tom Zanussi <tzanussi@gmail.com>
-# Licensed under the terms of the GNU GPL License version 2
-#
-# Displays system-wide failed system call totals
-# If a [comm] arg is specified, only syscalls called by [comm] are displayed.
-
-use lib "$ENV{'PERF_EXEC_PATH'}/scripts/perl/Perf-Trace-Util/lib";
-use lib "./Perf-Trace-Util/lib";
-use Perf::Trace::Core;
-use Perf::Trace::Context;
-use Perf::Trace::Util;
-
-my $for_comm = shift;
-
-my %failed_syscalls;
-
-sub raw_syscalls::sys_exit
-{
-	my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	    $common_pid, $common_comm,
-	    $id, $ret) = @_;
-
-	if ($ret < 0) {
-	    $failed_syscalls{$common_comm}++;
-	}
-}
-
-sub trace_end
-{
-    printf("\nfailed syscalls by comm:\n\n");
-
-    printf("%-20s  %10s\n", "comm", "# errors");
-    printf("%-20s  %6s  %10s\n", "--------------------", "----------");
-
-    foreach my $comm (sort {$failed_syscalls{$b} <=> $failed_syscalls{$a}}
-		      keys %failed_syscalls) {
-	next if ($for_comm && $comm ne $for_comm);
-
-	printf("%-20s  %10s\n", $comm, $failed_syscalls{$comm});
-    }
-}
diff --git a/src/tools/perf/scripts/perl/rw-by-file.pl b/src/tools/perf/scripts/perl/rw-by-file.pl
deleted file mode 100644
index 74844ee..0000000
--- a/src/tools/perf/scripts/perl/rw-by-file.pl
+++ /dev/null
@@ -1,106 +0,0 @@
-#!/usr/bin/perl -w
-# (c) 2009, Tom Zanussi <tzanussi@gmail.com>
-# Licensed under the terms of the GNU GPL License version 2
-
-# Display r/w activity for files read/written to for a given program
-
-# The common_* event handler fields are the most useful fields common to
-# all events.  They don't necessarily correspond to the 'common_*' fields
-# in the status files.  Those fields not available as handler params can
-# be retrieved via script functions of the form get_common_*().
-
-use 5.010000;
-use strict;
-use warnings;
-
-use lib "$ENV{'PERF_EXEC_PATH'}/scripts/perl/Perf-Trace-Util/lib";
-use lib "./Perf-Trace-Util/lib";
-use Perf::Trace::Core;
-use Perf::Trace::Util;
-
-my $usage = "perf script -s rw-by-file.pl <comm>\n";
-
-my $for_comm = shift or die $usage;
-
-my %reads;
-my %writes;
-
-sub syscalls::sys_enter_read
-{
-    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	$common_pid, $common_comm, $nr, $fd, $buf, $count) = @_;
-
-    if ($common_comm eq $for_comm) {
-	$reads{$fd}{bytes_requested} += $count;
-	$reads{$fd}{total_reads}++;
-    }
-}
-
-sub syscalls::sys_enter_write
-{
-    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	$common_pid, $common_comm, $nr, $fd, $buf, $count) = @_;
-
-    if ($common_comm eq $for_comm) {
-	$writes{$fd}{bytes_written} += $count;
-	$writes{$fd}{total_writes}++;
-    }
-}
-
-sub trace_end
-{
-    printf("file read counts for $for_comm:\n\n");
-
-    printf("%6s  %10s  %10s\n", "fd", "# reads", "bytes_requested");
-    printf("%6s  %10s  %10s\n", "------", "----------", "-----------");
-
-    foreach my $fd (sort {$reads{$b}{bytes_requested} <=>
-			      $reads{$a}{bytes_requested}} keys %reads) {
-	my $total_reads = $reads{$fd}{total_reads};
-	my $bytes_requested = $reads{$fd}{bytes_requested};
-	printf("%6u  %10u  %10u\n", $fd, $total_reads, $bytes_requested);
-    }
-
-    printf("\nfile write counts for $for_comm:\n\n");
-
-    printf("%6s  %10s  %10s\n", "fd", "# writes", "bytes_written");
-    printf("%6s  %10s  %10s\n", "------", "----------", "-----------");
-
-    foreach my $fd (sort {$writes{$b}{bytes_written} <=>
-			      $writes{$a}{bytes_written}} keys %writes) {
-	my $total_writes = $writes{$fd}{total_writes};
-	my $bytes_written = $writes{$fd}{bytes_written};
-	printf("%6u  %10u  %10u\n", $fd, $total_writes, $bytes_written);
-    }
-
-    print_unhandled();
-}
-
-my %unhandled;
-
-sub print_unhandled
-{
-    if ((scalar keys %unhandled) == 0) {
-	return;
-    }
-
-    print "\nunhandled events:\n\n";
-
-    printf("%-40s  %10s\n", "event", "count");
-    printf("%-40s  %10s\n", "----------------------------------------",
-	   "-----------");
-
-    foreach my $event_name (keys %unhandled) {
-	printf("%-40s  %10d\n", $event_name, $unhandled{$event_name});
-    }
-}
-
-sub trace_unhandled
-{
-    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	$common_pid, $common_comm) = @_;
-
-    $unhandled{$event_name}++;
-}
-
-
diff --git a/src/tools/perf/scripts/perl/rw-by-pid.pl b/src/tools/perf/scripts/perl/rw-by-pid.pl
deleted file mode 100644
index 9db23c9..0000000
--- a/src/tools/perf/scripts/perl/rw-by-pid.pl
+++ /dev/null
@@ -1,184 +0,0 @@
-#!/usr/bin/perl -w
-# (c) 2009, Tom Zanussi <tzanussi@gmail.com>
-# Licensed under the terms of the GNU GPL License version 2
-
-# Display r/w activity for all processes
-
-# The common_* event handler fields are the most useful fields common to
-# all events.  They don't necessarily correspond to the 'common_*' fields
-# in the status files.  Those fields not available as handler params can
-# be retrieved via script functions of the form get_common_*().
-
-use 5.010000;
-use strict;
-use warnings;
-
-use lib "$ENV{'PERF_EXEC_PATH'}/scripts/perl/Perf-Trace-Util/lib";
-use lib "./Perf-Trace-Util/lib";
-use Perf::Trace::Core;
-use Perf::Trace::Util;
-
-my %reads;
-my %writes;
-
-sub syscalls::sys_exit_read
-{
-    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	$common_pid, $common_comm,
-	$nr, $ret) = @_;
-
-    if ($ret > 0) {
-	$reads{$common_pid}{bytes_read} += $ret;
-    } else {
-	if (!defined ($reads{$common_pid}{bytes_read})) {
-	    $reads{$common_pid}{bytes_read} = 0;
-	}
-	$reads{$common_pid}{errors}{$ret}++;
-    }
-}
-
-sub syscalls::sys_enter_read
-{
-    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	$common_pid, $common_comm,
-	$nr, $fd, $buf, $count) = @_;
-
-    $reads{$common_pid}{bytes_requested} += $count;
-    $reads{$common_pid}{total_reads}++;
-    $reads{$common_pid}{comm} = $common_comm;
-}
-
-sub syscalls::sys_exit_write
-{
-    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	$common_pid, $common_comm,
-	$nr, $ret) = @_;
-
-    if ($ret <= 0) {
-	$writes{$common_pid}{errors}{$ret}++;
-    }
-}
-
-sub syscalls::sys_enter_write
-{
-    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	$common_pid, $common_comm,
-	$nr, $fd, $buf, $count) = @_;
-
-    $writes{$common_pid}{bytes_written} += $count;
-    $writes{$common_pid}{total_writes}++;
-    $writes{$common_pid}{comm} = $common_comm;
-}
-
-sub trace_end
-{
-    printf("read counts by pid:\n\n");
-
-    printf("%6s  %20s  %10s  %10s  %10s\n", "pid", "comm",
-	   "# reads", "bytes_requested", "bytes_read");
-    printf("%6s  %-20s  %10s  %10s  %10s\n", "------", "--------------------",
-	   "-----------", "----------", "----------");
-
-    foreach my $pid (sort { ($reads{$b}{bytes_read} || 0) <=>
-				($reads{$a}{bytes_read} || 0) } keys %reads) {
-	my $comm = $reads{$pid}{comm} || "";
-	my $total_reads = $reads{$pid}{total_reads} || 0;
-	my $bytes_requested = $reads{$pid}{bytes_requested} || 0;
-	my $bytes_read = $reads{$pid}{bytes_read} || 0;
-
-	printf("%6s  %-20s  %10s  %10s  %10s\n", $pid, $comm,
-	       $total_reads, $bytes_requested, $bytes_read);
-    }
-
-    printf("\nfailed reads by pid:\n\n");
-
-    printf("%6s  %20s  %6s  %10s\n", "pid", "comm", "error #", "# errors");
-    printf("%6s  %20s  %6s  %10s\n", "------", "--------------------",
-	   "------", "----------");
-
-    my @errcounts = ();
-
-    foreach my $pid (keys %reads) {
-	foreach my $error (keys %{$reads{$pid}{errors}}) {
-	    my $comm = $reads{$pid}{comm} || "";
-	    my $errcount = $reads{$pid}{errors}{$error} || 0;
-	    push @errcounts, [$pid, $comm, $error, $errcount];
-	}
-    }
-
-    @errcounts = sort { $b->[3] <=> $a->[3] } @errcounts;
-
-    for my $i (0 .. $#errcounts) {
-	printf("%6d  %-20s  %6d  %10s\n", $errcounts[$i][0],
-	       $errcounts[$i][1], $errcounts[$i][2], $errcounts[$i][3]);
-    }
-
-    printf("\nwrite counts by pid:\n\n");
-
-    printf("%6s  %20s  %10s  %10s\n", "pid", "comm",
-	   "# writes", "bytes_written");
-    printf("%6s  %-20s  %10s  %10s\n", "------", "--------------------",
-	   "-----------", "----------");
-
-    foreach my $pid (sort { ($writes{$b}{bytes_written} || 0) <=>
-			($writes{$a}{bytes_written} || 0)} keys %writes) {
-	my $comm = $writes{$pid}{comm} || "";
-	my $total_writes = $writes{$pid}{total_writes} || 0;
-	my $bytes_written = $writes{$pid}{bytes_written} || 0;
-
-	printf("%6s  %-20s  %10s  %10s\n", $pid, $comm,
-	       $total_writes, $bytes_written);
-    }
-
-    printf("\nfailed writes by pid:\n\n");
-
-    printf("%6s  %20s  %6s  %10s\n", "pid", "comm", "error #", "# errors");
-    printf("%6s  %20s  %6s  %10s\n", "------", "--------------------",
-	   "------", "----------");
-
-    @errcounts = ();
-
-    foreach my $pid (keys %writes) {
-	foreach my $error (keys %{$writes{$pid}{errors}}) {
-	    my $comm = $writes{$pid}{comm} || "";
-	    my $errcount = $writes{$pid}{errors}{$error} || 0;
-	    push @errcounts, [$pid, $comm, $error, $errcount];
-	}
-    }
-
-    @errcounts = sort { $b->[3] <=> $a->[3] } @errcounts;
-
-    for my $i (0 .. $#errcounts) {
-	printf("%6d  %-20s  %6d  %10s\n", $errcounts[$i][0],
-	       $errcounts[$i][1], $errcounts[$i][2], $errcounts[$i][3]);
-    }
-
-    print_unhandled();
-}
-
-my %unhandled;
-
-sub print_unhandled
-{
-    if ((scalar keys %unhandled) == 0) {
-	return;
-    }
-
-    print "\nunhandled events:\n\n";
-
-    printf("%-40s  %10s\n", "event", "count");
-    printf("%-40s  %10s\n", "----------------------------------------",
-	   "-----------");
-
-    foreach my $event_name (keys %unhandled) {
-	printf("%-40s  %10d\n", $event_name, $unhandled{$event_name});
-    }
-}
-
-sub trace_unhandled
-{
-    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	$common_pid, $common_comm) = @_;
-
-    $unhandled{$event_name}++;
-}
diff --git a/src/tools/perf/scripts/perl/rwtop.pl b/src/tools/perf/scripts/perl/rwtop.pl
deleted file mode 100644
index 8b20787..0000000
--- a/src/tools/perf/scripts/perl/rwtop.pl
+++ /dev/null
@@ -1,203 +0,0 @@
-#!/usr/bin/perl -w
-# (c) 2010, Tom Zanussi <tzanussi@gmail.com>
-# Licensed under the terms of the GNU GPL License version 2
-
-# read/write top
-#
-# Periodically displays system-wide r/w call activity, broken down by
-# pid.  If an [interval] arg is specified, the display will be
-# refreshed every [interval] seconds.  The default interval is 3
-# seconds.
-
-use 5.010000;
-use strict;
-use warnings;
-
-use lib "$ENV{'PERF_EXEC_PATH'}/scripts/perl/Perf-Trace-Util/lib";
-use lib "./Perf-Trace-Util/lib";
-use Perf::Trace::Core;
-use Perf::Trace::Util;
-use POSIX qw/SIGALRM SA_RESTART/;
-
-my $default_interval = 3;
-my $nlines = 20;
-my $print_thread;
-my $print_pending = 0;
-
-my %reads;
-my %writes;
-
-my $interval = shift;
-if (!$interval) {
-    $interval = $default_interval;
-}
-
-sub syscalls::sys_exit_read
-{
-    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	$common_pid, $common_comm,
-	$nr, $ret) = @_;
-
-    print_check();
-
-    if ($ret > 0) {
-	$reads{$common_pid}{bytes_read} += $ret;
-    } else {
-	if (!defined ($reads{$common_pid}{bytes_read})) {
-	    $reads{$common_pid}{bytes_read} = 0;
-	}
-	$reads{$common_pid}{errors}{$ret}++;
-    }
-}
-
-sub syscalls::sys_enter_read
-{
-    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	$common_pid, $common_comm,
-	$nr, $fd, $buf, $count) = @_;
-
-    print_check();
-
-    $reads{$common_pid}{bytes_requested} += $count;
-    $reads{$common_pid}{total_reads}++;
-    $reads{$common_pid}{comm} = $common_comm;
-}
-
-sub syscalls::sys_exit_write
-{
-    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	$common_pid, $common_comm,
-	$nr, $ret) = @_;
-
-    print_check();
-
-    if ($ret <= 0) {
-	$writes{$common_pid}{errors}{$ret}++;
-    }
-}
-
-sub syscalls::sys_enter_write
-{
-    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	$common_pid, $common_comm,
-	$nr, $fd, $buf, $count) = @_;
-
-    print_check();
-
-    $writes{$common_pid}{bytes_written} += $count;
-    $writes{$common_pid}{total_writes}++;
-    $writes{$common_pid}{comm} = $common_comm;
-}
-
-sub trace_begin
-{
-    my $sa = POSIX::SigAction->new(\&set_print_pending);
-    $sa->flags(SA_RESTART);
-    $sa->safe(1);
-    POSIX::sigaction(SIGALRM, $sa) or die "Can't set SIGALRM handler: $!\n";
-    alarm 1;
-}
-
-sub trace_end
-{
-    print_unhandled();
-    print_totals();
-}
-
-sub print_check()
-{
-    if ($print_pending == 1) {
-	$print_pending = 0;
-	print_totals();
-    }
-}
-
-sub set_print_pending()
-{
-    $print_pending = 1;
-    alarm $interval;
-}
-
-sub print_totals
-{
-    my $count;
-
-    $count = 0;
-
-    clear_term();
-
-    printf("\nread counts by pid:\n\n");
-
-    printf("%6s  %20s  %10s  %10s  %10s\n", "pid", "comm",
-	   "# reads", "bytes_req", "bytes_read");
-    printf("%6s  %-20s  %10s  %10s  %10s\n", "------", "--------------------",
-	   "----------", "----------", "----------");
-
-    foreach my $pid (sort { ($reads{$b}{bytes_read} || 0) <=>
-			       ($reads{$a}{bytes_read} || 0) } keys %reads) {
-	my $comm = $reads{$pid}{comm} || "";
-	my $total_reads = $reads{$pid}{total_reads} || 0;
-	my $bytes_requested = $reads{$pid}{bytes_requested} || 0;
-	my $bytes_read = $reads{$pid}{bytes_read} || 0;
-
-	printf("%6s  %-20s  %10s  %10s  %10s\n", $pid, $comm,
-	       $total_reads, $bytes_requested, $bytes_read);
-
-	if (++$count == $nlines) {
-	    last;
-	}
-    }
-
-    $count = 0;
-
-    printf("\nwrite counts by pid:\n\n");
-
-    printf("%6s  %20s  %10s  %13s\n", "pid", "comm",
-	   "# writes", "bytes_written");
-    printf("%6s  %-20s  %10s  %13s\n", "------", "--------------------",
-	   "----------", "-------------");
-
-    foreach my $pid (sort { ($writes{$b}{bytes_written} || 0) <=>
-			($writes{$a}{bytes_written} || 0)} keys %writes) {
-	my $comm = $writes{$pid}{comm} || "";
-	my $total_writes = $writes{$pid}{total_writes} || 0;
-	my $bytes_written = $writes{$pid}{bytes_written} || 0;
-
-	printf("%6s  %-20s  %10s  %13s\n", $pid, $comm,
-	       $total_writes, $bytes_written);
-
-	if (++$count == $nlines) {
-	    last;
-	}
-    }
-
-    %reads = ();
-    %writes = ();
-}
-
-my %unhandled;
-
-sub print_unhandled
-{
-    if ((scalar keys %unhandled) == 0) {
-	return;
-    }
-
-    print "\nunhandled events:\n\n";
-
-    printf("%-40s  %10s\n", "event", "count");
-    printf("%-40s  %10s\n", "----------------------------------------",
-	   "-----------");
-
-    foreach my $event_name (keys %unhandled) {
-	printf("%-40s  %10d\n", $event_name, $unhandled{$event_name});
-    }
-}
-
-sub trace_unhandled
-{
-    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	$common_pid, $common_comm) = @_;
-
-    $unhandled{$event_name}++;
-}
diff --git a/src/tools/perf/scripts/perl/wakeup-latency.pl b/src/tools/perf/scripts/perl/wakeup-latency.pl
deleted file mode 100644
index d9143dc..0000000
--- a/src/tools/perf/scripts/perl/wakeup-latency.pl
+++ /dev/null
@@ -1,107 +0,0 @@
-#!/usr/bin/perl -w
-# (c) 2009, Tom Zanussi <tzanussi@gmail.com>
-# Licensed under the terms of the GNU GPL License version 2
-
-# Display avg/min/max wakeup latency
-
-# The common_* event handler fields are the most useful fields common to
-# all events.  They don't necessarily correspond to the 'common_*' fields
-# in the status files.  Those fields not available as handler params can
-# be retrieved via script functions of the form get_common_*().
-
-use 5.010000;
-use strict;
-use warnings;
-
-use lib "$ENV{'PERF_EXEC_PATH'}/scripts/perl/Perf-Trace-Util/lib";
-use lib "./Perf-Trace-Util/lib";
-use Perf::Trace::Core;
-use Perf::Trace::Util;
-
-my %last_wakeup;
-
-my $max_wakeup_latency;
-my $min_wakeup_latency;
-my $total_wakeup_latency = 0;
-my $total_wakeups = 0;
-
-sub sched::sched_switch
-{
-    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	$common_pid, $common_comm,
-	$prev_comm, $prev_pid, $prev_prio, $prev_state, $next_comm, $next_pid,
-	$next_prio) = @_;
-
-    my $wakeup_ts = $last_wakeup{$common_cpu}{ts};
-    if ($wakeup_ts) {
-	my $switch_ts = nsecs($common_secs, $common_nsecs);
-	my $wakeup_latency = $switch_ts - $wakeup_ts;
-	if ($wakeup_latency > $max_wakeup_latency) {
-	    $max_wakeup_latency = $wakeup_latency;
-	}
-	if ($wakeup_latency < $min_wakeup_latency) {
-	    $min_wakeup_latency = $wakeup_latency;
-	}
-	$total_wakeup_latency += $wakeup_latency;
-	$total_wakeups++;
-    }
-    $last_wakeup{$common_cpu}{ts} = 0;
-}
-
-sub sched::sched_wakeup
-{
-    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	$common_pid, $common_comm,
-	$comm, $pid, $prio, $success, $target_cpu) = @_;
-
-    $last_wakeup{$target_cpu}{ts} = nsecs($common_secs, $common_nsecs);
-}
-
-sub trace_begin
-{
-    $min_wakeup_latency = 1000000000;
-    $max_wakeup_latency = 0;
-}
-
-sub trace_end
-{
-    printf("wakeup_latency stats:\n\n");
-    print "total_wakeups: $total_wakeups\n";
-    if ($total_wakeups) {
-	printf("avg_wakeup_latency (ns): %u\n",
-	       avg($total_wakeup_latency, $total_wakeups));
-    } else {
-	printf("avg_wakeup_latency (ns): N/A\n");
-    }
-    printf("min_wakeup_latency (ns): %u\n", $min_wakeup_latency);
-    printf("max_wakeup_latency (ns): %u\n", $max_wakeup_latency);
-
-    print_unhandled();
-}
-
-my %unhandled;
-
-sub print_unhandled
-{
-    if ((scalar keys %unhandled) == 0) {
-	return;
-    }
-
-    print "\nunhandled events:\n\n";
-
-    printf("%-40s  %10s\n", "event", "count");
-    printf("%-40s  %10s\n", "----------------------------------------",
-	   "-----------");
-
-    foreach my $event_name (keys %unhandled) {
-	printf("%-40s  %10d\n", $event_name, $unhandled{$event_name});
-    }
-}
-
-sub trace_unhandled
-{
-    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
-	$common_pid, $common_comm) = @_;
-
-    $unhandled{$event_name}++;
-}
diff --git a/src/tools/perf/scripts/python/Perf-Trace-Util/Context.c b/src/tools/perf/scripts/python/Perf-Trace-Util/Context.c
deleted file mode 100644
index 315067b..0000000
--- a/src/tools/perf/scripts/python/Perf-Trace-Util/Context.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Context.c.  Python interfaces for perf script.
- *
- * Copyright (C) 2010 Tom Zanussi <tzanussi@gmail.com>
- *
- *  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, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-
-#include <Python.h>
-#include "../../../perf.h"
-#include "../../../util/trace-event.h"
-
-PyMODINIT_FUNC initperf_trace_context(void);
-
-static PyObject *perf_trace_context_common_pc(PyObject *self, PyObject *args)
-{
-	static struct scripting_context *scripting_context;
-	PyObject *context;
-	int retval;
-
-	if (!PyArg_ParseTuple(args, "O", &context))
-		return NULL;
-
-	scripting_context = PyCObject_AsVoidPtr(context);
-	retval = common_pc(scripting_context);
-
-	return Py_BuildValue("i", retval);
-}
-
-static PyObject *perf_trace_context_common_flags(PyObject *self,
-						 PyObject *args)
-{
-	static struct scripting_context *scripting_context;
-	PyObject *context;
-	int retval;
-
-	if (!PyArg_ParseTuple(args, "O", &context))
-		return NULL;
-
-	scripting_context = PyCObject_AsVoidPtr(context);
-	retval = common_flags(scripting_context);
-
-	return Py_BuildValue("i", retval);
-}
-
-static PyObject *perf_trace_context_common_lock_depth(PyObject *self,
-						      PyObject *args)
-{
-	static struct scripting_context *scripting_context;
-	PyObject *context;
-	int retval;
-
-	if (!PyArg_ParseTuple(args, "O", &context))
-		return NULL;
-
-	scripting_context = PyCObject_AsVoidPtr(context);
-	retval = common_lock_depth(scripting_context);
-
-	return Py_BuildValue("i", retval);
-}
-
-static PyMethodDef ContextMethods[] = {
-	{ "common_pc", perf_trace_context_common_pc, METH_VARARGS,
-	  "Get the common preempt count event field value."},
-	{ "common_flags", perf_trace_context_common_flags, METH_VARARGS,
-	  "Get the common flags event field value."},
-	{ "common_lock_depth", perf_trace_context_common_lock_depth,
-	  METH_VARARGS,	"Get the common lock depth event field value."},
-	{ NULL, NULL, 0, NULL}
-};
-
-PyMODINIT_FUNC initperf_trace_context(void)
-{
-	(void) Py_InitModule("perf_trace_context", ContextMethods);
-}
diff --git a/src/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Core.py b/src/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Core.py
deleted file mode 100644
index de7211e..0000000
--- a/src/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Core.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# Core.py - Python extension for perf script, core functions
-#
-# Copyright (C) 2010 by Tom Zanussi <tzanussi@gmail.com>
-#
-# This software may be distributed under the terms of the GNU General
-# Public License ("GPL") version 2 as published by the Free Software
-# Foundation.
-
-from collections import defaultdict
-
-def autodict():
-    return defaultdict(autodict)
-
-flag_fields = autodict()
-symbolic_fields = autodict()
-
-def define_flag_field(event_name, field_name, delim):
-    flag_fields[event_name][field_name]['delim'] = delim
-
-def define_flag_value(event_name, field_name, value, field_str):
-    flag_fields[event_name][field_name]['values'][value] = field_str
-
-def define_symbolic_field(event_name, field_name):
-    # nothing to do, really
-    pass
-
-def define_symbolic_value(event_name, field_name, value, field_str):
-    symbolic_fields[event_name][field_name]['values'][value] = field_str
-
-def flag_str(event_name, field_name, value):
-    string = ""
-
-    if flag_fields[event_name][field_name]:
-	print_delim = 0
-        keys = flag_fields[event_name][field_name]['values'].keys()
-        keys.sort()
-        for idx in keys:
-            if not value and not idx:
-                string += flag_fields[event_name][field_name]['values'][idx]
-                break
-            if idx and (value & idx) == idx:
-                if print_delim and flag_fields[event_name][field_name]['delim']:
-                    string += " " + flag_fields[event_name][field_name]['delim'] + " "
-                string += flag_fields[event_name][field_name]['values'][idx]
-                print_delim = 1
-                value &= ~idx
-
-    return string
-
-def symbol_str(event_name, field_name, value):
-    string = ""
-
-    if symbolic_fields[event_name][field_name]:
-        keys = symbolic_fields[event_name][field_name]['values'].keys()
-        keys.sort()
-        for idx in keys:
-            if not value and not idx:
-		string = symbolic_fields[event_name][field_name]['values'][idx]
-                break
-	    if (value == idx):
-		string = symbolic_fields[event_name][field_name]['values'][idx]
-                break
-
-    return string
-
-trace_flags = { 0x00: "NONE", \
-                    0x01: "IRQS_OFF", \
-                    0x02: "IRQS_NOSUPPORT", \
-                    0x04: "NEED_RESCHED", \
-                    0x08: "HARDIRQ", \
-                    0x10: "SOFTIRQ" }
-
-def trace_flag_str(value):
-    string = ""
-    print_delim = 0
-
-    keys = trace_flags.keys()
-
-    for idx in keys:
-	if not value and not idx:
-	    string += "NONE"
-	    break
-
-	if idx and (value & idx) == idx:
-	    if print_delim:
-		string += " | ";
-	    string += trace_flags[idx]
-	    print_delim = 1
-	    value &= ~idx
-
-    return string
-
-
-def taskState(state):
-	states = {
-		0 : "R",
-		1 : "S",
-		2 : "D",
-		64: "DEAD"
-	}
-
-	if state not in states:
-		return "Unknown"
-
-	return states[state]
-
-
-class EventHeaders:
-	def __init__(self, common_cpu, common_secs, common_nsecs,
-		     common_pid, common_comm):
-		self.cpu = common_cpu
-		self.secs = common_secs
-		self.nsecs = common_nsecs
-		self.pid = common_pid
-		self.comm = common_comm
-
-	def ts(self):
-		return (self.secs * (10 ** 9)) + self.nsecs
-
-	def ts_format(self):
-		return "%d.%d" % (self.secs, int(self.nsecs / 1000))
diff --git a/src/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/EventClass.py b/src/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/EventClass.py
deleted file mode 100755
index 9e09857..0000000
--- a/src/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/EventClass.py
+++ /dev/null
@@ -1,94 +0,0 @@
-# EventClass.py
-#
-# This is a library defining some events types classes, which could
-# be used by other scripts to analyzing the perf samples.
-#
-# Currently there are just a few classes defined for examples,
-# PerfEvent is the base class for all perf event sample, PebsEvent
-# is a HW base Intel x86 PEBS event, and user could add more SW/HW
-# event classes based on requirements.
-
-import struct
-
-# Event types, user could add more here
-EVTYPE_GENERIC  = 0
-EVTYPE_PEBS     = 1     # Basic PEBS event
-EVTYPE_PEBS_LL  = 2     # PEBS event with load latency info
-EVTYPE_IBS      = 3
-
-#
-# Currently we don't have good way to tell the event type, but by
-# the size of raw buffer, raw PEBS event with load latency data's
-# size is 176 bytes, while the pure PEBS event's size is 144 bytes.
-#
-def create_event(name, comm, dso, symbol, raw_buf):
-        if (len(raw_buf) == 144):
-                event = PebsEvent(name, comm, dso, symbol, raw_buf)
-        elif (len(raw_buf) == 176):
-                event = PebsNHM(name, comm, dso, symbol, raw_buf)
-        else:
-                event = PerfEvent(name, comm, dso, symbol, raw_buf)
-
-        return event
-
-class PerfEvent(object):
-        event_num = 0
-        def __init__(self, name, comm, dso, symbol, raw_buf, ev_type=EVTYPE_GENERIC):
-                self.name       = name
-                self.comm       = comm
-                self.dso        = dso
-                self.symbol     = symbol
-                self.raw_buf    = raw_buf
-                self.ev_type    = ev_type
-                PerfEvent.event_num += 1
-
-        def show(self):
-                print "PMU event: name=%12s, symbol=%24s, comm=%8s, dso=%12s" % (self.name, self.symbol, self.comm, self.dso)
-
-#
-# Basic Intel PEBS (Precise Event-based Sampling) event, whose raw buffer
-# contains the context info when that event happened: the EFLAGS and
-# linear IP info, as well as all the registers.
-#
-class PebsEvent(PerfEvent):
-        pebs_num = 0
-        def __init__(self, name, comm, dso, symbol, raw_buf, ev_type=EVTYPE_PEBS):
-                tmp_buf=raw_buf[0:80]
-                flags, ip, ax, bx, cx, dx, si, di, bp, sp = struct.unpack('QQQQQQQQQQ', tmp_buf)
-                self.flags = flags
-                self.ip    = ip
-                self.ax    = ax
-                self.bx    = bx
-                self.cx    = cx
-                self.dx    = dx
-                self.si    = si
-                self.di    = di
-                self.bp    = bp
-                self.sp    = sp
-
-                PerfEvent.__init__(self, name, comm, dso, symbol, raw_buf, ev_type)
-                PebsEvent.pebs_num += 1
-                del tmp_buf
-
-#
-# Intel Nehalem and Westmere support PEBS plus Load Latency info which lie
-# in the four 64 bit words write after the PEBS data:
-#       Status: records the IA32_PERF_GLOBAL_STATUS register value
-#       DLA:    Data Linear Address (EIP)
-#       DSE:    Data Source Encoding, where the latency happens, hit or miss
-#               in L1/L2/L3 or IO operations
-#       LAT:    the actual latency in cycles
-#
-class PebsNHM(PebsEvent):
-        pebs_nhm_num = 0
-        def __init__(self, name, comm, dso, symbol, raw_buf, ev_type=EVTYPE_PEBS_LL):
-                tmp_buf=raw_buf[144:176]
-                status, dla, dse, lat = struct.unpack('QQQQ', tmp_buf)
-                self.status = status
-                self.dla = dla
-                self.dse = dse
-                self.lat = lat
-
-                PebsEvent.__init__(self, name, comm, dso, symbol, raw_buf, ev_type)
-                PebsNHM.pebs_nhm_num += 1
-                del tmp_buf
diff --git a/src/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/SchedGui.py b/src/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/SchedGui.py
deleted file mode 100644
index fdd92f6..0000000
--- a/src/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/SchedGui.py
+++ /dev/null
@@ -1,184 +0,0 @@
-# SchedGui.py - Python extension for perf script, basic GUI code for
-#		traces drawing and overview.
-#
-# Copyright (C) 2010 by Frederic Weisbecker <fweisbec@gmail.com>
-#
-# This software is distributed under the terms of the GNU General
-# Public License ("GPL") version 2 as published by the Free Software
-# Foundation.
-
-
-try:
-	import wx
-except ImportError:
-	raise ImportError, "You need to install the wxpython lib for this script"
-
-
-class RootFrame(wx.Frame):
-	Y_OFFSET = 100
-	RECT_HEIGHT = 100
-	RECT_SPACE = 50
-	EVENT_MARKING_WIDTH = 5
-
-	def __init__(self, sched_tracer, title, parent = None, id = -1):
-		wx.Frame.__init__(self, parent, id, title)
-
-		(self.screen_width, self.screen_height) = wx.GetDisplaySize()
-		self.screen_width -= 10
-		self.screen_height -= 10
-		self.zoom = 0.5
-		self.scroll_scale = 20
-		self.sched_tracer = sched_tracer
-		self.sched_tracer.set_root_win(self)
-		(self.ts_start, self.ts_end) = sched_tracer.interval()
-		self.update_width_virtual()
-		self.nr_rects = sched_tracer.nr_rectangles() + 1
-		self.height_virtual = RootFrame.Y_OFFSET + (self.nr_rects * (RootFrame.RECT_HEIGHT + RootFrame.RECT_SPACE))
-
-		# whole window panel
-		self.panel = wx.Panel(self, size=(self.screen_width, self.screen_height))
-
-		# scrollable container
-		self.scroll = wx.ScrolledWindow(self.panel)
-		self.scroll.SetScrollbars(self.scroll_scale, self.scroll_scale, self.width_virtual / self.scroll_scale, self.height_virtual / self.scroll_scale)
-		self.scroll.EnableScrolling(True, True)
-		self.scroll.SetFocus()
-
-		# scrollable drawing area
-		self.scroll_panel = wx.Panel(self.scroll, size=(self.screen_width - 15, self.screen_height / 2))
-		self.scroll_panel.Bind(wx.EVT_PAINT, self.on_paint)
-		self.scroll_panel.Bind(wx.EVT_KEY_DOWN, self.on_key_press)
-		self.scroll_panel.Bind(wx.EVT_LEFT_DOWN, self.on_mouse_down)
-		self.scroll.Bind(wx.EVT_PAINT, self.on_paint)
-		self.scroll.Bind(wx.EVT_KEY_DOWN, self.on_key_press)
-		self.scroll.Bind(wx.EVT_LEFT_DOWN, self.on_mouse_down)
-
-		self.scroll.Fit()
-		self.Fit()
-
-		self.scroll_panel.SetDimensions(-1, -1, self.width_virtual, self.height_virtual, wx.SIZE_USE_EXISTING)
-
-		self.txt = None
-
-		self.Show(True)
-
-	def us_to_px(self, val):
-		return val / (10 ** 3) * self.zoom
-
-	def px_to_us(self, val):
-		return (val / self.zoom) * (10 ** 3)
-
-	def scroll_start(self):
-		(x, y) = self.scroll.GetViewStart()
-		return (x * self.scroll_scale, y * self.scroll_scale)
-
-	def scroll_start_us(self):
-		(x, y) = self.scroll_start()
-		return self.px_to_us(x)
-
-	def paint_rectangle_zone(self, nr, color, top_color, start, end):
-		offset_px = self.us_to_px(start - self.ts_start)
-		width_px = self.us_to_px(end - self.ts_start)
-
-		offset_py = RootFrame.Y_OFFSET + (nr * (RootFrame.RECT_HEIGHT + RootFrame.RECT_SPACE))
-		width_py = RootFrame.RECT_HEIGHT
-
-		dc = self.dc
-
-		if top_color is not None:
-			(r, g, b) = top_color
-			top_color = wx.Colour(r, g, b)
-			brush = wx.Brush(top_color, wx.SOLID)
-			dc.SetBrush(brush)
-			dc.DrawRectangle(offset_px, offset_py, width_px, RootFrame.EVENT_MARKING_WIDTH)
-			width_py -= RootFrame.EVENT_MARKING_WIDTH
-			offset_py += RootFrame.EVENT_MARKING_WIDTH
-
-		(r ,g, b) = color
-		color = wx.Colour(r, g, b)
-		brush = wx.Brush(color, wx.SOLID)
-		dc.SetBrush(brush)
-		dc.DrawRectangle(offset_px, offset_py, width_px, width_py)
-
-	def update_rectangles(self, dc, start, end):
-		start += self.ts_start
-		end += self.ts_start
-		self.sched_tracer.fill_zone(start, end)
-
-	def on_paint(self, event):
-		dc = wx.PaintDC(self.scroll_panel)
-		self.dc = dc
-
-		width = min(self.width_virtual, self.screen_width)
-		(x, y) = self.scroll_start()
-		start = self.px_to_us(x)
-		end = self.px_to_us(x + width)
-		self.update_rectangles(dc, start, end)
-
-	def rect_from_ypixel(self, y):
-		y -= RootFrame.Y_OFFSET
-		rect = y / (RootFrame.RECT_HEIGHT + RootFrame.RECT_SPACE)
-		height = y % (RootFrame.RECT_HEIGHT + RootFrame.RECT_SPACE)
-
-		if rect < 0 or rect > self.nr_rects - 1 or height > RootFrame.RECT_HEIGHT:
-			return -1
-
-		return rect
-
-	def update_summary(self, txt):
-		if self.txt:
-			self.txt.Destroy()
-		self.txt = wx.StaticText(self.panel, -1, txt, (0, (self.screen_height / 2) + 50))
-
-
-	def on_mouse_down(self, event):
-		(x, y) = event.GetPositionTuple()
-		rect = self.rect_from_ypixel(y)
-		if rect == -1:
-			return
-
-		t = self.px_to_us(x) + self.ts_start
-
-		self.sched_tracer.mouse_down(rect, t)
-
-
-	def update_width_virtual(self):
-		self.width_virtual = self.us_to_px(self.ts_end - self.ts_start)
-
-	def __zoom(self, x):
-		self.update_width_virtual()
-		(xpos, ypos) = self.scroll.GetViewStart()
-		xpos = self.us_to_px(x) / self.scroll_scale
-		self.scroll.SetScrollbars(self.scroll_scale, self.scroll_scale, self.width_virtual / self.scroll_scale, self.height_virtual / self.scroll_scale, xpos, ypos)
-		self.Refresh()
-
-	def zoom_in(self):
-		x = self.scroll_start_us()
-		self.zoom *= 2
-		self.__zoom(x)
-
-	def zoom_out(self):
-		x = self.scroll_start_us()
-		self.zoom /= 2
-		self.__zoom(x)
-
-
-	def on_key_press(self, event):
-		key = event.GetRawKeyCode()
-		if key == ord("+"):
-			self.zoom_in()
-			return
-		if key == ord("-"):
-			self.zoom_out()
-			return
-
-		key = event.GetKeyCode()
-		(x, y) = self.scroll.GetViewStart()
-		if key == wx.WXK_RIGHT:
-			self.scroll.Scroll(x + 1, y)
-		elif key == wx.WXK_LEFT:
-			self.scroll.Scroll(x - 1, y)
-		elif key == wx.WXK_DOWN:
-			self.scroll.Scroll(x, y + 1)
-		elif key == wx.WXK_UP:
-			self.scroll.Scroll(x, y - 1)
diff --git a/src/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py b/src/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py
deleted file mode 100644
index 15c8400..0000000
--- a/src/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# Util.py - Python extension for perf script, miscellaneous utility code
-#
-# Copyright (C) 2010 by Tom Zanussi <tzanussi@gmail.com>
-#
-# This software may be distributed under the terms of the GNU General
-# Public License ("GPL") version 2 as published by the Free Software
-# Foundation.
-
-import errno, os
-
-FUTEX_WAIT = 0
-FUTEX_WAKE = 1
-FUTEX_PRIVATE_FLAG = 128
-FUTEX_CLOCK_REALTIME = 256
-FUTEX_CMD_MASK = ~(FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME)
-
-NSECS_PER_SEC    = 1000000000
-
-def avg(total, n):
-    return total / n
-
-def nsecs(secs, nsecs):
-    return secs * NSECS_PER_SEC + nsecs
-
-def nsecs_secs(nsecs):
-    return nsecs / NSECS_PER_SEC
-
-def nsecs_nsecs(nsecs):
-    return nsecs % NSECS_PER_SEC
-
-def nsecs_str(nsecs):
-    str = "%5u.%09u" % (nsecs_secs(nsecs), nsecs_nsecs(nsecs)),
-    return str
-
-def add_stats(dict, key, value):
-	if not dict.has_key(key):
-		dict[key] = (value, value, value, 1)
-	else:
-		min, max, avg, count = dict[key]
-		if value < min:
-			min = value
-		if value > max:
-			max = value
-		avg = (avg + value) / 2
-		dict[key] = (min, max, avg, count + 1)
-
-def clear_term():
-    print("\x1b[H\x1b[2J")
-
-audit_package_warned = False
-
-try:
-	import audit
-	machine_to_id = {
-		'x86_64': audit.MACH_86_64,
-		'alpha'	: audit.MACH_ALPHA,
-		'ia64'	: audit.MACH_IA64,
-		'ppc'	: audit.MACH_PPC,
-		'ppc64'	: audit.MACH_PPC64,
-		's390'	: audit.MACH_S390,
-		's390x'	: audit.MACH_S390X,
-		'i386'	: audit.MACH_X86,
-		'i586'	: audit.MACH_X86,
-		'i686'	: audit.MACH_X86,
-	}
-	try:
-		machine_to_id['armeb'] = audit.MACH_ARMEB
-	except:
-		pass
-	machine_id = machine_to_id[os.uname()[4]]
-except:
-	if not audit_package_warned:
-		audit_package_warned = True
-		print "Install the audit-libs-python package to get syscall names"
-
-def syscall_name(id):
-	try:
-		return audit.audit_syscall_to_name(id, machine_id)
-	except:
-		return str(id)
-
-def strerror(nr):
-	try:
-		return errno.errorcode[abs(nr)]
-	except:
-		return "Unknown %d errno" % nr
diff --git a/src/tools/perf/scripts/python/bin/event_analyzing_sample-record b/src/tools/perf/scripts/python/bin/event_analyzing_sample-record
deleted file mode 100644
index 5ce652d..0000000
--- a/src/tools/perf/scripts/python/bin/event_analyzing_sample-record
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-
-#
-# event_analyzing_sample.py can cover all type of perf samples including
-# the tracepoints, so no special record requirements, just record what
-# you want to analyze.
-#
-perf record $@
diff --git a/src/tools/perf/scripts/python/bin/event_analyzing_sample-report b/src/tools/perf/scripts/python/bin/event_analyzing_sample-report
deleted file mode 100644
index 0941fc9..0000000
--- a/src/tools/perf/scripts/python/bin/event_analyzing_sample-report
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-# description: analyze all perf samples
-perf script $@ -s "$PERF_EXEC_PATH"/scripts/python/event_analyzing_sample.py
diff --git a/src/tools/perf/scripts/python/bin/failed-syscalls-by-pid-record b/src/tools/perf/scripts/python/bin/failed-syscalls-by-pid-record
deleted file mode 100644
index 8104895..0000000
--- a/src/tools/perf/scripts/python/bin/failed-syscalls-by-pid-record
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-perf record -e raw_syscalls:sys_exit $@
diff --git a/src/tools/perf/scripts/python/bin/failed-syscalls-by-pid-report b/src/tools/perf/scripts/python/bin/failed-syscalls-by-pid-report
deleted file mode 100644
index fda5096..0000000
--- a/src/tools/perf/scripts/python/bin/failed-syscalls-by-pid-report
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-# description: system-wide failed syscalls, by pid
-# args: [comm]
-if [ $# -gt 0 ] ; then
-    if ! expr match "$1" "-" > /dev/null ; then
-	comm=$1
-	shift
-    fi
-fi
-perf script $@ -s "$PERF_EXEC_PATH"/scripts/python/failed-syscalls-by-pid.py $comm
diff --git a/src/tools/perf/scripts/python/bin/futex-contention-record b/src/tools/perf/scripts/python/bin/futex-contention-record
deleted file mode 100644
index b1495c9..0000000
--- a/src/tools/perf/scripts/python/bin/futex-contention-record
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-perf record -e syscalls:sys_enter_futex -e syscalls:sys_exit_futex $@
diff --git a/src/tools/perf/scripts/python/bin/futex-contention-report b/src/tools/perf/scripts/python/bin/futex-contention-report
deleted file mode 100644
index 6c44271..0000000
--- a/src/tools/perf/scripts/python/bin/futex-contention-report
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-# description: futext contention measurement
-
-perf script $@ -s "$PERF_EXEC_PATH"/scripts/python/futex-contention.py
diff --git a/src/tools/perf/scripts/python/bin/net_dropmonitor-record b/src/tools/perf/scripts/python/bin/net_dropmonitor-record
deleted file mode 100755
index 423fb81..0000000
--- a/src/tools/perf/scripts/python/bin/net_dropmonitor-record
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-perf record -e skb:kfree_skb $@
diff --git a/src/tools/perf/scripts/python/bin/net_dropmonitor-report b/src/tools/perf/scripts/python/bin/net_dropmonitor-report
deleted file mode 100755
index 8d698f5..0000000
--- a/src/tools/perf/scripts/python/bin/net_dropmonitor-report
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-# description: display a table of dropped frames
-
-perf script -s "$PERF_EXEC_PATH"/scripts/python/net_dropmonitor.py $@
diff --git a/src/tools/perf/scripts/python/bin/netdev-times-record b/src/tools/perf/scripts/python/bin/netdev-times-record
deleted file mode 100644
index 558754b..0000000
--- a/src/tools/perf/scripts/python/bin/netdev-times-record
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-perf record -e net:net_dev_xmit -e net:net_dev_queue		\
-		-e net:netif_receive_skb -e net:netif_rx		\
-		-e skb:consume_skb -e skb:kfree_skb			\
-		-e skb:skb_copy_datagram_iovec -e napi:napi_poll	\
-		-e irq:irq_handler_entry -e irq:irq_handler_exit	\
-		-e irq:softirq_entry -e irq:softirq_exit		\
-		-e irq:softirq_raise $@
diff --git a/src/tools/perf/scripts/python/bin/netdev-times-report b/src/tools/perf/scripts/python/bin/netdev-times-report
deleted file mode 100644
index 8f75929..0000000
--- a/src/tools/perf/scripts/python/bin/netdev-times-report
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/bash
-# description: display a process of packet and processing time
-# args: [tx] [rx] [dev=] [debug]
-
-perf script -s "$PERF_EXEC_PATH"/scripts/python/netdev-times.py $@
diff --git a/src/tools/perf/scripts/python/bin/sched-migration-record b/src/tools/perf/scripts/python/bin/sched-migration-record
deleted file mode 100644
index 7493fdd..0000000
--- a/src/tools/perf/scripts/python/bin/sched-migration-record
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-perf record -m 16384 -e sched:sched_wakeup -e sched:sched_wakeup_new -e sched:sched_switch -e sched:sched_migrate_task $@
diff --git a/src/tools/perf/scripts/python/bin/sched-migration-report b/src/tools/perf/scripts/python/bin/sched-migration-report
deleted file mode 100644
index 68b037a..0000000
--- a/src/tools/perf/scripts/python/bin/sched-migration-report
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-# description: sched migration overview
-perf script $@ -s "$PERF_EXEC_PATH"/scripts/python/sched-migration.py
diff --git a/src/tools/perf/scripts/python/bin/sctop-record b/src/tools/perf/scripts/python/bin/sctop-record
deleted file mode 100644
index 4efbfaa..0000000
--- a/src/tools/perf/scripts/python/bin/sctop-record
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-perf record -e raw_syscalls:sys_enter $@
diff --git a/src/tools/perf/scripts/python/bin/sctop-report b/src/tools/perf/scripts/python/bin/sctop-report
deleted file mode 100644
index c32db29..0000000
--- a/src/tools/perf/scripts/python/bin/sctop-report
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash
-# description: syscall top
-# args: [comm] [interval]
-n_args=0
-for i in "$@"
-do
-    if expr match "$i" "-" > /dev/null ; then
-	break
-    fi
-    n_args=$(( $n_args + 1 ))
-done
-if [ "$n_args" -gt 2 ] ; then
-    echo "usage: sctop-report [comm] [interval]"
-    exit
-fi
-if [ "$n_args" -gt 1 ] ; then
-    comm=$1
-    interval=$2
-    shift 2
-elif [ "$n_args" -gt 0 ] ; then
-    interval=$1
-    shift
-fi
-perf script $@ -s "$PERF_EXEC_PATH"/scripts/python/sctop.py $comm $interval
diff --git a/src/tools/perf/scripts/python/bin/syscall-counts-by-pid-record b/src/tools/perf/scripts/python/bin/syscall-counts-by-pid-record
deleted file mode 100644
index 4efbfaa..0000000
--- a/src/tools/perf/scripts/python/bin/syscall-counts-by-pid-record
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-perf record -e raw_syscalls:sys_enter $@
diff --git a/src/tools/perf/scripts/python/bin/syscall-counts-by-pid-report b/src/tools/perf/scripts/python/bin/syscall-counts-by-pid-report
deleted file mode 100644
index 16eb8d6..0000000
--- a/src/tools/perf/scripts/python/bin/syscall-counts-by-pid-report
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-# description: system-wide syscall counts, by pid
-# args: [comm]
-if [ $# -gt 0 ] ; then
-    if ! expr match "$1" "-" > /dev/null ; then
-	comm=$1
-	shift
-    fi
-fi
-perf script $@ -s "$PERF_EXEC_PATH"/scripts/python/syscall-counts-by-pid.py $comm
diff --git a/src/tools/perf/scripts/python/bin/syscall-counts-record b/src/tools/perf/scripts/python/bin/syscall-counts-record
deleted file mode 100644
index 4efbfaa..0000000
--- a/src/tools/perf/scripts/python/bin/syscall-counts-record
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-perf record -e raw_syscalls:sys_enter $@
diff --git a/src/tools/perf/scripts/python/bin/syscall-counts-report b/src/tools/perf/scripts/python/bin/syscall-counts-report
deleted file mode 100644
index 0f0e9d4..0000000
--- a/src/tools/perf/scripts/python/bin/syscall-counts-report
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-# description: system-wide syscall counts
-# args: [comm]
-if [ $# -gt 0 ] ; then
-    if ! expr match "$1" "-" > /dev/null ; then
-	comm=$1
-	shift
-    fi
-fi
-perf script $@ -s "$PERF_EXEC_PATH"/scripts/python/syscall-counts.py $comm
diff --git a/src/tools/perf/scripts/python/check-perf-trace.py b/src/tools/perf/scripts/python/check-perf-trace.py
deleted file mode 100644
index 4647a76..0000000
--- a/src/tools/perf/scripts/python/check-perf-trace.py
+++ /dev/null
@@ -1,82 +0,0 @@
-# perf script event handlers, generated by perf script -g python
-# (c) 2010, Tom Zanussi <tzanussi@gmail.com>
-# Licensed under the terms of the GNU GPL License version 2
-#
-# This script tests basic functionality such as flag and symbol
-# strings, common_xxx() calls back into perf, begin, end, unhandled
-# events, etc.  Basically, if this script runs successfully and
-# displays expected results, Python scripting support should be ok.
-
-import os
-import sys
-
-sys.path.append(os.environ['PERF_EXEC_PATH'] + \
-	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
-
-from Core import *
-from perf_trace_context import *
-
-unhandled = autodict()
-
-def trace_begin():
-	print "trace_begin"
-	pass
-
-def trace_end():
-        print_unhandled()
-
-def irq__softirq_entry(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	vec):
-		print_header(event_name, common_cpu, common_secs, common_nsecs,
-			common_pid, common_comm)
-
-                print_uncommon(context)
-
-		print "vec=%s\n" % \
-		(symbol_str("irq__softirq_entry", "vec", vec)),
-
-def kmem__kmalloc(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	call_site, ptr, bytes_req, bytes_alloc,
-	gfp_flags):
-		print_header(event_name, common_cpu, common_secs, common_nsecs,
-			common_pid, common_comm)
-
-                print_uncommon(context)
-
-		print "call_site=%u, ptr=%u, bytes_req=%u, " \
-		"bytes_alloc=%u, gfp_flags=%s\n" % \
-		(call_site, ptr, bytes_req, bytes_alloc,
-
-		flag_str("kmem__kmalloc", "gfp_flags", gfp_flags)),
-
-def trace_unhandled(event_name, context, event_fields_dict):
-    try:
-        unhandled[event_name] += 1
-    except TypeError:
-        unhandled[event_name] = 1
-
-def print_header(event_name, cpu, secs, nsecs, pid, comm):
-	print "%-20s %5u %05u.%09u %8u %-20s " % \
-	(event_name, cpu, secs, nsecs, pid, comm),
-
-# print trace fields not included in handler args
-def print_uncommon(context):
-    print "common_preempt_count=%d, common_flags=%s, common_lock_depth=%d, " \
-        % (common_pc(context), trace_flag_str(common_flags(context)), \
-               common_lock_depth(context))
-
-def print_unhandled():
-    keys = unhandled.keys()
-    if not keys:
-        return
-
-    print "\nunhandled events:\n\n",
-
-    print "%-40s  %10s\n" % ("event", "count"),
-    print "%-40s  %10s\n" % ("----------------------------------------", \
-                                 "-----------"),
-
-    for event_name in keys:
-	print "%-40s  %10d\n" % (event_name, unhandled[event_name])
diff --git a/src/tools/perf/scripts/python/event_analyzing_sample.py b/src/tools/perf/scripts/python/event_analyzing_sample.py
deleted file mode 100644
index 163c39f..0000000
--- a/src/tools/perf/scripts/python/event_analyzing_sample.py
+++ /dev/null
@@ -1,189 +0,0 @@
-# event_analyzing_sample.py: general event handler in python
-#
-# Current perf report is already very powerful with the annotation integrated,
-# and this script is not trying to be as powerful as perf report, but
-# providing end user/developer a flexible way to analyze the events other
-# than trace points.
-#
-# The 2 database related functions in this script just show how to gather
-# the basic information, and users can modify and write their own functions
-# according to their specific requirement.
-#
-# The first function "show_general_events" just does a basic grouping for all
-# generic events with the help of sqlite, and the 2nd one "show_pebs_ll" is
-# for a x86 HW PMU event: PEBS with load latency data.
-#
-
-import os
-import sys
-import math
-import struct
-import sqlite3
-
-sys.path.append(os.environ['PERF_EXEC_PATH'] + \
-        '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
-
-from perf_trace_context import *
-from EventClass import *
-
-#
-# If the perf.data has a big number of samples, then the insert operation
-# will be very time consuming (about 10+ minutes for 10000 samples) if the
-# .db database is on disk. Move the .db file to RAM based FS to speedup
-# the handling, which will cut the time down to several seconds.
-#
-con = sqlite3.connect("/dev/shm/perf.db")
-con.isolation_level = None
-
-def trace_begin():
-	print "In trace_begin:\n"
-
-        #
-        # Will create several tables at the start, pebs_ll is for PEBS data with
-        # load latency info, while gen_events is for general event.
-        #
-        con.execute("""
-                create table if not exists gen_events (
-                        name text,
-                        symbol text,
-                        comm text,
-                        dso text
-                );""")
-        con.execute("""
-                create table if not exists pebs_ll (
-                        name text,
-                        symbol text,
-                        comm text,
-                        dso text,
-                        flags integer,
-                        ip integer,
-                        status integer,
-                        dse integer,
-                        dla integer,
-                        lat integer
-                );""")
-
-#
-# Create and insert event object to a database so that user could
-# do more analysis with simple database commands.
-#
-def process_event(param_dict):
-        event_attr = param_dict["attr"]
-        sample     = param_dict["sample"]
-        raw_buf    = param_dict["raw_buf"]
-        comm       = param_dict["comm"]
-        name       = param_dict["ev_name"]
-
-        # Symbol and dso info are not always resolved
-        if (param_dict.has_key("dso")):
-                dso = param_dict["dso"]
-        else:
-                dso = "Unknown_dso"
-
-        if (param_dict.has_key("symbol")):
-                symbol = param_dict["symbol"]
-        else:
-                symbol = "Unknown_symbol"
-
-        # Create the event object and insert it to the right table in database
-        event = create_event(name, comm, dso, symbol, raw_buf)
-        insert_db(event)
-
-def insert_db(event):
-        if event.ev_type == EVTYPE_GENERIC:
-                con.execute("insert into gen_events values(?, ?, ?, ?)",
-                                (event.name, event.symbol, event.comm, event.dso))
-        elif event.ev_type == EVTYPE_PEBS_LL:
-                event.ip &= 0x7fffffffffffffff
-                event.dla &= 0x7fffffffffffffff
-                con.execute("insert into pebs_ll values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
-                        (event.name, event.symbol, event.comm, event.dso, event.flags,
-                                event.ip, event.status, event.dse, event.dla, event.lat))
-
-def trace_end():
-	print "In trace_end:\n"
-        # We show the basic info for the 2 type of event classes
-        show_general_events()
-        show_pebs_ll()
-        con.close()
-
-#
-# As the event number may be very big, so we can't use linear way
-# to show the histogram in real number, but use a log2 algorithm.
-#
-
-def num2sym(num):
-        # Each number will have at least one '#'
-        snum = '#' * (int)(math.log(num, 2) + 1)
-        return snum
-
-def show_general_events():
-
-        # Check the total record number in the table
-        count = con.execute("select count(*) from gen_events")
-        for t in count:
-                print "There is %d records in gen_events table" % t[0]
-                if t[0] == 0:
-                        return
-
-        print "Statistics about the general events grouped by thread/symbol/dso: \n"
-
-         # Group by thread
-        commq = con.execute("select comm, count(comm) from gen_events group by comm order by -count(comm)")
-        print "\n%16s %8s %16s\n%s" % ("comm", "number", "histogram", "="*42)
-        for row in commq:
-             print "%16s %8d     %s" % (row[0], row[1], num2sym(row[1]))
-
-        # Group by symbol
-        print "\n%32s %8s %16s\n%s" % ("symbol", "number", "histogram", "="*58)
-        symbolq = con.execute("select symbol, count(symbol) from gen_events group by symbol order by -count(symbol)")
-        for row in symbolq:
-             print "%32s %8d     %s" % (row[0], row[1], num2sym(row[1]))
-
-        # Group by dso
-        print "\n%40s %8s %16s\n%s" % ("dso", "number", "histogram", "="*74)
-        dsoq = con.execute("select dso, count(dso) from gen_events group by dso order by -count(dso)")
-        for row in dsoq:
-             print "%40s %8d     %s" % (row[0], row[1], num2sym(row[1]))
-
-#
-# This function just shows the basic info, and we could do more with the
-# data in the tables, like checking the function parameters when some
-# big latency events happen.
-#
-def show_pebs_ll():
-
-        count = con.execute("select count(*) from pebs_ll")
-        for t in count:
-                print "There is %d records in pebs_ll table" % t[0]
-                if t[0] == 0:
-                        return
-
-        print "Statistics about the PEBS Load Latency events grouped by thread/symbol/dse/latency: \n"
-
-        # Group by thread
-        commq = con.execute("select comm, count(comm) from pebs_ll group by comm order by -count(comm)")
-        print "\n%16s %8s %16s\n%s" % ("comm", "number", "histogram", "="*42)
-        for row in commq:
-             print "%16s %8d     %s" % (row[0], row[1], num2sym(row[1]))
-
-        # Group by symbol
-        print "\n%32s %8s %16s\n%s" % ("symbol", "number", "histogram", "="*58)
-        symbolq = con.execute("select symbol, count(symbol) from pebs_ll group by symbol order by -count(symbol)")
-        for row in symbolq:
-             print "%32s %8d     %s" % (row[0], row[1], num2sym(row[1]))
-
-        # Group by dse
-        dseq = con.execute("select dse, count(dse) from pebs_ll group by dse order by -count(dse)")
-        print "\n%32s %8s %16s\n%s" % ("dse", "number", "histogram", "="*58)
-        for row in dseq:
-             print "%32s %8d     %s" % (row[0], row[1], num2sym(row[1]))
-
-        # Group by latency
-        latq = con.execute("select lat, count(lat) from pebs_ll group by lat order by lat")
-        print "\n%32s %8s %16s\n%s" % ("latency", "number", "histogram", "="*58)
-        for row in latq:
-             print "%32s %8d     %s" % (row[0], row[1], num2sym(row[1]))
-
-def trace_unhandled(event_name, context, event_fields_dict):
-		print ' '.join(['%s=%s'%(k,str(v))for k,v in sorted(event_fields_dict.items())])
diff --git a/src/tools/perf/scripts/python/failed-syscalls-by-pid.py b/src/tools/perf/scripts/python/failed-syscalls-by-pid.py
deleted file mode 100644
index 85805fa..0000000
--- a/src/tools/perf/scripts/python/failed-syscalls-by-pid.py
+++ /dev/null
@@ -1,73 +0,0 @@
-# failed system call counts, by pid
-# (c) 2010, Tom Zanussi <tzanussi@gmail.com>
-# Licensed under the terms of the GNU GPL License version 2
-#
-# Displays system-wide failed system call totals, broken down by pid.
-# If a [comm] arg is specified, only syscalls called by [comm] are displayed.
-
-import os
-import sys
-
-sys.path.append(os.environ['PERF_EXEC_PATH'] + \
-	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
-
-from perf_trace_context import *
-from Core import *
-from Util import *
-
-usage = "perf script -s syscall-counts-by-pid.py [comm|pid]\n";
-
-for_comm = None
-for_pid = None
-
-if len(sys.argv) > 2:
-	sys.exit(usage)
-
-if len(sys.argv) > 1:
-	try:
-		for_pid = int(sys.argv[1])
-	except:
-		for_comm = sys.argv[1]
-
-syscalls = autodict()
-
-def trace_begin():
-	print "Press control+C to stop and show the summary"
-
-def trace_end():
-	print_error_totals()
-
-def raw_syscalls__sys_exit(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	id, ret):
-	if (for_comm and common_comm != for_comm) or \
-	   (for_pid  and common_pid  != for_pid ):
-		return
-
-	if ret < 0:
-		try:
-			syscalls[common_comm][common_pid][id][ret] += 1
-		except TypeError:
-			syscalls[common_comm][common_pid][id][ret] = 1
-
-def print_error_totals():
-    if for_comm is not None:
-	    print "\nsyscall errors for %s:\n\n" % (for_comm),
-    else:
-	    print "\nsyscall errors:\n\n",
-
-    print "%-30s  %10s\n" % ("comm [pid]", "count"),
-    print "%-30s  %10s\n" % ("------------------------------", \
-                                 "----------"),
-
-    comm_keys = syscalls.keys()
-    for comm in comm_keys:
-	    pid_keys = syscalls[comm].keys()
-	    for pid in pid_keys:
-		    print "\n%s [%d]\n" % (comm, pid),
-		    id_keys = syscalls[comm][pid].keys()
-		    for id in id_keys:
-			    print "  syscall: %-16s\n" % syscall_name(id),
-			    ret_keys = syscalls[comm][pid][id].keys()
-			    for ret, val in sorted(syscalls[comm][pid][id].iteritems(), key = lambda(k, v): (v, k),  reverse = True):
-				    print "    err = %-20s  %10d\n" % (strerror(ret), val),
diff --git a/src/tools/perf/scripts/python/futex-contention.py b/src/tools/perf/scripts/python/futex-contention.py
deleted file mode 100644
index 11e70a3..0000000
--- a/src/tools/perf/scripts/python/futex-contention.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# futex contention
-# (c) 2010, Arnaldo Carvalho de Melo <acme@redhat.com>
-# Licensed under the terms of the GNU GPL License version 2
-#
-# Translation of:
-#
-# http://sourceware.org/systemtap/wiki/WSFutexContention
-#
-# to perf python scripting.
-#
-# Measures futex contention
-
-import os, sys
-sys.path.append(os.environ['PERF_EXEC_PATH'] + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
-from Util import *
-
-process_names = {}
-thread_thislock = {}
-thread_blocktime = {}
-
-lock_waits = {} # long-lived stats on (tid,lock) blockage elapsed time
-process_names = {} # long-lived pid-to-execname mapping
-
-def syscalls__sys_enter_futex(event, ctxt, cpu, s, ns, tid, comm,
-			      nr, uaddr, op, val, utime, uaddr2, val3):
-	cmd = op & FUTEX_CMD_MASK
-	if cmd != FUTEX_WAIT:
-		return # we don't care about originators of WAKE events
-
-	process_names[tid] = comm
-	thread_thislock[tid] = uaddr
-	thread_blocktime[tid] = nsecs(s, ns)
-
-def syscalls__sys_exit_futex(event, ctxt, cpu, s, ns, tid, comm,
-			     nr, ret):
-	if thread_blocktime.has_key(tid):
-		elapsed = nsecs(s, ns) - thread_blocktime[tid]
-		add_stats(lock_waits, (tid, thread_thislock[tid]), elapsed)
-		del thread_blocktime[tid]
-		del thread_thislock[tid]
-
-def trace_begin():
-	print "Press control+C to stop and show the summary"
-
-def trace_end():
-	for (tid, lock) in lock_waits:
-		min, max, avg, count = lock_waits[tid, lock]
-		print "%s[%d] lock %x contended %d times, %d avg ns" % \
-		      (process_names[tid], tid, lock, count, avg)
-
diff --git a/src/tools/perf/scripts/python/net_dropmonitor.py b/src/tools/perf/scripts/python/net_dropmonitor.py
deleted file mode 100755
index b574059..0000000
--- a/src/tools/perf/scripts/python/net_dropmonitor.py
+++ /dev/null
@@ -1,75 +0,0 @@
-# Monitor the system for dropped packets and proudce a report of drop locations and counts
-
-import os
-import sys
-
-sys.path.append(os.environ['PERF_EXEC_PATH'] + \
-		'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
-
-from perf_trace_context import *
-from Core import *
-from Util import *
-
-drop_log = {}
-kallsyms = []
-
-def get_kallsyms_table():
-	global kallsyms
-
-	try:
-		f = open("/proc/kallsyms", "r")
-	except:
-		return
-
-	for line in f:
-		loc = int(line.split()[0], 16)
-		name = line.split()[2]
-		kallsyms.append((loc, name))
-	kallsyms.sort()
-
-def get_sym(sloc):
-	loc = int(sloc)
-
-	# Invariant: kallsyms[i][0] <= loc for all 0 <= i <= start
-	#            kallsyms[i][0] > loc for all end <= i < len(kallsyms)
-	start, end = -1, len(kallsyms)
-	while end != start + 1:
-		pivot = (start + end) // 2
-		if loc < kallsyms[pivot][0]:
-			end = pivot
-		else:
-			start = pivot
-
-	# Now (start == -1 or kallsyms[start][0] <= loc)
-	# and (start == len(kallsyms) - 1 or loc < kallsyms[start + 1][0])
-	if start >= 0:
-		symloc, name = kallsyms[start]
-		return (name, loc - symloc)
-	else:
-		return (None, 0)
-
-def print_drop_table():
-	print "%25s %25s %25s" % ("LOCATION", "OFFSET", "COUNT")
-	for i in drop_log.keys():
-		(sym, off) = get_sym(i)
-		if sym == None:
-			sym = i
-		print "%25s %25s %25s" % (sym, off, drop_log[i])
-
-
-def trace_begin():
-	print "Starting trace (Ctrl-C to dump results)"
-
-def trace_end():
-	print "Gathering kallsyms data"
-	get_kallsyms_table()
-	print_drop_table()
-
-# called from perf, when it finds a correspoinding event
-def skb__kfree_skb(name, context, cpu, sec, nsec, pid, comm,
-		   skbaddr, location, protocol):
-	slocation = str(location)
-	try:
-		drop_log[slocation] = drop_log[slocation] + 1
-	except:
-		drop_log[slocation] = 1
diff --git a/src/tools/perf/scripts/python/netdev-times.py b/src/tools/perf/scripts/python/netdev-times.py
deleted file mode 100644
index 9aa0a32..0000000
--- a/src/tools/perf/scripts/python/netdev-times.py
+++ /dev/null
@@ -1,464 +0,0 @@
-# Display a process of packets and processed time.
-# It helps us to investigate networking or network device.
-#
-# options
-# tx: show only tx chart
-# rx: show only rx chart
-# dev=: show only thing related to specified device
-# debug: work with debug mode. It shows buffer status.
-
-import os
-import sys
-
-sys.path.append(os.environ['PERF_EXEC_PATH'] + \
-	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
-
-from perf_trace_context import *
-from Core import *
-from Util import *
-
-all_event_list = []; # insert all tracepoint event related with this script
-irq_dic = {}; # key is cpu and value is a list which stacks irqs
-              # which raise NET_RX softirq
-net_rx_dic = {}; # key is cpu and value include time of NET_RX softirq-entry
-		 # and a list which stacks receive
-receive_hunk_list = []; # a list which include a sequence of receive events
-rx_skb_list = []; # received packet list for matching
-		       # skb_copy_datagram_iovec
-
-buffer_budget = 65536; # the budget of rx_skb_list, tx_queue_list and
-		       # tx_xmit_list
-of_count_rx_skb_list = 0; # overflow count
-
-tx_queue_list = []; # list of packets which pass through dev_queue_xmit
-of_count_tx_queue_list = 0; # overflow count
-
-tx_xmit_list = [];  # list of packets which pass through dev_hard_start_xmit
-of_count_tx_xmit_list = 0; # overflow count
-
-tx_free_list = [];  # list of packets which is freed
-
-# options
-show_tx = 0;
-show_rx = 0;
-dev = 0; # store a name of device specified by option "dev="
-debug = 0;
-
-# indices of event_info tuple
-EINFO_IDX_NAME=   0
-EINFO_IDX_CONTEXT=1
-EINFO_IDX_CPU=    2
-EINFO_IDX_TIME=   3
-EINFO_IDX_PID=    4
-EINFO_IDX_COMM=   5
-
-# Calculate a time interval(msec) from src(nsec) to dst(nsec)
-def diff_msec(src, dst):
-	return (dst - src) / 1000000.0
-
-# Display a process of transmitting a packet
-def print_transmit(hunk):
-	if dev != 0 and hunk['dev'].find(dev) < 0:
-		return
-	print "%7s %5d %6d.%06dsec %12.3fmsec      %12.3fmsec" % \
-		(hunk['dev'], hunk['len'],
-		nsecs_secs(hunk['queue_t']),
-		nsecs_nsecs(hunk['queue_t'])/1000,
-		diff_msec(hunk['queue_t'], hunk['xmit_t']),
-		diff_msec(hunk['xmit_t'], hunk['free_t']))
-
-# Format for displaying rx packet processing
-PF_IRQ_ENTRY= "  irq_entry(+%.3fmsec irq=%d:%s)"
-PF_SOFT_ENTRY="  softirq_entry(+%.3fmsec)"
-PF_NAPI_POLL= "  napi_poll_exit(+%.3fmsec %s)"
-PF_JOINT=     "         |"
-PF_WJOINT=    "         |            |"
-PF_NET_RECV=  "         |---netif_receive_skb(+%.3fmsec skb=%x len=%d)"
-PF_NET_RX=    "         |---netif_rx(+%.3fmsec skb=%x)"
-PF_CPY_DGRAM= "         |      skb_copy_datagram_iovec(+%.3fmsec %d:%s)"
-PF_KFREE_SKB= "         |      kfree_skb(+%.3fmsec location=%x)"
-PF_CONS_SKB=  "         |      consume_skb(+%.3fmsec)"
-
-# Display a process of received packets and interrputs associated with
-# a NET_RX softirq
-def print_receive(hunk):
-	show_hunk = 0
-	irq_list = hunk['irq_list']
-	cpu = irq_list[0]['cpu']
-	base_t = irq_list[0]['irq_ent_t']
-	# check if this hunk should be showed
-	if dev != 0:
-		for i in range(len(irq_list)):
-			if irq_list[i]['name'].find(dev) >= 0:
-				show_hunk = 1
-				break
-	else:
-		show_hunk = 1
-	if show_hunk == 0:
-		return
-
-	print "%d.%06dsec cpu=%d" % \
-		(nsecs_secs(base_t), nsecs_nsecs(base_t)/1000, cpu)
-	for i in range(len(irq_list)):
-		print PF_IRQ_ENTRY % \
-			(diff_msec(base_t, irq_list[i]['irq_ent_t']),
-			irq_list[i]['irq'], irq_list[i]['name'])
-		print PF_JOINT
-		irq_event_list = irq_list[i]['event_list']
-		for j in range(len(irq_event_list)):
-			irq_event = irq_event_list[j]
-			if irq_event['event'] == 'netif_rx':
-				print PF_NET_RX % \
-					(diff_msec(base_t, irq_event['time']),
-					irq_event['skbaddr'])
-				print PF_JOINT
-	print PF_SOFT_ENTRY % \
-		diff_msec(base_t, hunk['sirq_ent_t'])
-	print PF_JOINT
-	event_list = hunk['event_list']
-	for i in range(len(event_list)):
-		event = event_list[i]
-		if event['event_name'] == 'napi_poll':
-			print PF_NAPI_POLL % \
-			    (diff_msec(base_t, event['event_t']), event['dev'])
-			if i == len(event_list) - 1:
-				print ""
-			else:
-				print PF_JOINT
-		else:
-			print PF_NET_RECV % \
-			    (diff_msec(base_t, event['event_t']), event['skbaddr'],
-				event['len'])
-			if 'comm' in event.keys():
-				print PF_WJOINT
-				print PF_CPY_DGRAM % \
-					(diff_msec(base_t, event['comm_t']),
-					event['pid'], event['comm'])
-			elif 'handle' in event.keys():
-				print PF_WJOINT
-				if event['handle'] == "kfree_skb":
-					print PF_KFREE_SKB % \
-						(diff_msec(base_t,
-						event['comm_t']),
-						event['location'])
-				elif event['handle'] == "consume_skb":
-					print PF_CONS_SKB % \
-						diff_msec(base_t,
-							event['comm_t'])
-			print PF_JOINT
-
-def trace_begin():
-	global show_tx
-	global show_rx
-	global dev
-	global debug
-
-	for i in range(len(sys.argv)):
-		if i == 0:
-			continue
-		arg = sys.argv[i]
-		if arg == 'tx':
-			show_tx = 1
-		elif arg =='rx':
-			show_rx = 1
-		elif arg.find('dev=',0, 4) >= 0:
-			dev = arg[4:]
-		elif arg == 'debug':
-			debug = 1
-	if show_tx == 0  and show_rx == 0:
-		show_tx = 1
-		show_rx = 1
-
-def trace_end():
-	# order all events in time
-	all_event_list.sort(lambda a,b :cmp(a[EINFO_IDX_TIME],
-					    b[EINFO_IDX_TIME]))
-	# process all events
-	for i in range(len(all_event_list)):
-		event_info = all_event_list[i]
-		name = event_info[EINFO_IDX_NAME]
-		if name == 'irq__softirq_exit':
-			handle_irq_softirq_exit(event_info)
-		elif name == 'irq__softirq_entry':
-			handle_irq_softirq_entry(event_info)
-		elif name == 'irq__softirq_raise':
-			handle_irq_softirq_raise(event_info)
-		elif name == 'irq__irq_handler_entry':
-			handle_irq_handler_entry(event_info)
-		elif name == 'irq__irq_handler_exit':
-			handle_irq_handler_exit(event_info)
-		elif name == 'napi__napi_poll':
-			handle_napi_poll(event_info)
-		elif name == 'net__netif_receive_skb':
-			handle_netif_receive_skb(event_info)
-		elif name == 'net__netif_rx':
-			handle_netif_rx(event_info)
-		elif name == 'skb__skb_copy_datagram_iovec':
-			handle_skb_copy_datagram_iovec(event_info)
-		elif name == 'net__net_dev_queue':
-			handle_net_dev_queue(event_info)
-		elif name == 'net__net_dev_xmit':
-			handle_net_dev_xmit(event_info)
-		elif name == 'skb__kfree_skb':
-			handle_kfree_skb(event_info)
-		elif name == 'skb__consume_skb':
-			handle_consume_skb(event_info)
-	# display receive hunks
-	if show_rx:
-		for i in range(len(receive_hunk_list)):
-			print_receive(receive_hunk_list[i])
-	# display transmit hunks
-	if show_tx:
-		print "   dev    len      Qdisc        " \
-			"       netdevice             free"
-		for i in range(len(tx_free_list)):
-			print_transmit(tx_free_list[i])
-	if debug:
-		print "debug buffer status"
-		print "----------------------------"
-		print "xmit Qdisc:remain:%d overflow:%d" % \
-			(len(tx_queue_list), of_count_tx_queue_list)
-		print "xmit netdevice:remain:%d overflow:%d" % \
-			(len(tx_xmit_list), of_count_tx_xmit_list)
-		print "receive:remain:%d overflow:%d" % \
-			(len(rx_skb_list), of_count_rx_skb_list)
-
-# called from perf, when it finds a correspoinding event
-def irq__softirq_entry(name, context, cpu, sec, nsec, pid, comm, vec):
-	if symbol_str("irq__softirq_entry", "vec", vec) != "NET_RX":
-		return
-	event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, vec)
-	all_event_list.append(event_info)
-
-def irq__softirq_exit(name, context, cpu, sec, nsec, pid, comm, vec):
-	if symbol_str("irq__softirq_entry", "vec", vec) != "NET_RX":
-		return
-	event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, vec)
-	all_event_list.append(event_info)
-
-def irq__softirq_raise(name, context, cpu, sec, nsec, pid, comm, vec):
-	if symbol_str("irq__softirq_entry", "vec", vec) != "NET_RX":
-		return
-	event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, vec)
-	all_event_list.append(event_info)
-
-def irq__irq_handler_entry(name, context, cpu, sec, nsec, pid, comm,
-			irq, irq_name):
-	event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm,
-			irq, irq_name)
-	all_event_list.append(event_info)
-
-def irq__irq_handler_exit(name, context, cpu, sec, nsec, pid, comm, irq, ret):
-	event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm, irq, ret)
-	all_event_list.append(event_info)
-
-def napi__napi_poll(name, context, cpu, sec, nsec, pid, comm, napi, dev_name):
-	event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm,
-			napi, dev_name)
-	all_event_list.append(event_info)
-
-def net__netif_receive_skb(name, context, cpu, sec, nsec, pid, comm, skbaddr,
-			skblen, dev_name):
-	event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm,
-			skbaddr, skblen, dev_name)
-	all_event_list.append(event_info)
-
-def net__netif_rx(name, context, cpu, sec, nsec, pid, comm, skbaddr,
-			skblen, dev_name):
-	event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm,
-			skbaddr, skblen, dev_name)
-	all_event_list.append(event_info)
-
-def net__net_dev_queue(name, context, cpu, sec, nsec, pid, comm,
-			skbaddr, skblen, dev_name):
-	event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm,
-			skbaddr, skblen, dev_name)
-	all_event_list.append(event_info)
-
-def net__net_dev_xmit(name, context, cpu, sec, nsec, pid, comm,
-			skbaddr, skblen, rc, dev_name):
-	event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm,
-			skbaddr, skblen, rc ,dev_name)
-	all_event_list.append(event_info)
-
-def skb__kfree_skb(name, context, cpu, sec, nsec, pid, comm,
-			skbaddr, protocol, location):
-	event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm,
-			skbaddr, protocol, location)
-	all_event_list.append(event_info)
-
-def skb__consume_skb(name, context, cpu, sec, nsec, pid, comm, skbaddr):
-	event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm,
-			skbaddr)
-	all_event_list.append(event_info)
-
-def skb__skb_copy_datagram_iovec(name, context, cpu, sec, nsec, pid, comm,
-	skbaddr, skblen):
-	event_info = (name, context, cpu, nsecs(sec, nsec), pid, comm,
-			skbaddr, skblen)
-	all_event_list.append(event_info)
-
-def handle_irq_handler_entry(event_info):
-	(name, context, cpu, time, pid, comm, irq, irq_name) = event_info
-	if cpu not in irq_dic.keys():
-		irq_dic[cpu] = []
-	irq_record = {'irq':irq, 'name':irq_name, 'cpu':cpu, 'irq_ent_t':time}
-	irq_dic[cpu].append(irq_record)
-
-def handle_irq_handler_exit(event_info):
-	(name, context, cpu, time, pid, comm, irq, ret) = event_info
-	if cpu not in irq_dic.keys():
-		return
-	irq_record = irq_dic[cpu].pop()
-	if irq != irq_record['irq']:
-		return
-	irq_record.update({'irq_ext_t':time})
-	# if an irq doesn't include NET_RX softirq, drop.
-	if 'event_list' in irq_record.keys():
-		irq_dic[cpu].append(irq_record)
-
-def handle_irq_softirq_raise(event_info):
-	(name, context, cpu, time, pid, comm, vec) = event_info
-	if cpu not in irq_dic.keys() \
-	or len(irq_dic[cpu]) == 0:
-		return
-	irq_record = irq_dic[cpu].pop()
-	if 'event_list' in irq_record.keys():
-		irq_event_list = irq_record['event_list']
-	else:
-		irq_event_list = []
-	irq_event_list.append({'time':time, 'event':'sirq_raise'})
-	irq_record.update({'event_list':irq_event_list})
-	irq_dic[cpu].append(irq_record)
-
-def handle_irq_softirq_entry(event_info):
-	(name, context, cpu, time, pid, comm, vec) = event_info
-	net_rx_dic[cpu] = {'sirq_ent_t':time, 'event_list':[]}
-
-def handle_irq_softirq_exit(event_info):
-	(name, context, cpu, time, pid, comm, vec) = event_info
-	irq_list = []
-	event_list = 0
-	if cpu in irq_dic.keys():
-		irq_list = irq_dic[cpu]
-		del irq_dic[cpu]
-	if cpu in net_rx_dic.keys():
-		sirq_ent_t = net_rx_dic[cpu]['sirq_ent_t']
-		event_list = net_rx_dic[cpu]['event_list']
-		del net_rx_dic[cpu]
-	if irq_list == [] or event_list == 0:
-		return
-	rec_data = {'sirq_ent_t':sirq_ent_t, 'sirq_ext_t':time,
-		    'irq_list':irq_list, 'event_list':event_list}
-	# merge information realted to a NET_RX softirq
-	receive_hunk_list.append(rec_data)
-
-def handle_napi_poll(event_info):
-	(name, context, cpu, time, pid, comm, napi, dev_name) = event_info
-	if cpu in net_rx_dic.keys():
-		event_list = net_rx_dic[cpu]['event_list']
-		rec_data = {'event_name':'napi_poll',
-				'dev':dev_name, 'event_t':time}
-		event_list.append(rec_data)
-
-def handle_netif_rx(event_info):
-	(name, context, cpu, time, pid, comm,
-		skbaddr, skblen, dev_name) = event_info
-	if cpu not in irq_dic.keys() \
-	or len(irq_dic[cpu]) == 0:
-		return
-	irq_record = irq_dic[cpu].pop()
-	if 'event_list' in irq_record.keys():
-		irq_event_list = irq_record['event_list']
-	else:
-		irq_event_list = []
-	irq_event_list.append({'time':time, 'event':'netif_rx',
-		'skbaddr':skbaddr, 'skblen':skblen, 'dev_name':dev_name})
-	irq_record.update({'event_list':irq_event_list})
-	irq_dic[cpu].append(irq_record)
-
-def handle_netif_receive_skb(event_info):
-	global of_count_rx_skb_list
-
-	(name, context, cpu, time, pid, comm,
-		skbaddr, skblen, dev_name) = event_info
-	if cpu in net_rx_dic.keys():
-		rec_data = {'event_name':'netif_receive_skb',
-			    'event_t':time, 'skbaddr':skbaddr, 'len':skblen}
-		event_list = net_rx_dic[cpu]['event_list']
-		event_list.append(rec_data)
-		rx_skb_list.insert(0, rec_data)
-		if len(rx_skb_list) > buffer_budget:
-			rx_skb_list.pop()
-			of_count_rx_skb_list += 1
-
-def handle_net_dev_queue(event_info):
-	global of_count_tx_queue_list
-
-	(name, context, cpu, time, pid, comm,
-		skbaddr, skblen, dev_name) = event_info
-	skb = {'dev':dev_name, 'skbaddr':skbaddr, 'len':skblen, 'queue_t':time}
-	tx_queue_list.insert(0, skb)
-	if len(tx_queue_list) > buffer_budget:
-		tx_queue_list.pop()
-		of_count_tx_queue_list += 1
-
-def handle_net_dev_xmit(event_info):
-	global of_count_tx_xmit_list
-
-	(name, context, cpu, time, pid, comm,
-		skbaddr, skblen, rc, dev_name) = event_info
-	if rc == 0: # NETDEV_TX_OK
-		for i in range(len(tx_queue_list)):
-			skb = tx_queue_list[i]
-			if skb['skbaddr'] == skbaddr:
-				skb['xmit_t'] = time
-				tx_xmit_list.insert(0, skb)
-				del tx_queue_list[i]
-				if len(tx_xmit_list) > buffer_budget:
-					tx_xmit_list.pop()
-					of_count_tx_xmit_list += 1
-				return
-
-def handle_kfree_skb(event_info):
-	(name, context, cpu, time, pid, comm,
-		skbaddr, protocol, location) = event_info
-	for i in range(len(tx_queue_list)):
-		skb = tx_queue_list[i]
-		if skb['skbaddr'] == skbaddr:
-			del tx_queue_list[i]
-			return
-	for i in range(len(tx_xmit_list)):
-		skb = tx_xmit_list[i]
-		if skb['skbaddr'] == skbaddr:
-			skb['free_t'] = time
-			tx_free_list.append(skb)
-			del tx_xmit_list[i]
-			return
-	for i in range(len(rx_skb_list)):
-		rec_data = rx_skb_list[i]
-		if rec_data['skbaddr'] == skbaddr:
-			rec_data.update({'handle':"kfree_skb",
-					'comm':comm, 'pid':pid, 'comm_t':time})
-			del rx_skb_list[i]
-			return
-
-def handle_consume_skb(event_info):
-	(name, context, cpu, time, pid, comm, skbaddr) = event_info
-	for i in range(len(tx_xmit_list)):
-		skb = tx_xmit_list[i]
-		if skb['skbaddr'] == skbaddr:
-			skb['free_t'] = time
-			tx_free_list.append(skb)
-			del tx_xmit_list[i]
-			return
-
-def handle_skb_copy_datagram_iovec(event_info):
-	(name, context, cpu, time, pid, comm, skbaddr, skblen) = event_info
-	for i in range(len(rx_skb_list)):
-		rec_data = rx_skb_list[i]
-		if skbaddr == rec_data['skbaddr']:
-			rec_data.update({'handle':"skb_copy_datagram_iovec",
-					'comm':comm, 'pid':pid, 'comm_t':time})
-			del rx_skb_list[i]
-			return
diff --git a/src/tools/perf/scripts/python/sched-migration.py b/src/tools/perf/scripts/python/sched-migration.py
deleted file mode 100644
index 74d55ec..0000000
--- a/src/tools/perf/scripts/python/sched-migration.py
+++ /dev/null
@@ -1,461 +0,0 @@
-#!/usr/bin/python
-#
-# Cpu task migration overview toy
-#
-# Copyright (C) 2010 Frederic Weisbecker <fweisbec@gmail.com>
-#
-# perf script event handlers have been generated by perf script -g python
-#
-# This software is distributed under the terms of the GNU General
-# Public License ("GPL") version 2 as published by the Free Software
-# Foundation.
-
-
-import os
-import sys
-
-from collections import defaultdict
-from UserList import UserList
-
-sys.path.append(os.environ['PERF_EXEC_PATH'] + \
-	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
-sys.path.append('scripts/python/Perf-Trace-Util/lib/Perf/Trace')
-
-from perf_trace_context import *
-from Core import *
-from SchedGui import *
-
-
-threads = { 0 : "idle"}
-
-def thread_name(pid):
-	return "%s:%d" % (threads[pid], pid)
-
-class RunqueueEventUnknown:
-	@staticmethod
-	def color():
-		return None
-
-	def __repr__(self):
-		return "unknown"
-
-class RunqueueEventSleep:
-	@staticmethod
-	def color():
-		return (0, 0, 0xff)
-
-	def __init__(self, sleeper):
-		self.sleeper = sleeper
-
-	def __repr__(self):
-		return "%s gone to sleep" % thread_name(self.sleeper)
-
-class RunqueueEventWakeup:
-	@staticmethod
-	def color():
-		return (0xff, 0xff, 0)
-
-	def __init__(self, wakee):
-		self.wakee = wakee
-
-	def __repr__(self):
-		return "%s woke up" % thread_name(self.wakee)
-
-class RunqueueEventFork:
-	@staticmethod
-	def color():
-		return (0, 0xff, 0)
-
-	def __init__(self, child):
-		self.child = child
-
-	def __repr__(self):
-		return "new forked task %s" % thread_name(self.child)
-
-class RunqueueMigrateIn:
-	@staticmethod
-	def color():
-		return (0, 0xf0, 0xff)
-
-	def __init__(self, new):
-		self.new = new
-
-	def __repr__(self):
-		return "task migrated in %s" % thread_name(self.new)
-
-class RunqueueMigrateOut:
-	@staticmethod
-	def color():
-		return (0xff, 0, 0xff)
-
-	def __init__(self, old):
-		self.old = old
-
-	def __repr__(self):
-		return "task migrated out %s" % thread_name(self.old)
-
-class RunqueueSnapshot:
-	def __init__(self, tasks = [0], event = RunqueueEventUnknown()):
-		self.tasks = tuple(tasks)
-		self.event = event
-
-	def sched_switch(self, prev, prev_state, next):
-		event = RunqueueEventUnknown()
-
-		if taskState(prev_state) == "R" and next in self.tasks \
-			and prev in self.tasks:
-			return self
-
-		if taskState(prev_state) != "R":
-			event = RunqueueEventSleep(prev)
-
-		next_tasks = list(self.tasks[:])
-		if prev in self.tasks:
-			if taskState(prev_state) != "R":
-				next_tasks.remove(prev)
-		elif taskState(prev_state) == "R":
-			next_tasks.append(prev)
-
-		if next not in next_tasks:
-			next_tasks.append(next)
-
-		return RunqueueSnapshot(next_tasks, event)
-
-	def migrate_out(self, old):
-		if old not in self.tasks:
-			return self
-		next_tasks = [task for task in self.tasks if task != old]
-
-		return RunqueueSnapshot(next_tasks, RunqueueMigrateOut(old))
-
-	def __migrate_in(self, new, event):
-		if new in self.tasks:
-			self.event = event
-			return self
-		next_tasks = self.tasks[:] + tuple([new])
-
-		return RunqueueSnapshot(next_tasks, event)
-
-	def migrate_in(self, new):
-		return self.__migrate_in(new, RunqueueMigrateIn(new))
-
-	def wake_up(self, new):
-		return self.__migrate_in(new, RunqueueEventWakeup(new))
-
-	def wake_up_new(self, new):
-		return self.__migrate_in(new, RunqueueEventFork(new))
-
-	def load(self):
-		""" Provide the number of tasks on the runqueue.
-		    Don't count idle"""
-		return len(self.tasks) - 1
-
-	def __repr__(self):
-		ret = self.tasks.__repr__()
-		ret += self.origin_tostring()
-
-		return ret
-
-class TimeSlice:
-	def __init__(self, start, prev):
-		self.start = start
-		self.prev = prev
-		self.end = start
-		# cpus that triggered the event
-		self.event_cpus = []
-		if prev is not None:
-			self.total_load = prev.total_load
-			self.rqs = prev.rqs.copy()
-		else:
-			self.rqs = defaultdict(RunqueueSnapshot)
-			self.total_load = 0
-
-	def __update_total_load(self, old_rq, new_rq):
-		diff = new_rq.load() - old_rq.load()
-		self.total_load += diff
-
-	def sched_switch(self, ts_list, prev, prev_state, next, cpu):
-		old_rq = self.prev.rqs[cpu]
-		new_rq = old_rq.sched_switch(prev, prev_state, next)
-
-		if old_rq is new_rq:
-			return
-
-		self.rqs[cpu] = new_rq
-		self.__update_total_load(old_rq, new_rq)
-		ts_list.append(self)
-		self.event_cpus = [cpu]
-
-	def migrate(self, ts_list, new, old_cpu, new_cpu):
-		if old_cpu == new_cpu:
-			return
-		old_rq = self.prev.rqs[old_cpu]
-		out_rq = old_rq.migrate_out(new)
-		self.rqs[old_cpu] = out_rq
-		self.__update_total_load(old_rq, out_rq)
-
-		new_rq = self.prev.rqs[new_cpu]
-		in_rq = new_rq.migrate_in(new)
-		self.rqs[new_cpu] = in_rq
-		self.__update_total_load(new_rq, in_rq)
-
-		ts_list.append(self)
-
-		if old_rq is not out_rq:
-			self.event_cpus.append(old_cpu)
-		self.event_cpus.append(new_cpu)
-
-	def wake_up(self, ts_list, pid, cpu, fork):
-		old_rq = self.prev.rqs[cpu]
-		if fork:
-			new_rq = old_rq.wake_up_new(pid)
-		else:
-			new_rq = old_rq.wake_up(pid)
-
-		if new_rq is old_rq:
-			return
-		self.rqs[cpu] = new_rq
-		self.__update_total_load(old_rq, new_rq)
-		ts_list.append(self)
-		self.event_cpus = [cpu]
-
-	def next(self, t):
-		self.end = t
-		return TimeSlice(t, self)
-
-class TimeSliceList(UserList):
-	def __init__(self, arg = []):
-		self.data = arg
-
-	def get_time_slice(self, ts):
-		if len(self.data) == 0:
-			slice = TimeSlice(ts, TimeSlice(-1, None))
-		else:
-			slice = self.data[-1].next(ts)
-		return slice
-
-	def find_time_slice(self, ts):
-		start = 0
-		end = len(self.data)
-		found = -1
-		searching = True
-		while searching:
-			if start == end or start == end - 1:
-				searching = False
-
-			i = (end + start) / 2
-			if self.data[i].start <= ts and self.data[i].end >= ts:
-				found = i
-				end = i
-				continue
-
-			if self.data[i].end < ts:
-				start = i
-
-			elif self.data[i].start > ts:
-				end = i
-
-		return found
-
-	def set_root_win(self, win):
-		self.root_win = win
-
-	def mouse_down(self, cpu, t):
-		idx = self.find_time_slice(t)
-		if idx == -1:
-			return
-
-		ts = self[idx]
-		rq = ts.rqs[cpu]
-		raw = "CPU: %d\n" % cpu
-		raw += "Last event : %s\n" % rq.event.__repr__()
-		raw += "Timestamp : %d.%06d\n" % (ts.start / (10 ** 9), (ts.start % (10 ** 9)) / 1000)
-		raw += "Duration : %6d us\n" % ((ts.end - ts.start) / (10 ** 6))
-		raw += "Load = %d\n" % rq.load()
-		for t in rq.tasks:
-			raw += "%s \n" % thread_name(t)
-
-		self.root_win.update_summary(raw)
-
-	def update_rectangle_cpu(self, slice, cpu):
-		rq = slice.rqs[cpu]
-
-		if slice.total_load != 0:
-			load_rate = rq.load() / float(slice.total_load)
-		else:
-			load_rate = 0
-
-		red_power = int(0xff - (0xff * load_rate))
-		color = (0xff, red_power, red_power)
-
-		top_color = None
-
-		if cpu in slice.event_cpus:
-			top_color = rq.event.color()
-
-		self.root_win.paint_rectangle_zone(cpu, color, top_color, slice.start, slice.end)
-
-	def fill_zone(self, start, end):
-		i = self.find_time_slice(start)
-		if i == -1:
-			return
-
-		for i in xrange(i, len(self.data)):
-			timeslice = self.data[i]
-			if timeslice.start > end:
-				return
-
-			for cpu in timeslice.rqs:
-				self.update_rectangle_cpu(timeslice, cpu)
-
-	def interval(self):
-		if len(self.data) == 0:
-			return (0, 0)
-
-		return (self.data[0].start, self.data[-1].end)
-
-	def nr_rectangles(self):
-		last_ts = self.data[-1]
-		max_cpu = 0
-		for cpu in last_ts.rqs:
-			if cpu > max_cpu:
-				max_cpu = cpu
-		return max_cpu
-
-
-class SchedEventProxy:
-	def __init__(self):
-		self.current_tsk = defaultdict(lambda : -1)
-		self.timeslices = TimeSliceList()
-
-	def sched_switch(self, headers, prev_comm, prev_pid, prev_prio, prev_state,
-			 next_comm, next_pid, next_prio):
-		""" Ensure the task we sched out this cpu is really the one
-		    we logged. Otherwise we may have missed traces """
-
-		on_cpu_task = self.current_tsk[headers.cpu]
-
-		if on_cpu_task != -1 and on_cpu_task != prev_pid:
-			print "Sched switch event rejected ts: %s cpu: %d prev: %s(%d) next: %s(%d)" % \
-				(headers.ts_format(), headers.cpu, prev_comm, prev_pid, next_comm, next_pid)
-
-		threads[prev_pid] = prev_comm
-		threads[next_pid] = next_comm
-		self.current_tsk[headers.cpu] = next_pid
-
-		ts = self.timeslices.get_time_slice(headers.ts())
-		ts.sched_switch(self.timeslices, prev_pid, prev_state, next_pid, headers.cpu)
-
-	def migrate(self, headers, pid, prio, orig_cpu, dest_cpu):
-		ts = self.timeslices.get_time_slice(headers.ts())
-		ts.migrate(self.timeslices, pid, orig_cpu, dest_cpu)
-
-	def wake_up(self, headers, comm, pid, success, target_cpu, fork):
-		if success == 0:
-			return
-		ts = self.timeslices.get_time_slice(headers.ts())
-		ts.wake_up(self.timeslices, pid, target_cpu, fork)
-
-
-def trace_begin():
-	global parser
-	parser = SchedEventProxy()
-
-def trace_end():
-	app = wx.App(False)
-	timeslices = parser.timeslices
-	frame = RootFrame(timeslices, "Migration")
-	app.MainLoop()
-
-def sched__sched_stat_runtime(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	comm, pid, runtime, vruntime):
-	pass
-
-def sched__sched_stat_iowait(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	comm, pid, delay):
-	pass
-
-def sched__sched_stat_sleep(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	comm, pid, delay):
-	pass
-
-def sched__sched_stat_wait(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	comm, pid, delay):
-	pass
-
-def sched__sched_process_fork(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	parent_comm, parent_pid, child_comm, child_pid):
-	pass
-
-def sched__sched_process_wait(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	comm, pid, prio):
-	pass
-
-def sched__sched_process_exit(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	comm, pid, prio):
-	pass
-
-def sched__sched_process_free(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	comm, pid, prio):
-	pass
-
-def sched__sched_migrate_task(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	comm, pid, prio, orig_cpu,
-	dest_cpu):
-	headers = EventHeaders(common_cpu, common_secs, common_nsecs,
-				common_pid, common_comm)
-	parser.migrate(headers, pid, prio, orig_cpu, dest_cpu)
-
-def sched__sched_switch(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	prev_comm, prev_pid, prev_prio, prev_state,
-	next_comm, next_pid, next_prio):
-
-	headers = EventHeaders(common_cpu, common_secs, common_nsecs,
-				common_pid, common_comm)
-	parser.sched_switch(headers, prev_comm, prev_pid, prev_prio, prev_state,
-			 next_comm, next_pid, next_prio)
-
-def sched__sched_wakeup_new(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	comm, pid, prio, success,
-	target_cpu):
-	headers = EventHeaders(common_cpu, common_secs, common_nsecs,
-				common_pid, common_comm)
-	parser.wake_up(headers, comm, pid, success, target_cpu, 1)
-
-def sched__sched_wakeup(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	comm, pid, prio, success,
-	target_cpu):
-	headers = EventHeaders(common_cpu, common_secs, common_nsecs,
-				common_pid, common_comm)
-	parser.wake_up(headers, comm, pid, success, target_cpu, 0)
-
-def sched__sched_wait_task(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	comm, pid, prio):
-	pass
-
-def sched__sched_kthread_stop_ret(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	ret):
-	pass
-
-def sched__sched_kthread_stop(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	comm, pid):
-	pass
-
-def trace_unhandled(event_name, context, common_cpu, common_secs, common_nsecs,
-		common_pid, common_comm):
-	pass
diff --git a/src/tools/perf/scripts/python/sctop.py b/src/tools/perf/scripts/python/sctop.py
deleted file mode 100644
index 42c267e..0000000
--- a/src/tools/perf/scripts/python/sctop.py
+++ /dev/null
@@ -1,75 +0,0 @@
-# system call top
-# (c) 2010, Tom Zanussi <tzanussi@gmail.com>
-# Licensed under the terms of the GNU GPL License version 2
-#
-# Periodically displays system-wide system call totals, broken down by
-# syscall.  If a [comm] arg is specified, only syscalls called by
-# [comm] are displayed. If an [interval] arg is specified, the display
-# will be refreshed every [interval] seconds.  The default interval is
-# 3 seconds.
-
-import os, sys, thread, time
-
-sys.path.append(os.environ['PERF_EXEC_PATH'] + \
-	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
-
-from perf_trace_context import *
-from Core import *
-from Util import *
-
-usage = "perf script -s sctop.py [comm] [interval]\n";
-
-for_comm = None
-default_interval = 3
-interval = default_interval
-
-if len(sys.argv) > 3:
-	sys.exit(usage)
-
-if len(sys.argv) > 2:
-	for_comm = sys.argv[1]
-	interval = int(sys.argv[2])
-elif len(sys.argv) > 1:
-	try:
-		interval = int(sys.argv[1])
-	except ValueError:
-		for_comm = sys.argv[1]
-		interval = default_interval
-
-syscalls = autodict()
-
-def trace_begin():
-	thread.start_new_thread(print_syscall_totals, (interval,))
-	pass
-
-def raw_syscalls__sys_enter(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	id, args):
-	if for_comm is not None:
-		if common_comm != for_comm:
-			return
-	try:
-		syscalls[id] += 1
-	except TypeError:
-		syscalls[id] = 1
-
-def print_syscall_totals(interval):
-	while 1:
-		clear_term()
-		if for_comm is not None:
-			print "\nsyscall events for %s:\n\n" % (for_comm),
-		else:
-			print "\nsyscall events:\n\n",
-
-		print "%-40s  %10s\n" % ("event", "count"),
-		print "%-40s  %10s\n" % ("----------------------------------------", \
-						 "----------"),
-
-		for id, val in sorted(syscalls.iteritems(), key = lambda(k, v): (v, k), \
-					      reverse = True):
-			try:
-				print "%-40s  %10d\n" % (syscall_name(id), val),
-			except TypeError:
-				pass
-		syscalls.clear()
-		time.sleep(interval)
diff --git a/src/tools/perf/scripts/python/syscall-counts-by-pid.py b/src/tools/perf/scripts/python/syscall-counts-by-pid.py
deleted file mode 100644
index c64d1c5..0000000
--- a/src/tools/perf/scripts/python/syscall-counts-by-pid.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# system call counts, by pid
-# (c) 2010, Tom Zanussi <tzanussi@gmail.com>
-# Licensed under the terms of the GNU GPL License version 2
-#
-# Displays system-wide system call totals, broken down by syscall.
-# If a [comm] arg is specified, only syscalls called by [comm] are displayed.
-
-import os, sys
-
-sys.path.append(os.environ['PERF_EXEC_PATH'] + \
-	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
-
-from perf_trace_context import *
-from Core import *
-from Util import syscall_name
-
-usage = "perf script -s syscall-counts-by-pid.py [comm]\n";
-
-for_comm = None
-for_pid = None
-
-if len(sys.argv) > 2:
-	sys.exit(usage)
-
-if len(sys.argv) > 1:
-	try:
-		for_pid = int(sys.argv[1])
-	except:
-		for_comm = sys.argv[1]
-
-syscalls = autodict()
-
-def trace_begin():
-	print "Press control+C to stop and show the summary"
-
-def trace_end():
-	print_syscall_totals()
-
-def raw_syscalls__sys_enter(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	id, args):
-
-	if (for_comm and common_comm != for_comm) or \
-	   (for_pid  and common_pid  != for_pid ):
-		return
-	try:
-		syscalls[common_comm][common_pid][id] += 1
-	except TypeError:
-		syscalls[common_comm][common_pid][id] = 1
-
-def print_syscall_totals():
-    if for_comm is not None:
-	    print "\nsyscall events for %s:\n\n" % (for_comm),
-    else:
-	    print "\nsyscall events by comm/pid:\n\n",
-
-    print "%-40s  %10s\n" % ("comm [pid]/syscalls", "count"),
-    print "%-40s  %10s\n" % ("----------------------------------------", \
-                                 "----------"),
-
-    comm_keys = syscalls.keys()
-    for comm in comm_keys:
-	    pid_keys = syscalls[comm].keys()
-	    for pid in pid_keys:
-		    print "\n%s [%d]\n" % (comm, pid),
-		    id_keys = syscalls[comm][pid].keys()
-		    for id, val in sorted(syscalls[comm][pid].iteritems(), \
-				  key = lambda(k, v): (v, k),  reverse = True):
-			    print "  %-38s  %10d\n" % (syscall_name(id), val),
diff --git a/src/tools/perf/scripts/python/syscall-counts.py b/src/tools/perf/scripts/python/syscall-counts.py
deleted file mode 100644
index b435d3f..0000000
--- a/src/tools/perf/scripts/python/syscall-counts.py
+++ /dev/null
@@ -1,59 +0,0 @@
-# system call counts
-# (c) 2010, Tom Zanussi <tzanussi@gmail.com>
-# Licensed under the terms of the GNU GPL License version 2
-#
-# Displays system-wide system call totals, broken down by syscall.
-# If a [comm] arg is specified, only syscalls called by [comm] are displayed.
-
-import os
-import sys
-
-sys.path.append(os.environ['PERF_EXEC_PATH'] + \
-	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
-
-from perf_trace_context import *
-from Core import *
-from Util import syscall_name
-
-usage = "perf script -s syscall-counts.py [comm]\n";
-
-for_comm = None
-
-if len(sys.argv) > 2:
-	sys.exit(usage)
-
-if len(sys.argv) > 1:
-	for_comm = sys.argv[1]
-
-syscalls = autodict()
-
-def trace_begin():
-	print "Press control+C to stop and show the summary"
-
-def trace_end():
-	print_syscall_totals()
-
-def raw_syscalls__sys_enter(event_name, context, common_cpu,
-	common_secs, common_nsecs, common_pid, common_comm,
-	id, args):
-	if for_comm is not None:
-		if common_comm != for_comm:
-			return
-	try:
-		syscalls[id] += 1
-	except TypeError:
-		syscalls[id] = 1
-
-def print_syscall_totals():
-    if for_comm is not None:
-	    print "\nsyscall events for %s:\n\n" % (for_comm),
-    else:
-	    print "\nsyscall events:\n\n",
-
-    print "%-40s  %10s\n" % ("event", "count"),
-    print "%-40s  %10s\n" % ("----------------------------------------", \
-                                 "-----------"),
-
-    for id, val in sorted(syscalls.iteritems(), key = lambda(k, v): (v, k), \
-				  reverse = True):
-	    print "%-40s  %10d\n" % (syscall_name(id), val),
diff --git a/src/tools/perf/tests/attr.c b/src/tools/perf/tests/attr.c
deleted file mode 100644
index 00218f5..0000000
--- a/src/tools/perf/tests/attr.c
+++ /dev/null
@@ -1,183 +0,0 @@
-
-/*
- * The struct perf_event_attr test support.
- *
- * This test is embedded inside into perf directly and is governed
- * by the PERF_TEST_ATTR environment variable and hook inside
- * sys_perf_event_open function.
- *
- * The general idea is to store 'struct perf_event_attr' details for
- * each event created within single perf command. Each event details
- * are stored into separate text file. Once perf command is finished
- * these files can be checked for values we expect for command.
- *
- * Besides 'struct perf_event_attr' values we also store 'fd' and
- * 'group_fd' values to allow checking for groups created.
- *
- * This all is triggered by setting PERF_TEST_ATTR environment variable.
- * It must contain name of existing directory with access and write
- * permissions. All the event text files are stored there.
- */
-
-/*
- * Powerpc needs __SANE_USERSPACE_TYPES__ before <linux/types.h> to select
- * 'int-ll64.h' and avoid compile warnings when printing __u64 with %llu.
- */
-#define __SANE_USERSPACE_TYPES__
-#include <stdlib.h>
-#include <stdio.h>
-#include <inttypes.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include "../perf.h"
-#include "util.h"
-#include "exec_cmd.h"
-#include "tests.h"
-
-#define ENV "PERF_TEST_ATTR"
-
-extern int verbose;
-
-static char *dir;
-
-void test_attr__init(void)
-{
-	dir = getenv(ENV);
-	test_attr__enabled = (dir != NULL);
-}
-
-#define BUFSIZE 1024
-
-#define __WRITE_ASS(str, fmt, data)					\
-do {									\
-	char buf[BUFSIZE];						\
-	size_t size;							\
-									\
-	size = snprintf(buf, BUFSIZE, #str "=%"fmt "\n", data);		\
-	if (1 != fwrite(buf, size, 1, file)) {				\
-		perror("test attr - failed to write event file");	\
-		fclose(file);						\
-		return -1;						\
-	}								\
-									\
-} while (0)
-
-#define WRITE_ASS(field, fmt) __WRITE_ASS(field, fmt, attr->field)
-
-static int store_event(struct perf_event_attr *attr, pid_t pid, int cpu,
-		       int fd, int group_fd, unsigned long flags)
-{
-	FILE *file;
-	char path[PATH_MAX];
-
-	snprintf(path, PATH_MAX, "%s/event-%d-%llu-%d", dir,
-		 attr->type, attr->config, fd);
-
-	file = fopen(path, "w+");
-	if (!file) {
-		perror("test attr - failed to open event file");
-		return -1;
-	}
-
-	if (fprintf(file, "[event-%d-%llu-%d]\n",
-		    attr->type, attr->config, fd) < 0) {
-		perror("test attr - failed to write event file");
-		fclose(file);
-		return -1;
-	}
-
-	/* syscall arguments */
-	__WRITE_ASS(fd,       "d", fd);
-	__WRITE_ASS(group_fd, "d", group_fd);
-	__WRITE_ASS(cpu,      "d", cpu);
-	__WRITE_ASS(pid,      "d", pid);
-	__WRITE_ASS(flags,   "lu", flags);
-
-	/* struct perf_event_attr */
-	WRITE_ASS(type,   PRIu32);
-	WRITE_ASS(size,   PRIu32);
-	WRITE_ASS(config,  "llu");
-	WRITE_ASS(sample_period, "llu");
-	WRITE_ASS(sample_type,   "llu");
-	WRITE_ASS(read_format,   "llu");
-	WRITE_ASS(disabled,       "d");
-	WRITE_ASS(inherit,        "d");
-	WRITE_ASS(pinned,         "d");
-	WRITE_ASS(exclusive,      "d");
-	WRITE_ASS(exclude_user,   "d");
-	WRITE_ASS(exclude_kernel, "d");
-	WRITE_ASS(exclude_hv,     "d");
-	WRITE_ASS(exclude_idle,   "d");
-	WRITE_ASS(mmap,           "d");
-	WRITE_ASS(comm,           "d");
-	WRITE_ASS(freq,           "d");
-	WRITE_ASS(inherit_stat,   "d");
-	WRITE_ASS(enable_on_exec, "d");
-	WRITE_ASS(task,           "d");
-	WRITE_ASS(watermark,      "d");
-	WRITE_ASS(precise_ip,     "d");
-	WRITE_ASS(mmap_data,      "d");
-	WRITE_ASS(sample_id_all,  "d");
-	WRITE_ASS(exclude_host,   "d");
-	WRITE_ASS(exclude_guest,  "d");
-	WRITE_ASS(exclude_callchain_kernel, "d");
-	WRITE_ASS(exclude_callchain_user, "d");
-	WRITE_ASS(wakeup_events, PRIu32);
-	WRITE_ASS(bp_type, PRIu32);
-	WRITE_ASS(config1, "llu");
-	WRITE_ASS(config2, "llu");
-	WRITE_ASS(branch_sample_type, "llu");
-	WRITE_ASS(sample_regs_user,   "llu");
-	WRITE_ASS(sample_stack_user,  PRIu32);
-
-	fclose(file);
-	return 0;
-}
-
-void test_attr__open(struct perf_event_attr *attr, pid_t pid, int cpu,
-		     int fd, int group_fd, unsigned long flags)
-{
-	int errno_saved = errno;
-
-	if (store_event(attr, pid, cpu, fd, group_fd, flags))
-		die("test attr FAILED");
-
-	errno = errno_saved;
-}
-
-static int run_dir(const char *d, const char *perf)
-{
-	char v[] = "-vvvvv";
-	int vcnt = min(verbose, (int) sizeof(v) - 1);
-	char cmd[3*PATH_MAX];
-
-	if (verbose)
-		vcnt++;
-
-	snprintf(cmd, 3*PATH_MAX, PYTHON " %s/attr.py -d %s/attr/ -p %s %.*s",
-		 d, d, perf, vcnt, v);
-
-	return system(cmd);
-}
-
-int test__attr(void)
-{
-	struct stat st;
-	char path_perf[PATH_MAX];
-	char path_dir[PATH_MAX];
-
-	/* First try developement tree tests. */
-	if (!lstat("./tests", &st))
-		return run_dir("./tests", "./perf");
-
-	/* Then installed path. */
-	snprintf(path_dir,  PATH_MAX, "%s/tests", perf_exec_path());
-	snprintf(path_perf, PATH_MAX, "%s/perf", BINDIR);
-
-	if (!lstat(path_dir, &st) &&
-	    !lstat(path_perf, &st))
-		return run_dir(path_dir, path_perf);
-
-	fprintf(stderr, " (omitted)");
-	return 0;
-}
diff --git a/src/tools/perf/tests/attr.py b/src/tools/perf/tests/attr.py
deleted file mode 100644
index c9b4b62..0000000
--- a/src/tools/perf/tests/attr.py
+++ /dev/null
@@ -1,332 +0,0 @@
-#! /usr/bin/python
-
-import os
-import sys
-import glob
-import optparse
-import tempfile
-import logging
-import shutil
-import ConfigParser
-
-class Fail(Exception):
-    def __init__(self, test, msg):
-        self.msg = msg
-        self.test = test
-    def getMsg(self):
-        return '\'%s\' - %s' % (self.test.path, self.msg)
-
-class Unsup(Exception):
-    def __init__(self, test):
-        self.test = test
-    def getMsg(self):
-        return '\'%s\'' % self.test.path
-
-class Event(dict):
-    terms = [
-        'cpu',
-        'flags',
-        'type',
-        'size',
-        'config',
-        'sample_period',
-        'sample_type',
-        'read_format',
-        'disabled',
-        'inherit',
-        'pinned',
-        'exclusive',
-        'exclude_user',
-        'exclude_kernel',
-        'exclude_hv',
-        'exclude_idle',
-        'mmap',
-        'comm',
-        'freq',
-        'inherit_stat',
-        'enable_on_exec',
-        'task',
-        'watermark',
-        'precise_ip',
-        'mmap_data',
-        'sample_id_all',
-        'exclude_host',
-        'exclude_guest',
-        'exclude_callchain_kernel',
-        'exclude_callchain_user',
-        'wakeup_events',
-        'bp_type',
-        'config1',
-        'config2',
-        'branch_sample_type',
-        'sample_regs_user',
-        'sample_stack_user',
-    ]
-
-    def add(self, data):
-        for key, val in data:
-            log.debug("      %s = %s" % (key, val))
-            self[key] = val
-
-    def __init__(self, name, data, base):
-        log.debug("    Event %s" % name);
-        self.name  = name;
-        self.group = ''
-        self.add(base)
-        self.add(data)
-
-    def compare_data(self, a, b):
-        # Allow multiple values in assignment separated by '|'
-        a_list = a.split('|')
-        b_list = b.split('|')
-
-        for a_item in a_list:
-            for b_item in b_list:
-                if (a_item == b_item):
-                    return True
-                elif (a_item == '*') or (b_item == '*'):
-                    return True
-
-        return False
-
-    def equal(self, other):
-        for t in Event.terms:
-            log.debug("      [%s] %s %s" % (t, self[t], other[t]));
-            if not self.has_key(t) or not other.has_key(t):
-                return False
-            if not self.compare_data(self[t], other[t]):
-                return False
-        return True
-
-    def diff(self, other):
-        for t in Event.terms:
-            if not self.has_key(t) or not other.has_key(t):
-                continue
-            if not self.compare_data(self[t], other[t]):
-		log.warning("expected %s=%s, got %s" % (t, self[t], other[t]))
-                
-
-# Test file description needs to have following sections:
-# [config]
-#   - just single instance in file
-#   - needs to specify:
-#     'command' - perf command name
-#     'args'    - special command arguments
-#     'ret'     - expected command return value (0 by default)
-#
-# [eventX:base]
-#   - one or multiple instances in file
-#   - expected values assignments
-class Test(object):
-    def __init__(self, path, options):
-        parser = ConfigParser.SafeConfigParser()
-        parser.read(path)
-
-        log.warning("running '%s'" % path)
-
-        self.path     = path
-        self.test_dir = options.test_dir
-        self.perf     = options.perf
-        self.command  = parser.get('config', 'command')
-        self.args     = parser.get('config', 'args')
-
-        try:
-            self.ret  = parser.get('config', 'ret')
-        except:
-            self.ret  = 0
-
-        self.expect   = {}
-        self.result   = {}
-        log.debug("  loading expected events");
-        self.load_events(path, self.expect)
-
-    def is_event(self, name):
-        if name.find("event") == -1:
-            return False
-        else:
-            return True
-
-    def load_events(self, path, events):
-        parser_event = ConfigParser.SafeConfigParser()
-        parser_event.read(path)
-
-        # The event record section header contains 'event' word,
-        # optionaly followed by ':' allowing to load 'parent
-        # event' first as a base
-        for section in filter(self.is_event, parser_event.sections()):
-
-            parser_items = parser_event.items(section);
-            base_items   = {}
-
-            # Read parent event if there's any
-            if (':' in section):
-                base = section[section.index(':') + 1:]
-                parser_base = ConfigParser.SafeConfigParser()
-                parser_base.read(self.test_dir + '/' + base)
-                base_items = parser_base.items('event')
-
-            e = Event(section, parser_items, base_items)
-            events[section] = e
-
-    def run_cmd(self, tempdir):
-        cmd = "PERF_TEST_ATTR=%s %s %s -o %s/perf.data %s" % (tempdir,
-              self.perf, self.command, tempdir, self.args)
-        ret = os.WEXITSTATUS(os.system(cmd))
-
-        log.info("  '%s' ret %d " % (cmd, ret))
-
-        if ret != int(self.ret):
-            raise Unsup(self)
-
-    def compare(self, expect, result):
-        match = {}
-
-        log.debug("  compare");
-
-        # For each expected event find all matching
-        # events in result. Fail if there's not any.
-        for exp_name, exp_event in expect.items():
-            exp_list = []
-            log.debug("    matching [%s]" % exp_name)
-            for res_name, res_event in result.items():
-                log.debug("      to [%s]" % res_name)
-                if (exp_event.equal(res_event)):
-                    exp_list.append(res_name)
-                    log.debug("    ->OK")
-                else:
-                    log.debug("    ->FAIL");
-
-            log.debug("    match: [%s] matches %s" % (exp_name, str(exp_list)))
-
-            # we did not any matching event - fail
-            if (not exp_list):
-		exp_event.diff(res_event)
-                raise Fail(self, 'match failure');
-
-            match[exp_name] = exp_list
-
-        # For each defined group in the expected events
-        # check we match the same group in the result.
-        for exp_name, exp_event in expect.items():
-            group = exp_event.group
-
-            if (group == ''):
-                continue
-
-            for res_name in match[exp_name]:
-                res_group = result[res_name].group
-                if res_group not in match[group]:
-                    raise Fail(self, 'group failure')
-
-                log.debug("    group: [%s] matches group leader %s" %
-                         (exp_name, str(match[group])))
-
-        log.debug("  matched")
-
-    def resolve_groups(self, events):
-        for name, event in events.items():
-            group_fd = event['group_fd'];
-            if group_fd == '-1':
-                continue;
-
-            for iname, ievent in events.items():
-                if (ievent['fd'] == group_fd):
-                    event.group = iname
-                    log.debug('[%s] has group leader [%s]' % (name, iname))
-                    break;
-
-    def run(self):
-        tempdir = tempfile.mkdtemp();
-
-        try:
-            # run the test script
-            self.run_cmd(tempdir);
-
-            # load events expectation for the test
-            log.debug("  loading result events");
-            for f in glob.glob(tempdir + '/event*'):
-                self.load_events(f, self.result);
-
-            # resolve group_fd to event names
-            self.resolve_groups(self.expect);
-            self.resolve_groups(self.result);
-
-            # do the expectation - results matching - both ways
-            self.compare(self.expect, self.result)
-            self.compare(self.result, self.expect)
-
-        finally:
-            # cleanup
-            shutil.rmtree(tempdir)
-
-
-def run_tests(options):
-    for f in glob.glob(options.test_dir + '/' + options.test):
-        try:
-            Test(f, options).run()
-        except Unsup, obj:
-            log.warning("unsupp  %s" % obj.getMsg())
-
-def setup_log(verbose):
-    global log
-    level = logging.CRITICAL
-
-    if verbose == 1:
-        level = logging.WARNING
-    if verbose == 2:
-        level = logging.INFO
-    if verbose >= 3:
-        level = logging.DEBUG
-
-    log = logging.getLogger('test')
-    log.setLevel(level)
-    ch  = logging.StreamHandler()
-    ch.setLevel(level)
-    formatter = logging.Formatter('%(message)s')
-    ch.setFormatter(formatter)
-    log.addHandler(ch)
-
-USAGE = '''%s [OPTIONS]
-  -d dir  # tests dir
-  -p path # perf binary
-  -t test # single test
-  -v      # verbose level
-''' % sys.argv[0]
-
-def main():
-    parser = optparse.OptionParser(usage=USAGE)
-
-    parser.add_option("-t", "--test",
-                      action="store", type="string", dest="test")
-    parser.add_option("-d", "--test-dir",
-                      action="store", type="string", dest="test_dir")
-    parser.add_option("-p", "--perf",
-                      action="store", type="string", dest="perf")
-    parser.add_option("-v", "--verbose",
-                      action="count", dest="verbose")
-
-    options, args = parser.parse_args()
-    if args:
-        parser.error('FAILED wrong arguments %s' %  ' '.join(args))
-        return -1
-
-    setup_log(options.verbose)
-
-    if not options.test_dir:
-        print 'FAILED no -d option specified'
-        sys.exit(-1)
-
-    if not options.test:
-        options.test = 'test*'
-
-    try:
-        run_tests(options)
-
-    except Fail, obj:
-        print "FAILED %s" % obj.getMsg();
-        sys.exit(-1)
-
-    sys.exit(0)
-
-if __name__ == '__main__':
-    main()
diff --git a/src/tools/perf/tests/attr/README b/src/tools/perf/tests/attr/README
deleted file mode 100644
index d102957..0000000
--- a/src/tools/perf/tests/attr/README
+++ /dev/null
@@ -1,64 +0,0 @@
-The struct perf_event_attr test (attr tests) support
-====================================================
-This testing support is embedded into perf directly and is governed
-by the PERF_TEST_ATTR environment variable and hook inside the
-sys_perf_event_open function.
-
-The general idea is to store 'struct perf_event_attr' details for
-each event created within single perf command. Each event details
-are stored into separate text file. Once perf command is finished
-these files are checked for values we expect for command.
-
-The attr tests consist of following parts:
-
-tests/attr.c
-------------
-This is the sys_perf_event_open hook implementation. The hook
-is triggered when the PERF_TEST_ATTR environment variable is
-defined. It must contain name of existing directory with access
-and write permissions.
-
-For each sys_perf_event_open call event details are stored in
-separate file. Besides 'struct perf_event_attr' values we also
-store 'fd' and 'group_fd' values to allow checking for groups.
-
-tests/attr.py
--------------
-This is the python script that does all the hard work. It reads
-the test definition, executes it and checks results.
-
-tests/attr/
------------
-Directory containing all attr test definitions.
-Following tests are defined (with perf commands):
-
-  perf record kill                              (test-record-basic)
-  perf record -b kill                           (test-record-branch-any)
-  perf record -j any kill                       (test-record-branch-filter-any)
-  perf record -j any_call kill                  (test-record-branch-filter-any_call)
-  perf record -j any_ret kill                   (test-record-branch-filter-any_ret)
-  perf record -j hv kill                        (test-record-branch-filter-hv)
-  perf record -j ind_call kill                  (test-record-branch-filter-ind_call)
-  perf record -j k kill                         (test-record-branch-filter-k)
-  perf record -j u kill                         (test-record-branch-filter-u)
-  perf record -c 123 kill                       (test-record-count)
-  perf record -d kill                           (test-record-data)
-  perf record -F 100 kill                       (test-record-freq)
-  perf record -g -- kill                        (test-record-graph-default)
-  perf record -g dwarf -- kill                  (test-record-graph-dwarf)
-  perf record -g fp kill                        (test-record-graph-fp)
-  perf record --group -e cycles,instructions kill (test-record-group)
-  perf record -e '{cycles,instructions}' kill   (test-record-group1)
-  perf record -D kill                           (test-record-no-delay)
-  perf record -i kill                           (test-record-no-inherit)
-  perf record -n kill                           (test-record-no-samples)
-  perf record -c 100 -P kill                    (test-record-period)
-  perf record -R kill                           (test-record-raw)
-  perf stat -e cycles kill                      (test-stat-basic)
-  perf stat kill                                (test-stat-default)
-  perf stat -d kill                             (test-stat-detailed-1)
-  perf stat -dd kill                            (test-stat-detailed-2)
-  perf stat -ddd kill                           (test-stat-detailed-3)
-  perf stat --group -e cycles,instructions kill (test-stat-group)
-  perf stat -e '{cycles,instructions}' kill     (test-stat-group1)
-  perf stat -i -e cycles kill                   (test-stat-no-inherit)
diff --git a/src/tools/perf/tests/attr/base-record b/src/tools/perf/tests/attr/base-record
deleted file mode 100644
index e9bd639..0000000
--- a/src/tools/perf/tests/attr/base-record
+++ /dev/null
@@ -1,40 +0,0 @@
-[event]
-fd=1
-group_fd=-1
-flags=0
-cpu=*
-type=0|1
-size=96
-config=0
-sample_period=4000
-sample_type=263
-read_format=0
-disabled=1
-inherit=1
-pinned=0
-exclusive=0
-exclude_user=0
-exclude_kernel=0
-exclude_hv=0
-exclude_idle=0
-mmap=1
-comm=1
-freq=1
-inherit_stat=0
-enable_on_exec=1
-task=0
-watermark=0
-precise_ip=0
-mmap_data=0
-sample_id_all=1
-exclude_host=0|1
-exclude_guest=0|1
-exclude_callchain_kernel=0
-exclude_callchain_user=0
-wakeup_events=0
-bp_type=0
-config1=0
-config2=0
-branch_sample_type=0
-sample_regs_user=0
-sample_stack_user=0
diff --git a/src/tools/perf/tests/attr/base-stat b/src/tools/perf/tests/attr/base-stat
deleted file mode 100644
index 91cd48b..0000000
--- a/src/tools/perf/tests/attr/base-stat
+++ /dev/null
@@ -1,40 +0,0 @@
-[event]
-fd=1
-group_fd=-1
-flags=0
-cpu=*
-type=0
-size=96
-config=0
-sample_period=0
-sample_type=0
-read_format=3
-disabled=1
-inherit=1
-pinned=0
-exclusive=0
-exclude_user=0
-exclude_kernel=0
-exclude_hv=0
-exclude_idle=0
-mmap=0
-comm=0
-freq=0
-inherit_stat=0
-enable_on_exec=1
-task=0
-watermark=0
-precise_ip=0
-mmap_data=0
-sample_id_all=0
-exclude_host=0|1
-exclude_guest=0|1
-exclude_callchain_kernel=0
-exclude_callchain_user=0
-wakeup_events=0
-bp_type=0
-config1=0
-config2=0
-branch_sample_type=0
-sample_regs_user=0
-sample_stack_user=0
diff --git a/src/tools/perf/tests/attr/test-record-C0 b/src/tools/perf/tests/attr/test-record-C0
deleted file mode 100644
index d6a7e43..0000000
--- a/src/tools/perf/tests/attr/test-record-C0
+++ /dev/null
@@ -1,13 +0,0 @@
-[config]
-command = record
-args    = -C 0 kill >/dev/null 2>&1
-
-[event:base-record]
-cpu=0
-
-# no enable on exec for CPU attached
-enable_on_exec=0
-
-# PERF_SAMPLE_IP | PERF_SAMPLE_TID PERF_SAMPLE_TIME | # PERF_SAMPLE_PERIOD
-# + PERF_SAMPLE_CPU added by -C 0
-sample_type=391
diff --git a/src/tools/perf/tests/attr/test-record-basic b/src/tools/perf/tests/attr/test-record-basic
deleted file mode 100644
index 55c0428..0000000
--- a/src/tools/perf/tests/attr/test-record-basic
+++ /dev/null
@@ -1,5 +0,0 @@
-[config]
-command = record
-args    = kill >/dev/null 2>&1
-
-[event:base-record]
diff --git a/src/tools/perf/tests/attr/test-record-branch-any b/src/tools/perf/tests/attr/test-record-branch-any
deleted file mode 100644
index 1421960..0000000
--- a/src/tools/perf/tests/attr/test-record-branch-any
+++ /dev/null
@@ -1,8 +0,0 @@
-[config]
-command = record
-args    = -b kill >/dev/null 2>&1
-
-[event:base-record]
-sample_period=4000
-sample_type=2311
-branch_sample_type=8
diff --git a/src/tools/perf/tests/attr/test-record-branch-filter-any b/src/tools/perf/tests/attr/test-record-branch-filter-any
deleted file mode 100644
index 915c4df..0000000
--- a/src/tools/perf/tests/attr/test-record-branch-filter-any
+++ /dev/null
@@ -1,8 +0,0 @@
-[config]
-command = record
-args    = -j any kill >/dev/null 2>&1
-
-[event:base-record]
-sample_period=4000
-sample_type=2311
-branch_sample_type=8
diff --git a/src/tools/perf/tests/attr/test-record-branch-filter-any_call b/src/tools/perf/tests/attr/test-record-branch-filter-any_call
deleted file mode 100644
index 8708dbd..0000000
--- a/src/tools/perf/tests/attr/test-record-branch-filter-any_call
+++ /dev/null
@@ -1,8 +0,0 @@
-[config]
-command = record
-args    = -j any_call kill >/dev/null 2>&1
-
-[event:base-record]
-sample_period=4000
-sample_type=2311
-branch_sample_type=16
diff --git a/src/tools/perf/tests/attr/test-record-branch-filter-any_ret b/src/tools/perf/tests/attr/test-record-branch-filter-any_ret
deleted file mode 100644
index 0d3607a..0000000
--- a/src/tools/perf/tests/attr/test-record-branch-filter-any_ret
+++ /dev/null
@@ -1,8 +0,0 @@
-[config]
-command = record
-args    = -j any_ret kill >/dev/null 2>&1
-
-[event:base-record]
-sample_period=4000
-sample_type=2311
-branch_sample_type=32
diff --git a/src/tools/perf/tests/attr/test-record-branch-filter-hv b/src/tools/perf/tests/attr/test-record-branch-filter-hv
deleted file mode 100644
index f255267..0000000
--- a/src/tools/perf/tests/attr/test-record-branch-filter-hv
+++ /dev/null
@@ -1,8 +0,0 @@
-[config]
-command = record
-args    = -j hv kill >/dev/null 2>&1
-
-[event:base-record]
-sample_period=4000
-sample_type=2311
-branch_sample_type=8
diff --git a/src/tools/perf/tests/attr/test-record-branch-filter-ind_call b/src/tools/perf/tests/attr/test-record-branch-filter-ind_call
deleted file mode 100644
index e862dd1..0000000
--- a/src/tools/perf/tests/attr/test-record-branch-filter-ind_call
+++ /dev/null
@@ -1,8 +0,0 @@
-[config]
-command = record
-args    = -j ind_call kill >/dev/null 2>&1
-
-[event:base-record]
-sample_period=4000
-sample_type=2311
-branch_sample_type=64
diff --git a/src/tools/perf/tests/attr/test-record-branch-filter-k b/src/tools/perf/tests/attr/test-record-branch-filter-k
deleted file mode 100644
index 182971e..0000000
--- a/src/tools/perf/tests/attr/test-record-branch-filter-k
+++ /dev/null
@@ -1,8 +0,0 @@
-[config]
-command = record
-args    = -j k kill >/dev/null 2>&1
-
-[event:base-record]
-sample_period=4000
-sample_type=2311
-branch_sample_type=8
diff --git a/src/tools/perf/tests/attr/test-record-branch-filter-u b/src/tools/perf/tests/attr/test-record-branch-filter-u
deleted file mode 100644
index 83449ef..0000000
--- a/src/tools/perf/tests/attr/test-record-branch-filter-u
+++ /dev/null
@@ -1,8 +0,0 @@
-[config]
-command = record
-args    = -j u kill >/dev/null 2>&1
-
-[event:base-record]
-sample_period=4000
-sample_type=2311
-branch_sample_type=8
diff --git a/src/tools/perf/tests/attr/test-record-count b/src/tools/perf/tests/attr/test-record-count
deleted file mode 100644
index 2f841de..0000000
--- a/src/tools/perf/tests/attr/test-record-count
+++ /dev/null
@@ -1,8 +0,0 @@
-[config]
-command = record
-args    = -c 123 kill >/dev/null 2>&1
-
-[event:base-record]
-sample_period=123
-sample_type=7
-freq=0
diff --git a/src/tools/perf/tests/attr/test-record-data b/src/tools/perf/tests/attr/test-record-data
deleted file mode 100644
index 716e143..0000000
--- a/src/tools/perf/tests/attr/test-record-data
+++ /dev/null
@@ -1,11 +0,0 @@
-[config]
-command = record
-args    = -d kill >/dev/null 2>&1
-
-[event:base-record]
-sample_period=4000
-
-# sample_type = PERF_SAMPLE_IP | PERF_SAMPLE_TID | PERF_SAMPLE_TIME |
-# PERF_SAMPLE_ADDR | PERF_SAMPLE_PERIOD | PERF_SAMPLE_DATA_SRC
-sample_type=33039
-mmap_data=1
diff --git a/src/tools/perf/tests/attr/test-record-freq b/src/tools/perf/tests/attr/test-record-freq
deleted file mode 100644
index 600d0f8..0000000
--- a/src/tools/perf/tests/attr/test-record-freq
+++ /dev/null
@@ -1,6 +0,0 @@
-[config]
-command = record
-args    = -F 100 kill >/dev/null 2>&1
-
-[event:base-record]
-sample_period=100
diff --git a/src/tools/perf/tests/attr/test-record-graph-default b/src/tools/perf/tests/attr/test-record-graph-default
deleted file mode 100644
index 833d184..0000000
--- a/src/tools/perf/tests/attr/test-record-graph-default
+++ /dev/null
@@ -1,6 +0,0 @@
-[config]
-command = record
-args    = -g -- kill >/dev/null 2>&1
-
-[event:base-record]
-sample_type=295
diff --git a/src/tools/perf/tests/attr/test-record-graph-dwarf b/src/tools/perf/tests/attr/test-record-graph-dwarf
deleted file mode 100644
index e93e082..0000000
--- a/src/tools/perf/tests/attr/test-record-graph-dwarf
+++ /dev/null
@@ -1,10 +0,0 @@
-[config]
-command = record
-args    = -g dwarf -- kill >/dev/null 2>&1
-
-[event:base-record]
-sample_type=12583
-exclude_callchain_user=1
-sample_stack_user=8192
-# TODO different for each arch, no support for that now
-sample_regs_user=*
diff --git a/src/tools/perf/tests/attr/test-record-graph-fp b/src/tools/perf/tests/attr/test-record-graph-fp
deleted file mode 100644
index 7cef374..0000000
--- a/src/tools/perf/tests/attr/test-record-graph-fp
+++ /dev/null
@@ -1,6 +0,0 @@
-[config]
-command = record
-args    = -g fp kill >/dev/null 2>&1
-
-[event:base-record]
-sample_type=295
diff --git a/src/tools/perf/tests/attr/test-record-group b/src/tools/perf/tests/attr/test-record-group
deleted file mode 100644
index 57739ca..0000000
--- a/src/tools/perf/tests/attr/test-record-group
+++ /dev/null
@@ -1,20 +0,0 @@
-[config]
-command = record
-args    = --group -e cycles,instructions kill >/dev/null 2>&1
-
-[event-1:base-record]
-fd=1
-group_fd=-1
-sample_type=327
-read_format=4
-
-[event-2:base-record]
-fd=2
-group_fd=1
-config=1
-sample_type=327
-read_format=4
-mmap=0
-comm=0
-enable_on_exec=0
-disabled=0
diff --git a/src/tools/perf/tests/attr/test-record-group-sampling b/src/tools/perf/tests/attr/test-record-group-sampling
deleted file mode 100644
index 658f5d6..0000000
--- a/src/tools/perf/tests/attr/test-record-group-sampling
+++ /dev/null
@@ -1,36 +0,0 @@
-[config]
-command = record
-args    = -e '{cycles,cache-misses}:S' kill >/dev/null 2>&1
-
-[event-1:base-record]
-fd=1
-group_fd=-1
-sample_type=343
-read_format=12
-inherit=0
-
-[event-2:base-record]
-fd=2
-group_fd=1
-
-# cache-misses
-type=0
-config=3
-
-# default | PERF_SAMPLE_READ
-sample_type=343
-
-# PERF_FORMAT_ID | PERF_FORMAT_GROUP
-read_format=12
-
-mmap=0
-comm=0
-enable_on_exec=0
-disabled=0
-
-# inherit is disabled for group sampling
-inherit=0
-
-# sampling disabled
-sample_freq=0
-sample_period=0
diff --git a/src/tools/perf/tests/attr/test-record-group1 b/src/tools/perf/tests/attr/test-record-group1
deleted file mode 100644
index c5548d0..0000000
--- a/src/tools/perf/tests/attr/test-record-group1
+++ /dev/null
@@ -1,21 +0,0 @@
-[config]
-command = record
-args    = -e '{cycles,instructions}' kill >/dev/null 2>&1
-
-[event-1:base-record]
-fd=1
-group_fd=-1
-sample_type=327
-read_format=4
-
-[event-2:base-record]
-fd=2
-group_fd=1
-type=0
-config=1
-sample_type=327
-read_format=4
-mmap=0
-comm=0
-enable_on_exec=0
-disabled=0
diff --git a/src/tools/perf/tests/attr/test-record-no-delay b/src/tools/perf/tests/attr/test-record-no-delay
deleted file mode 100644
index f253b78..0000000
--- a/src/tools/perf/tests/attr/test-record-no-delay
+++ /dev/null
@@ -1,9 +0,0 @@
-[config]
-command = record
-args    = -D kill >/dev/null 2>&1
-
-[event:base-record]
-sample_period=4000
-sample_type=263
-watermark=0
-wakeup_events=1
diff --git a/src/tools/perf/tests/attr/test-record-no-inherit b/src/tools/perf/tests/attr/test-record-no-inherit
deleted file mode 100644
index 9079a25..0000000
--- a/src/tools/perf/tests/attr/test-record-no-inherit
+++ /dev/null
@@ -1,7 +0,0 @@
-[config]
-command = record
-args    = -i kill >/dev/null 2>&1
-
-[event:base-record]
-sample_type=259
-inherit=0
diff --git a/src/tools/perf/tests/attr/test-record-no-samples b/src/tools/perf/tests/attr/test-record-no-samples
deleted file mode 100644
index d0141b2..0000000
--- a/src/tools/perf/tests/attr/test-record-no-samples
+++ /dev/null
@@ -1,6 +0,0 @@
-[config]
-command = record
-args    = -n kill >/dev/null 2>&1
-
-[event:base-record]
-sample_period=0
diff --git a/src/tools/perf/tests/attr/test-record-period b/src/tools/perf/tests/attr/test-record-period
deleted file mode 100644
index 8abc531..0000000
--- a/src/tools/perf/tests/attr/test-record-period
+++ /dev/null
@@ -1,7 +0,0 @@
-[config]
-command = record
-args    = -c 100 -P kill >/dev/null 2>&1
-
-[event:base-record]
-sample_period=100
-freq=0
diff --git a/src/tools/perf/tests/attr/test-record-raw b/src/tools/perf/tests/attr/test-record-raw
deleted file mode 100644
index 4a8ef25..0000000
--- a/src/tools/perf/tests/attr/test-record-raw
+++ /dev/null
@@ -1,7 +0,0 @@
-[config]
-command = record
-args    = -R kill >/dev/null 2>&1
-
-[event:base-record]
-sample_period=4000
-sample_type=1415
diff --git a/src/tools/perf/tests/attr/test-stat-C0 b/src/tools/perf/tests/attr/test-stat-C0
deleted file mode 100644
index aa83595..0000000
--- a/src/tools/perf/tests/attr/test-stat-C0
+++ /dev/null
@@ -1,9 +0,0 @@
-[config]
-command = stat
-args    = -e cycles -C 0 kill >/dev/null 2>&1
-ret     = 1
-
-[event:base-stat]
-# events are enabled by default when attached to cpu
-disabled=0
-enable_on_exec=0
diff --git a/src/tools/perf/tests/attr/test-stat-basic b/src/tools/perf/tests/attr/test-stat-basic
deleted file mode 100644
index 74e1788..0000000
--- a/src/tools/perf/tests/attr/test-stat-basic
+++ /dev/null
@@ -1,6 +0,0 @@
-[config]
-command = stat
-args    = -e cycles kill >/dev/null 2>&1
-ret     = 1
-
-[event:base-stat]
diff --git a/src/tools/perf/tests/attr/test-stat-default b/src/tools/perf/tests/attr/test-stat-default
deleted file mode 100644
index 19270f5..0000000
--- a/src/tools/perf/tests/attr/test-stat-default
+++ /dev/null
@@ -1,64 +0,0 @@
-[config]
-command = stat
-args    = kill >/dev/null 2>&1
-ret     = 1
-
-# PERF_TYPE_SOFTWARE / PERF_COUNT_SW_TASK_CLOCK
-[event1:base-stat]
-fd=1
-type=1
-config=1
-
-# PERF_TYPE_SOFTWARE / PERF_COUNT_SW_CONTEXT_SWITCHES
-[event2:base-stat]
-fd=2
-type=1
-config=3
-
-# PERF_TYPE_SOFTWARE / PERF_COUNT_SW_CPU_MIGRATIONS
-[event3:base-stat]
-fd=3
-type=1
-config=4
-
-# PERF_TYPE_SOFTWARE / PERF_COUNT_SW_PAGE_FAULTS
-[event4:base-stat]
-fd=4
-type=1
-config=2
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_CPU_CYCLES
-[event5:base-stat]
-fd=5
-type=0
-config=0
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_STALLED_CYCLES_FRONTEND
-[event6:base-stat]
-fd=6
-type=0
-config=7
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_STALLED_CYCLES_BACKEND
-[event7:base-stat]
-fd=7
-type=0
-config=8
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_INSTRUCTIONS
-[event8:base-stat]
-fd=8
-type=0
-config=1
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_BRANCH_INSTRUCTIONS
-[event9:base-stat]
-fd=9
-type=0
-config=4
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_BRANCH_MISSES
-[event10:base-stat]
-fd=10
-type=0
-config=5
diff --git a/src/tools/perf/tests/attr/test-stat-detailed-1 b/src/tools/perf/tests/attr/test-stat-detailed-1
deleted file mode 100644
index 51426b8..0000000
--- a/src/tools/perf/tests/attr/test-stat-detailed-1
+++ /dev/null
@@ -1,101 +0,0 @@
-[config]
-command = stat
-args    = -d kill >/dev/null 2>&1
-ret     = 1
-
-
-# PERF_TYPE_SOFTWARE / PERF_COUNT_SW_TASK_CLOCK
-[event1:base-stat]
-fd=1
-type=1
-config=1
-
-# PERF_TYPE_SOFTWARE / PERF_COUNT_SW_CONTEXT_SWITCHES
-[event2:base-stat]
-fd=2
-type=1
-config=3
-
-# PERF_TYPE_SOFTWARE / PERF_COUNT_SW_CPU_MIGRATIONS
-[event3:base-stat]
-fd=3
-type=1
-config=4
-
-# PERF_TYPE_SOFTWARE / PERF_COUNT_SW_PAGE_FAULTS
-[event4:base-stat]
-fd=4
-type=1
-config=2
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_CPU_CYCLES
-[event5:base-stat]
-fd=5
-type=0
-config=0
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_STALLED_CYCLES_FRONTEND
-[event6:base-stat]
-fd=6
-type=0
-config=7
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_STALLED_CYCLES_BACKEND
-[event7:base-stat]
-fd=7
-type=0
-config=8
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_INSTRUCTIONS
-[event8:base-stat]
-fd=8
-type=0
-config=1
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_BRANCH_INSTRUCTIONS
-[event9:base-stat]
-fd=9
-type=0
-config=4
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_BRANCH_MISSES
-[event10:base-stat]
-fd=10
-type=0
-config=5
-
-# PERF_TYPE_HW_CACHE /
-#  PERF_COUNT_HW_CACHE_L1D                <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)
-[event11:base-stat]
-fd=11
-type=3
-config=0
-
-# PERF_TYPE_HW_CACHE /
-#  PERF_COUNT_HW_CACHE_L1D                <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)
-[event12:base-stat]
-fd=12
-type=3
-config=65536
-
-# PERF_TYPE_HW_CACHE /
-#  PERF_COUNT_HW_CACHE_LL                 <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)
-[event13:base-stat]
-fd=13
-type=3
-config=2
-
-# PERF_TYPE_HW_CACHE,
-#  PERF_COUNT_HW_CACHE_LL                 <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)
-[event14:base-stat]
-fd=14
-type=3
-config=65538
diff --git a/src/tools/perf/tests/attr/test-stat-detailed-2 b/src/tools/perf/tests/attr/test-stat-detailed-2
deleted file mode 100644
index 8de5acc..0000000
--- a/src/tools/perf/tests/attr/test-stat-detailed-2
+++ /dev/null
@@ -1,155 +0,0 @@
-[config]
-command = stat
-args    = -dd kill >/dev/null 2>&1
-ret     = 1
-
-
-# PERF_TYPE_SOFTWARE / PERF_COUNT_SW_TASK_CLOCK
-[event1:base-stat]
-fd=1
-type=1
-config=1
-
-# PERF_TYPE_SOFTWARE / PERF_COUNT_SW_CONTEXT_SWITCHES
-[event2:base-stat]
-fd=2
-type=1
-config=3
-
-# PERF_TYPE_SOFTWARE / PERF_COUNT_SW_CPU_MIGRATIONS
-[event3:base-stat]
-fd=3
-type=1
-config=4
-
-# PERF_TYPE_SOFTWARE / PERF_COUNT_SW_PAGE_FAULTS
-[event4:base-stat]
-fd=4
-type=1
-config=2
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_CPU_CYCLES
-[event5:base-stat]
-fd=5
-type=0
-config=0
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_STALLED_CYCLES_FRONTEND
-[event6:base-stat]
-fd=6
-type=0
-config=7
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_STALLED_CYCLES_BACKEND
-[event7:base-stat]
-fd=7
-type=0
-config=8
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_INSTRUCTIONS
-[event8:base-stat]
-fd=8
-type=0
-config=1
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_BRANCH_INSTRUCTIONS
-[event9:base-stat]
-fd=9
-type=0
-config=4
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_BRANCH_MISSES
-[event10:base-stat]
-fd=10
-type=0
-config=5
-
-# PERF_TYPE_HW_CACHE /
-#  PERF_COUNT_HW_CACHE_L1D                <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)
-[event11:base-stat]
-fd=11
-type=3
-config=0
-
-# PERF_TYPE_HW_CACHE /
-#  PERF_COUNT_HW_CACHE_L1D                <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)
-[event12:base-stat]
-fd=12
-type=3
-config=65536
-
-# PERF_TYPE_HW_CACHE /
-#  PERF_COUNT_HW_CACHE_LL                 <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)
-[event13:base-stat]
-fd=13
-type=3
-config=2
-
-# PERF_TYPE_HW_CACHE,
-#  PERF_COUNT_HW_CACHE_LL                 <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)
-[event14:base-stat]
-fd=14
-type=3
-config=65538
-
-# PERF_TYPE_HW_CACHE,
-#  PERF_COUNT_HW_CACHE_L1I                <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)
-[event15:base-stat]
-fd=15
-type=3
-config=1
-
-# PERF_TYPE_HW_CACHE,
-#  PERF_COUNT_HW_CACHE_L1I                <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)
-[event16:base-stat]
-fd=16
-type=3
-config=65537
-
-# PERF_TYPE_HW_CACHE,
-#  PERF_COUNT_HW_CACHE_DTLB               <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)
-[event17:base-stat]
-fd=17
-type=3
-config=3
-
-# PERF_TYPE_HW_CACHE,
-#  PERF_COUNT_HW_CACHE_DTLB               <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)
-[event18:base-stat]
-fd=18
-type=3
-config=65539
-
-# PERF_TYPE_HW_CACHE,
-#  PERF_COUNT_HW_CACHE_ITLB               <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)
-[event19:base-stat]
-fd=19
-type=3
-config=4
-
-# PERF_TYPE_HW_CACHE,
-#  PERF_COUNT_HW_CACHE_ITLB               <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)
-[event20:base-stat]
-fd=20
-type=3
-config=65540
diff --git a/src/tools/perf/tests/attr/test-stat-detailed-3 b/src/tools/perf/tests/attr/test-stat-detailed-3
deleted file mode 100644
index 0a1f45b..0000000
--- a/src/tools/perf/tests/attr/test-stat-detailed-3
+++ /dev/null
@@ -1,173 +0,0 @@
-[config]
-command = stat
-args    = -ddd kill >/dev/null 2>&1
-ret     = 1
-
-
-# PERF_TYPE_SOFTWARE / PERF_COUNT_SW_TASK_CLOCK
-[event1:base-stat]
-fd=1
-type=1
-config=1
-
-# PERF_TYPE_SOFTWARE / PERF_COUNT_SW_CONTEXT_SWITCHES
-[event2:base-stat]
-fd=2
-type=1
-config=3
-
-# PERF_TYPE_SOFTWARE / PERF_COUNT_SW_CPU_MIGRATIONS
-[event3:base-stat]
-fd=3
-type=1
-config=4
-
-# PERF_TYPE_SOFTWARE / PERF_COUNT_SW_PAGE_FAULTS
-[event4:base-stat]
-fd=4
-type=1
-config=2
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_CPU_CYCLES
-[event5:base-stat]
-fd=5
-type=0
-config=0
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_STALLED_CYCLES_FRONTEND
-[event6:base-stat]
-fd=6
-type=0
-config=7
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_STALLED_CYCLES_BACKEND
-[event7:base-stat]
-fd=7
-type=0
-config=8
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_INSTRUCTIONS
-[event8:base-stat]
-fd=8
-type=0
-config=1
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_BRANCH_INSTRUCTIONS
-[event9:base-stat]
-fd=9
-type=0
-config=4
-
-# PERF_TYPE_HARDWARE / PERF_COUNT_HW_BRANCH_MISSES
-[event10:base-stat]
-fd=10
-type=0
-config=5
-
-# PERF_TYPE_HW_CACHE /
-#  PERF_COUNT_HW_CACHE_L1D                <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)
-[event11:base-stat]
-fd=11
-type=3
-config=0
-
-# PERF_TYPE_HW_CACHE /
-#  PERF_COUNT_HW_CACHE_L1D                <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)
-[event12:base-stat]
-fd=12
-type=3
-config=65536
-
-# PERF_TYPE_HW_CACHE /
-#  PERF_COUNT_HW_CACHE_LL                 <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)
-[event13:base-stat]
-fd=13
-type=3
-config=2
-
-# PERF_TYPE_HW_CACHE,
-#  PERF_COUNT_HW_CACHE_LL                 <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)
-[event14:base-stat]
-fd=14
-type=3
-config=65538
-
-# PERF_TYPE_HW_CACHE,
-#  PERF_COUNT_HW_CACHE_L1I                <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)
-[event15:base-stat]
-fd=15
-type=3
-config=1
-
-# PERF_TYPE_HW_CACHE,
-#  PERF_COUNT_HW_CACHE_L1I                <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)
-[event16:base-stat]
-fd=16
-type=3
-config=65537
-
-# PERF_TYPE_HW_CACHE,
-#  PERF_COUNT_HW_CACHE_DTLB               <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)
-[event17:base-stat]
-fd=17
-type=3
-config=3
-
-# PERF_TYPE_HW_CACHE,
-#  PERF_COUNT_HW_CACHE_DTLB               <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)
-[event18:base-stat]
-fd=18
-type=3
-config=65539
-
-# PERF_TYPE_HW_CACHE,
-#  PERF_COUNT_HW_CACHE_ITLB               <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)
-[event19:base-stat]
-fd=19
-type=3
-config=4
-
-# PERF_TYPE_HW_CACHE,
-#  PERF_COUNT_HW_CACHE_ITLB               <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)
-[event20:base-stat]
-fd=20
-type=3
-config=65540
-
-# PERF_TYPE_HW_CACHE,
-#  PERF_COUNT_HW_CACHE_L1D                <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_PREFETCH        <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)
-[event21:base-stat]
-fd=21
-type=3
-config=512
-
-# PERF_TYPE_HW_CACHE,
-#  PERF_COUNT_HW_CACHE_L1D                <<  0  |
-# (PERF_COUNT_HW_CACHE_OP_PREFETCH        <<  8) |
-# (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)
-[event22:base-stat]
-fd=22
-type=3
-config=66048
diff --git a/src/tools/perf/tests/attr/test-stat-group b/src/tools/perf/tests/attr/test-stat-group
deleted file mode 100644
index fdc1596..0000000
--- a/src/tools/perf/tests/attr/test-stat-group
+++ /dev/null
@@ -1,15 +0,0 @@
-[config]
-command = stat
-args    = --group -e cycles,instructions kill >/dev/null 2>&1
-ret     = 1
-
-[event-1:base-stat]
-fd=1
-group_fd=-1
-
-[event-2:base-stat]
-fd=2
-group_fd=1
-config=1
-disabled=0
-enable_on_exec=0
diff --git a/src/tools/perf/tests/attr/test-stat-group1 b/src/tools/perf/tests/attr/test-stat-group1
deleted file mode 100644
index 2a1f86e..0000000
--- a/src/tools/perf/tests/attr/test-stat-group1
+++ /dev/null
@@ -1,15 +0,0 @@
-[config]
-command = stat
-args    = -e '{cycles,instructions}' kill >/dev/null 2>&1
-ret     = 1
-
-[event-1:base-stat]
-fd=1
-group_fd=-1
-
-[event-2:base-stat]
-fd=2
-group_fd=1
-config=1
-disabled=0
-enable_on_exec=0
diff --git a/src/tools/perf/tests/attr/test-stat-no-inherit b/src/tools/perf/tests/attr/test-stat-no-inherit
deleted file mode 100644
index d54b2a1..0000000
--- a/src/tools/perf/tests/attr/test-stat-no-inherit
+++ /dev/null
@@ -1,7 +0,0 @@
-[config]
-command = stat
-args    = -i -e cycles kill >/dev/null 2>&1
-ret     = 1
-
-[event:base-stat]
-inherit=0
diff --git a/src/tools/perf/tests/bp_signal.c b/src/tools/perf/tests/bp_signal.c
deleted file mode 100644
index aba0954..0000000
--- a/src/tools/perf/tests/bp_signal.c
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Inspired by breakpoint overflow test done by
- * Vince Weaver <vincent.weaver@maine.edu> for perf_event_tests
- * (git://github.com/deater/perf_event_tests)
- */
-
-/*
- * Powerpc needs __SANE_USERSPACE_TYPES__ before <linux/types.h> to select
- * 'int-ll64.h' and avoid compile warnings when printing __u64 with %llu.
- */
-#define __SANE_USERSPACE_TYPES__
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <time.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <sys/mman.h>
-#include <linux/compiler.h>
-#include <linux/hw_breakpoint.h>
-
-#include "tests.h"
-#include "debug.h"
-#include "perf.h"
-
-static int fd1;
-static int fd2;
-static int overflows;
-
-__attribute__ ((noinline))
-static int test_function(void)
-{
-	return time(NULL);
-}
-
-static void sig_handler(int signum __maybe_unused,
-			siginfo_t *oh __maybe_unused,
-			void *uc __maybe_unused)
-{
-	overflows++;
-
-	if (overflows > 10) {
-		/*
-		 * This should be executed only once during
-		 * this test, if we are here for the 10th
-		 * time, consider this the recursive issue.
-		 *
-		 * We can get out of here by disable events,
-		 * so no new SIGIO is delivered.
-		 */
-		ioctl(fd1, PERF_EVENT_IOC_DISABLE, 0);
-		ioctl(fd2, PERF_EVENT_IOC_DISABLE, 0);
-	}
-}
-
-static int bp_event(void *fn, int setup_signal)
-{
-	struct perf_event_attr pe;
-	int fd;
-
-	memset(&pe, 0, sizeof(struct perf_event_attr));
-	pe.type = PERF_TYPE_BREAKPOINT;
-	pe.size = sizeof(struct perf_event_attr);
-
-	pe.config = 0;
-	pe.bp_type = HW_BREAKPOINT_X;
-	pe.bp_addr = (unsigned long) fn;
-	pe.bp_len = sizeof(long);
-
-	pe.sample_period = 1;
-	pe.sample_type = PERF_SAMPLE_IP;
-	pe.wakeup_events = 1;
-
-	pe.disabled = 1;
-	pe.exclude_kernel = 1;
-	pe.exclude_hv = 1;
-
-	fd = sys_perf_event_open(&pe, 0, -1, -1, 0);
-	if (fd < 0) {
-		pr_debug("failed opening event %llx\n", pe.config);
-		return TEST_FAIL;
-	}
-
-	if (setup_signal) {
-		fcntl(fd, F_SETFL, O_RDWR|O_NONBLOCK|O_ASYNC);
-		fcntl(fd, F_SETSIG, SIGIO);
-		fcntl(fd, F_SETOWN, getpid());
-	}
-
-	ioctl(fd, PERF_EVENT_IOC_RESET, 0);
-
-	return fd;
-}
-
-static long long bp_count(int fd)
-{
-	long long count;
-	int ret;
-
-	ret = read(fd, &count, sizeof(long long));
-	if (ret != sizeof(long long)) {
-		pr_debug("failed to read: %d\n", ret);
-		return TEST_FAIL;
-	}
-
-	return count;
-}
-
-int test__bp_signal(void)
-{
-	struct sigaction sa;
-	long long count1, count2;
-
-	/* setup SIGIO signal handler */
-	memset(&sa, 0, sizeof(struct sigaction));
-	sa.sa_sigaction = (void *) sig_handler;
-	sa.sa_flags = SA_SIGINFO;
-
-	if (sigaction(SIGIO, &sa, NULL) < 0) {
-		pr_debug("failed setting up signal handler\n");
-		return TEST_FAIL;
-	}
-
-	/*
-	 * We create following events:
-	 *
-	 * fd1 - breakpoint event on test_function with SIGIO
-	 *       signal configured. We should get signal
-	 *       notification each time the breakpoint is hit
-	 *
-	 * fd2 - breakpoint event on sig_handler without SIGIO
-	 *       configured.
-	 *
-	 * Following processing should happen:
-	 *   - execute test_function
-	 *   - fd1 event breakpoint hit -> count1 == 1
-	 *   - SIGIO is delivered       -> overflows == 1
-	 *   - fd2 event breakpoint hit -> count2 == 1
-	 *
-	 * The test case check following error conditions:
-	 * - we get stuck in signal handler because of debug
-	 *   exception being triggered receursively due to
-	 *   the wrong RF EFLAG management
-	 *
-	 * - we never trigger the sig_handler breakpoint due
-	 *   to the rong RF EFLAG management
-	 *
-	 */
-
-	fd1 = bp_event(test_function, 1);
-	fd2 = bp_event(sig_handler, 0);
-
-	ioctl(fd1, PERF_EVENT_IOC_ENABLE, 0);
-	ioctl(fd2, PERF_EVENT_IOC_ENABLE, 0);
-
-	/*
-	 * Kick off the test by trigering 'fd1'
-	 * breakpoint.
-	 */
-	test_function();
-
-	ioctl(fd1, PERF_EVENT_IOC_DISABLE, 0);
-	ioctl(fd2, PERF_EVENT_IOC_DISABLE, 0);
-
-	count1 = bp_count(fd1);
-	count2 = bp_count(fd2);
-
-	close(fd1);
-	close(fd2);
-
-	pr_debug("count1 %lld, count2 %lld, overflow %d\n",
-		 count1, count2, overflows);
-
-	if (count1 != 1) {
-		if (count1 == 11)
-			pr_debug("failed: RF EFLAG recursion issue detected\n");
-		else
-			pr_debug("failed: wrong count for bp1%lld\n", count1);
-	}
-
-	if (overflows != 1)
-		pr_debug("failed: wrong overflow hit\n");
-
-	if (count2 != 1)
-		pr_debug("failed: wrong count for bp2\n");
-
-	return count1 == 1 && overflows == 1 && count2 == 1 ?
-		TEST_OK : TEST_FAIL;
-}
diff --git a/src/tools/perf/tests/bp_signal_overflow.c b/src/tools/perf/tests/bp_signal_overflow.c
deleted file mode 100644
index 44ac821..0000000
--- a/src/tools/perf/tests/bp_signal_overflow.c
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Originally done by Vince Weaver <vincent.weaver@maine.edu> for
- * perf_event_tests (git://github.com/deater/perf_event_tests)
- */
-
-/*
- * Powerpc needs __SANE_USERSPACE_TYPES__ before <linux/types.h> to select
- * 'int-ll64.h' and avoid compile warnings when printing __u64 with %llu.
- */
-#define __SANE_USERSPACE_TYPES__
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <time.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <sys/mman.h>
-#include <linux/compiler.h>
-#include <linux/hw_breakpoint.h>
-
-#include "tests.h"
-#include "debug.h"
-#include "perf.h"
-
-static int overflows;
-
-__attribute__ ((noinline))
-static int test_function(void)
-{
-	return time(NULL);
-}
-
-static void sig_handler(int signum __maybe_unused,
-			siginfo_t *oh __maybe_unused,
-			void *uc __maybe_unused)
-{
-	overflows++;
-}
-
-static long long bp_count(int fd)
-{
-	long long count;
-	int ret;
-
-	ret = read(fd, &count, sizeof(long long));
-	if (ret != sizeof(long long)) {
-		pr_debug("failed to read: %d\n", ret);
-		return TEST_FAIL;
-	}
-
-	return count;
-}
-
-#define EXECUTIONS 10000
-#define THRESHOLD  100
-
-int test__bp_signal_overflow(void)
-{
-	struct perf_event_attr pe;
-	struct sigaction sa;
-	long long count;
-	int fd, i, fails = 0;
-
-	/* setup SIGIO signal handler */
-	memset(&sa, 0, sizeof(struct sigaction));
-	sa.sa_sigaction = (void *) sig_handler;
-	sa.sa_flags = SA_SIGINFO;
-
-	if (sigaction(SIGIO, &sa, NULL) < 0) {
-		pr_debug("failed setting up signal handler\n");
-		return TEST_FAIL;
-	}
-
-	memset(&pe, 0, sizeof(struct perf_event_attr));
-	pe.type = PERF_TYPE_BREAKPOINT;
-	pe.size = sizeof(struct perf_event_attr);
-
-	pe.config = 0;
-	pe.bp_type = HW_BREAKPOINT_X;
-	pe.bp_addr = (unsigned long) test_function;
-	pe.bp_len = sizeof(long);
-
-	pe.sample_period = THRESHOLD;
-	pe.sample_type = PERF_SAMPLE_IP;
-	pe.wakeup_events = 1;
-
-	pe.disabled = 1;
-	pe.exclude_kernel = 1;
-	pe.exclude_hv = 1;
-
-	fd = sys_perf_event_open(&pe, 0, -1, -1, 0);
-	if (fd < 0) {
-		pr_debug("failed opening event %llx\n", pe.config);
-		return TEST_FAIL;
-	}
-
-	fcntl(fd, F_SETFL, O_RDWR|O_NONBLOCK|O_ASYNC);
-	fcntl(fd, F_SETSIG, SIGIO);
-	fcntl(fd, F_SETOWN, getpid());
-
-	ioctl(fd, PERF_EVENT_IOC_RESET, 0);
-	ioctl(fd, PERF_EVENT_IOC_ENABLE, 0);
-
-	for (i = 0; i < EXECUTIONS; i++)
-		test_function();
-
-	ioctl(fd, PERF_EVENT_IOC_DISABLE, 0);
-
-	count = bp_count(fd);
-
-	close(fd);
-
-	pr_debug("count %lld, overflow %d\n",
-		 count, overflows);
-
-	if (count != EXECUTIONS) {
-		pr_debug("\tWrong number of executions %lld != %d\n",
-		count, EXECUTIONS);
-		fails++;
-	}
-
-	if (overflows != EXECUTIONS / THRESHOLD) {
-		pr_debug("\tWrong number of overflows %d != %d\n",
-		overflows, EXECUTIONS / THRESHOLD);
-		fails++;
-	}
-
-	return fails ? TEST_FAIL : TEST_OK;
-}
diff --git a/src/tools/perf/tests/builtin-test.c b/src/tools/perf/tests/builtin-test.c
deleted file mode 100644
index 1e67437..0000000
--- a/src/tools/perf/tests/builtin-test.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * builtin-test.c
- *
- * Builtin regression testing command: ever growing number of sanity tests
- */
-#include "builtin.h"
-#include "intlist.h"
-#include "tests.h"
-#include "debug.h"
-#include "color.h"
-#include "parse-options.h"
-#include "symbol.h"
-
-static struct test {
-	const char *desc;
-	int (*func)(void);
-} tests[] = {
-	{
-		.desc = "vmlinux symtab matches kallsyms",
-		.func = test__vmlinux_matches_kallsyms,
-	},
-	{
-		.desc = "detect open syscall event",
-		.func = test__open_syscall_event,
-	},
-	{
-		.desc = "detect open syscall event on all cpus",
-		.func = test__open_syscall_event_on_all_cpus,
-	},
-	{
-		.desc = "read samples using the mmap interface",
-		.func = test__basic_mmap,
-	},
-	{
-		.desc = "parse events tests",
-		.func = test__parse_events,
-	},
-#if defined(__x86_64__) || defined(__i386__)
-	{
-		.desc = "x86 rdpmc test",
-		.func = test__rdpmc,
-	},
-#endif
-	{
-		.desc = "Validate PERF_RECORD_* events & perf_sample fields",
-		.func = test__PERF_RECORD,
-	},
-	{
-		.desc = "Test perf pmu format parsing",
-		.func = test__pmu,
-	},
-	{
-		.desc = "Test dso data interface",
-		.func = test__dso_data,
-	},
-	{
-		.desc = "roundtrip evsel->name check",
-		.func = test__perf_evsel__roundtrip_name_test,
-	},
-	{
-		.desc = "Check parsing of sched tracepoints fields",
-		.func = test__perf_evsel__tp_sched_test,
-	},
-	{
-		.desc = "Generate and check syscalls:sys_enter_open event fields",
-		.func = test__syscall_open_tp_fields,
-	},
-	{
-		.desc = "struct perf_event_attr setup",
-		.func = test__attr,
-	},
-	{
-		.desc = "Test matching and linking multiple hists",
-		.func = test__hists_link,
-	},
-	{
-		.desc = "Try 'use perf' in python, checking link problems",
-		.func = test__python_use,
-	},
-	{
-		.desc = "Test breakpoint overflow signal handler",
-		.func = test__bp_signal,
-	},
-	{
-		.desc = "Test breakpoint overflow sampling",
-		.func = test__bp_signal_overflow,
-	},
-	{
-		.desc = "Test number of exit event of a simple workload",
-		.func = test__task_exit,
-	},
-	{
-		.desc = "Test software clock events have valid period values",
-		.func = test__sw_clock_freq,
-	},
-#if defined(__x86_64__) || defined(__i386__)
-	{
-		.desc = "Test converting perf time to TSC",
-		.func = test__perf_time_to_tsc,
-	},
-#endif
-	{
-		.desc = "Test object code reading",
-		.func = test__code_reading,
-	},
-	{
-		.desc = "Test sample parsing",
-		.func = test__sample_parsing,
-	},
-	{
-		.desc = "Test using a dummy software event to keep tracking",
-		.func = test__keep_tracking,
-	},
-	{
-		.desc = "Test parsing with no sample_id_all bit set",
-		.func = test__parse_no_sample_id_all,
-	},
-	{
-		.func = NULL,
-	},
-};
-
-static bool perf_test__matches(int curr, int argc, const char *argv[])
-{
-	int i;
-
-	if (argc == 0)
-		return true;
-
-	for (i = 0; i < argc; ++i) {
-		char *end;
-		long nr = strtoul(argv[i], &end, 10);
-
-		if (*end == '\0') {
-			if (nr == curr + 1)
-				return true;
-			continue;
-		}
-
-		if (strstr(tests[curr].desc, argv[i]))
-			return true;
-	}
-
-	return false;
-}
-
-static int __cmd_test(int argc, const char *argv[], struct intlist *skiplist)
-{
-	int i = 0;
-	int width = 0;
-
-	while (tests[i].func) {
-		int len = strlen(tests[i].desc);
-
-		if (width < len)
-			width = len;
-		++i;
-	}
-
-	i = 0;
-	while (tests[i].func) {
-		int curr = i++, err;
-
-		if (!perf_test__matches(curr, argc, argv))
-			continue;
-
-		pr_info("%2d: %-*s:", i, width, tests[curr].desc);
-
-		if (intlist__find(skiplist, i)) {
-			color_fprintf(stderr, PERF_COLOR_YELLOW, " Skip (user override)\n");
-			continue;
-		}
-
-		pr_debug("\n--- start ---\n");
-		err = tests[curr].func();
-		pr_debug("---- end ----\n%s:", tests[curr].desc);
-
-		switch (err) {
-		case TEST_OK:
-			pr_info(" Ok\n");
-			break;
-		case TEST_SKIP:
-			color_fprintf(stderr, PERF_COLOR_YELLOW, " Skip\n");
-			break;
-		case TEST_FAIL:
-		default:
-			color_fprintf(stderr, PERF_COLOR_RED, " FAILED!\n");
-			break;
-		}
-	}
-
-	return 0;
-}
-
-static int perf_test__list(int argc, const char **argv)
-{
-	int i = 0;
-
-	while (tests[i].func) {
-		int curr = i++;
-
-		if (argc > 1 && !strstr(tests[curr].desc, argv[1]))
-			continue;
-
-		pr_info("%2d: %s\n", i, tests[curr].desc);
-	}
-
-	return 0;
-}
-
-int cmd_test(int argc, const char **argv, const char *prefix __maybe_unused)
-{
-	const char * const test_usage[] = {
-	"perf test [<options>] [{list <test-name-fragment>|[<test-name-fragments>|<test-numbers>]}]",
-	NULL,
-	};
-	const char *skip = NULL;
-	const struct option test_options[] = {
-	OPT_STRING('s', "skip", &skip, "tests", "tests to skip"),
-	OPT_INCR('v', "verbose", &verbose,
-		    "be more verbose (show symbol address, etc)"),
-	OPT_END()
-	};
-	struct intlist *skiplist = NULL;
-
-	argc = parse_options(argc, argv, test_options, test_usage, 0);
-	if (argc >= 1 && !strcmp(argv[0], "list"))
-		return perf_test__list(argc, argv);
-
-	symbol_conf.priv_size = sizeof(int);
-	symbol_conf.sort_by_name = true;
-	symbol_conf.try_vmlinux_path = true;
-
-	if (symbol__init() < 0)
-		return -1;
-
-	if (skip != NULL)
-		skiplist = intlist__new(skip);
-
-	return __cmd_test(argc, argv, skiplist);
-}
diff --git a/src/tools/perf/tests/code-reading.c b/src/tools/perf/tests/code-reading.c
deleted file mode 100644
index e3fedfa..0000000
--- a/src/tools/perf/tests/code-reading.c
+++ /dev/null
@@ -1,573 +0,0 @@
-#include <sys/types.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <inttypes.h>
-#include <ctype.h>
-#include <string.h>
-
-#include "parse-events.h"
-#include "evlist.h"
-#include "evsel.h"
-#include "thread_map.h"
-#include "cpumap.h"
-#include "machine.h"
-#include "event.h"
-#include "thread.h"
-
-#include "tests.h"
-
-#define BUFSZ	1024
-#define READLEN	128
-
-struct state {
-	u64 done[1024];
-	size_t done_cnt;
-};
-
-static unsigned int hex(char c)
-{
-	if (c >= '0' && c <= '9')
-		return c - '0';
-	if (c >= 'a' && c <= 'f')
-		return c - 'a' + 10;
-	return c - 'A' + 10;
-}
-
-static void read_objdump_line(const char *line, size_t line_len, void **buf,
-			      size_t *len)
-{
-	const char *p;
-	size_t i;
-
-	/* Skip to a colon */
-	p = strchr(line, ':');
-	if (!p)
-		return;
-	i = p + 1 - line;
-
-	/* Read bytes */
-	while (*len) {
-		char c1, c2;
-
-		/* Skip spaces */
-		for (; i < line_len; i++) {
-			if (!isspace(line[i]))
-				break;
-		}
-		/* Get 2 hex digits */
-		if (i >= line_len || !isxdigit(line[i]))
-			break;
-		c1 = line[i++];
-		if (i >= line_len || !isxdigit(line[i]))
-			break;
-		c2 = line[i++];
-		/* Followed by a space */
-		if (i < line_len && line[i] && !isspace(line[i]))
-			break;
-		/* Store byte */
-		*(unsigned char *)*buf = (hex(c1) << 4) | hex(c2);
-		*buf += 1;
-		*len -= 1;
-	}
-}
-
-static int read_objdump_output(FILE *f, void **buf, size_t *len)
-{
-	char *line = NULL;
-	size_t line_len;
-	ssize_t ret;
-	int err = 0;
-
-	while (1) {
-		ret = getline(&line, &line_len, f);
-		if (feof(f))
-			break;
-		if (ret < 0) {
-			pr_debug("getline failed\n");
-			err = -1;
-			break;
-		}
-		read_objdump_line(line, ret, buf, len);
-	}
-
-	free(line);
-
-	return err;
-}
-
-static int read_via_objdump(const char *filename, u64 addr, void *buf,
-			    size_t len)
-{
-	char cmd[PATH_MAX * 2];
-	const char *fmt;
-	FILE *f;
-	int ret;
-
-	fmt = "%s -d --start-address=0x%"PRIx64" --stop-address=0x%"PRIx64" %s";
-	ret = snprintf(cmd, sizeof(cmd), fmt, "objdump", addr, addr + len,
-		       filename);
-	if (ret <= 0 || (size_t)ret >= sizeof(cmd))
-		return -1;
-
-	pr_debug("Objdump command is: %s\n", cmd);
-
-	/* Ignore objdump errors */
-	strcat(cmd, " 2>/dev/null");
-
-	f = popen(cmd, "r");
-	if (!f) {
-		pr_debug("popen failed\n");
-		return -1;
-	}
-
-	ret = read_objdump_output(f, &buf, &len);
-	if (len) {
-		pr_debug("objdump read too few bytes\n");
-		if (!ret)
-			ret = len;
-	}
-
-	pclose(f);
-
-	return ret;
-}
-
-static int read_object_code(u64 addr, size_t len, u8 cpumode,
-			    struct thread *thread, struct machine *machine,
-			    struct state *state)
-{
-	struct addr_location al;
-	unsigned char buf1[BUFSZ];
-	unsigned char buf2[BUFSZ];
-	size_t ret_len;
-	u64 objdump_addr;
-	int ret;
-
-	pr_debug("Reading object code for memory address: %#"PRIx64"\n", addr);
-
-	thread__find_addr_map(thread, machine, cpumode, MAP__FUNCTION, addr,
-			      &al);
-	if (!al.map || !al.map->dso) {
-		pr_debug("thread__find_addr_map failed\n");
-		return -1;
-	}
-
-	pr_debug("File is: %s\n", al.map->dso->long_name);
-
-	if (al.map->dso->symtab_type == DSO_BINARY_TYPE__KALLSYMS &&
-	    !dso__is_kcore(al.map->dso)) {
-		pr_debug("Unexpected kernel address - skipping\n");
-		return 0;
-	}
-
-	pr_debug("On file address is: %#"PRIx64"\n", al.addr);
-
-	if (len > BUFSZ)
-		len = BUFSZ;
-
-	/* Do not go off the map */
-	if (addr + len > al.map->end)
-		len = al.map->end - addr;
-
-	/* Read the object code using perf */
-	ret_len = dso__data_read_offset(al.map->dso, machine, al.addr, buf1,
-					len);
-	if (ret_len != len) {
-		pr_debug("dso__data_read_offset failed\n");
-		return -1;
-	}
-
-	/*
-	 * Converting addresses for use by objdump requires more information.
-	 * map__load() does that.  See map__rip_2objdump() for details.
-	 */
-	if (map__load(al.map, NULL))
-		return -1;
-
-	/* objdump struggles with kcore - try each map only once */
-	if (dso__is_kcore(al.map->dso)) {
-		size_t d;
-
-		for (d = 0; d < state->done_cnt; d++) {
-			if (state->done[d] == al.map->start) {
-				pr_debug("kcore map tested already");
-				pr_debug(" - skipping\n");
-				return 0;
-			}
-		}
-		if (state->done_cnt >= ARRAY_SIZE(state->done)) {
-			pr_debug("Too many kcore maps - skipping\n");
-			return 0;
-		}
-		state->done[state->done_cnt++] = al.map->start;
-	}
-
-	/* Read the object code using objdump */
-	objdump_addr = map__rip_2objdump(al.map, al.addr);
-	ret = read_via_objdump(al.map->dso->long_name, objdump_addr, buf2, len);
-	if (ret > 0) {
-		/*
-		 * The kernel maps are inaccurate - assume objdump is right in
-		 * that case.
-		 */
-		if (cpumode == PERF_RECORD_MISC_KERNEL ||
-		    cpumode == PERF_RECORD_MISC_GUEST_KERNEL) {
-			len -= ret;
-			if (len) {
-				pr_debug("Reducing len to %zu\n", len);
-			} else if (dso__is_kcore(al.map->dso)) {
-				/*
-				 * objdump cannot handle very large segments
-				 * that may be found in kcore.
-				 */
-				pr_debug("objdump failed for kcore");
-				pr_debug(" - skipping\n");
-				return 0;
-			} else {
-				return -1;
-			}
-		}
-	}
-	if (ret < 0) {
-		pr_debug("read_via_objdump failed\n");
-		return -1;
-	}
-
-	/* The results should be identical */
-	if (memcmp(buf1, buf2, len)) {
-		pr_debug("Bytes read differ from those read by objdump\n");
-		return -1;
-	}
-	pr_debug("Bytes read match those read by objdump\n");
-
-	return 0;
-}
-
-static int process_sample_event(struct machine *machine,
-				struct perf_evlist *evlist,
-				union perf_event *event, struct state *state)
-{
-	struct perf_sample sample;
-	struct thread *thread;
-	u8 cpumode;
-
-	if (perf_evlist__parse_sample(evlist, event, &sample)) {
-		pr_debug("perf_evlist__parse_sample failed\n");
-		return -1;
-	}
-
-	thread = machine__findnew_thread(machine, sample.pid, sample.pid);
-	if (!thread) {
-		pr_debug("machine__findnew_thread failed\n");
-		return -1;
-	}
-
-	cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
-
-	return read_object_code(sample.ip, READLEN, cpumode, thread, machine,
-				state);
-}
-
-static int process_event(struct machine *machine, struct perf_evlist *evlist,
-			 union perf_event *event, struct state *state)
-{
-	if (event->header.type == PERF_RECORD_SAMPLE)
-		return process_sample_event(machine, evlist, event, state);
-
-	if (event->header.type < PERF_RECORD_MAX)
-		return machine__process_event(machine, event);
-
-	return 0;
-}
-
-static int process_events(struct machine *machine, struct perf_evlist *evlist,
-			  struct state *state)
-{
-	union perf_event *event;
-	int i, ret;
-
-	for (i = 0; i < evlist->nr_mmaps; i++) {
-		while ((event = perf_evlist__mmap_read(evlist, i)) != NULL) {
-			ret = process_event(machine, evlist, event, state);
-			perf_evlist__mmap_consume(evlist, i);
-			if (ret < 0)
-				return ret;
-		}
-	}
-	return 0;
-}
-
-static int comp(const void *a, const void *b)
-{
-	return *(int *)a - *(int *)b;
-}
-
-static void do_sort_something(void)
-{
-	int buf[40960], i;
-
-	for (i = 0; i < (int)ARRAY_SIZE(buf); i++)
-		buf[i] = ARRAY_SIZE(buf) - i - 1;
-
-	qsort(buf, ARRAY_SIZE(buf), sizeof(int), comp);
-
-	for (i = 0; i < (int)ARRAY_SIZE(buf); i++) {
-		if (buf[i] != i) {
-			pr_debug("qsort failed\n");
-			break;
-		}
-	}
-}
-
-static void sort_something(void)
-{
-	int i;
-
-	for (i = 0; i < 10; i++)
-		do_sort_something();
-}
-
-static void syscall_something(void)
-{
-	int pipefd[2];
-	int i;
-
-	for (i = 0; i < 1000; i++) {
-		if (pipe(pipefd) < 0) {
-			pr_debug("pipe failed\n");
-			break;
-		}
-		close(pipefd[1]);
-		close(pipefd[0]);
-	}
-}
-
-static void fs_something(void)
-{
-	const char *test_file_name = "temp-perf-code-reading-test-file--";
-	FILE *f;
-	int i;
-
-	for (i = 0; i < 1000; i++) {
-		f = fopen(test_file_name, "w+");
-		if (f) {
-			fclose(f);
-			unlink(test_file_name);
-		}
-	}
-}
-
-static void do_something(void)
-{
-	fs_something();
-
-	sort_something();
-
-	syscall_something();
-}
-
-enum {
-	TEST_CODE_READING_OK,
-	TEST_CODE_READING_NO_VMLINUX,
-	TEST_CODE_READING_NO_KCORE,
-	TEST_CODE_READING_NO_ACCESS,
-	TEST_CODE_READING_NO_KERNEL_OBJ,
-};
-
-static int do_test_code_reading(bool try_kcore)
-{
-	struct machines machines;
-	struct machine *machine;
-	struct thread *thread;
-	struct perf_record_opts opts = {
-		.mmap_pages	     = UINT_MAX,
-		.user_freq	     = UINT_MAX,
-		.user_interval	     = ULLONG_MAX,
-		.freq		     = 4000,
-		.target		     = {
-			.uses_mmap   = true,
-		},
-	};
-	struct state state = {
-		.done_cnt = 0,
-	};
-	struct thread_map *threads = NULL;
-	struct cpu_map *cpus = NULL;
-	struct perf_evlist *evlist = NULL;
-	struct perf_evsel *evsel = NULL;
-	int err = -1, ret;
-	pid_t pid;
-	struct map *map;
-	bool have_vmlinux, have_kcore, excl_kernel = false;
-
-	pid = getpid();
-
-	machines__init(&machines);
-	machine = &machines.host;
-
-	ret = machine__create_kernel_maps(machine);
-	if (ret < 0) {
-		pr_debug("machine__create_kernel_maps failed\n");
-		goto out_err;
-	}
-
-	/* Force the use of kallsyms instead of vmlinux to try kcore */
-	if (try_kcore)
-		symbol_conf.kallsyms_name = "/proc/kallsyms";
-
-	/* Load kernel map */
-	map = machine->vmlinux_maps[MAP__FUNCTION];
-	ret = map__load(map, NULL);
-	if (ret < 0) {
-		pr_debug("map__load failed\n");
-		goto out_err;
-	}
-	have_vmlinux = dso__is_vmlinux(map->dso);
-	have_kcore = dso__is_kcore(map->dso);
-
-	/* 2nd time through we just try kcore */
-	if (try_kcore && !have_kcore)
-		return TEST_CODE_READING_NO_KCORE;
-
-	/* No point getting kernel events if there is no kernel object */
-	if (!have_vmlinux && !have_kcore)
-		excl_kernel = true;
-
-	threads = thread_map__new_by_tid(pid);
-	if (!threads) {
-		pr_debug("thread_map__new_by_tid failed\n");
-		goto out_err;
-	}
-
-	ret = perf_event__synthesize_thread_map(NULL, threads,
-						perf_event__process, machine);
-	if (ret < 0) {
-		pr_debug("perf_event__synthesize_thread_map failed\n");
-		goto out_err;
-	}
-
-	thread = machine__findnew_thread(machine, pid, pid);
-	if (!thread) {
-		pr_debug("machine__findnew_thread failed\n");
-		goto out_err;
-	}
-
-	cpus = cpu_map__new(NULL);
-	if (!cpus) {
-		pr_debug("cpu_map__new failed\n");
-		goto out_err;
-	}
-
-	while (1) {
-		const char *str;
-
-		evlist = perf_evlist__new();
-		if (!evlist) {
-			pr_debug("perf_evlist__new failed\n");
-			goto out_err;
-		}
-
-		perf_evlist__set_maps(evlist, cpus, threads);
-
-		if (excl_kernel)
-			str = "cycles:u";
-		else
-			str = "cycles";
-		pr_debug("Parsing event '%s'\n", str);
-		ret = parse_events(evlist, str);
-		if (ret < 0) {
-			pr_debug("parse_events failed\n");
-			goto out_err;
-		}
-
-		perf_evlist__config(evlist, &opts);
-
-		evsel = perf_evlist__first(evlist);
-
-		evsel->attr.comm = 1;
-		evsel->attr.disabled = 1;
-		evsel->attr.enable_on_exec = 0;
-
-		ret = perf_evlist__open(evlist);
-		if (ret < 0) {
-			if (!excl_kernel) {
-				excl_kernel = true;
-				perf_evlist__delete(evlist);
-				evlist = NULL;
-				continue;
-			}
-			pr_debug("perf_evlist__open failed\n");
-			goto out_err;
-		}
-		break;
-	}
-
-	ret = perf_evlist__mmap(evlist, UINT_MAX, false);
-	if (ret < 0) {
-		pr_debug("perf_evlist__mmap failed\n");
-		goto out_err;
-	}
-
-	perf_evlist__enable(evlist);
-
-	do_something();
-
-	perf_evlist__disable(evlist);
-
-	ret = process_events(machine, evlist, &state);
-	if (ret < 0)
-		goto out_err;
-
-	if (!have_vmlinux && !have_kcore && !try_kcore)
-		err = TEST_CODE_READING_NO_KERNEL_OBJ;
-	else if (!have_vmlinux && !try_kcore)
-		err = TEST_CODE_READING_NO_VMLINUX;
-	else if (excl_kernel)
-		err = TEST_CODE_READING_NO_ACCESS;
-	else
-		err = TEST_CODE_READING_OK;
-out_err:
-	if (evlist) {
-		perf_evlist__munmap(evlist);
-		perf_evlist__close(evlist);
-		perf_evlist__delete(evlist);
-	}
-	if (cpus)
-		cpu_map__delete(cpus);
-	if (threads)
-		thread_map__delete(threads);
-	machines__destroy_kernel_maps(&machines);
-	machine__delete_threads(machine);
-	machines__exit(&machines);
-
-	return err;
-}
-
-int test__code_reading(void)
-{
-	int ret;
-
-	ret = do_test_code_reading(false);
-	if (!ret)
-		ret = do_test_code_reading(true);
-
-	switch (ret) {
-	case TEST_CODE_READING_OK:
-		return 0;
-	case TEST_CODE_READING_NO_VMLINUX:
-		fprintf(stderr, " (no vmlinux)");
-		return 0;
-	case TEST_CODE_READING_NO_KCORE:
-		fprintf(stderr, " (no kcore)");
-		return 0;
-	case TEST_CODE_READING_NO_ACCESS:
-		fprintf(stderr, " (no access)");
-		return 0;
-	case TEST_CODE_READING_NO_KERNEL_OBJ:
-		fprintf(stderr, " (no kernel obj)");
-		return 0;
-	default:
-		return -1;
-	};
-}
diff --git a/src/tools/perf/tests/dso-data.c b/src/tools/perf/tests/dso-data.c
deleted file mode 100644
index dffe055..0000000
--- a/src/tools/perf/tests/dso-data.c
+++ /dev/null
@@ -1,151 +0,0 @@
-#include "util.h"
-
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <string.h>
-
-#include "machine.h"
-#include "symbol.h"
-#include "tests.h"
-
-static char *test_file(int size)
-{
-	static char buf_templ[] = "/tmp/test-XXXXXX";
-	char *templ = buf_templ;
-	int fd, i;
-	unsigned char *buf;
-
-	fd = mkstemp(templ);
-	if (fd < 0) {
-		perror("mkstemp failed");
-		return NULL;
-	}
-
-	buf = malloc(size);
-	if (!buf) {
-		close(fd);
-		return NULL;
-	}
-
-	for (i = 0; i < size; i++)
-		buf[i] = (unsigned char) ((int) i % 10);
-
-	if (size != write(fd, buf, size))
-		templ = NULL;
-
-	close(fd);
-	return templ;
-}
-
-#define TEST_FILE_SIZE (DSO__DATA_CACHE_SIZE * 20)
-
-struct test_data_offset {
-	off_t offset;
-	u8 data[10];
-	int size;
-};
-
-struct test_data_offset offsets[] = {
-	/* Fill first cache page. */
-	{
-		.offset = 10,
-		.data   = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
-		.size   = 10,
-	},
-	/* Read first cache page. */
-	{
-		.offset = 10,
-		.data   = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
-		.size   = 10,
-	},
-	/* Fill cache boundary pages. */
-	{
-		.offset = DSO__DATA_CACHE_SIZE - DSO__DATA_CACHE_SIZE % 10,
-		.data   = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
-		.size   = 10,
-	},
-	/* Read cache boundary pages. */
-	{
-		.offset = DSO__DATA_CACHE_SIZE - DSO__DATA_CACHE_SIZE % 10,
-		.data   = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
-		.size   = 10,
-	},
-	/* Fill final cache page. */
-	{
-		.offset = TEST_FILE_SIZE - 10,
-		.data   = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
-		.size   = 10,
-	},
-	/* Read final cache page. */
-	{
-		.offset = TEST_FILE_SIZE - 10,
-		.data   = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
-		.size   = 10,
-	},
-	/* Read final cache page. */
-	{
-		.offset = TEST_FILE_SIZE - 3,
-		.data   = { 7, 8, 9, 0, 0, 0, 0, 0, 0, 0 },
-		.size   = 3,
-	},
-};
-
-int test__dso_data(void)
-{
-	struct machine machine;
-	struct dso *dso;
-	char *file = test_file(TEST_FILE_SIZE);
-	size_t i;
-
-	TEST_ASSERT_VAL("No test file", file);
-
-	memset(&machine, 0, sizeof(machine));
-
-	dso = dso__new((const char *)file);
-
-	/* Basic 10 bytes tests. */
-	for (i = 0; i < ARRAY_SIZE(offsets); i++) {
-		struct test_data_offset *data = &offsets[i];
-		ssize_t size;
-		u8 buf[10];
-
-		memset(buf, 0, 10);
-		size = dso__data_read_offset(dso, &machine, data->offset,
-				     buf, 10);
-
-		TEST_ASSERT_VAL("Wrong size", size == data->size);
-		TEST_ASSERT_VAL("Wrong data", !memcmp(buf, data->data, 10));
-	}
-
-	/* Read cross multiple cache pages. */
-	{
-		ssize_t size;
-		int c;
-		u8 *buf;
-
-		buf = malloc(TEST_FILE_SIZE);
-		TEST_ASSERT_VAL("ENOMEM\n", buf);
-
-		/* First iteration to fill caches, second one to read them. */
-		for (c = 0; c < 2; c++) {
-			memset(buf, 0, TEST_FILE_SIZE);
-			size = dso__data_read_offset(dso, &machine, 10,
-						     buf, TEST_FILE_SIZE);
-
-			TEST_ASSERT_VAL("Wrong size",
-				size == (TEST_FILE_SIZE - 10));
-
-			for (i = 0; i < (size_t)size; i++)
-				TEST_ASSERT_VAL("Wrong data",
-					buf[i] == (i % 10));
-		}
-
-		free(buf);
-	}
-
-	dso__delete(dso);
-	unlink(file);
-	return 0;
-}
diff --git a/src/tools/perf/tests/evsel-roundtrip-name.c b/src/tools/perf/tests/evsel-roundtrip-name.c
deleted file mode 100644
index 0197bda..0000000
--- a/src/tools/perf/tests/evsel-roundtrip-name.c
+++ /dev/null
@@ -1,114 +0,0 @@
-#include "evlist.h"
-#include "evsel.h"
-#include "parse-events.h"
-#include "tests.h"
-
-static int perf_evsel__roundtrip_cache_name_test(void)
-{
-	char name[128];
-	int type, op, err = 0, ret = 0, i, idx;
-	struct perf_evsel *evsel;
-	struct perf_evlist *evlist = perf_evlist__new();
-
-        if (evlist == NULL)
-                return -ENOMEM;
-
-	for (type = 0; type < PERF_COUNT_HW_CACHE_MAX; type++) {
-		for (op = 0; op < PERF_COUNT_HW_CACHE_OP_MAX; op++) {
-			/* skip invalid cache type */
-			if (!perf_evsel__is_cache_op_valid(type, op))
-				continue;
-
-			for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
-				__perf_evsel__hw_cache_type_op_res_name(type, op, i,
-									name, sizeof(name));
-				err = parse_events(evlist, name);
-				if (err)
-					ret = err;
-			}
-		}
-	}
-
-	idx = 0;
-	evsel = perf_evlist__first(evlist);
-
-	for (type = 0; type < PERF_COUNT_HW_CACHE_MAX; type++) {
-		for (op = 0; op < PERF_COUNT_HW_CACHE_OP_MAX; op++) {
-			/* skip invalid cache type */
-			if (!perf_evsel__is_cache_op_valid(type, op))
-				continue;
-
-			for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
-				__perf_evsel__hw_cache_type_op_res_name(type, op, i,
-									name, sizeof(name));
-				if (evsel->idx != idx)
-					continue;
-
-				++idx;
-
-				if (strcmp(perf_evsel__name(evsel), name)) {
-					pr_debug("%s != %s\n", perf_evsel__name(evsel), name);
-					ret = -1;
-				}
-
-				evsel = perf_evsel__next(evsel);
-			}
-		}
-	}
-
-	perf_evlist__delete(evlist);
-	return ret;
-}
-
-static int __perf_evsel__name_array_test(const char *names[], int nr_names)
-{
-	int i, err;
-	struct perf_evsel *evsel;
-	struct perf_evlist *evlist = perf_evlist__new();
-
-        if (evlist == NULL)
-                return -ENOMEM;
-
-	for (i = 0; i < nr_names; ++i) {
-		err = parse_events(evlist, names[i]);
-		if (err) {
-			pr_debug("failed to parse event '%s', err %d\n",
-				 names[i], err);
-			goto out_delete_evlist;
-		}
-	}
-
-	err = 0;
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		if (strcmp(perf_evsel__name(evsel), names[evsel->idx])) {
-			--err;
-			pr_debug("%s != %s\n", perf_evsel__name(evsel), names[evsel->idx]);
-		}
-	}
-
-out_delete_evlist:
-	perf_evlist__delete(evlist);
-	return err;
-}
-
-#define perf_evsel__name_array_test(names) \
-	__perf_evsel__name_array_test(names, ARRAY_SIZE(names))
-
-int test__perf_evsel__roundtrip_name_test(void)
-{
-	int err = 0, ret = 0;
-
-	err = perf_evsel__name_array_test(perf_evsel__hw_names);
-	if (err)
-		ret = err;
-
-	err = perf_evsel__name_array_test(perf_evsel__sw_names);
-	if (err)
-		ret = err;
-
-	err = perf_evsel__roundtrip_cache_name_test();
-	if (err)
-		ret = err;
-
-	return ret;
-}
diff --git a/src/tools/perf/tests/evsel-tp-sched.c b/src/tools/perf/tests/evsel-tp-sched.c
deleted file mode 100644
index 9b98c15..0000000
--- a/src/tools/perf/tests/evsel-tp-sched.c
+++ /dev/null
@@ -1,84 +0,0 @@
-#include <traceevent/event-parse.h>
-#include "evsel.h"
-#include "tests.h"
-
-static int perf_evsel__test_field(struct perf_evsel *evsel, const char *name,
-				  int size, bool should_be_signed)
-{
-	struct format_field *field = perf_evsel__field(evsel, name);
-	int is_signed;
-	int ret = 0;
-
-	if (field == NULL) {
-		pr_debug("%s: \"%s\" field not found!\n", evsel->name, name);
-		return -1;
-	}
-
-	is_signed = !!(field->flags | FIELD_IS_SIGNED);
-	if (should_be_signed && !is_signed) {
-		pr_debug("%s: \"%s\" signedness(%d) is wrong, should be %d\n",
-			 evsel->name, name, is_signed, should_be_signed);
-		ret = -1;
-	}
-
-	if (field->size != size) {
-		pr_debug("%s: \"%s\" size (%d) should be %d!\n",
-			 evsel->name, name, field->size, size);
-		ret = -1;
-	}
-
-	return ret;
-}
-
-int test__perf_evsel__tp_sched_test(void)
-{
-	struct perf_evsel *evsel = perf_evsel__newtp("sched", "sched_switch", 0);
-	int ret = 0;
-
-	if (evsel == NULL) {
-		pr_debug("perf_evsel__new\n");
-		return -1;
-	}
-
-	if (perf_evsel__test_field(evsel, "prev_comm", 16, true))
-		ret = -1;
-
-	if (perf_evsel__test_field(evsel, "prev_pid", 4, true))
-		ret = -1;
-
-	if (perf_evsel__test_field(evsel, "prev_prio", 4, true))
-		ret = -1;
-
-	if (perf_evsel__test_field(evsel, "prev_state", sizeof(long), true))
-		ret = -1;
-
-	if (perf_evsel__test_field(evsel, "next_comm", 16, true))
-		ret = -1;
-
-	if (perf_evsel__test_field(evsel, "next_pid", 4, true))
-		ret = -1;
-
-	if (perf_evsel__test_field(evsel, "next_prio", 4, true))
-		ret = -1;
-
-	perf_evsel__delete(evsel);
-
-	evsel = perf_evsel__newtp("sched", "sched_wakeup", 0);
-
-	if (perf_evsel__test_field(evsel, "comm", 16, true))
-		ret = -1;
-
-	if (perf_evsel__test_field(evsel, "pid", 4, true))
-		ret = -1;
-
-	if (perf_evsel__test_field(evsel, "prio", 4, true))
-		ret = -1;
-
-	if (perf_evsel__test_field(evsel, "success", 4, true))
-		ret = -1;
-
-	if (perf_evsel__test_field(evsel, "target_cpu", 4, true))
-		ret = -1;
-
-	return ret;
-}
diff --git a/src/tools/perf/tests/hists_link.c b/src/tools/perf/tests/hists_link.c
deleted file mode 100644
index 4228ffc..0000000
--- a/src/tools/perf/tests/hists_link.c
+++ /dev/null
@@ -1,497 +0,0 @@
-#include "perf.h"
-#include "tests.h"
-#include "debug.h"
-#include "symbol.h"
-#include "sort.h"
-#include "evsel.h"
-#include "evlist.h"
-#include "machine.h"
-#include "thread.h"
-#include "parse-events.h"
-
-static struct {
-	u32 pid;
-	const char *comm;
-} fake_threads[] = {
-	{ 100, "perf" },
-	{ 200, "perf" },
-	{ 300, "bash" },
-};
-
-static struct {
-	u32 pid;
-	u64 start;
-	const char *filename;
-} fake_mmap_info[] = {
-	{ 100, 0x40000, "perf" },
-	{ 100, 0x50000, "libc" },
-	{ 100, 0xf0000, "[kernel]" },
-	{ 200, 0x40000, "perf" },
-	{ 200, 0x50000, "libc" },
-	{ 200, 0xf0000, "[kernel]" },
-	{ 300, 0x40000, "bash" },
-	{ 300, 0x50000, "libc" },
-	{ 300, 0xf0000, "[kernel]" },
-};
-
-struct fake_sym {
-	u64 start;
-	u64 length;
-	const char *name;
-};
-
-static struct fake_sym perf_syms[] = {
-	{ 700, 100, "main" },
-	{ 800, 100, "run_command" },
-	{ 900, 100, "cmd_record" },
-};
-
-static struct fake_sym bash_syms[] = {
-	{ 700, 100, "main" },
-	{ 800, 100, "xmalloc" },
-	{ 900, 100, "xfree" },
-};
-
-static struct fake_sym libc_syms[] = {
-	{ 700, 100, "malloc" },
-	{ 800, 100, "free" },
-	{ 900, 100, "realloc" },
-};
-
-static struct fake_sym kernel_syms[] = {
-	{ 700, 100, "schedule" },
-	{ 800, 100, "page_fault" },
-	{ 900, 100, "sys_perf_event_open" },
-};
-
-static struct {
-	const char *dso_name;
-	struct fake_sym *syms;
-	size_t nr_syms;
-} fake_symbols[] = {
-	{ "perf", perf_syms, ARRAY_SIZE(perf_syms) },
-	{ "bash", bash_syms, ARRAY_SIZE(bash_syms) },
-	{ "libc", libc_syms, ARRAY_SIZE(libc_syms) },
-	{ "[kernel]", kernel_syms, ARRAY_SIZE(kernel_syms) },
-};
-
-static struct machine *setup_fake_machine(struct machines *machines)
-{
-	struct machine *machine = machines__find(machines, HOST_KERNEL_ID);
-	size_t i;
-
-	if (machine == NULL) {
-		pr_debug("Not enough memory for machine setup\n");
-		return NULL;
-	}
-
-	for (i = 0; i < ARRAY_SIZE(fake_threads); i++) {
-		struct thread *thread;
-
-		thread = machine__findnew_thread(machine, fake_threads[i].pid,
-						 fake_threads[i].pid);
-		if (thread == NULL)
-			goto out;
-
-		thread__set_comm(thread, fake_threads[i].comm);
-	}
-
-	for (i = 0; i < ARRAY_SIZE(fake_mmap_info); i++) {
-		union perf_event fake_mmap_event = {
-			.mmap = {
-				.header = { .misc = PERF_RECORD_MISC_USER, },
-				.pid = fake_mmap_info[i].pid,
-				.start = fake_mmap_info[i].start,
-				.len = 0x1000ULL,
-				.pgoff = 0ULL,
-			},
-		};
-
-		strcpy(fake_mmap_event.mmap.filename,
-		       fake_mmap_info[i].filename);
-
-		machine__process_mmap_event(machine, &fake_mmap_event);
-	}
-
-	for (i = 0; i < ARRAY_SIZE(fake_symbols); i++) {
-		size_t k;
-		struct dso *dso;
-
-		dso = __dsos__findnew(&machine->user_dsos,
-				      fake_symbols[i].dso_name);
-		if (dso == NULL)
-			goto out;
-
-		/* emulate dso__load() */
-		dso__set_loaded(dso, MAP__FUNCTION);
-
-		for (k = 0; k < fake_symbols[i].nr_syms; k++) {
-			struct symbol *sym;
-			struct fake_sym *fsym = &fake_symbols[i].syms[k];
-
-			sym = symbol__new(fsym->start, fsym->length,
-					  STB_GLOBAL, fsym->name);
-			if (sym == NULL)
-				goto out;
-
-			symbols__insert(&dso->symbols[MAP__FUNCTION], sym);
-		}
-	}
-
-	return machine;
-
-out:
-	pr_debug("Not enough memory for machine setup\n");
-	machine__delete_threads(machine);
-	machine__delete(machine);
-	return NULL;
-}
-
-struct sample {
-	u32 pid;
-	u64 ip;
-	struct thread *thread;
-	struct map *map;
-	struct symbol *sym;
-};
-
-static struct sample fake_common_samples[] = {
-	/* perf [kernel] schedule() */
-	{ .pid = 100, .ip = 0xf0000 + 700, },
-	/* perf [perf]   main() */
-	{ .pid = 200, .ip = 0x40000 + 700, },
-	/* perf [perf]   cmd_record() */
-	{ .pid = 200, .ip = 0x40000 + 900, },
-	/* bash [bash]   xmalloc() */
-	{ .pid = 300, .ip = 0x40000 + 800, },
-	/* bash [libc]   malloc() */
-	{ .pid = 300, .ip = 0x50000 + 700, },
-};
-
-static struct sample fake_samples[][5] = {
-	{
-		/* perf [perf]   run_command() */
-		{ .pid = 100, .ip = 0x40000 + 800, },
-		/* perf [libc]   malloc() */
-		{ .pid = 100, .ip = 0x50000 + 700, },
-		/* perf [kernel] page_fault() */
-		{ .pid = 100, .ip = 0xf0000 + 800, },
-		/* perf [kernel] sys_perf_event_open() */
-		{ .pid = 200, .ip = 0xf0000 + 900, },
-		/* bash [libc]   free() */
-		{ .pid = 300, .ip = 0x50000 + 800, },
-	},
-	{
-		/* perf [libc]   free() */
-		{ .pid = 200, .ip = 0x50000 + 800, },
-		/* bash [libc]   malloc() */
-		{ .pid = 300, .ip = 0x50000 + 700, }, /* will be merged */
-		/* bash [bash]   xfee() */
-		{ .pid = 300, .ip = 0x40000 + 900, },
-		/* bash [libc]   realloc() */
-		{ .pid = 300, .ip = 0x50000 + 900, },
-		/* bash [kernel] page_fault() */
-		{ .pid = 300, .ip = 0xf0000 + 800, },
-	},
-};
-
-static int add_hist_entries(struct perf_evlist *evlist, struct machine *machine)
-{
-	struct perf_evsel *evsel;
-	struct addr_location al;
-	struct hist_entry *he;
-	struct perf_sample sample = { .cpu = 0, };
-	size_t i = 0, k;
-
-	/*
-	 * each evsel will have 10 samples - 5 common and 5 distinct.
-	 * However the second evsel also has a collapsed entry for
-	 * "bash [libc] malloc" so total 9 entries will be in the tree.
-	 */
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		for (k = 0; k < ARRAY_SIZE(fake_common_samples); k++) {
-			const union perf_event event = {
-				.header = {
-					.misc = PERF_RECORD_MISC_USER,
-				},
-			};
-
-			sample.pid = fake_common_samples[k].pid;
-			sample.ip = fake_common_samples[k].ip;
-			if (perf_event__preprocess_sample(&event, machine, &al,
-							  &sample) < 0)
-				goto out;
-
-			he = __hists__add_entry(&evsel->hists, &al, NULL, 1, 1);
-			if (he == NULL)
-				goto out;
-
-			fake_common_samples[k].thread = al.thread;
-			fake_common_samples[k].map = al.map;
-			fake_common_samples[k].sym = al.sym;
-		}
-
-		for (k = 0; k < ARRAY_SIZE(fake_samples[i]); k++) {
-			const union perf_event event = {
-				.header = {
-					.misc = PERF_RECORD_MISC_USER,
-				},
-			};
-
-			sample.pid = fake_samples[i][k].pid;
-			sample.ip = fake_samples[i][k].ip;
-			if (perf_event__preprocess_sample(&event, machine, &al,
-							  &sample) < 0)
-				goto out;
-
-			he = __hists__add_entry(&evsel->hists, &al, NULL, 1, 1);
-			if (he == NULL)
-				goto out;
-
-			fake_samples[i][k].thread = al.thread;
-			fake_samples[i][k].map = al.map;
-			fake_samples[i][k].sym = al.sym;
-		}
-		i++;
-	}
-
-	return 0;
-
-out:
-	pr_debug("Not enough memory for adding a hist entry\n");
-	return -1;
-}
-
-static int find_sample(struct sample *samples, size_t nr_samples,
-		       struct thread *t, struct map *m, struct symbol *s)
-{
-	while (nr_samples--) {
-		if (samples->thread == t && samples->map == m &&
-		    samples->sym == s)
-			return 1;
-		samples++;
-	}
-	return 0;
-}
-
-static int __validate_match(struct hists *hists)
-{
-	size_t count = 0;
-	struct rb_root *root;
-	struct rb_node *node;
-
-	/*
-	 * Only entries from fake_common_samples should have a pair.
-	 */
-	if (sort__need_collapse)
-		root = &hists->entries_collapsed;
-	else
-		root = hists->entries_in;
-
-	node = rb_first(root);
-	while (node) {
-		struct hist_entry *he;
-
-		he = rb_entry(node, struct hist_entry, rb_node_in);
-
-		if (hist_entry__has_pairs(he)) {
-			if (find_sample(fake_common_samples,
-					ARRAY_SIZE(fake_common_samples),
-					he->thread, he->ms.map, he->ms.sym)) {
-				count++;
-			} else {
-				pr_debug("Can't find the matched entry\n");
-				return -1;
-			}
-		}
-
-		node = rb_next(node);
-	}
-
-	if (count != ARRAY_SIZE(fake_common_samples)) {
-		pr_debug("Invalid count for matched entries: %zd of %zd\n",
-			 count, ARRAY_SIZE(fake_common_samples));
-		return -1;
-	}
-
-	return 0;
-}
-
-static int validate_match(struct hists *leader, struct hists *other)
-{
-	return __validate_match(leader) || __validate_match(other);
-}
-
-static int __validate_link(struct hists *hists, int idx)
-{
-	size_t count = 0;
-	size_t count_pair = 0;
-	size_t count_dummy = 0;
-	struct rb_root *root;
-	struct rb_node *node;
-
-	/*
-	 * Leader hists (idx = 0) will have dummy entries from other,
-	 * and some entries will have no pair.  However every entry
-	 * in other hists should have (dummy) pair.
-	 */
-	if (sort__need_collapse)
-		root = &hists->entries_collapsed;
-	else
-		root = hists->entries_in;
-
-	node = rb_first(root);
-	while (node) {
-		struct hist_entry *he;
-
-		he = rb_entry(node, struct hist_entry, rb_node_in);
-
-		if (hist_entry__has_pairs(he)) {
-			if (!find_sample(fake_common_samples,
-					 ARRAY_SIZE(fake_common_samples),
-					 he->thread, he->ms.map, he->ms.sym) &&
-			    !find_sample(fake_samples[idx],
-					 ARRAY_SIZE(fake_samples[idx]),
-					 he->thread, he->ms.map, he->ms.sym)) {
-				count_dummy++;
-			}
-			count_pair++;
-		} else if (idx) {
-			pr_debug("A entry from the other hists should have pair\n");
-			return -1;
-		}
-
-		count++;
-		node = rb_next(node);
-	}
-
-	/*
-	 * Note that we have a entry collapsed in the other (idx = 1) hists.
-	 */
-	if (idx == 0) {
-		if (count_dummy != ARRAY_SIZE(fake_samples[1]) - 1) {
-			pr_debug("Invalid count of dummy entries: %zd of %zd\n",
-				 count_dummy, ARRAY_SIZE(fake_samples[1]) - 1);
-			return -1;
-		}
-		if (count != count_pair + ARRAY_SIZE(fake_samples[0])) {
-			pr_debug("Invalid count of total leader entries: %zd of %zd\n",
-				 count, count_pair + ARRAY_SIZE(fake_samples[0]));
-			return -1;
-		}
-	} else {
-		if (count != count_pair) {
-			pr_debug("Invalid count of total other entries: %zd of %zd\n",
-				 count, count_pair);
-			return -1;
-		}
-		if (count_dummy > 0) {
-			pr_debug("Other hists should not have dummy entries: %zd\n",
-				 count_dummy);
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-static int validate_link(struct hists *leader, struct hists *other)
-{
-	return __validate_link(leader, 0) || __validate_link(other, 1);
-}
-
-static void print_hists(struct hists *hists)
-{
-	int i = 0;
-	struct rb_root *root;
-	struct rb_node *node;
-
-	if (sort__need_collapse)
-		root = &hists->entries_collapsed;
-	else
-		root = hists->entries_in;
-
-	pr_info("----- %s --------\n", __func__);
-	node = rb_first(root);
-	while (node) {
-		struct hist_entry *he;
-
-		he = rb_entry(node, struct hist_entry, rb_node_in);
-
-		pr_info("%2d: entry: %-8s [%-8s] %20s: period = %"PRIu64"\n",
-			i, he->thread->comm, he->ms.map->dso->short_name,
-			he->ms.sym->name, he->stat.period);
-
-		i++;
-		node = rb_next(node);
-	}
-}
-
-int test__hists_link(void)
-{
-	int err = -1;
-	struct machines machines;
-	struct machine *machine = NULL;
-	struct perf_evsel *evsel, *first;
-	struct perf_evlist *evlist = perf_evlist__new();
-
-	if (evlist == NULL)
-                return -ENOMEM;
-
-	err = parse_events(evlist, "cpu-clock");
-	if (err)
-		goto out;
-	err = parse_events(evlist, "task-clock");
-	if (err)
-		goto out;
-
-	/* default sort order (comm,dso,sym) will be used */
-	if (setup_sorting() < 0)
-		goto out;
-
-	machines__init(&machines);
-
-	/* setup threads/dso/map/symbols also */
-	machine = setup_fake_machine(&machines);
-	if (!machine)
-		goto out;
-
-	if (verbose > 1)
-		machine__fprintf(machine, stderr);
-
-	/* process sample events */
-	err = add_hist_entries(evlist, machine);
-	if (err < 0)
-		goto out;
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		hists__collapse_resort(&evsel->hists);
-
-		if (verbose > 2)
-			print_hists(&evsel->hists);
-	}
-
-	first = perf_evlist__first(evlist);
-	evsel = perf_evlist__last(evlist);
-
-	/* match common entries */
-	hists__match(&first->hists, &evsel->hists);
-	err = validate_match(&first->hists, &evsel->hists);
-	if (err)
-		goto out;
-
-	/* link common and/or dummy entries */
-	hists__link(&first->hists, &evsel->hists);
-	err = validate_link(&first->hists, &evsel->hists);
-	if (err)
-		goto out;
-
-	err = 0;
-
-out:
-	/* tear down everything */
-	perf_evlist__delete(evlist);
-	machines__exit(&machines);
-
-	return err;
-}
diff --git a/src/tools/perf/tests/keep-tracking.c b/src/tools/perf/tests/keep-tracking.c
deleted file mode 100644
index 376c356..0000000
--- a/src/tools/perf/tests/keep-tracking.c
+++ /dev/null
@@ -1,155 +0,0 @@
-#include <sys/types.h>
-#include <unistd.h>
-#include <sys/prctl.h>
-
-#include "parse-events.h"
-#include "evlist.h"
-#include "evsel.h"
-#include "thread_map.h"
-#include "cpumap.h"
-#include "tests.h"
-
-#define CHECK__(x) {				\
-	while ((x) < 0) {			\
-		pr_debug(#x " failed!\n");	\
-		goto out_err;			\
-	}					\
-}
-
-#define CHECK_NOT_NULL__(x) {			\
-	while ((x) == NULL) {			\
-		pr_debug(#x " failed!\n");	\
-		goto out_err;			\
-	}					\
-}
-
-static int find_comm(struct perf_evlist *evlist, const char *comm)
-{
-	union perf_event *event;
-	int i, found;
-
-	found = 0;
-	for (i = 0; i < evlist->nr_mmaps; i++) {
-		while ((event = perf_evlist__mmap_read(evlist, i)) != NULL) {
-			if (event->header.type == PERF_RECORD_COMM &&
-			    (pid_t)event->comm.pid == getpid() &&
-			    (pid_t)event->comm.tid == getpid() &&
-			    strcmp(event->comm.comm, comm) == 0)
-				found += 1;
-			perf_evlist__mmap_consume(evlist, i);
-		}
-	}
-	return found;
-}
-
-/**
- * test__keep_tracking - test using a dummy software event to keep tracking.
- *
- * This function implements a test that checks that tracking events continue
- * when an event is disabled but a dummy software event is not disabled.  If the
- * test passes %0 is returned, otherwise %-1 is returned.
- */
-int test__keep_tracking(void)
-{
-	struct perf_record_opts opts = {
-		.mmap_pages	     = UINT_MAX,
-		.user_freq	     = UINT_MAX,
-		.user_interval	     = ULLONG_MAX,
-		.freq		     = 4000,
-		.target		     = {
-			.uses_mmap   = true,
-		},
-	};
-	struct thread_map *threads = NULL;
-	struct cpu_map *cpus = NULL;
-	struct perf_evlist *evlist = NULL;
-	struct perf_evsel *evsel = NULL;
-	int found, err = -1;
-	const char *comm;
-
-	threads = thread_map__new(-1, getpid(), UINT_MAX);
-	CHECK_NOT_NULL__(threads);
-
-	cpus = cpu_map__new(NULL);
-	CHECK_NOT_NULL__(cpus);
-
-	evlist = perf_evlist__new();
-	CHECK_NOT_NULL__(evlist);
-
-	perf_evlist__set_maps(evlist, cpus, threads);
-
-	CHECK__(parse_events(evlist, "dummy:u"));
-	CHECK__(parse_events(evlist, "cycles:u"));
-
-	perf_evlist__config(evlist, &opts);
-
-	evsel = perf_evlist__first(evlist);
-
-	evsel->attr.comm = 1;
-	evsel->attr.disabled = 1;
-	evsel->attr.enable_on_exec = 0;
-
-	if (perf_evlist__open(evlist) < 0) {
-		fprintf(stderr, " (not supported)");
-		err = 0;
-		goto out_err;
-	}
-
-	CHECK__(perf_evlist__mmap(evlist, UINT_MAX, false));
-
-	/*
-	 * First, test that a 'comm' event can be found when the event is
-	 * enabled.
-	 */
-
-	perf_evlist__enable(evlist);
-
-	comm = "Test COMM 1";
-	CHECK__(prctl(PR_SET_NAME, (unsigned long)comm, 0, 0, 0));
-
-	perf_evlist__disable(evlist);
-
-	found = find_comm(evlist, comm);
-	if (found != 1) {
-		pr_debug("First time, failed to find tracking event.\n");
-		goto out_err;
-	}
-
-	/*
-	 * Secondly, test that a 'comm' event can be found when the event is
-	 * disabled with the dummy event still enabled.
-	 */
-
-	perf_evlist__enable(evlist);
-
-	evsel = perf_evlist__last(evlist);
-
-	CHECK__(perf_evlist__disable_event(evlist, evsel));
-
-	comm = "Test COMM 2";
-	CHECK__(prctl(PR_SET_NAME, (unsigned long)comm, 0, 0, 0));
-
-	perf_evlist__disable(evlist);
-
-	found = find_comm(evlist, comm);
-	if (found != 1) {
-		pr_debug("Seconf time, failed to find tracking event.\n");
-		goto out_err;
-	}
-
-	err = 0;
-
-out_err:
-	if (evlist) {
-		perf_evlist__disable(evlist);
-		perf_evlist__munmap(evlist);
-		perf_evlist__close(evlist);
-		perf_evlist__delete(evlist);
-	}
-	if (cpus)
-		cpu_map__delete(cpus);
-	if (threads)
-		thread_map__delete(threads);
-
-	return err;
-}
diff --git a/src/tools/perf/tests/make b/src/tools/perf/tests/make
deleted file mode 100644
index 2ca0abf..0000000
--- a/src/tools/perf/tests/make
+++ /dev/null
@@ -1,189 +0,0 @@
-PERF := .
-MK   := Makefile
-
-has = $(shell which $1 2>/dev/null)
-
-# standard single make variable specified
-make_clean_all      := clean all
-make_python_perf_so := python/perf.so
-make_debug          := DEBUG=1
-make_no_libperl     := NO_LIBPERL=1
-make_no_libpython   := NO_LIBPYTHON=1
-make_no_scripts     := NO_LIBPYTHON=1 NO_LIBPERL=1
-make_no_newt        := NO_NEWT=1
-make_no_slang       := NO_SLANG=1
-make_no_gtk2        := NO_GTK2=1
-make_no_ui          := NO_NEWT=1 NO_SLANG=1 NO_GTK2=1
-make_no_demangle    := NO_DEMANGLE=1
-make_no_libelf      := NO_LIBELF=1
-make_no_libunwind   := NO_LIBUNWIND=1
-make_no_backtrace   := NO_BACKTRACE=1
-make_no_libnuma     := NO_LIBNUMA=1
-make_no_libaudit    := NO_LIBAUDIT=1
-make_no_libbionic   := NO_LIBBIONIC=1
-make_tags           := tags
-make_cscope         := cscope
-make_help           := help
-make_doc            := doc
-make_perf_o         := perf.o
-make_util_map_o     := util/map.o
-make_install        := install
-make_install_bin    := install-bin
-make_install_doc    := install-doc
-make_install_man    := install-man
-make_install_html   := install-html
-make_install_info   := install-info
-make_install_pdf    := install-pdf
-
-# all the NO_* variable combined
-make_minimal        := NO_LIBPERL=1 NO_LIBPYTHON=1 NO_NEWT=1 NO_GTK2=1
-make_minimal        += NO_DEMANGLE=1 NO_LIBELF=1 NO_LIBUNWIND=1 NO_BACKTRACE=1
-make_minimal        += NO_LIBNUMA=1 NO_LIBAUDIT=1 NO_LIBBIONIC=1
-
-# $(run) contains all available tests
-run := make_pure
-run += make_clean_all
-run += make_python_perf_so
-run += make_debug
-run += make_no_libperl
-run += make_no_libpython
-run += make_no_scripts
-run += make_no_newt
-run += make_no_slang
-run += make_no_gtk2
-run += make_no_ui
-run += make_no_demangle
-run += make_no_libelf
-run += make_no_libunwind
-run += make_no_backtrace
-run += make_no_libnuma
-run += make_no_libaudit
-run += make_no_libbionic
-run += make_help
-run += make_doc
-run += make_perf_o
-run += make_util_map_o
-run += make_install
-run += make_install_bin
-# FIXME 'install-*' commented out till they're fixed
-# run += make_install_doc
-# run += make_install_man
-# run += make_install_html
-# run += make_install_info
-# run += make_install_pdf
-run += make_minimal
-
-ifneq ($(call has,ctags),)
-run += make_tags
-endif
-ifneq ($(call has,cscope),)
-run += make_cscope
-endif
-
-# $(run_O) contains same portion of $(run) tests with '_O' attached
-# to distinguish O=... tests
-run_O := $(addsuffix _O,$(run))
-
-# disable some tests for O=...
-run_O := $(filter-out make_python_perf_so_O,$(run_O))
-
-# define test for each compile as 'test_NAME' variable
-# with the test itself as a value
-test_make_tags   = test -f tags
-test_make_cscope = test -f cscope.out
-
-test_make_tags_O   := $(test_make_tags)
-test_make_cscope_O := $(test_make_cscope)
-
-test_ok          := true
-test_make_help   := $(test_ok)
-test_make_doc    := $(test_ok)
-test_make_help_O := $(test_ok)
-test_make_doc_O  := $(test_ok)
-
-test_make_python_perf_so := test -f $(PERF)/python/perf.so
-
-test_make_perf_o     := test -f $(PERF)/perf.o
-test_make_util_map_o := test -f $(PERF)/util/map.o
-
-test_make_install       := test -x $$TMP_DEST/bin/perf
-test_make_install_O     := $(test_make_install)
-test_make_install_bin   := $(test_make_install)
-test_make_install_bin_O := $(test_make_install)
-
-# FIXME nothing gets installed
-test_make_install_man    := test -f $$TMP_DEST/share/man/man1/perf.1
-test_make_install_man_O  := $(test_make_install_man)
-
-# FIXME nothing gets installed
-test_make_install_doc    := $(test_ok)
-test_make_install_doc_O  := $(test_ok)
-
-# FIXME nothing gets installed
-test_make_install_html   := $(test_ok)
-test_make_install_html_O := $(test_ok)
-
-# FIXME nothing gets installed
-test_make_install_info   := $(test_ok)
-test_make_install_info_O := $(test_ok)
-
-# FIXME nothing gets installed
-test_make_install_pdf    := $(test_ok)
-test_make_install_pdf_O  := $(test_ok)
-
-# Kbuild tests only
-#test_make_python_perf_so_O := test -f $$TMP/tools/perf/python/perf.so
-#test_make_perf_o_O         := test -f $$TMP/tools/perf/perf.o
-#test_make_util_map_o_O     := test -f $$TMP/tools/perf/util/map.o
-
-test_make_perf_o_O     := true
-test_make_util_map_o_O := true
-
-test_default = test -x $(PERF)/perf
-test = $(if $(test_$1),$(test_$1),$(test_default))
-
-test_default_O = test -x $$TMP_O/perf
-test_O = $(if $(test_$1),$(test_$1),$(test_default_O))
-
-all:
-
-ifdef DEBUG
-d := $(info run   $(run))
-d := $(info run_O $(run_O))
-endif
-
-MAKEFLAGS := --no-print-directory
-
-clean := @(cd $(PERF); make -s -f $(MK) clean >/dev/null)
-
-$(run):
-	$(call clean)
-	@TMP_DEST=$$(mktemp -d); \
-	cmd="cd $(PERF) && make -f $(MK) DESTDIR=$$TMP_DEST $($@)"; \
-	echo "- $@: $$cmd" && echo $$cmd > $@ && \
-	( eval $$cmd ) >> $@ 2>&1; \
-	echo "  test: $(call test,$@)"; \
-	$(call test,$@) && \
-	rm -f $@ \
-	rm -rf $$TMP_DEST
-
-$(run_O):
-	$(call clean)
-	@TMP_O=$$(mktemp -d); \
-	TMP_DEST=$$(mktemp -d); \
-	cmd="cd $(PERF) && make -f $(MK) O=$$TMP_O DESTDIR=$$TMP_DEST $($(patsubst %_O,%,$@))"; \
-	echo "- $@: $$cmd" && echo $$cmd > $@ && \
-	( eval $$cmd ) >> $@ 2>&1 && \
-	echo "  test: $(call test_O,$@)"; \
-	$(call test_O,$@) && \
-	rm -f $@ && \
-	rm -rf $$TMP_O \
-	rm -rf $$TMP_DEST
-
-all: $(run) $(run_O)
-	@echo OK
-
-out: $(run_O)
-	@echo OK
-
-.PHONY: all $(run) $(run_O) clean
diff --git a/src/tools/perf/tests/mmap-basic.c b/src/tools/perf/tests/mmap-basic.c
deleted file mode 100644
index a7232c2..0000000
--- a/src/tools/perf/tests/mmap-basic.c
+++ /dev/null
@@ -1,151 +0,0 @@
-#include "evlist.h"
-#include "evsel.h"
-#include "thread_map.h"
-#include "cpumap.h"
-#include "tests.h"
-
-/*
- * This test will generate random numbers of calls to some getpid syscalls,
- * then establish an mmap for a group of events that are created to monitor
- * the syscalls.
- *
- * It will receive the events, using mmap, use its PERF_SAMPLE_ID generated
- * sample.id field to map back to its respective perf_evsel instance.
- *
- * Then it checks if the number of syscalls reported as perf events by
- * the kernel corresponds to the number of syscalls made.
- */
-int test__basic_mmap(void)
-{
-	int err = -1;
-	union perf_event *event;
-	struct thread_map *threads;
-	struct cpu_map *cpus;
-	struct perf_evlist *evlist;
-	cpu_set_t cpu_set;
-	const char *syscall_names[] = { "getsid", "getppid", "getpgrp",
-					"getpgid", };
-	pid_t (*syscalls[])(void) = { (void *)getsid, getppid, getpgrp,
-				      (void*)getpgid };
-#define nsyscalls ARRAY_SIZE(syscall_names)
-	unsigned int nr_events[nsyscalls],
-		     expected_nr_events[nsyscalls], i, j;
-	struct perf_evsel *evsels[nsyscalls], *evsel;
-
-	threads = thread_map__new(-1, getpid(), UINT_MAX);
-	if (threads == NULL) {
-		pr_debug("thread_map__new\n");
-		return -1;
-	}
-
-	cpus = cpu_map__new(NULL);
-	if (cpus == NULL) {
-		pr_debug("cpu_map__new\n");
-		goto out_free_threads;
-	}
-
-	CPU_ZERO(&cpu_set);
-	CPU_SET(cpus->map[0], &cpu_set);
-	sched_setaffinity(0, sizeof(cpu_set), &cpu_set);
-	if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set) < 0) {
-		pr_debug("sched_setaffinity() failed on CPU %d: %s ",
-			 cpus->map[0], strerror(errno));
-		goto out_free_cpus;
-	}
-
-	evlist = perf_evlist__new();
-	if (evlist == NULL) {
-		pr_debug("perf_evlist__new\n");
-		goto out_free_cpus;
-	}
-
-	perf_evlist__set_maps(evlist, cpus, threads);
-
-	for (i = 0; i < nsyscalls; ++i) {
-		char name[64];
-
-		snprintf(name, sizeof(name), "sys_enter_%s", syscall_names[i]);
-		evsels[i] = perf_evsel__newtp("syscalls", name, i);
-		if (evsels[i] == NULL) {
-			pr_debug("perf_evsel__new\n");
-			goto out_free_evlist;
-		}
-
-		evsels[i]->attr.wakeup_events = 1;
-		perf_evsel__set_sample_id(evsels[i], false);
-
-		perf_evlist__add(evlist, evsels[i]);
-
-		if (perf_evsel__open(evsels[i], cpus, threads) < 0) {
-			pr_debug("failed to open counter: %s, "
-				 "tweak /proc/sys/kernel/perf_event_paranoid?\n",
-				 strerror(errno));
-			goto out_close_fd;
-		}
-
-		nr_events[i] = 0;
-		expected_nr_events[i] = 1 + rand() % 127;
-	}
-
-	if (perf_evlist__mmap(evlist, 128, true) < 0) {
-		pr_debug("failed to mmap events: %d (%s)\n", errno,
-			 strerror(errno));
-		goto out_close_fd;
-	}
-
-	for (i = 0; i < nsyscalls; ++i)
-		for (j = 0; j < expected_nr_events[i]; ++j) {
-			int foo = syscalls[i]();
-			++foo;
-		}
-
-	while ((event = perf_evlist__mmap_read(evlist, 0)) != NULL) {
-		struct perf_sample sample;
-
-		if (event->header.type != PERF_RECORD_SAMPLE) {
-			pr_debug("unexpected %s event\n",
-				 perf_event__name(event->header.type));
-			goto out_munmap;
-		}
-
-		err = perf_evlist__parse_sample(evlist, event, &sample);
-		if (err) {
-			pr_err("Can't parse sample, err = %d\n", err);
-			goto out_munmap;
-		}
-
-		err = -1;
-		evsel = perf_evlist__id2evsel(evlist, sample.id);
-		if (evsel == NULL) {
-			pr_debug("event with id %" PRIu64
-				 " doesn't map to an evsel\n", sample.id);
-			goto out_munmap;
-		}
-		nr_events[evsel->idx]++;
-		perf_evlist__mmap_consume(evlist, 0);
-	}
-
-	err = 0;
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		if (nr_events[evsel->idx] != expected_nr_events[evsel->idx]) {
-			pr_debug("expected %d %s events, got %d\n",
-				 expected_nr_events[evsel->idx],
-				 perf_evsel__name(evsel), nr_events[evsel->idx]);
-			err = -1;
-			goto out_munmap;
-		}
-	}
-
-out_munmap:
-	perf_evlist__munmap(evlist);
-out_close_fd:
-	for (i = 0; i < nsyscalls; ++i)
-		perf_evsel__close_fd(evsels[i], 1, threads->nr);
-out_free_evlist:
-	perf_evlist__delete(evlist);
-out_free_cpus:
-	cpu_map__delete(cpus);
-out_free_threads:
-	thread_map__delete(threads);
-	return err;
-}
diff --git a/src/tools/perf/tests/open-syscall-all-cpus.c b/src/tools/perf/tests/open-syscall-all-cpus.c
deleted file mode 100644
index b0657a9..0000000
--- a/src/tools/perf/tests/open-syscall-all-cpus.c
+++ /dev/null
@@ -1,109 +0,0 @@
-#include "evsel.h"
-#include "tests.h"
-#include "thread_map.h"
-#include "cpumap.h"
-#include "debug.h"
-
-int test__open_syscall_event_on_all_cpus(void)
-{
-	int err = -1, fd, cpu;
-	struct cpu_map *cpus;
-	struct perf_evsel *evsel;
-	unsigned int nr_open_calls = 111, i;
-	cpu_set_t cpu_set;
-	struct thread_map *threads = thread_map__new(-1, getpid(), UINT_MAX);
-
-	if (threads == NULL) {
-		pr_debug("thread_map__new\n");
-		return -1;
-	}
-
-	cpus = cpu_map__new(NULL);
-	if (cpus == NULL) {
-		pr_debug("cpu_map__new\n");
-		goto out_thread_map_delete;
-	}
-
-	CPU_ZERO(&cpu_set);
-
-	evsel = perf_evsel__newtp("syscalls", "sys_enter_open", 0);
-	if (evsel == NULL) {
-		pr_debug("is debugfs mounted on /sys/kernel/debug?\n");
-		goto out_thread_map_delete;
-	}
-
-	if (perf_evsel__open(evsel, cpus, threads) < 0) {
-		pr_debug("failed to open counter: %s, "
-			 "tweak /proc/sys/kernel/perf_event_paranoid?\n",
-			 strerror(errno));
-		goto out_evsel_delete;
-	}
-
-	for (cpu = 0; cpu < cpus->nr; ++cpu) {
-		unsigned int ncalls = nr_open_calls + cpu;
-		/*
-		 * XXX eventually lift this restriction in a way that
-		 * keeps perf building on older glibc installations
-		 * without CPU_ALLOC. 1024 cpus in 2010 still seems
-		 * a reasonable upper limit tho :-)
-		 */
-		if (cpus->map[cpu] >= CPU_SETSIZE) {
-			pr_debug("Ignoring CPU %d\n", cpus->map[cpu]);
-			continue;
-		}
-
-		CPU_SET(cpus->map[cpu], &cpu_set);
-		if (sched_setaffinity(0, sizeof(cpu_set), &cpu_set) < 0) {
-			pr_debug("sched_setaffinity() failed on CPU %d: %s ",
-				 cpus->map[cpu],
-				 strerror(errno));
-			goto out_close_fd;
-		}
-		for (i = 0; i < ncalls; ++i) {
-			fd = open("/etc/passwd", O_RDONLY);
-			close(fd);
-		}
-		CPU_CLR(cpus->map[cpu], &cpu_set);
-	}
-
-	/*
-	 * Here we need to explicitely preallocate the counts, as if
-	 * we use the auto allocation it will allocate just for 1 cpu,
-	 * as we start by cpu 0.
-	 */
-	if (perf_evsel__alloc_counts(evsel, cpus->nr) < 0) {
-		pr_debug("perf_evsel__alloc_counts(ncpus=%d)\n", cpus->nr);
-		goto out_close_fd;
-	}
-
-	err = 0;
-
-	for (cpu = 0; cpu < cpus->nr; ++cpu) {
-		unsigned int expected;
-
-		if (cpus->map[cpu] >= CPU_SETSIZE)
-			continue;
-
-		if (perf_evsel__read_on_cpu(evsel, cpu, 0) < 0) {
-			pr_debug("perf_evsel__read_on_cpu\n");
-			err = -1;
-			break;
-		}
-
-		expected = nr_open_calls + cpu;
-		if (evsel->counts->cpu[cpu].val != expected) {
-			pr_debug("perf_evsel__read_on_cpu: expected to intercept %d calls on cpu %d, got %" PRIu64 "\n",
-				 expected, cpus->map[cpu], evsel->counts->cpu[cpu].val);
-			err = -1;
-		}
-	}
-
-	perf_evsel__free_counts(evsel);
-out_close_fd:
-	perf_evsel__close_fd(evsel, 1, threads->nr);
-out_evsel_delete:
-	perf_evsel__delete(evsel);
-out_thread_map_delete:
-	thread_map__delete(threads);
-	return err;
-}
diff --git a/src/tools/perf/tests/open-syscall-tp-fields.c b/src/tools/perf/tests/open-syscall-tp-fields.c
deleted file mode 100644
index 524b221..0000000
--- a/src/tools/perf/tests/open-syscall-tp-fields.c
+++ /dev/null
@@ -1,123 +0,0 @@
-#include "perf.h"
-#include "evlist.h"
-#include "evsel.h"
-#include "thread_map.h"
-#include "tests.h"
-
-int test__syscall_open_tp_fields(void)
-{
-	struct perf_record_opts opts = {
-		.target = {
-			.uid = UINT_MAX,
-			.uses_mmap = true,
-		},
-		.no_delay   = true,
-		.freq	    = 1,
-		.mmap_pages = 256,
-		.raw_samples = true,
-	};
-	const char *filename = "/etc/passwd";
-	int flags = O_RDONLY | O_DIRECTORY;
-	struct perf_evlist *evlist = perf_evlist__new();
-	struct perf_evsel *evsel;
-	int err = -1, i, nr_events = 0, nr_polls = 0;
-
-	if (evlist == NULL) {
-		pr_debug("%s: perf_evlist__new\n", __func__);
-		goto out;
-	}
-
-	evsel = perf_evsel__newtp("syscalls", "sys_enter_open", 0);
-	if (evsel == NULL) {
-		pr_debug("%s: perf_evsel__newtp\n", __func__);
-		goto out_delete_evlist;
-	}
-
-	perf_evlist__add(evlist, evsel);
-
-	err = perf_evlist__create_maps(evlist, &opts.target);
-	if (err < 0) {
-		pr_debug("%s: perf_evlist__create_maps\n", __func__);
-		goto out_delete_evlist;
-	}
-
-	perf_evsel__config(evsel, &opts);
-
-	evlist->threads->map[0] = getpid();
-
-	err = perf_evlist__open(evlist);
-	if (err < 0) {
-		pr_debug("perf_evlist__open: %s\n", strerror(errno));
-		goto out_delete_maps;
-	}
-
-	err = perf_evlist__mmap(evlist, UINT_MAX, false);
-	if (err < 0) {
-		pr_debug("perf_evlist__mmap: %s\n", strerror(errno));
-		goto out_close_evlist;
-	}
-
-	perf_evlist__enable(evlist);
-
-	/*
-	 * Generate the event:
-	 */
-	open(filename, flags);
-
-	while (1) {
-		int before = nr_events;
-
-		for (i = 0; i < evlist->nr_mmaps; i++) {
-			union perf_event *event;
-
-			while ((event = perf_evlist__mmap_read(evlist, i)) != NULL) {
-				const u32 type = event->header.type;
-				int tp_flags;
-				struct perf_sample sample;
-
-				++nr_events;
-
-				if (type != PERF_RECORD_SAMPLE) {
-					perf_evlist__mmap_consume(evlist, i);
-					continue;
-				}
-
-				err = perf_evsel__parse_sample(evsel, event, &sample);
-				if (err) {
-					pr_err("Can't parse sample, err = %d\n", err);
-					goto out_munmap;
-				}
-
-				tp_flags = perf_evsel__intval(evsel, &sample, "flags");
-
-				if (flags != tp_flags) {
-					pr_debug("%s: Expected flags=%#x, got %#x\n",
-						 __func__, flags, tp_flags);
-					goto out_munmap;
-				}
-
-				goto out_ok;
-			}
-		}
-
-		if (nr_events == before)
-			poll(evlist->pollfd, evlist->nr_fds, 10);
-
-		if (++nr_polls > 5) {
-			pr_debug("%s: no events!\n", __func__);
-			goto out_munmap;
-		}
-	}
-out_ok:
-	err = 0;
-out_munmap:
-	perf_evlist__munmap(evlist);
-out_close_evlist:
-	perf_evlist__close(evlist);
-out_delete_maps:
-	perf_evlist__delete_maps(evlist);
-out_delete_evlist:
-	perf_evlist__delete(evlist);
-out:
-	return err;
-}
diff --git a/src/tools/perf/tests/open-syscall.c b/src/tools/perf/tests/open-syscall.c
deleted file mode 100644
index befc067..0000000
--- a/src/tools/perf/tests/open-syscall.c
+++ /dev/null
@@ -1,55 +0,0 @@
-#include "thread_map.h"
-#include "evsel.h"
-#include "debug.h"
-#include "tests.h"
-
-int test__open_syscall_event(void)
-{
-	int err = -1, fd;
-	struct perf_evsel *evsel;
-	unsigned int nr_open_calls = 111, i;
-	struct thread_map *threads = thread_map__new(-1, getpid(), UINT_MAX);
-
-	if (threads == NULL) {
-		pr_debug("thread_map__new\n");
-		return -1;
-	}
-
-	evsel = perf_evsel__newtp("syscalls", "sys_enter_open", 0);
-	if (evsel == NULL) {
-		pr_debug("is debugfs mounted on /sys/kernel/debug?\n");
-		goto out_thread_map_delete;
-	}
-
-	if (perf_evsel__open_per_thread(evsel, threads) < 0) {
-		pr_debug("failed to open counter: %s, "
-			 "tweak /proc/sys/kernel/perf_event_paranoid?\n",
-			 strerror(errno));
-		goto out_evsel_delete;
-	}
-
-	for (i = 0; i < nr_open_calls; ++i) {
-		fd = open("/etc/passwd", O_RDONLY);
-		close(fd);
-	}
-
-	if (perf_evsel__read_on_cpu(evsel, 0, 0) < 0) {
-		pr_debug("perf_evsel__read_on_cpu\n");
-		goto out_close_fd;
-	}
-
-	if (evsel->counts->cpu[0].val != nr_open_calls) {
-		pr_debug("perf_evsel__read_on_cpu: expected to intercept %d calls, got %" PRIu64 "\n",
-			 nr_open_calls, evsel->counts->cpu[0].val);
-		goto out_close_fd;
-	}
-
-	err = 0;
-out_close_fd:
-	perf_evsel__close_fd(evsel, 1, threads->nr);
-out_evsel_delete:
-	perf_evsel__delete(evsel);
-out_thread_map_delete:
-	thread_map__delete(threads);
-	return err;
-}
diff --git a/src/tools/perf/tests/parse-events.c b/src/tools/perf/tests/parse-events.c
deleted file mode 100644
index 48114d1..0000000
--- a/src/tools/perf/tests/parse-events.c
+++ /dev/null
@@ -1,1539 +0,0 @@
-
-#include "parse-events.h"
-#include "evsel.h"
-#include "evlist.h"
-#include "sysfs.h"
-#include <lk/debugfs.h>
-#include "tests.h"
-#include <linux/hw_breakpoint.h>
-
-#define PERF_TP_SAMPLE_TYPE (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | \
-			     PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD)
-
-static int test__checkevent_tracepoint(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->nr_groups);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong sample_type",
-		PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
-	TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
-	return 0;
-}
-
-static int test__checkevent_tracepoint_multi(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel;
-
-	TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1);
-	TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->nr_groups);
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		TEST_ASSERT_VAL("wrong type",
-			PERF_TYPE_TRACEPOINT == evsel->attr.type);
-		TEST_ASSERT_VAL("wrong sample_type",
-			PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
-		TEST_ASSERT_VAL("wrong sample_period",
-			1 == evsel->attr.sample_period);
-	}
-	return 0;
-}
-
-static int test__checkevent_raw(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config", 0x1a == evsel->attr.config);
-	return 0;
-}
-
-static int test__checkevent_numeric(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
-	return 0;
-}
-
-static int test__checkevent_symbolic_name(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
-	return 0;
-}
-
-static int test__checkevent_symbolic_name_config(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong period",
-			100000 == evsel->attr.sample_period);
-	TEST_ASSERT_VAL("wrong config1",
-			0 == evsel->attr.config1);
-	TEST_ASSERT_VAL("wrong config2",
-			1 == evsel->attr.config2);
-	return 0;
-}
-
-static int test__checkevent_symbolic_alias(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_SW_PAGE_FAULTS == evsel->attr.config);
-	return 0;
-}
-
-static int test__checkevent_genhw(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HW_CACHE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config", (1 << 16) == evsel->attr.config);
-	return 0;
-}
-
-static int test__checkevent_breakpoint(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) ==
-					 evsel->attr.bp_type);
-	TEST_ASSERT_VAL("wrong bp_len", HW_BREAKPOINT_LEN_4 ==
-					evsel->attr.bp_len);
-	return 0;
-}
-
-static int test__checkevent_breakpoint_x(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong bp_type",
-			HW_BREAKPOINT_X == evsel->attr.bp_type);
-	TEST_ASSERT_VAL("wrong bp_len", sizeof(long) == evsel->attr.bp_len);
-	return 0;
-}
-
-static int test__checkevent_breakpoint_r(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong type",
-			PERF_TYPE_BREAKPOINT == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong bp_type",
-			HW_BREAKPOINT_R == evsel->attr.bp_type);
-	TEST_ASSERT_VAL("wrong bp_len",
-			HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
-	return 0;
-}
-
-static int test__checkevent_breakpoint_w(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong type",
-			PERF_TYPE_BREAKPOINT == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong bp_type",
-			HW_BREAKPOINT_W == evsel->attr.bp_type);
-	TEST_ASSERT_VAL("wrong bp_len",
-			HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
-	return 0;
-}
-
-static int test__checkevent_breakpoint_rw(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong type",
-			PERF_TYPE_BREAKPOINT == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong bp_type",
-		(HW_BREAKPOINT_R|HW_BREAKPOINT_W) == evsel->attr.bp_type);
-	TEST_ASSERT_VAL("wrong bp_len",
-			HW_BREAKPOINT_LEN_4 == evsel->attr.bp_len);
-	return 0;
-}
-
-static int test__checkevent_tracepoint_modifier(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-
-	return test__checkevent_tracepoint(evlist);
-}
-
-static int
-test__checkevent_tracepoint_multi_modifier(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel;
-
-	TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1);
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		TEST_ASSERT_VAL("wrong exclude_user",
-				!evsel->attr.exclude_user);
-		TEST_ASSERT_VAL("wrong exclude_kernel",
-				evsel->attr.exclude_kernel);
-		TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-		TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	}
-
-	return test__checkevent_tracepoint_multi(evlist);
-}
-
-static int test__checkevent_raw_modifier(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
-
-	return test__checkevent_raw(evlist);
-}
-
-static int test__checkevent_numeric_modifier(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
-
-	return test__checkevent_numeric(evlist);
-}
-
-static int test__checkevent_symbolic_name_modifier(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-
-	return test__checkevent_symbolic_name(evlist);
-}
-
-static int test__checkevent_exclude_host_modifier(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
-
-	return test__checkevent_symbolic_name(evlist);
-}
-
-static int test__checkevent_exclude_guest_modifier(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-
-	return test__checkevent_symbolic_name(evlist);
-}
-
-static int test__checkevent_symbolic_alias_modifier(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-
-	return test__checkevent_symbolic_alias(evlist);
-}
-
-static int test__checkevent_genhw_modifier(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
-
-	return test__checkevent_genhw(evlist);
-}
-
-static int test__checkevent_breakpoint_modifier(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong name",
-			!strcmp(perf_evsel__name(evsel), "mem:0:u"));
-
-	return test__checkevent_breakpoint(evlist);
-}
-
-static int test__checkevent_breakpoint_x_modifier(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong name",
-			!strcmp(perf_evsel__name(evsel), "mem:0:x:k"));
-
-	return test__checkevent_breakpoint_x(evlist);
-}
-
-static int test__checkevent_breakpoint_r_modifier(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong name",
-			!strcmp(perf_evsel__name(evsel), "mem:0:r:hp"));
-
-	return test__checkevent_breakpoint_r(evlist);
-}
-
-static int test__checkevent_breakpoint_w_modifier(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong name",
-			!strcmp(perf_evsel__name(evsel), "mem:0:w:up"));
-
-	return test__checkevent_breakpoint_w(evlist);
-}
-
-static int test__checkevent_breakpoint_rw_modifier(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong name",
-			!strcmp(perf_evsel__name(evsel), "mem:0:rw:kp"));
-
-	return test__checkevent_breakpoint_rw(evlist);
-}
-
-static int test__checkevent_pmu(struct perf_evlist *evlist)
-{
-
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",    10 == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong config1",    1 == evsel->attr.config1);
-	TEST_ASSERT_VAL("wrong config2",    3 == evsel->attr.config2);
-	TEST_ASSERT_VAL("wrong period",  1000 == evsel->attr.sample_period);
-
-	return 0;
-}
-
-static int test__checkevent_list(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
-
-	/* r1 */
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong config1", 0 == evsel->attr.config1);
-	TEST_ASSERT_VAL("wrong config2", 0 == evsel->attr.config2);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-
-	/* syscalls:sys_enter_open:k */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong sample_type",
-		PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
-	TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
-	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-
-	/* 1:1:hp */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
-
-	return 0;
-}
-
-static int test__checkevent_pmu_name(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	/* cpu/config=1,name=krava/u */
-	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",  1 == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong name", !strcmp(perf_evsel__name(evsel), "krava"));
-
-	/* cpu/config=2/u" */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",  2 == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong name",
-			!strcmp(perf_evsel__name(evsel), "cpu/config=2/u"));
-
-	return 0;
-}
-
-static int test__checkevent_pmu_events(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel;
-
-	evsel = list_entry(evlist->entries.next, struct perf_evsel, node);
-	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong exclude_user",
-			!evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel",
-			evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong pinned", !evsel->attr.pinned);
-
-	return 0;
-}
-
-static int test__checkterms_simple(struct list_head *terms)
-{
-	struct parse_events_term *term;
-
-	/* config=10 */
-	term = list_entry(terms->next, struct parse_events_term, list);
-	TEST_ASSERT_VAL("wrong type term",
-			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG);
-	TEST_ASSERT_VAL("wrong type val",
-			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
-	TEST_ASSERT_VAL("wrong val", term->val.num == 10);
-	TEST_ASSERT_VAL("wrong config", !term->config);
-
-	/* config1 */
-	term = list_entry(term->list.next, struct parse_events_term, list);
-	TEST_ASSERT_VAL("wrong type term",
-			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG1);
-	TEST_ASSERT_VAL("wrong type val",
-			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
-	TEST_ASSERT_VAL("wrong val", term->val.num == 1);
-	TEST_ASSERT_VAL("wrong config", !term->config);
-
-	/* config2=3 */
-	term = list_entry(term->list.next, struct parse_events_term, list);
-	TEST_ASSERT_VAL("wrong type term",
-			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG2);
-	TEST_ASSERT_VAL("wrong type val",
-			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
-	TEST_ASSERT_VAL("wrong val", term->val.num == 3);
-	TEST_ASSERT_VAL("wrong config", !term->config);
-
-	/* umask=1*/
-	term = list_entry(term->list.next, struct parse_events_term, list);
-	TEST_ASSERT_VAL("wrong type term",
-			term->type_term == PARSE_EVENTS__TERM_TYPE_USER);
-	TEST_ASSERT_VAL("wrong type val",
-			term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
-	TEST_ASSERT_VAL("wrong val", term->val.num == 1);
-	TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "umask"));
-
-	return 0;
-}
-
-static int test__group1(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel, *leader;
-
-	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
-
-	/* instructions:k */
-	evsel = leader = perf_evlist__first(evlist);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
-	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
-
-	/* cycles:upp */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	/* use of precise requires exclude_guest */
-	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 2);
-	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
-
-	return 0;
-}
-
-static int test__group2(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel, *leader;
-
-	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
-
-	/* faults + :ku modifier */
-	evsel = leader = perf_evlist__first(evlist);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_SW_PAGE_FAULTS == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
-	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
-
-	/* cache-references + :u modifier */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CACHE_REFERENCES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
-
-	/* cycles:k */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
-
-	return 0;
-}
-
-static int test__group3(struct perf_evlist *evlist __maybe_unused)
-{
-	struct perf_evsel *evsel, *leader;
-
-	TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong number of groups", 2 == evlist->nr_groups);
-
-	/* group1 syscalls:sys_enter_open:H */
-	evsel = leader = perf_evlist__first(evlist);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong sample_type",
-		PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type);
-	TEST_ASSERT_VAL("wrong sample_period", 1 == evsel->attr.sample_period);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
-	TEST_ASSERT_VAL("wrong group name",
-		!strcmp(leader->group_name, "group1"));
-	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
-
-	/* group1 cycles:kppp */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	/* use of precise requires exclude_guest */
-	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 3);
-	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
-
-	/* group2 cycles + G modifier */
-	evsel = leader = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
-	TEST_ASSERT_VAL("wrong group name",
-		!strcmp(leader->group_name, "group2"));
-	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
-
-	/* group2 1:3 + G modifier */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config", 3 == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
-
-	/* instructions:u */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
-
-	return 0;
-}
-
-static int test__group4(struct perf_evlist *evlist __maybe_unused)
-{
-	struct perf_evsel *evsel, *leader;
-
-	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
-
-	/* cycles:u + p */
-	evsel = leader = perf_evlist__first(evlist);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	/* use of precise requires exclude_guest */
-	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 1);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
-	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
-
-	/* instructions:kp + p */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	/* use of precise requires exclude_guest */
-	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 2);
-	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
-
-	return 0;
-}
-
-static int test__group5(struct perf_evlist *evlist __maybe_unused)
-{
-	struct perf_evsel *evsel, *leader;
-
-	TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong number of groups", 2 == evlist->nr_groups);
-
-	/* cycles + G */
-	evsel = leader = perf_evlist__first(evlist);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
-	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
-
-	/* instructions + G */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
-
-	/* cycles:G */
-	evsel = leader = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
-	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
-	TEST_ASSERT_VAL("wrong sample_read", !evsel->sample_read);
-
-	/* instructions:G */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
-
-	/* cycles */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
-
-	return 0;
-}
-
-static int test__group_gh1(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel, *leader;
-
-	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
-
-	/* cycles + :H group modifier */
-	evsel = leader = perf_evlist__first(evlist);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
-	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
-
-	/* cache-misses:G + :H group modifier */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
-
-	return 0;
-}
-
-static int test__group_gh2(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel, *leader;
-
-	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
-
-	/* cycles + :G group modifier */
-	evsel = leader = perf_evlist__first(evlist);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
-	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
-
-	/* cache-misses:H + :G group modifier */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
-
-	return 0;
-}
-
-static int test__group_gh3(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel, *leader;
-
-	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
-
-	/* cycles:G + :u group modifier */
-	evsel = leader = perf_evlist__first(evlist);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
-	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
-
-	/* cache-misses:H + :u group modifier */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
-
-	return 0;
-}
-
-static int test__group_gh4(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel, *leader;
-
-	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
-	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
-
-	/* cycles:G + :uG group modifier */
-	evsel = leader = perf_evlist__first(evlist);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));
-	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);
-
-	/* cache-misses:H + :uG group modifier */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
-	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);
-
-	return 0;
-}
-
-static int test__leader_sample1(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel, *leader;
-
-	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
-
-	/* cycles - sampling group leader */
-	evsel = leader = perf_evlist__first(evlist);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
-	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
-
-	/* cache-misses - not sampling */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
-	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
-
-	/* branch-misses - not sampling */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_BRANCH_MISSES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
-	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
-
-	return 0;
-}
-
-static int test__leader_sample2(struct perf_evlist *evlist __maybe_unused)
-{
-	struct perf_evsel *evsel, *leader;
-
-	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
-
-	/* instructions - sampling group leader */
-	evsel = leader = perf_evlist__first(evlist);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
-	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
-
-	/* branch-misses - not sampling */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_BRANCH_MISSES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
-	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
-	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
-	TEST_ASSERT_VAL("wrong sample_read", evsel->sample_read);
-
-	return 0;
-}
-
-static int test__checkevent_pinned_modifier(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel = perf_evlist__first(evlist);
-
-	TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
-	TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
-	TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
-	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip);
-	TEST_ASSERT_VAL("wrong pinned", evsel->attr.pinned);
-
-	return test__checkevent_symbolic_name(evlist);
-}
-
-static int test__pinned_group(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel, *leader;
-
-	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
-
-	/* cycles - group leader */
-	evsel = leader = perf_evlist__first(evlist);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
-	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
-	TEST_ASSERT_VAL("wrong pinned", evsel->attr.pinned);
-
-	/* cache-misses - can not be pinned, but will go on with the leader */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong pinned", !evsel->attr.pinned);
-
-	/* branch-misses - ditto */
-	evsel = perf_evsel__next(evsel);
-	TEST_ASSERT_VAL("wrong config",
-			PERF_COUNT_HW_BRANCH_MISSES == evsel->attr.config);
-	TEST_ASSERT_VAL("wrong pinned", !evsel->attr.pinned);
-
-	return 0;
-}
-
-static int count_tracepoints(void)
-{
-	char events_path[PATH_MAX];
-	struct dirent *events_ent;
-	DIR *events_dir;
-	int cnt = 0;
-
-	scnprintf(events_path, PATH_MAX, "%s/tracing/events",
-		  debugfs_find_mountpoint());
-
-	events_dir = opendir(events_path);
-
-	TEST_ASSERT_VAL("Can't open events dir", events_dir);
-
-	while ((events_ent = readdir(events_dir))) {
-		char sys_path[PATH_MAX];
-		struct dirent *sys_ent;
-		DIR *sys_dir;
-
-		if (!strcmp(events_ent->d_name, ".")
-		    || !strcmp(events_ent->d_name, "..")
-		    || !strcmp(events_ent->d_name, "enable")
-		    || !strcmp(events_ent->d_name, "header_event")
-		    || !strcmp(events_ent->d_name, "header_page"))
-			continue;
-
-		scnprintf(sys_path, PATH_MAX, "%s/%s",
-			  events_path, events_ent->d_name);
-
-		sys_dir = opendir(sys_path);
-		TEST_ASSERT_VAL("Can't open sys dir", sys_dir);
-
-		while ((sys_ent = readdir(sys_dir))) {
-			if (!strcmp(sys_ent->d_name, ".")
-			    || !strcmp(sys_ent->d_name, "..")
-			    || !strcmp(sys_ent->d_name, "enable")
-			    || !strcmp(sys_ent->d_name, "filter"))
-				continue;
-
-			cnt++;
-		}
-
-		closedir(sys_dir);
-	}
-
-	closedir(events_dir);
-	return cnt;
-}
-
-static int test__all_tracepoints(struct perf_evlist *evlist)
-{
-	TEST_ASSERT_VAL("wrong events count",
-			count_tracepoints() == evlist->nr_entries);
-
-	return test__checkevent_tracepoint_multi(evlist);
-}
-
-struct evlist_test {
-	const char *name;
-	__u32 type;
-	int (*check)(struct perf_evlist *evlist);
-};
-
-static struct evlist_test test__events[] = {
-	[0] = {
-		.name  = "syscalls:sys_enter_open",
-		.check = test__checkevent_tracepoint,
-	},
-	[1] = {
-		.name  = "syscalls:*",
-		.check = test__checkevent_tracepoint_multi,
-	},
-	[2] = {
-		.name  = "r1a",
-		.check = test__checkevent_raw,
-	},
-	[3] = {
-		.name  = "1:1",
-		.check = test__checkevent_numeric,
-	},
-	[4] = {
-		.name  = "instructions",
-		.check = test__checkevent_symbolic_name,
-	},
-	[5] = {
-		.name  = "cycles/period=100000,config2/",
-		.check = test__checkevent_symbolic_name_config,
-	},
-	[6] = {
-		.name  = "faults",
-		.check = test__checkevent_symbolic_alias,
-	},
-	[7] = {
-		.name  = "L1-dcache-load-miss",
-		.check = test__checkevent_genhw,
-	},
-	[8] = {
-		.name  = "mem:0",
-		.check = test__checkevent_breakpoint,
-	},
-	[9] = {
-		.name  = "mem:0:x",
-		.check = test__checkevent_breakpoint_x,
-	},
-	[10] = {
-		.name  = "mem:0:r",
-		.check = test__checkevent_breakpoint_r,
-	},
-	[11] = {
-		.name  = "mem:0:w",
-		.check = test__checkevent_breakpoint_w,
-	},
-	[12] = {
-		.name  = "syscalls:sys_enter_open:k",
-		.check = test__checkevent_tracepoint_modifier,
-	},
-	[13] = {
-		.name  = "syscalls:*:u",
-		.check = test__checkevent_tracepoint_multi_modifier,
-	},
-	[14] = {
-		.name  = "r1a:kp",
-		.check = test__checkevent_raw_modifier,
-	},
-	[15] = {
-		.name  = "1:1:hp",
-		.check = test__checkevent_numeric_modifier,
-	},
-	[16] = {
-		.name  = "instructions:h",
-		.check = test__checkevent_symbolic_name_modifier,
-	},
-	[17] = {
-		.name  = "faults:u",
-		.check = test__checkevent_symbolic_alias_modifier,
-	},
-	[18] = {
-		.name  = "L1-dcache-load-miss:kp",
-		.check = test__checkevent_genhw_modifier,
-	},
-	[19] = {
-		.name  = "mem:0:u",
-		.check = test__checkevent_breakpoint_modifier,
-	},
-	[20] = {
-		.name  = "mem:0:x:k",
-		.check = test__checkevent_breakpoint_x_modifier,
-	},
-	[21] = {
-		.name  = "mem:0:r:hp",
-		.check = test__checkevent_breakpoint_r_modifier,
-	},
-	[22] = {
-		.name  = "mem:0:w:up",
-		.check = test__checkevent_breakpoint_w_modifier,
-	},
-	[23] = {
-		.name  = "r1,syscalls:sys_enter_open:k,1:1:hp",
-		.check = test__checkevent_list,
-	},
-	[24] = {
-		.name  = "instructions:G",
-		.check = test__checkevent_exclude_host_modifier,
-	},
-	[25] = {
-		.name  = "instructions:H",
-		.check = test__checkevent_exclude_guest_modifier,
-	},
-	[26] = {
-		.name  = "mem:0:rw",
-		.check = test__checkevent_breakpoint_rw,
-	},
-	[27] = {
-		.name  = "mem:0:rw:kp",
-		.check = test__checkevent_breakpoint_rw_modifier,
-	},
-	[28] = {
-		.name  = "{instructions:k,cycles:upp}",
-		.check = test__group1,
-	},
-	[29] = {
-		.name  = "{faults:k,cache-references}:u,cycles:k",
-		.check = test__group2,
-	},
-	[30] = {
-		.name  = "group1{syscalls:sys_enter_open:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u",
-		.check = test__group3,
-	},
-	[31] = {
-		.name  = "{cycles:u,instructions:kp}:p",
-		.check = test__group4,
-	},
-	[32] = {
-		.name  = "{cycles,instructions}:G,{cycles:G,instructions:G},cycles",
-		.check = test__group5,
-	},
-	[33] = {
-		.name  = "*:*",
-		.check = test__all_tracepoints,
-	},
-	[34] = {
-		.name  = "{cycles,cache-misses:G}:H",
-		.check = test__group_gh1,
-	},
-	[35] = {
-		.name  = "{cycles,cache-misses:H}:G",
-		.check = test__group_gh2,
-	},
-	[36] = {
-		.name  = "{cycles:G,cache-misses:H}:u",
-		.check = test__group_gh3,
-	},
-	[37] = {
-		.name  = "{cycles:G,cache-misses:H}:uG",
-		.check = test__group_gh4,
-	},
-	[38] = {
-		.name  = "{cycles,cache-misses,branch-misses}:S",
-		.check = test__leader_sample1,
-	},
-	[39] = {
-		.name  = "{instructions,branch-misses}:Su",
-		.check = test__leader_sample2,
-	},
-	[40] = {
-		.name  = "instructions:uDp",
-		.check = test__checkevent_pinned_modifier,
-	},
-	[41] = {
-		.name  = "{cycles,cache-misses,branch-misses}:D",
-		.check = test__pinned_group,
-	},
-};
-
-static struct evlist_test test__events_pmu[] = {
-	[0] = {
-		.name  = "cpu/config=10,config1,config2=3,period=1000/u",
-		.check = test__checkevent_pmu,
-	},
-	[1] = {
-		.name  = "cpu/config=1,name=krava/u,cpu/config=2/u",
-		.check = test__checkevent_pmu_name,
-	},
-};
-
-struct terms_test {
-	const char *str;
-	__u32 type;
-	int (*check)(struct list_head *terms);
-};
-
-static struct terms_test test__terms[] = {
-	[0] = {
-		.str   = "config=10,config1,config2=3,umask=1",
-		.check = test__checkterms_simple,
-	},
-};
-
-static int test_event(struct evlist_test *e)
-{
-	struct perf_evlist *evlist;
-	int ret;
-
-	evlist = perf_evlist__new();
-	if (evlist == NULL)
-		return -ENOMEM;
-
-	ret = parse_events(evlist, e->name);
-	if (ret) {
-		pr_debug("failed to parse event '%s', err %d\n",
-			 e->name, ret);
-		return ret;
-	}
-
-	ret = e->check(evlist);
-	perf_evlist__delete(evlist);
-
-	return ret;
-}
-
-static int test_events(struct evlist_test *events, unsigned cnt)
-{
-	int ret1, ret2 = 0;
-	unsigned i;
-
-	for (i = 0; i < cnt; i++) {
-		struct evlist_test *e = &events[i];
-
-		pr_debug("running test %d '%s'\n", i, e->name);
-		ret1 = test_event(e);
-		if (ret1)
-			ret2 = ret1;
-	}
-
-	return ret2;
-}
-
-static int test_term(struct terms_test *t)
-{
-	struct list_head terms;
-	int ret;
-
-	INIT_LIST_HEAD(&terms);
-
-	ret = parse_events_terms(&terms, t->str);
-	if (ret) {
-		pr_debug("failed to parse terms '%s', err %d\n",
-			 t->str , ret);
-		return ret;
-	}
-
-	ret = t->check(&terms);
-	parse_events__free_terms(&terms);
-
-	return ret;
-}
-
-static int test_terms(struct terms_test *terms, unsigned cnt)
-{
-	int ret = 0;
-	unsigned i;
-
-	for (i = 0; i < cnt; i++) {
-		struct terms_test *t = &terms[i];
-
-		pr_debug("running test %d '%s'\n", i, t->str);
-		ret = test_term(t);
-		if (ret)
-			break;
-	}
-
-	return ret;
-}
-
-static int test_pmu(void)
-{
-	struct stat st;
-	char path[PATH_MAX];
-	int ret;
-
-	snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/format/",
-		 sysfs_find_mountpoint());
-
-	ret = stat(path, &st);
-	if (ret)
-		pr_debug("omitting PMU cpu tests\n");
-	return !ret;
-}
-
-static int test_pmu_events(void)
-{
-	struct stat st;
-	char path[PATH_MAX];
-	struct dirent *ent;
-	DIR *dir;
-	int ret;
-
-	snprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu/events/",
-		 sysfs_find_mountpoint());
-
-	ret = stat(path, &st);
-	if (ret) {
-		pr_debug("omitting PMU cpu events tests\n");
-		return 0;
-	}
-
-	dir = opendir(path);
-	if (!dir) {
-		pr_debug("can't open pmu event dir");
-		return -1;
-	}
-
-	while (!ret && (ent = readdir(dir))) {
-#define MAX_NAME 100
-		struct evlist_test e;
-		char name[MAX_NAME];
-
-		if (!strcmp(ent->d_name, ".") ||
-		    !strcmp(ent->d_name, ".."))
-			continue;
-
-		snprintf(name, MAX_NAME, "cpu/event=%s/u", ent->d_name);
-
-		e.name  = name;
-		e.check = test__checkevent_pmu_events;
-
-		ret = test_event(&e);
-#undef MAX_NAME
-	}
-
-	closedir(dir);
-	return ret;
-}
-
-int test__parse_events(void)
-{
-	int ret1, ret2 = 0;
-
-#define TEST_EVENTS(tests)				\
-do {							\
-	ret1 = test_events(tests, ARRAY_SIZE(tests));	\
-	if (!ret2)					\
-		ret2 = ret1;				\
-} while (0)
-
-	TEST_EVENTS(test__events);
-
-	if (test_pmu())
-		TEST_EVENTS(test__events_pmu);
-
-	if (test_pmu()) {
-		int ret = test_pmu_events();
-		if (ret)
-			return ret;
-	}
-
-	ret1 = test_terms(test__terms, ARRAY_SIZE(test__terms));
-	if (!ret2)
-		ret2 = ret1;
-
-	return ret2;
-}
diff --git a/src/tools/perf/tests/parse-no-sample-id-all.c b/src/tools/perf/tests/parse-no-sample-id-all.c
deleted file mode 100644
index e117b6c..0000000
--- a/src/tools/perf/tests/parse-no-sample-id-all.c
+++ /dev/null
@@ -1,108 +0,0 @@
-#include <sys/types.h>
-#include <stddef.h>
-
-#include "tests.h"
-
-#include "event.h"
-#include "evlist.h"
-#include "header.h"
-#include "util.h"
-
-static int process_event(struct perf_evlist **pevlist, union perf_event *event)
-{
-	struct perf_sample sample;
-
-	if (event->header.type == PERF_RECORD_HEADER_ATTR) {
-		if (perf_event__process_attr(NULL, event, pevlist)) {
-			pr_debug("perf_event__process_attr failed\n");
-			return -1;
-		}
-		return 0;
-	}
-
-	if (event->header.type >= PERF_RECORD_USER_TYPE_START)
-		return -1;
-
-	if (!*pevlist)
-		return -1;
-
-	if (perf_evlist__parse_sample(*pevlist, event, &sample)) {
-		pr_debug("perf_evlist__parse_sample failed\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-static int process_events(union perf_event **events, size_t count)
-{
-	struct perf_evlist *evlist = NULL;
-	int err = 0;
-	size_t i;
-
-	for (i = 0; i < count && !err; i++)
-		err = process_event(&evlist, events[i]);
-
-	if (evlist)
-		perf_evlist__delete(evlist);
-
-	return err;
-}
-
-struct test_attr_event {
-	struct attr_event attr;
-	u64 id;
-};
-
-/**
- * test__parse_no_sample_id_all - test parsing with no sample_id_all bit set.
- *
- * This function tests parsing data produced on kernel's that do not support the
- * sample_id_all bit.  Without the sample_id_all bit, non-sample events (such as
- * mmap events) do not have an id sample appended, and consequently logic
- * designed to determine the id will not work.  That case happens when there is
- * more than one selected event, so this test processes three events: 2
- * attributes representing the selected events and one mmap event.
- *
- * Return: %0 on success, %-1 if the test fails.
- */
-int test__parse_no_sample_id_all(void)
-{
-	int err;
-
-	struct test_attr_event event1 = {
-		.attr = {
-			.header = {
-				.type = PERF_RECORD_HEADER_ATTR,
-				.size = sizeof(struct test_attr_event),
-			},
-		},
-		.id = 1,
-	};
-	struct test_attr_event event2 = {
-		.attr = {
-			.header = {
-				.type = PERF_RECORD_HEADER_ATTR,
-				.size = sizeof(struct test_attr_event),
-			},
-		},
-		.id = 2,
-	};
-	struct mmap_event event3 = {
-		.header = {
-			.type = PERF_RECORD_MMAP,
-			.size = sizeof(struct mmap_event),
-		},
-	};
-	union perf_event *events[] = {
-		(union perf_event *)&event1,
-		(union perf_event *)&event2,
-		(union perf_event *)&event3,
-	};
-
-	err = process_events(events, ARRAY_SIZE(events));
-	if (err)
-		return -1;
-
-	return 0;
-}
diff --git a/src/tools/perf/tests/perf-record.c b/src/tools/perf/tests/perf-record.c
deleted file mode 100644
index 7923b06..0000000
--- a/src/tools/perf/tests/perf-record.c
+++ /dev/null
@@ -1,326 +0,0 @@
-#include <sched.h>
-#include "evlist.h"
-#include "evsel.h"
-#include "perf.h"
-#include "debug.h"
-#include "tests.h"
-
-static int sched__get_first_possible_cpu(pid_t pid, cpu_set_t *maskp)
-{
-	int i, cpu = -1, nrcpus = 1024;
-realloc:
-	CPU_ZERO(maskp);
-
-	if (sched_getaffinity(pid, sizeof(*maskp), maskp) == -1) {
-		if (errno == EINVAL && nrcpus < (1024 << 8)) {
-			nrcpus = nrcpus << 2;
-			goto realloc;
-		}
-		perror("sched_getaffinity");
-			return -1;
-	}
-
-	for (i = 0; i < nrcpus; i++) {
-		if (CPU_ISSET(i, maskp)) {
-			if (cpu == -1)
-				cpu = i;
-			else
-				CPU_CLR(i, maskp);
-		}
-	}
-
-	return cpu;
-}
-
-int test__PERF_RECORD(void)
-{
-	struct perf_record_opts opts = {
-		.target = {
-			.uid = UINT_MAX,
-			.uses_mmap = true,
-		},
-		.no_delay   = true,
-		.freq	    = 10,
-		.mmap_pages = 256,
-	};
-	cpu_set_t cpu_mask;
-	size_t cpu_mask_size = sizeof(cpu_mask);
-	struct perf_evlist *evlist = perf_evlist__new();
-	struct perf_evsel *evsel;
-	struct perf_sample sample;
-	const char *cmd = "sleep";
-	const char *argv[] = { cmd, "1", NULL, };
-	char *bname, *mmap_filename;
-	u64 prev_time = 0;
-	bool found_cmd_mmap = false,
-	     found_libc_mmap = false,
-	     found_vdso_mmap = false,
-	     found_ld_mmap = false;
-	int err = -1, errs = 0, i, wakeups = 0;
-	u32 cpu;
-	int total_events = 0, nr_events[PERF_RECORD_MAX] = { 0, };
-
-	if (evlist == NULL || argv == NULL) {
-		pr_debug("Not enough memory to create evlist\n");
-		goto out;
-	}
-
-	/*
-	 * We need at least one evsel in the evlist, use the default
-	 * one: "cycles".
-	 */
-	err = perf_evlist__add_default(evlist);
-	if (err < 0) {
-		pr_debug("Not enough memory to create evsel\n");
-		goto out_delete_evlist;
-	}
-
-	/*
-	 * Create maps of threads and cpus to monitor. In this case
-	 * we start with all threads and cpus (-1, -1) but then in
-	 * perf_evlist__prepare_workload we'll fill in the only thread
-	 * we're monitoring, the one forked there.
-	 */
-	err = perf_evlist__create_maps(evlist, &opts.target);
-	if (err < 0) {
-		pr_debug("Not enough memory to create thread/cpu maps\n");
-		goto out_delete_evlist;
-	}
-
-	/*
-	 * Prepare the workload in argv[] to run, it'll fork it, and then wait
-	 * for perf_evlist__start_workload() to exec it. This is done this way
-	 * so that we have time to open the evlist (calling sys_perf_event_open
-	 * on all the fds) and then mmap them.
-	 */
-	err = perf_evlist__prepare_workload(evlist, &opts.target, argv,
-					    false, false);
-	if (err < 0) {
-		pr_debug("Couldn't run the workload!\n");
-		goto out_delete_maps;
-	}
-
-	/*
-	 * Config the evsels, setting attr->comm on the first one, etc.
-	 */
-	evsel = perf_evlist__first(evlist);
-	perf_evsel__set_sample_bit(evsel, CPU);
-	perf_evsel__set_sample_bit(evsel, TID);
-	perf_evsel__set_sample_bit(evsel, TIME);
-	perf_evlist__config(evlist, &opts);
-
-	err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask);
-	if (err < 0) {
-		pr_debug("sched__get_first_possible_cpu: %s\n", strerror(errno));
-		goto out_delete_maps;
-	}
-
-	cpu = err;
-
-	/*
-	 * So that we can check perf_sample.cpu on all the samples.
-	 */
-	if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, &cpu_mask) < 0) {
-		pr_debug("sched_setaffinity: %s\n", strerror(errno));
-		goto out_delete_maps;
-	}
-
-	/*
-	 * Call sys_perf_event_open on all the fds on all the evsels,
-	 * grouping them if asked to.
-	 */
-	err = perf_evlist__open(evlist);
-	if (err < 0) {
-		pr_debug("perf_evlist__open: %s\n", strerror(errno));
-		goto out_delete_maps;
-	}
-
-	/*
-	 * mmap the first fd on a given CPU and ask for events for the other
-	 * fds in the same CPU to be injected in the same mmap ring buffer
-	 * (using ioctl(PERF_EVENT_IOC_SET_OUTPUT)).
-	 */
-	err = perf_evlist__mmap(evlist, opts.mmap_pages, false);
-	if (err < 0) {
-		pr_debug("perf_evlist__mmap: %s\n", strerror(errno));
-		goto out_close_evlist;
-	}
-
-	/*
-	 * Now that all is properly set up, enable the events, they will
-	 * count just on workload.pid, which will start...
-	 */
-	perf_evlist__enable(evlist);
-
-	/*
-	 * Now!
-	 */
-	perf_evlist__start_workload(evlist);
-
-	while (1) {
-		int before = total_events;
-
-		for (i = 0; i < evlist->nr_mmaps; i++) {
-			union perf_event *event;
-
-			while ((event = perf_evlist__mmap_read(evlist, i)) != NULL) {
-				const u32 type = event->header.type;
-				const char *name = perf_event__name(type);
-
-				++total_events;
-				if (type < PERF_RECORD_MAX)
-					nr_events[type]++;
-
-				err = perf_evlist__parse_sample(evlist, event, &sample);
-				if (err < 0) {
-					if (verbose)
-						perf_event__fprintf(event, stderr);
-					pr_debug("Couldn't parse sample\n");
-					goto out_err;
-				}
-
-				if (verbose) {
-					pr_info("%" PRIu64" %d ", sample.time, sample.cpu);
-					perf_event__fprintf(event, stderr);
-				}
-
-				if (prev_time > sample.time) {
-					pr_debug("%s going backwards in time, prev=%" PRIu64 ", curr=%" PRIu64 "\n",
-						 name, prev_time, sample.time);
-					++errs;
-				}
-
-				prev_time = sample.time;
-
-				if (sample.cpu != cpu) {
-					pr_debug("%s with unexpected cpu, expected %d, got %d\n",
-						 name, cpu, sample.cpu);
-					++errs;
-				}
-
-				if ((pid_t)sample.pid != evlist->workload.pid) {
-					pr_debug("%s with unexpected pid, expected %d, got %d\n",
-						 name, evlist->workload.pid, sample.pid);
-					++errs;
-				}
-
-				if ((pid_t)sample.tid != evlist->workload.pid) {
-					pr_debug("%s with unexpected tid, expected %d, got %d\n",
-						 name, evlist->workload.pid, sample.tid);
-					++errs;
-				}
-
-				if ((type == PERF_RECORD_COMM ||
-				     type == PERF_RECORD_MMAP ||
-				     type == PERF_RECORD_MMAP2 ||
-				     type == PERF_RECORD_FORK ||
-				     type == PERF_RECORD_EXIT) &&
-				     (pid_t)event->comm.pid != evlist->workload.pid) {
-					pr_debug("%s with unexpected pid/tid\n", name);
-					++errs;
-				}
-
-				if ((type == PERF_RECORD_COMM ||
-				     type == PERF_RECORD_MMAP ||
-				     type == PERF_RECORD_MMAP2) &&
-				     event->comm.pid != event->comm.tid) {
-					pr_debug("%s with different pid/tid!\n", name);
-					++errs;
-				}
-
-				switch (type) {
-				case PERF_RECORD_COMM:
-					if (strcmp(event->comm.comm, cmd)) {
-						pr_debug("%s with unexpected comm!\n", name);
-						++errs;
-					}
-					break;
-				case PERF_RECORD_EXIT:
-					goto found_exit;
-				case PERF_RECORD_MMAP:
-					mmap_filename = event->mmap.filename;
-					goto check_bname;
-				case PERF_RECORD_MMAP2:
-					mmap_filename = event->mmap2.filename;
-				check_bname:
-					bname = strrchr(mmap_filename, '/');
-					if (bname != NULL) {
-						if (!found_cmd_mmap)
-							found_cmd_mmap = !strcmp(bname + 1, cmd);
-						if (!found_libc_mmap)
-							found_libc_mmap = !strncmp(bname + 1, "libc", 4);
-						if (!found_ld_mmap)
-							found_ld_mmap = !strncmp(bname + 1, "ld", 2);
-					} else if (!found_vdso_mmap)
-						found_vdso_mmap = !strcmp(mmap_filename, "[vdso]");
-					break;
-
-				case PERF_RECORD_SAMPLE:
-					/* Just ignore samples for now */
-					break;
-				default:
-					pr_debug("Unexpected perf_event->header.type %d!\n",
-						 type);
-					++errs;
-				}
-
-				perf_evlist__mmap_consume(evlist, i);
-			}
-		}
-
-		/*
-		 * We don't use poll here because at least at 3.1 times the
-		 * PERF_RECORD_{!SAMPLE} events don't honour
-		 * perf_event_attr.wakeup_events, just PERF_EVENT_SAMPLE does.
-		 */
-		if (total_events == before && false)
-			poll(evlist->pollfd, evlist->nr_fds, -1);
-
-		sleep(1);
-		if (++wakeups > 5) {
-			pr_debug("No PERF_RECORD_EXIT event!\n");
-			break;
-		}
-	}
-
-found_exit:
-	if (nr_events[PERF_RECORD_COMM] > 1) {
-		pr_debug("Excessive number of PERF_RECORD_COMM events!\n");
-		++errs;
-	}
-
-	if (nr_events[PERF_RECORD_COMM] == 0) {
-		pr_debug("Missing PERF_RECORD_COMM for %s!\n", cmd);
-		++errs;
-	}
-
-	if (!found_cmd_mmap) {
-		pr_debug("PERF_RECORD_MMAP for %s missing!\n", cmd);
-		++errs;
-	}
-
-	if (!found_libc_mmap) {
-		pr_debug("PERF_RECORD_MMAP for %s missing!\n", "libc");
-		++errs;
-	}
-
-	if (!found_ld_mmap) {
-		pr_debug("PERF_RECORD_MMAP for %s missing!\n", "ld");
-		++errs;
-	}
-
-	if (!found_vdso_mmap) {
-		pr_debug("PERF_RECORD_MMAP for %s missing!\n", "[vdso]");
-		++errs;
-	}
-out_err:
-	perf_evlist__munmap(evlist);
-out_close_evlist:
-	perf_evlist__close(evlist);
-out_delete_maps:
-	perf_evlist__delete_maps(evlist);
-out_delete_evlist:
-	perf_evlist__delete(evlist);
-out:
-	return (err < 0 || errs > 0) ? -1 : 0;
-}
diff --git a/src/tools/perf/tests/perf-time-to-tsc.c b/src/tools/perf/tests/perf-time-to-tsc.c
deleted file mode 100644
index 4ca1b93..0000000
--- a/src/tools/perf/tests/perf-time-to-tsc.c
+++ /dev/null
@@ -1,179 +0,0 @@
-#include <stdio.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <inttypes.h>
-#include <sys/prctl.h>
-
-#include "parse-events.h"
-#include "evlist.h"
-#include "evsel.h"
-#include "thread_map.h"
-#include "cpumap.h"
-#include "tests.h"
-
-#include "../arch/x86/util/tsc.h"
-
-#define CHECK__(x) {				\
-	while ((x) < 0) {			\
-		pr_debug(#x " failed!\n");	\
-		goto out_err;			\
-	}					\
-}
-
-#define CHECK_NOT_NULL__(x) {			\
-	while ((x) == NULL) {			\
-		pr_debug(#x " failed!\n");	\
-		goto out_err;			\
-	}					\
-}
-
-static u64 rdtsc(void)
-{
-	unsigned int low, high;
-
-	asm volatile("rdtsc" : "=a" (low), "=d" (high));
-
-	return low | ((u64)high) << 32;
-}
-
-/**
- * test__perf_time_to_tsc - test converting perf time to TSC.
- *
- * This function implements a test that checks that the conversion of perf time
- * to and from TSC is consistent with the order of events.  If the test passes
- * %0 is returned, otherwise %-1 is returned.  If TSC conversion is not
- * supported then then the test passes but " (not supported)" is printed.
- */
-int test__perf_time_to_tsc(void)
-{
-	struct perf_record_opts opts = {
-		.mmap_pages	     = UINT_MAX,
-		.user_freq	     = UINT_MAX,
-		.user_interval	     = ULLONG_MAX,
-		.freq		     = 4000,
-		.target		     = {
-			.uses_mmap   = true,
-		},
-		.sample_time	     = true,
-	};
-	struct thread_map *threads = NULL;
-	struct cpu_map *cpus = NULL;
-	struct perf_evlist *evlist = NULL;
-	struct perf_evsel *evsel = NULL;
-	int err = -1, ret, i;
-	const char *comm1, *comm2;
-	struct perf_tsc_conversion tc;
-	struct perf_event_mmap_page *pc;
-	union perf_event *event;
-	u64 test_tsc, comm1_tsc, comm2_tsc;
-	u64 test_time, comm1_time = 0, comm2_time = 0;
-
-	threads = thread_map__new(-1, getpid(), UINT_MAX);
-	CHECK_NOT_NULL__(threads);
-
-	cpus = cpu_map__new(NULL);
-	CHECK_NOT_NULL__(cpus);
-
-	evlist = perf_evlist__new();
-	CHECK_NOT_NULL__(evlist);
-
-	perf_evlist__set_maps(evlist, cpus, threads);
-
-	CHECK__(parse_events(evlist, "cycles:u"));
-
-	perf_evlist__config(evlist, &opts);
-
-	evsel = perf_evlist__first(evlist);
-
-	evsel->attr.comm = 1;
-	evsel->attr.disabled = 1;
-	evsel->attr.enable_on_exec = 0;
-
-	CHECK__(perf_evlist__open(evlist));
-
-	CHECK__(perf_evlist__mmap(evlist, UINT_MAX, false));
-
-	pc = evlist->mmap[0].base;
-	ret = perf_read_tsc_conversion(pc, &tc);
-	if (ret) {
-		if (ret == -EOPNOTSUPP) {
-			fprintf(stderr, " (not supported)");
-			return 0;
-		}
-		goto out_err;
-	}
-
-	perf_evlist__enable(evlist);
-
-	comm1 = "Test COMM 1";
-	CHECK__(prctl(PR_SET_NAME, (unsigned long)comm1, 0, 0, 0));
-
-	test_tsc = rdtsc();
-
-	comm2 = "Test COMM 2";
-	CHECK__(prctl(PR_SET_NAME, (unsigned long)comm2, 0, 0, 0));
-
-	perf_evlist__disable(evlist);
-
-	for (i = 0; i < evlist->nr_mmaps; i++) {
-		while ((event = perf_evlist__mmap_read(evlist, i)) != NULL) {
-			struct perf_sample sample;
-
-			if (event->header.type != PERF_RECORD_COMM ||
-			    (pid_t)event->comm.pid != getpid() ||
-			    (pid_t)event->comm.tid != getpid())
-				goto next_event;
-
-			if (strcmp(event->comm.comm, comm1) == 0) {
-				CHECK__(perf_evsel__parse_sample(evsel, event,
-								 &sample));
-				comm1_time = sample.time;
-			}
-			if (strcmp(event->comm.comm, comm2) == 0) {
-				CHECK__(perf_evsel__parse_sample(evsel, event,
-								 &sample));
-				comm2_time = sample.time;
-			}
-next_event:
-			perf_evlist__mmap_consume(evlist, i);
-		}
-	}
-
-	if (!comm1_time || !comm2_time)
-		goto out_err;
-
-	test_time = tsc_to_perf_time(test_tsc, &tc);
-	comm1_tsc = perf_time_to_tsc(comm1_time, &tc);
-	comm2_tsc = perf_time_to_tsc(comm2_time, &tc);
-
-	pr_debug("1st event perf time %"PRIu64" tsc %"PRIu64"\n",
-		 comm1_time, comm1_tsc);
-	pr_debug("rdtsc          time %"PRIu64" tsc %"PRIu64"\n",
-		 test_time, test_tsc);
-	pr_debug("2nd event perf time %"PRIu64" tsc %"PRIu64"\n",
-		 comm2_time, comm2_tsc);
-
-	if (test_time <= comm1_time ||
-	    test_time >= comm2_time)
-		goto out_err;
-
-	if (test_tsc <= comm1_tsc ||
-	    test_tsc >= comm2_tsc)
-		goto out_err;
-
-	err = 0;
-
-out_err:
-	if (evlist) {
-		perf_evlist__disable(evlist);
-		perf_evlist__munmap(evlist);
-		perf_evlist__close(evlist);
-		perf_evlist__delete(evlist);
-	}
-	if (cpus)
-		cpu_map__delete(cpus);
-	if (threads)
-		thread_map__delete(threads);
-
-	return err;
-}
diff --git a/src/tools/perf/tests/pmu.c b/src/tools/perf/tests/pmu.c
deleted file mode 100644
index 12b322f..0000000
--- a/src/tools/perf/tests/pmu.c
+++ /dev/null
@@ -1,173 +0,0 @@
-#include "parse-events.h"
-#include "pmu.h"
-#include "util.h"
-#include "tests.h"
-
-/* Simulated format definitions. */
-static struct test_format {
-	const char *name;
-	const char *value;
-} test_formats[] = {
-	{ "krava01", "config:0-1,62-63\n", },
-	{ "krava02", "config:10-17\n", },
-	{ "krava03", "config:5\n", },
-	{ "krava11", "config1:0,2,4,6,8,20-28\n", },
-	{ "krava12", "config1:63\n", },
-	{ "krava13", "config1:45-47\n", },
-	{ "krava21", "config2:0-3,10-13,20-23,30-33,40-43,50-53,60-63\n", },
-	{ "krava22", "config2:8,18,48,58\n", },
-	{ "krava23", "config2:28-29,38\n", },
-};
-
-/* Simulated users input. */
-static struct parse_events_term test_terms[] = {
-	{
-		.config    = (char *) "krava01",
-		.val.num   = 15,
-		.type_val  = PARSE_EVENTS__TERM_TYPE_NUM,
-		.type_term = PARSE_EVENTS__TERM_TYPE_USER,
-	},
-	{
-		.config    = (char *) "krava02",
-		.val.num   = 170,
-		.type_val  = PARSE_EVENTS__TERM_TYPE_NUM,
-		.type_term = PARSE_EVENTS__TERM_TYPE_USER,
-	},
-	{
-		.config    = (char *) "krava03",
-		.val.num   = 1,
-		.type_val  = PARSE_EVENTS__TERM_TYPE_NUM,
-		.type_term = PARSE_EVENTS__TERM_TYPE_USER,
-	},
-	{
-		.config    = (char *) "krava11",
-		.val.num   = 27,
-		.type_val  = PARSE_EVENTS__TERM_TYPE_NUM,
-		.type_term = PARSE_EVENTS__TERM_TYPE_USER,
-	},
-	{
-		.config    = (char *) "krava12",
-		.val.num   = 1,
-		.type_val  = PARSE_EVENTS__TERM_TYPE_NUM,
-		.type_term = PARSE_EVENTS__TERM_TYPE_USER,
-	},
-	{
-		.config    = (char *) "krava13",
-		.val.num   = 2,
-		.type_val  = PARSE_EVENTS__TERM_TYPE_NUM,
-		.type_term = PARSE_EVENTS__TERM_TYPE_USER,
-	},
-	{
-		.config    = (char *) "krava21",
-		.val.num   = 119,
-		.type_val  = PARSE_EVENTS__TERM_TYPE_NUM,
-		.type_term = PARSE_EVENTS__TERM_TYPE_USER,
-	},
-	{
-		.config    = (char *) "krava22",
-		.val.num   = 11,
-		.type_val  = PARSE_EVENTS__TERM_TYPE_NUM,
-		.type_term = PARSE_EVENTS__TERM_TYPE_USER,
-	},
-	{
-		.config    = (char *) "krava23",
-		.val.num   = 2,
-		.type_val  = PARSE_EVENTS__TERM_TYPE_NUM,
-		.type_term = PARSE_EVENTS__TERM_TYPE_USER,
-	},
-};
-
-/*
- * Prepare format directory data, exported by kernel
- * at /sys/bus/event_source/devices/<dev>/format.
- */
-static char *test_format_dir_get(void)
-{
-	static char dir[PATH_MAX];
-	unsigned int i;
-
-	snprintf(dir, PATH_MAX, "/tmp/perf-pmu-test-format-XXXXXX");
-	if (!mkdtemp(dir))
-		return NULL;
-
-	for (i = 0; i < ARRAY_SIZE(test_formats); i++) {
-		static char name[PATH_MAX];
-		struct test_format *format = &test_formats[i];
-		FILE *file;
-
-		snprintf(name, PATH_MAX, "%s/%s", dir, format->name);
-
-		file = fopen(name, "w");
-		if (!file)
-			return NULL;
-
-		if (1 != fwrite(format->value, strlen(format->value), 1, file))
-			break;
-
-		fclose(file);
-	}
-
-	return dir;
-}
-
-/* Cleanup format directory. */
-static int test_format_dir_put(char *dir)
-{
-	char buf[PATH_MAX];
-	snprintf(buf, PATH_MAX, "rm -f %s/*\n", dir);
-	if (system(buf))
-		return -1;
-
-	snprintf(buf, PATH_MAX, "rmdir %s\n", dir);
-	return system(buf);
-}
-
-static struct list_head *test_terms_list(void)
-{
-	static LIST_HEAD(terms);
-	unsigned int i;
-
-	for (i = 0; i < ARRAY_SIZE(test_terms); i++)
-		list_add_tail(&test_terms[i].list, &terms);
-
-	return &terms;
-}
-
-int test__pmu(void)
-{
-	char *format = test_format_dir_get();
-	LIST_HEAD(formats);
-	struct list_head *terms = test_terms_list();
-	int ret;
-
-	if (!format)
-		return -EINVAL;
-
-	do {
-		struct perf_event_attr attr;
-
-		memset(&attr, 0, sizeof(attr));
-
-		ret = perf_pmu__format_parse(format, &formats);
-		if (ret)
-			break;
-
-		ret = perf_pmu__config_terms(&formats, &attr, terms);
-		if (ret)
-			break;
-
-		ret = -EINVAL;
-
-		if (attr.config  != 0xc00000000002a823)
-			break;
-		if (attr.config1 != 0x8000400000000145)
-			break;
-		if (attr.config2 != 0x0400000020041d07)
-			break;
-
-		ret = 0;
-	} while (0);
-
-	test_format_dir_put(format);
-	return ret;
-}
diff --git a/src/tools/perf/tests/python-use.c b/src/tools/perf/tests/python-use.c
deleted file mode 100644
index 7760277..0000000
--- a/src/tools/perf/tests/python-use.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Just test if we can load the python binding.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "tests.h"
-
-extern int verbose;
-
-int test__python_use(void)
-{
-	char *cmd;
-	int ret;
-
-	if (asprintf(&cmd, "echo \"import sys ; sys.path.append('%s'); import perf\" | %s %s",
-		     PYTHONPATH, PYTHON, verbose ? "" : "2> /dev/null") < 0)
-		return -1;
-
-	ret = system(cmd) ? -1 : 0;
-	free(cmd);
-	return ret;
-}
diff --git a/src/tools/perf/tests/rdpmc.c b/src/tools/perf/tests/rdpmc.c
deleted file mode 100644
index ff94886..0000000
--- a/src/tools/perf/tests/rdpmc.c
+++ /dev/null
@@ -1,175 +0,0 @@
-#include <unistd.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <sys/mman.h>
-#include "types.h"
-#include "perf.h"
-#include "debug.h"
-#include "tests.h"
-
-#if defined(__x86_64__) || defined(__i386__)
-
-#define barrier() asm volatile("" ::: "memory")
-
-static u64 rdpmc(unsigned int counter)
-{
-	unsigned int low, high;
-
-	asm volatile("rdpmc" : "=a" (low), "=d" (high) : "c" (counter));
-
-	return low | ((u64)high) << 32;
-}
-
-static u64 rdtsc(void)
-{
-	unsigned int low, high;
-
-	asm volatile("rdtsc" : "=a" (low), "=d" (high));
-
-	return low | ((u64)high) << 32;
-}
-
-static u64 mmap_read_self(void *addr)
-{
-	struct perf_event_mmap_page *pc = addr;
-	u32 seq, idx, time_mult = 0, time_shift = 0;
-	u64 count, cyc = 0, time_offset = 0, enabled, running, delta;
-
-	do {
-		seq = pc->lock;
-		barrier();
-
-		enabled = pc->time_enabled;
-		running = pc->time_running;
-
-		if (enabled != running) {
-			cyc = rdtsc();
-			time_mult = pc->time_mult;
-			time_shift = pc->time_shift;
-			time_offset = pc->time_offset;
-		}
-
-		idx = pc->index;
-		count = pc->offset;
-		if (idx)
-			count += rdpmc(idx - 1);
-
-		barrier();
-	} while (pc->lock != seq);
-
-	if (enabled != running) {
-		u64 quot, rem;
-
-		quot = (cyc >> time_shift);
-		rem = cyc & ((1 << time_shift) - 1);
-		delta = time_offset + quot * time_mult +
-			((rem * time_mult) >> time_shift);
-
-		enabled += delta;
-		if (idx)
-			running += delta;
-
-		quot = count / running;
-		rem = count % running;
-		count = quot * enabled + (rem * enabled) / running;
-	}
-
-	return count;
-}
-
-/*
- * If the RDPMC instruction faults then signal this back to the test parent task:
- */
-static void segfault_handler(int sig __maybe_unused,
-			     siginfo_t *info __maybe_unused,
-			     void *uc __maybe_unused)
-{
-	exit(-1);
-}
-
-static int __test__rdpmc(void)
-{
-	volatile int tmp = 0;
-	u64 i, loops = 1000;
-	int n;
-	int fd;
-	void *addr;
-	struct perf_event_attr attr = {
-		.type = PERF_TYPE_HARDWARE,
-		.config = PERF_COUNT_HW_INSTRUCTIONS,
-		.exclude_kernel = 1,
-	};
-	u64 delta_sum = 0;
-        struct sigaction sa;
-
-	sigfillset(&sa.sa_mask);
-	sa.sa_sigaction = segfault_handler;
-	sigaction(SIGSEGV, &sa, NULL);
-
-	fd = sys_perf_event_open(&attr, 0, -1, -1, 0);
-	if (fd < 0) {
-		pr_err("Error: sys_perf_event_open() syscall returned "
-		       "with %d (%s)\n", fd, strerror(errno));
-		return -1;
-	}
-
-	addr = mmap(NULL, page_size, PROT_READ, MAP_SHARED, fd, 0);
-	if (addr == (void *)(-1)) {
-		pr_err("Error: mmap() syscall returned with (%s)\n",
-		       strerror(errno));
-		goto out_close;
-	}
-
-	for (n = 0; n < 6; n++) {
-		u64 stamp, now, delta;
-
-		stamp = mmap_read_self(addr);
-
-		for (i = 0; i < loops; i++)
-			tmp++;
-
-		now = mmap_read_self(addr);
-		loops *= 10;
-
-		delta = now - stamp;
-		pr_debug("%14d: %14Lu\n", n, (long long)delta);
-
-		delta_sum += delta;
-	}
-
-	munmap(addr, page_size);
-	pr_debug("   ");
-out_close:
-	close(fd);
-
-	if (!delta_sum)
-		return -1;
-
-	return 0;
-}
-
-int test__rdpmc(void)
-{
-	int status = 0;
-	int wret = 0;
-	int ret;
-	int pid;
-
-	pid = fork();
-	if (pid < 0)
-		return -1;
-
-	if (!pid) {
-		ret = __test__rdpmc();
-
-		exit(ret);
-	}
-
-	wret = waitpid(pid, &status, 0);
-	if (wret < 0 || status)
-		return -1;
-
-	return 0;
-}
-
-#endif
diff --git a/src/tools/perf/tests/sample-parsing.c b/src/tools/perf/tests/sample-parsing.c
deleted file mode 100644
index 77f598d..0000000
--- a/src/tools/perf/tests/sample-parsing.c
+++ /dev/null
@@ -1,316 +0,0 @@
-#include <stdbool.h>
-#include <inttypes.h>
-
-#include "util.h"
-#include "event.h"
-#include "evsel.h"
-
-#include "tests.h"
-
-#define COMP(m) do {					\
-	if (s1->m != s2->m) {				\
-		pr_debug("Samples differ at '"#m"'\n");	\
-		return false;				\
-	}						\
-} while (0)
-
-#define MCOMP(m) do {					\
-	if (memcmp(&s1->m, &s2->m, sizeof(s1->m))) {	\
-		pr_debug("Samples differ at '"#m"'\n");	\
-		return false;				\
-	}						\
-} while (0)
-
-static bool samples_same(const struct perf_sample *s1,
-			 const struct perf_sample *s2, u64 type, u64 regs_user,
-			 u64 read_format)
-{
-	size_t i;
-
-	if (type & PERF_SAMPLE_IDENTIFIER)
-		COMP(id);
-
-	if (type & PERF_SAMPLE_IP)
-		COMP(ip);
-
-	if (type & PERF_SAMPLE_TID) {
-		COMP(pid);
-		COMP(tid);
-	}
-
-	if (type & PERF_SAMPLE_TIME)
-		COMP(time);
-
-	if (type & PERF_SAMPLE_ADDR)
-		COMP(addr);
-
-	if (type & PERF_SAMPLE_ID)
-		COMP(id);
-
-	if (type & PERF_SAMPLE_STREAM_ID)
-		COMP(stream_id);
-
-	if (type & PERF_SAMPLE_CPU)
-		COMP(cpu);
-
-	if (type & PERF_SAMPLE_PERIOD)
-		COMP(period);
-
-	if (type & PERF_SAMPLE_READ) {
-		if (read_format & PERF_FORMAT_GROUP)
-			COMP(read.group.nr);
-		else
-			COMP(read.one.value);
-		if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
-			COMP(read.time_enabled);
-		if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING)
-			COMP(read.time_running);
-		/* PERF_FORMAT_ID is forced for PERF_SAMPLE_READ */
-		if (read_format & PERF_FORMAT_GROUP) {
-			for (i = 0; i < s1->read.group.nr; i++)
-				MCOMP(read.group.values[i]);
-		} else {
-			COMP(read.one.id);
-		}
-	}
-
-	if (type & PERF_SAMPLE_CALLCHAIN) {
-		COMP(callchain->nr);
-		for (i = 0; i < s1->callchain->nr; i++)
-			COMP(callchain->ips[i]);
-	}
-
-	if (type & PERF_SAMPLE_RAW) {
-		COMP(raw_size);
-		if (memcmp(s1->raw_data, s2->raw_data, s1->raw_size)) {
-			pr_debug("Samples differ at 'raw_data'\n");
-			return false;
-		}
-	}
-
-	if (type & PERF_SAMPLE_BRANCH_STACK) {
-		COMP(branch_stack->nr);
-		for (i = 0; i < s1->branch_stack->nr; i++)
-			MCOMP(branch_stack->entries[i]);
-	}
-
-	if (type & PERF_SAMPLE_REGS_USER) {
-		size_t sz = hweight_long(regs_user) * sizeof(u64);
-
-		COMP(user_regs.abi);
-		if (s1->user_regs.abi &&
-		    (!s1->user_regs.regs || !s2->user_regs.regs ||
-		     memcmp(s1->user_regs.regs, s2->user_regs.regs, sz))) {
-			pr_debug("Samples differ at 'user_regs'\n");
-			return false;
-		}
-	}
-
-	if (type & PERF_SAMPLE_STACK_USER) {
-		COMP(user_stack.size);
-		if (memcmp(s1->user_stack.data, s1->user_stack.data,
-			   s1->user_stack.size)) {
-			pr_debug("Samples differ at 'user_stack'\n");
-			return false;
-		}
-	}
-
-	if (type & PERF_SAMPLE_WEIGHT)
-		COMP(weight);
-
-	if (type & PERF_SAMPLE_DATA_SRC)
-		COMP(data_src);
-
-	return true;
-}
-
-static int do_test(u64 sample_type, u64 sample_regs_user, u64 read_format)
-{
-	struct perf_evsel evsel = {
-		.needs_swap = false,
-		.attr = {
-			.sample_type = sample_type,
-			.sample_regs_user = sample_regs_user,
-			.read_format = read_format,
-		},
-	};
-	union perf_event *event;
-	union {
-		struct ip_callchain callchain;
-		u64 data[64];
-	} callchain = {
-		/* 3 ips */
-		.data = {3, 201, 202, 203},
-	};
-	union {
-		struct branch_stack branch_stack;
-		u64 data[64];
-	} branch_stack = {
-		/* 1 branch_entry */
-		.data = {1, 211, 212, 213},
-	};
-	u64 user_regs[64];
-	const u64 raw_data[] = {0x123456780a0b0c0dULL, 0x1102030405060708ULL};
-	const u64 data[] = {0x2211443366558877ULL, 0, 0xaabbccddeeff4321ULL};
-	struct perf_sample sample = {
-		.ip		= 101,
-		.pid		= 102,
-		.tid		= 103,
-		.time		= 104,
-		.addr		= 105,
-		.id		= 106,
-		.stream_id	= 107,
-		.period		= 108,
-		.weight		= 109,
-		.cpu		= 110,
-		.raw_size	= sizeof(raw_data),
-		.data_src	= 111,
-		.raw_data	= (void *)raw_data,
-		.callchain	= &callchain.callchain,
-		.branch_stack	= &branch_stack.branch_stack,
-		.user_regs	= {
-			.abi	= PERF_SAMPLE_REGS_ABI_64,
-			.regs	= user_regs,
-		},
-		.user_stack	= {
-			.size	= sizeof(data),
-			.data	= (void *)data,
-		},
-		.read		= {
-			.time_enabled = 0x030a59d664fca7deULL,
-			.time_running = 0x011b6ae553eb98edULL,
-		},
-	};
-	struct sample_read_value values[] = {{1, 5}, {9, 3}, {2, 7}, {6, 4},};
-	struct perf_sample sample_out;
-	size_t i, sz, bufsz;
-	int err, ret = -1;
-
-	for (i = 0; i < sizeof(user_regs); i++)
-		*(i + (u8 *)user_regs) = i & 0xfe;
-
-	if (read_format & PERF_FORMAT_GROUP) {
-		sample.read.group.nr     = 4;
-		sample.read.group.values = values;
-	} else {
-		sample.read.one.value = 0x08789faeb786aa87ULL;
-		sample.read.one.id    = 99;
-	}
-
-	sz = perf_event__sample_event_size(&sample, sample_type,
-					   sample_regs_user, read_format);
-	bufsz = sz + 4096; /* Add a bit for overrun checking */
-	event = malloc(bufsz);
-	if (!event) {
-		pr_debug("malloc failed\n");
-		return -1;
-	}
-
-	memset(event, 0xff, bufsz);
-	event->header.type = PERF_RECORD_SAMPLE;
-	event->header.misc = 0;
-	event->header.size = sz;
-
-	err = perf_event__synthesize_sample(event, sample_type,
-					    sample_regs_user, read_format,
-					    &sample, false);
-	if (err) {
-		pr_debug("%s failed for sample_type %#"PRIx64", error %d\n",
-			 "perf_event__synthesize_sample", sample_type, err);
-		goto out_free;
-	}
-
-	/* The data does not contain 0xff so we use that to check the size */
-	for (i = bufsz; i > 0; i--) {
-		if (*(i - 1 + (u8 *)event) != 0xff)
-			break;
-	}
-	if (i != sz) {
-		pr_debug("Event size mismatch: actual %zu vs expected %zu\n",
-			 i, sz);
-		goto out_free;
-	}
-
-	evsel.sample_size = __perf_evsel__sample_size(sample_type);
-
-	err = perf_evsel__parse_sample(&evsel, event, &sample_out);
-	if (err) {
-		pr_debug("%s failed for sample_type %#"PRIx64", error %d\n",
-			 "perf_evsel__parse_sample", sample_type, err);
-		goto out_free;
-	}
-
-	if (!samples_same(&sample, &sample_out, sample_type,
-			  sample_regs_user, read_format)) {
-		pr_debug("parsing failed for sample_type %#"PRIx64"\n",
-			 sample_type);
-		goto out_free;
-	}
-
-	ret = 0;
-out_free:
-	free(event);
-	if (ret && read_format)
-		pr_debug("read_format %#"PRIx64"\n", read_format);
-	return ret;
-}
-
-/**
- * test__sample_parsing - test sample parsing.
- *
- * This function implements a test that synthesizes a sample event, parses it
- * and then checks that the parsed sample matches the original sample.  The test
- * checks sample format bits separately and together.  If the test passes %0 is
- * returned, otherwise %-1 is returned.
- */
-int test__sample_parsing(void)
-{
-	const u64 rf[] = {4, 5, 6, 7, 12, 13, 14, 15};
-	u64 sample_type;
-	u64 sample_regs_user;
-	size_t i;
-	int err;
-
-	/*
-	 * Fail the test if it has not been updated when new sample format bits
-	 * were added.
-	 */
-	if (PERF_SAMPLE_MAX > PERF_SAMPLE_IDENTIFIER << 1) {
-		pr_debug("sample format has changed - test needs updating\n");
-		return -1;
-	}
-
-	/* Test each sample format bit separately */
-	for (sample_type = 1; sample_type != PERF_SAMPLE_MAX;
-	     sample_type <<= 1) {
-		/* Test read_format variations */
-		if (sample_type == PERF_SAMPLE_READ) {
-			for (i = 0; i < ARRAY_SIZE(rf); i++) {
-				err = do_test(sample_type, 0, rf[i]);
-				if (err)
-					return err;
-			}
-			continue;
-		}
-
-		if (sample_type == PERF_SAMPLE_REGS_USER)
-			sample_regs_user = 0x3fff;
-		else
-			sample_regs_user = 0;
-
-		err = do_test(sample_type, sample_regs_user, 0);
-		if (err)
-			return err;
-	}
-
-	/* Test all sample format bits together */
-	sample_type = PERF_SAMPLE_MAX - 1;
-	sample_regs_user = 0x3fff;
-	for (i = 0; i < ARRAY_SIZE(rf); i++) {
-		err = do_test(sample_type, sample_regs_user, rf[i]);
-		if (err)
-			return err;
-	}
-
-	return 0;
-}
diff --git a/src/tools/perf/tests/sw-clock.c b/src/tools/perf/tests/sw-clock.c
deleted file mode 100644
index 6e2b44e..0000000
--- a/src/tools/perf/tests/sw-clock.c
+++ /dev/null
@@ -1,121 +0,0 @@
-#include <unistd.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <sys/mman.h>
-
-#include "tests.h"
-#include "util/evsel.h"
-#include "util/evlist.h"
-#include "util/cpumap.h"
-#include "util/thread_map.h"
-
-#define NR_LOOPS  1000000
-
-/*
- * This test will open software clock events (cpu-clock, task-clock)
- * then check their frequency -> period conversion has no artifact of
- * setting period to 1 forcefully.
- */
-static int __test__sw_clock_freq(enum perf_sw_ids clock_id)
-{
-	int i, err = -1;
-	volatile int tmp = 0;
-	u64 total_periods = 0;
-	int nr_samples = 0;
-	union perf_event *event;
-	struct perf_evsel *evsel;
-	struct perf_evlist *evlist;
-	struct perf_event_attr attr = {
-		.type = PERF_TYPE_SOFTWARE,
-		.config = clock_id,
-		.sample_type = PERF_SAMPLE_PERIOD,
-		.exclude_kernel = 1,
-		.disabled = 1,
-		.freq = 1,
-	};
-
-	attr.sample_freq = 10000;
-
-	evlist = perf_evlist__new();
-	if (evlist == NULL) {
-		pr_debug("perf_evlist__new\n");
-		return -1;
-	}
-
-	evsel = perf_evsel__new(&attr, 0);
-	if (evsel == NULL) {
-		pr_debug("perf_evsel__new\n");
-		goto out_free_evlist;
-	}
-	perf_evlist__add(evlist, evsel);
-
-	evlist->cpus = cpu_map__dummy_new();
-	evlist->threads = thread_map__new_by_tid(getpid());
-	if (!evlist->cpus || !evlist->threads) {
-		err = -ENOMEM;
-		pr_debug("Not enough memory to create thread/cpu maps\n");
-		goto out_delete_maps;
-	}
-
-	perf_evlist__open(evlist);
-
-	err = perf_evlist__mmap(evlist, 128, true);
-	if (err < 0) {
-		pr_debug("failed to mmap event: %d (%s)\n", errno,
-			 strerror(errno));
-		goto out_close_evlist;
-	}
-
-	perf_evlist__enable(evlist);
-
-	/* collect samples */
-	for (i = 0; i < NR_LOOPS; i++)
-		tmp++;
-
-	perf_evlist__disable(evlist);
-
-	while ((event = perf_evlist__mmap_read(evlist, 0)) != NULL) {
-		struct perf_sample sample;
-
-		if (event->header.type != PERF_RECORD_SAMPLE)
-			goto next_event;
-
-		err = perf_evlist__parse_sample(evlist, event, &sample);
-		if (err < 0) {
-			pr_debug("Error during parse sample\n");
-			goto out_unmap_evlist;
-		}
-
-		total_periods += sample.period;
-		nr_samples++;
-next_event:
-		perf_evlist__mmap_consume(evlist, 0);
-	}
-
-	if ((u64) nr_samples == total_periods) {
-		pr_debug("All (%d) samples have period value of 1!\n",
-			 nr_samples);
-		err = -1;
-	}
-
-out_unmap_evlist:
-	perf_evlist__munmap(evlist);
-out_close_evlist:
-	perf_evlist__close(evlist);
-out_delete_maps:
-	perf_evlist__delete_maps(evlist);
-out_free_evlist:
-	perf_evlist__delete(evlist);
-	return err;
-}
-
-int test__sw_clock_freq(void)
-{
-	int ret;
-
-	ret = __test__sw_clock_freq(PERF_COUNT_SW_CPU_CLOCK);
-	if (!ret)
-		ret = __test__sw_clock_freq(PERF_COUNT_SW_TASK_CLOCK);
-
-	return ret;
-}
diff --git a/src/tools/perf/tests/task-exit.c b/src/tools/perf/tests/task-exit.c
deleted file mode 100644
index a3e6487..0000000
--- a/src/tools/perf/tests/task-exit.c
+++ /dev/null
@@ -1,123 +0,0 @@
-#include "evlist.h"
-#include "evsel.h"
-#include "thread_map.h"
-#include "cpumap.h"
-#include "tests.h"
-
-#include <signal.h>
-
-static int exited;
-static int nr_exit;
-
-static void sig_handler(int sig)
-{
-	exited = 1;
-
-	if (sig == SIGUSR1)
-		nr_exit = -1;
-}
-
-/*
- * This test will start a workload that does nothing then it checks
- * if the number of exit event reported by the kernel is 1 or not
- * in order to check the kernel returns correct number of event.
- */
-int test__task_exit(void)
-{
-	int err = -1;
-	union perf_event *event;
-	struct perf_evsel *evsel;
-	struct perf_evlist *evlist;
-	struct perf_target target = {
-		.uid		= UINT_MAX,
-		.uses_mmap	= true,
-	};
-	const char *argv[] = { "true", NULL };
-
-	signal(SIGCHLD, sig_handler);
-	signal(SIGUSR1, sig_handler);
-
-	evlist = perf_evlist__new();
-	if (evlist == NULL) {
-		pr_debug("perf_evlist__new\n");
-		return -1;
-	}
-	/*
-	 * We need at least one evsel in the evlist, use the default
-	 * one: "cycles".
-	 */
-	err = perf_evlist__add_default(evlist);
-	if (err < 0) {
-		pr_debug("Not enough memory to create evsel\n");
-		goto out_free_evlist;
-	}
-
-	/*
-	 * Create maps of threads and cpus to monitor. In this case
-	 * we start with all threads and cpus (-1, -1) but then in
-	 * perf_evlist__prepare_workload we'll fill in the only thread
-	 * we're monitoring, the one forked there.
-	 */
-	evlist->cpus = cpu_map__dummy_new();
-	evlist->threads = thread_map__new_by_tid(-1);
-	if (!evlist->cpus || !evlist->threads) {
-		err = -ENOMEM;
-		pr_debug("Not enough memory to create thread/cpu maps\n");
-		goto out_delete_maps;
-	}
-
-	err = perf_evlist__prepare_workload(evlist, &target, argv, false, true);
-	if (err < 0) {
-		pr_debug("Couldn't run the workload!\n");
-		goto out_delete_maps;
-	}
-
-	evsel = perf_evlist__first(evlist);
-	evsel->attr.task = 1;
-	evsel->attr.sample_freq = 0;
-	evsel->attr.inherit = 0;
-	evsel->attr.watermark = 0;
-	evsel->attr.wakeup_events = 1;
-	evsel->attr.exclude_kernel = 1;
-
-	err = perf_evlist__open(evlist);
-	if (err < 0) {
-		pr_debug("Couldn't open the evlist: %s\n", strerror(-err));
-		goto out_delete_maps;
-	}
-
-	if (perf_evlist__mmap(evlist, 128, true) < 0) {
-		pr_debug("failed to mmap events: %d (%s)\n", errno,
-			 strerror(errno));
-		goto out_close_evlist;
-	}
-
-	perf_evlist__start_workload(evlist);
-
-retry:
-	while ((event = perf_evlist__mmap_read(evlist, 0)) != NULL) {
-		if (event->header.type == PERF_RECORD_EXIT)
-			nr_exit++;
-
-		perf_evlist__mmap_consume(evlist, 0);
-	}
-
-	if (!exited || !nr_exit) {
-		poll(evlist->pollfd, evlist->nr_fds, -1);
-		goto retry;
-	}
-
-	if (nr_exit != 1) {
-		pr_debug("received %d EXIT records\n", nr_exit);
-		err = -1;
-	}
-
-	perf_evlist__munmap(evlist);
-out_close_evlist:
-	perf_evlist__close(evlist);
-out_delete_maps:
-	perf_evlist__delete_maps(evlist);
-out_free_evlist:
-	perf_evlist__delete(evlist);
-	return err;
-}
diff --git a/src/tools/perf/tests/tests.h b/src/tools/perf/tests/tests.h
deleted file mode 100644
index e0ac713..0000000
--- a/src/tools/perf/tests/tests.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef TESTS_H
-#define TESTS_H
-
-#define TEST_ASSERT_VAL(text, cond)					 \
-do {									 \
-	if (!(cond)) {							 \
-		pr_debug("FAILED %s:%d %s\n", __FILE__, __LINE__, text); \
-		return -1;						 \
-	}								 \
-} while (0)
-
-enum {
-	TEST_OK   =  0,
-	TEST_FAIL = -1,
-	TEST_SKIP = -2,
-};
-
-/* Tests */
-int test__vmlinux_matches_kallsyms(void);
-int test__open_syscall_event(void);
-int test__open_syscall_event_on_all_cpus(void);
-int test__basic_mmap(void);
-int test__PERF_RECORD(void);
-int test__rdpmc(void);
-int test__perf_evsel__roundtrip_name_test(void);
-int test__perf_evsel__tp_sched_test(void);
-int test__syscall_open_tp_fields(void);
-int test__pmu(void);
-int test__attr(void);
-int test__dso_data(void);
-int test__parse_events(void);
-int test__hists_link(void);
-int test__python_use(void);
-int test__bp_signal(void);
-int test__bp_signal_overflow(void);
-int test__task_exit(void);
-int test__sw_clock_freq(void);
-int test__perf_time_to_tsc(void);
-int test__code_reading(void);
-int test__sample_parsing(void);
-int test__keep_tracking(void);
-int test__parse_no_sample_id_all(void);
-
-#endif /* TESTS_H */
diff --git a/src/tools/perf/tests/vmlinux-kallsyms.c b/src/tools/perf/tests/vmlinux-kallsyms.c
deleted file mode 100644
index 2bd13ed..0000000
--- a/src/tools/perf/tests/vmlinux-kallsyms.c
+++ /dev/null
@@ -1,252 +0,0 @@
-#include <linux/compiler.h>
-#include <linux/rbtree.h>
-#include <string.h>
-#include "map.h"
-#include "symbol.h"
-#include "util.h"
-#include "tests.h"
-#include "debug.h"
-#include "machine.h"
-
-static int vmlinux_matches_kallsyms_filter(struct map *map __maybe_unused,
-					   struct symbol *sym)
-{
-	bool *visited = symbol__priv(sym);
-	*visited = true;
-	return 0;
-}
-
-#define UM(x) kallsyms_map->unmap_ip(kallsyms_map, (x))
-
-int test__vmlinux_matches_kallsyms(void)
-{
-	int err = -1;
-	struct rb_node *nd;
-	struct symbol *sym;
-	struct map *kallsyms_map, *vmlinux_map;
-	struct machine kallsyms, vmlinux;
-	enum map_type type = MAP__FUNCTION;
-	struct ref_reloc_sym ref_reloc_sym = { .name = "_stext", };
-	u64 mem_start, mem_end;
-
-	/*
-	 * Step 1:
-	 *
-	 * Init the machines that will hold kernel, modules obtained from
-	 * both vmlinux + .ko files and from /proc/kallsyms split by modules.
-	 */
-	machine__init(&kallsyms, "", HOST_KERNEL_ID);
-	machine__init(&vmlinux, "", HOST_KERNEL_ID);
-
-	/*
-	 * Step 2:
-	 *
-	 * Create the kernel maps for kallsyms and the DSO where we will then
-	 * load /proc/kallsyms. Also create the modules maps from /proc/modules
-	 * and find the .ko files that match them in /lib/modules/`uname -r`/.
-	 */
-	if (machine__create_kernel_maps(&kallsyms) < 0) {
-		pr_debug("machine__create_kernel_maps ");
-		goto out;
-	}
-
-	/*
-	 * Step 3:
-	 *
-	 * Load and split /proc/kallsyms into multiple maps, one per module.
-	 */
-	if (machine__load_kallsyms(&kallsyms, "/proc/kallsyms", type, NULL) <= 0) {
-		pr_debug("dso__load_kallsyms ");
-		goto out;
-	}
-
-	/*
-	 * Step 4:
-	 *
-	 * kallsyms will be internally on demand sorted by name so that we can
-	 * find the reference relocation * symbol, i.e. the symbol we will use
-	 * to see if the running kernel was relocated by checking if it has the
-	 * same value in the vmlinux file we load.
-	 */
-	kallsyms_map = machine__kernel_map(&kallsyms, type);
-
-	sym = map__find_symbol_by_name(kallsyms_map, ref_reloc_sym.name, NULL);
-	if (sym == NULL) {
-		pr_debug("dso__find_symbol_by_name ");
-		goto out;
-	}
-
-	ref_reloc_sym.addr = UM(sym->start);
-
-	/*
-	 * Step 5:
-	 *
-	 * Now repeat step 2, this time for the vmlinux file we'll auto-locate.
-	 */
-	if (machine__create_kernel_maps(&vmlinux) < 0) {
-		pr_debug("machine__create_kernel_maps ");
-		goto out;
-	}
-
-	vmlinux_map = machine__kernel_map(&vmlinux, type);
-	map__kmap(vmlinux_map)->ref_reloc_sym = &ref_reloc_sym;
-
-	/*
-	 * Step 6:
-	 *
-	 * Locate a vmlinux file in the vmlinux path that has a buildid that
-	 * matches the one of the running kernel.
-	 *
-	 * While doing that look if we find the ref reloc symbol, if we find it
-	 * we'll have its ref_reloc_symbol.unrelocated_addr and then
-	 * maps__reloc_vmlinux will notice and set proper ->[un]map_ip routines
-	 * to fixup the symbols.
-	 */
-	if (machine__load_vmlinux_path(&vmlinux, type,
-				       vmlinux_matches_kallsyms_filter) <= 0) {
-		pr_debug("Couldn't find a vmlinux that matches the kernel running on this machine, skipping test\n");
-		err = TEST_SKIP;
-		goto out;
-	}
-
-	err = 0;
-	/*
-	 * Step 7:
-	 *
-	 * Now look at the symbols in the vmlinux DSO and check if we find all of them
-	 * in the kallsyms dso. For the ones that are in both, check its names and
-	 * end addresses too.
-	 */
-	for (nd = rb_first(&vmlinux_map->dso->symbols[type]); nd; nd = rb_next(nd)) {
-		struct symbol *pair, *first_pair;
-		bool backwards = true;
-
-		sym  = rb_entry(nd, struct symbol, rb_node);
-
-		if (sym->start == sym->end)
-			continue;
-
-		mem_start = vmlinux_map->unmap_ip(vmlinux_map, sym->start);
-		mem_end = vmlinux_map->unmap_ip(vmlinux_map, sym->end);
-
-		first_pair = machine__find_kernel_symbol(&kallsyms, type,
-							 mem_start, NULL, NULL);
-		pair = first_pair;
-
-		if (pair && UM(pair->start) == mem_start) {
-next_pair:
-			if (strcmp(sym->name, pair->name) == 0) {
-				/*
-				 * kallsyms don't have the symbol end, so we
-				 * set that by using the next symbol start - 1,
-				 * in some cases we get this up to a page
-				 * wrong, trace_kmalloc when I was developing
-				 * this code was one such example, 2106 bytes
-				 * off the real size. More than that and we
-				 * _really_ have a problem.
-				 */
-				s64 skew = mem_end - UM(pair->end);
-				if (llabs(skew) >= page_size)
-					pr_debug("%#" PRIx64 ": diff end addr for %s v: %#" PRIx64 " k: %#" PRIx64 "\n",
-						 mem_start, sym->name, mem_end,
-						 UM(pair->end));
-
-				/*
-				 * Do not count this as a failure, because we
-				 * could really find a case where it's not
-				 * possible to get proper function end from
-				 * kallsyms.
-				 */
-				continue;
-
-			} else {
-				struct rb_node *nnd;
-detour:
-				nnd = backwards ? rb_prev(&pair->rb_node) :
-						  rb_next(&pair->rb_node);
-				if (nnd) {
-					struct symbol *next = rb_entry(nnd, struct symbol, rb_node);
-
-					if (UM(next->start) == mem_start) {
-						pair = next;
-						goto next_pair;
-					}
-				}
-
-				if (backwards) {
-					backwards = false;
-					pair = first_pair;
-					goto detour;
-				}
-
-				pr_debug("%#" PRIx64 ": diff name v: %s k: %s\n",
-					 mem_start, sym->name, pair->name);
-			}
-		} else
-			pr_debug("%#" PRIx64 ": %s not on kallsyms\n",
-				 mem_start, sym->name);
-
-		err = -1;
-	}
-
-	if (!verbose)
-		goto out;
-
-	pr_info("Maps only in vmlinux:\n");
-
-	for (nd = rb_first(&vmlinux.kmaps.maps[type]); nd; nd = rb_next(nd)) {
-		struct map *pos = rb_entry(nd, struct map, rb_node), *pair;
-		/*
-		 * If it is the kernel, kallsyms is always "[kernel.kallsyms]", while
-		 * the kernel will have the path for the vmlinux file being used,
-		 * so use the short name, less descriptive but the same ("[kernel]" in
-		 * both cases.
-		 */
-		pair = map_groups__find_by_name(&kallsyms.kmaps, type,
-						(pos->dso->kernel ?
-							pos->dso->short_name :
-							pos->dso->name));
-		if (pair)
-			pair->priv = 1;
-		else
-			map__fprintf(pos, stderr);
-	}
-
-	pr_info("Maps in vmlinux with a different name in kallsyms:\n");
-
-	for (nd = rb_first(&vmlinux.kmaps.maps[type]); nd; nd = rb_next(nd)) {
-		struct map *pos = rb_entry(nd, struct map, rb_node), *pair;
-
-		mem_start = vmlinux_map->unmap_ip(vmlinux_map, pos->start);
-		mem_end = vmlinux_map->unmap_ip(vmlinux_map, pos->end);
-
-		pair = map_groups__find(&kallsyms.kmaps, type, mem_start);
-		if (pair == NULL || pair->priv)
-			continue;
-
-		if (pair->start == mem_start) {
-			pair->priv = 1;
-			pr_info(" %" PRIx64 "-%" PRIx64 " %" PRIx64 " %s in kallsyms as",
-				pos->start, pos->end, pos->pgoff, pos->dso->name);
-			if (mem_end != pair->end)
-				pr_info(":\n*%" PRIx64 "-%" PRIx64 " %" PRIx64,
-					pair->start, pair->end, pair->pgoff);
-			pr_info(" %s\n", pair->dso->name);
-			pair->priv = 1;
-		}
-	}
-
-	pr_info("Maps only in kallsyms:\n");
-
-	for (nd = rb_first(&kallsyms.kmaps.maps[type]);
-	     nd; nd = rb_next(nd)) {
-		struct map *pos = rb_entry(nd, struct map, rb_node);
-
-		if (!pos->priv)
-			map__fprintf(pos, stderr);
-	}
-out:
-	machine__exit(&kallsyms);
-	machine__exit(&vmlinux);
-	return err;
-}
diff --git a/src/tools/perf/ui/browser.c b/src/tools/perf/ui/browser.c
deleted file mode 100644
index bbc782e..0000000
--- a/src/tools/perf/ui/browser.c
+++ /dev/null
@@ -1,721 +0,0 @@
-#include "../util.h"
-#include "../cache.h"
-#include "../../perf.h"
-#include "libslang.h"
-#include "ui.h"
-#include "util.h"
-#include <linux/compiler.h>
-#include <linux/list.h>
-#include <linux/rbtree.h>
-#include <stdlib.h>
-#include <sys/ttydefaults.h>
-#include "browser.h"
-#include "helpline.h"
-#include "keysyms.h"
-#include "../color.h"
-
-static int ui_browser__percent_color(struct ui_browser *browser,
-				     double percent, bool current)
-{
-	if (current && (!browser->use_navkeypressed || browser->navkeypressed))
-		return HE_COLORSET_SELECTED;
-	if (percent >= MIN_RED)
-		return HE_COLORSET_TOP;
-	if (percent >= MIN_GREEN)
-		return HE_COLORSET_MEDIUM;
-	return HE_COLORSET_NORMAL;
-}
-
-int ui_browser__set_color(struct ui_browser *browser, int color)
-{
-	int ret = browser->current_color;
-	browser->current_color = color;
-	SLsmg_set_color(color);
-	return ret;
-}
-
-void ui_browser__set_percent_color(struct ui_browser *browser,
-				   double percent, bool current)
-{
-	 int color = ui_browser__percent_color(browser, percent, current);
-	 ui_browser__set_color(browser, color);
-}
-
-void ui_browser__gotorc(struct ui_browser *browser, int y, int x)
-{
-	SLsmg_gotorc(browser->y + y, browser->x + x);
-}
-
-static struct list_head *
-ui_browser__list_head_filter_entries(struct ui_browser *browser,
-				     struct list_head *pos)
-{
-	do {
-		if (!browser->filter || !browser->filter(browser, pos))
-			return pos;
-		pos = pos->next;
-	} while (pos != browser->entries);
-
-	return NULL;
-}
-
-static struct list_head *
-ui_browser__list_head_filter_prev_entries(struct ui_browser *browser,
-					  struct list_head *pos)
-{
-	do {
-		if (!browser->filter || !browser->filter(browser, pos))
-			return pos;
-		pos = pos->prev;
-	} while (pos != browser->entries);
-
-	return NULL;
-}
-
-void ui_browser__list_head_seek(struct ui_browser *browser, off_t offset, int whence)
-{
-	struct list_head *head = browser->entries;
-	struct list_head *pos;
-
-	if (browser->nr_entries == 0)
-		return;
-
-	switch (whence) {
-	case SEEK_SET:
-		pos = ui_browser__list_head_filter_entries(browser, head->next);
-		break;
-	case SEEK_CUR:
-		pos = browser->top;
-		break;
-	case SEEK_END:
-		pos = ui_browser__list_head_filter_prev_entries(browser, head->prev);
-		break;
-	default:
-		return;
-	}
-
-	assert(pos != NULL);
-
-	if (offset > 0) {
-		while (offset-- != 0)
-			pos = ui_browser__list_head_filter_entries(browser, pos->next);
-	} else {
-		while (offset++ != 0)
-			pos = ui_browser__list_head_filter_prev_entries(browser, pos->prev);
-	}
-
-	browser->top = pos;
-}
-
-void ui_browser__rb_tree_seek(struct ui_browser *browser, off_t offset, int whence)
-{
-	struct rb_root *root = browser->entries;
-	struct rb_node *nd;
-
-	switch (whence) {
-	case SEEK_SET:
-		nd = rb_first(root);
-		break;
-	case SEEK_CUR:
-		nd = browser->top;
-		break;
-	case SEEK_END:
-		nd = rb_last(root);
-		break;
-	default:
-		return;
-	}
-
-	if (offset > 0) {
-		while (offset-- != 0)
-			nd = rb_next(nd);
-	} else {
-		while (offset++ != 0)
-			nd = rb_prev(nd);
-	}
-
-	browser->top = nd;
-}
-
-unsigned int ui_browser__rb_tree_refresh(struct ui_browser *browser)
-{
-	struct rb_node *nd;
-	int row = 0;
-
-	if (browser->top == NULL)
-                browser->top = rb_first(browser->entries);
-
-	nd = browser->top;
-
-	while (nd != NULL) {
-		ui_browser__gotorc(browser, row, 0);
-		browser->write(browser, nd, row);
-		if (++row == browser->height)
-			break;
-		nd = rb_next(nd);
-	}
-
-	return row;
-}
-
-bool ui_browser__is_current_entry(struct ui_browser *browser, unsigned row)
-{
-	return browser->top_idx + row == browser->index;
-}
-
-void ui_browser__refresh_dimensions(struct ui_browser *browser)
-{
-	browser->width = SLtt_Screen_Cols - 1;
-	browser->height = SLtt_Screen_Rows - 2;
-	browser->y = 1;
-	browser->x = 0;
-}
-
-void ui_browser__handle_resize(struct ui_browser *browser)
-{
-	ui__refresh_dimensions(false);
-	ui_browser__show(browser, browser->title, ui_helpline__current);
-	ui_browser__refresh(browser);
-}
-
-int ui_browser__warning(struct ui_browser *browser, int timeout,
-			const char *format, ...)
-{
-	va_list args;
-	char *text;
-	int key = 0, err;
-
-	va_start(args, format);
-	err = vasprintf(&text, format, args);
-	va_end(args);
-
-	if (err < 0) {
-		va_start(args, format);
-		ui_helpline__vpush(format, args);
-		va_end(args);
-	} else {
-		while ((key == ui__question_window("Warning!", text,
-						   "Press any key...",
-						   timeout)) == K_RESIZE)
-			ui_browser__handle_resize(browser);
-		free(text);
-	}
-
-	return key;
-}
-
-int ui_browser__help_window(struct ui_browser *browser, const char *text)
-{
-	int key;
-
-	while ((key = ui__help_window(text)) == K_RESIZE)
-		ui_browser__handle_resize(browser);
-
-	return key;
-}
-
-bool ui_browser__dialog_yesno(struct ui_browser *browser, const char *text)
-{
-	int key;
-
-	while ((key = ui__dialog_yesno(text)) == K_RESIZE)
-		ui_browser__handle_resize(browser);
-
-	return key == K_ENTER || toupper(key) == 'Y';
-}
-
-void ui_browser__reset_index(struct ui_browser *browser)
-{
-	browser->index = browser->top_idx = 0;
-	browser->seek(browser, 0, SEEK_SET);
-}
-
-void __ui_browser__show_title(struct ui_browser *browser, const char *title)
-{
-	SLsmg_gotorc(0, 0);
-	ui_browser__set_color(browser, HE_COLORSET_ROOT);
-	slsmg_write_nstring(title, browser->width + 1);
-}
-
-void ui_browser__show_title(struct ui_browser *browser, const char *title)
-{
-	pthread_mutex_lock(&ui__lock);
-	__ui_browser__show_title(browser, title);
-	pthread_mutex_unlock(&ui__lock);
-}
-
-int ui_browser__show(struct ui_browser *browser, const char *title,
-		     const char *helpline, ...)
-{
-	int err;
-	va_list ap;
-
-	ui_browser__refresh_dimensions(browser);
-
-	pthread_mutex_lock(&ui__lock);
-	__ui_browser__show_title(browser, title);
-
-	browser->title = title;
-	free(browser->helpline);
-	browser->helpline = NULL;
-
-	va_start(ap, helpline);
-	err = vasprintf(&browser->helpline, helpline, ap);
-	va_end(ap);
-	if (err > 0)
-		ui_helpline__push(browser->helpline);
-	pthread_mutex_unlock(&ui__lock);
-	return err ? 0 : -1;
-}
-
-void ui_browser__hide(struct ui_browser *browser __maybe_unused)
-{
-	pthread_mutex_lock(&ui__lock);
-	ui_helpline__pop();
-	free(browser->helpline);
-	browser->helpline = NULL;
-	pthread_mutex_unlock(&ui__lock);
-}
-
-static void ui_browser__scrollbar_set(struct ui_browser *browser)
-{
-	int height = browser->height, h = 0, pct = 0,
-	    col = browser->width,
-	    row = browser->y - 1;
-
-	if (browser->nr_entries > 1) {
-		pct = ((browser->index * (browser->height - 1)) /
-		       (browser->nr_entries - 1));
-	}
-
-	SLsmg_set_char_set(1);
-
-	while (h < height) {
-	        ui_browser__gotorc(browser, row++, col);
-		SLsmg_write_char(h == pct ? SLSMG_DIAMOND_CHAR : SLSMG_CKBRD_CHAR);
-		++h;
-	}
-
-	SLsmg_set_char_set(0);
-}
-
-static int __ui_browser__refresh(struct ui_browser *browser)
-{
-	int row;
-	int width = browser->width;
-
-	row = browser->refresh(browser);
-	ui_browser__set_color(browser, HE_COLORSET_NORMAL);
-
-	if (!browser->use_navkeypressed || browser->navkeypressed)
-		ui_browser__scrollbar_set(browser);
-	else
-		width += 1;
-
-	SLsmg_fill_region(browser->y + row, browser->x,
-			  browser->height - row, width, ' ');
-
-	return 0;
-}
-
-int ui_browser__refresh(struct ui_browser *browser)
-{
-	pthread_mutex_lock(&ui__lock);
-	__ui_browser__refresh(browser);
-	pthread_mutex_unlock(&ui__lock);
-
-	return 0;
-}
-
-/*
- * Here we're updating nr_entries _after_ we started browsing, i.e.  we have to
- * forget about any reference to any entry in the underlying data structure,
- * that is why we do a SEEK_SET. Think about 'perf top' in the hists browser
- * after an output_resort and hist decay.
- */
-void ui_browser__update_nr_entries(struct ui_browser *browser, u32 nr_entries)
-{
-	off_t offset = nr_entries - browser->nr_entries;
-
-	browser->nr_entries = nr_entries;
-
-	if (offset < 0) {
-		if (browser->top_idx < (u64)-offset)
-			offset = -browser->top_idx;
-
-		browser->index += offset;
-		browser->top_idx += offset;
-	}
-
-	browser->top = NULL;
-	browser->seek(browser, browser->top_idx, SEEK_SET);
-}
-
-int ui_browser__run(struct ui_browser *browser, int delay_secs)
-{
-	int err, key;
-
-	while (1) {
-		off_t offset;
-
-		pthread_mutex_lock(&ui__lock);
-		err = __ui_browser__refresh(browser);
-		SLsmg_refresh();
-		pthread_mutex_unlock(&ui__lock);
-		if (err < 0)
-			break;
-
-		key = ui__getch(delay_secs);
-
-		if (key == K_RESIZE) {
-			ui__refresh_dimensions(false);
-			ui_browser__refresh_dimensions(browser);
-			__ui_browser__show_title(browser, browser->title);
-			ui_helpline__puts(browser->helpline);
-			continue;
-		}
-
-		if (browser->use_navkeypressed && !browser->navkeypressed) {
-			if (key == K_DOWN || key == K_UP ||
-			    key == K_PGDN || key == K_PGUP ||
-			    key == K_HOME || key == K_END ||
-			    key == ' ') {
-				browser->navkeypressed = true;
-				continue;
-			} else
-				return key;
-		}
-
-		switch (key) {
-		case K_DOWN:
-			if (browser->index == browser->nr_entries - 1)
-				break;
-			++browser->index;
-			if (browser->index == browser->top_idx + browser->height) {
-				++browser->top_idx;
-				browser->seek(browser, +1, SEEK_CUR);
-			}
-			break;
-		case K_UP:
-			if (browser->index == 0)
-				break;
-			--browser->index;
-			if (browser->index < browser->top_idx) {
-				--browser->top_idx;
-				browser->seek(browser, -1, SEEK_CUR);
-			}
-			break;
-		case K_PGDN:
-		case ' ':
-			if (browser->top_idx + browser->height > browser->nr_entries - 1)
-				break;
-
-			offset = browser->height;
-			if (browser->index + offset > browser->nr_entries - 1)
-				offset = browser->nr_entries - 1 - browser->index;
-			browser->index += offset;
-			browser->top_idx += offset;
-			browser->seek(browser, +offset, SEEK_CUR);
-			break;
-		case K_PGUP:
-			if (browser->top_idx == 0)
-				break;
-
-			if (browser->top_idx < browser->height)
-				offset = browser->top_idx;
-			else
-				offset = browser->height;
-
-			browser->index -= offset;
-			browser->top_idx -= offset;
-			browser->seek(browser, -offset, SEEK_CUR);
-			break;
-		case K_HOME:
-			ui_browser__reset_index(browser);
-			break;
-		case K_END:
-			offset = browser->height - 1;
-			if (offset >= browser->nr_entries)
-				offset = browser->nr_entries - 1;
-
-			browser->index = browser->nr_entries - 1;
-			browser->top_idx = browser->index - offset;
-			browser->seek(browser, -offset, SEEK_END);
-			break;
-		default:
-			return key;
-		}
-	}
-	return -1;
-}
-
-unsigned int ui_browser__list_head_refresh(struct ui_browser *browser)
-{
-	struct list_head *pos;
-	struct list_head *head = browser->entries;
-	int row = 0;
-
-	if (browser->top == NULL || browser->top == browser->entries)
-                browser->top = ui_browser__list_head_filter_entries(browser, head->next);
-
-	pos = browser->top;
-
-	list_for_each_from(pos, head) {
-		if (!browser->filter || !browser->filter(browser, pos)) {
-			ui_browser__gotorc(browser, row, 0);
-			browser->write(browser, pos, row);
-			if (++row == browser->height)
-				break;
-		}
-	}
-
-	return row;
-}
-
-static struct ui_browser_colorset {
-	const char *name, *fg, *bg;
-	int colorset;
-} ui_browser__colorsets[] = {
-	{
-		.colorset = HE_COLORSET_TOP,
-		.name	  = "top",
-		.fg	  = "red",
-		.bg	  = "default",
-	},
-	{
-		.colorset = HE_COLORSET_MEDIUM,
-		.name	  = "medium",
-		.fg	  = "green",
-		.bg	  = "default",
-	},
-	{
-		.colorset = HE_COLORSET_NORMAL,
-		.name	  = "normal",
-		.fg	  = "default",
-		.bg	  = "default",
-	},
-	{
-		.colorset = HE_COLORSET_SELECTED,
-		.name	  = "selected",
-		.fg	  = "black",
-		.bg	  = "lightgray",
-	},
-	{
-		.colorset = HE_COLORSET_CODE,
-		.name	  = "code",
-		.fg	  = "blue",
-		.bg	  = "default",
-	},
-	{
-		.colorset = HE_COLORSET_ADDR,
-		.name	  = "addr",
-		.fg	  = "magenta",
-		.bg	  = "default",
-	},
-	{
-		.colorset = HE_COLORSET_ROOT,
-		.name	  = "root",
-		.fg	  = "white",
-		.bg	  = "blue",
-	},
-	{
-		.name = NULL,
-	}
-};
-
-
-static int ui_browser__color_config(const char *var, const char *value,
-				    void *data __maybe_unused)
-{
-	char *fg = NULL, *bg;
-	int i;
-
-	/* same dir for all commands */
-	if (prefixcmp(var, "colors.") != 0)
-		return 0;
-
-	for (i = 0; ui_browser__colorsets[i].name != NULL; ++i) {
-		const char *name = var + 7;
-
-		if (strcmp(ui_browser__colorsets[i].name, name) != 0)
-			continue;
-
-		fg = strdup(value);
-		if (fg == NULL)
-			break;
-
-		bg = strchr(fg, ',');
-		if (bg == NULL)
-			break;
-
-		*bg = '\0';
-		while (isspace(*++bg));
-		ui_browser__colorsets[i].bg = bg;
-		ui_browser__colorsets[i].fg = fg;
-		return 0;
-	}
-
-	free(fg);
-	return -1;
-}
-
-void ui_browser__argv_seek(struct ui_browser *browser, off_t offset, int whence)
-{
-	switch (whence) {
-	case SEEK_SET:
-		browser->top = browser->entries;
-		break;
-	case SEEK_CUR:
-		browser->top = browser->top + browser->top_idx + offset;
-		break;
-	case SEEK_END:
-		browser->top = browser->top + browser->nr_entries + offset;
-		break;
-	default:
-		return;
-	}
-}
-
-unsigned int ui_browser__argv_refresh(struct ui_browser *browser)
-{
-	unsigned int row = 0, idx = browser->top_idx;
-	char **pos;
-
-	if (browser->top == NULL)
-		browser->top = browser->entries;
-
-	pos = (char **)browser->top;
-	while (idx < browser->nr_entries) {
-		if (!browser->filter || !browser->filter(browser, *pos)) {
-			ui_browser__gotorc(browser, row, 0);
-			browser->write(browser, pos, row);
-			if (++row == browser->height)
-				break;
-		}
-
-		++idx;
-		++pos;
-	}
-
-	return row;
-}
-
-void __ui_browser__vline(struct ui_browser *browser, unsigned int column,
-			 u16 start, u16 end)
-{
-	SLsmg_set_char_set(1);
-	ui_browser__gotorc(browser, start, column);
-	SLsmg_draw_vline(end - start + 1);
-	SLsmg_set_char_set(0);
-}
-
-void ui_browser__write_graph(struct ui_browser *browser __maybe_unused,
-			     int graph)
-{
-	SLsmg_set_char_set(1);
-	SLsmg_write_char(graph);
-	SLsmg_set_char_set(0);
-}
-
-static void __ui_browser__line_arrow_up(struct ui_browser *browser,
-					unsigned int column,
-					u64 start, u64 end)
-{
-	unsigned int row, end_row;
-
-	SLsmg_set_char_set(1);
-
-	if (start < browser->top_idx + browser->height) {
-		row = start - browser->top_idx;
-		ui_browser__gotorc(browser, row, column);
-		SLsmg_write_char(SLSMG_LLCORN_CHAR);
-		ui_browser__gotorc(browser, row, column + 1);
-		SLsmg_draw_hline(2);
-
-		if (row-- == 0)
-			goto out;
-	} else
-		row = browser->height - 1;
-
-	if (end > browser->top_idx)
-		end_row = end - browser->top_idx;
-	else
-		end_row = 0;
-
-	ui_browser__gotorc(browser, end_row, column);
-	SLsmg_draw_vline(row - end_row + 1);
-
-	ui_browser__gotorc(browser, end_row, column);
-	if (end >= browser->top_idx) {
-		SLsmg_write_char(SLSMG_ULCORN_CHAR);
-		ui_browser__gotorc(browser, end_row, column + 1);
-		SLsmg_write_char(SLSMG_HLINE_CHAR);
-		ui_browser__gotorc(browser, end_row, column + 2);
-		SLsmg_write_char(SLSMG_RARROW_CHAR);
-	}
-out:
-	SLsmg_set_char_set(0);
-}
-
-static void __ui_browser__line_arrow_down(struct ui_browser *browser,
-					  unsigned int column,
-					  u64 start, u64 end)
-{
-	unsigned int row, end_row;
-
-	SLsmg_set_char_set(1);
-
-	if (start >= browser->top_idx) {
-		row = start - browser->top_idx;
-		ui_browser__gotorc(browser, row, column);
-		SLsmg_write_char(SLSMG_ULCORN_CHAR);
-		ui_browser__gotorc(browser, row, column + 1);
-		SLsmg_draw_hline(2);
-
-		if (row++ == 0)
-			goto out;
-	} else
-		row = 0;
-
-	if (end >= browser->top_idx + browser->height)
-		end_row = browser->height - 1;
-	else
-		end_row = end - browser->top_idx;;
-
-	ui_browser__gotorc(browser, row, column);
-	SLsmg_draw_vline(end_row - row + 1);
-
-	ui_browser__gotorc(browser, end_row, column);
-	if (end < browser->top_idx + browser->height) {
-		SLsmg_write_char(SLSMG_LLCORN_CHAR);
-		ui_browser__gotorc(browser, end_row, column + 1);
-		SLsmg_write_char(SLSMG_HLINE_CHAR);
-		ui_browser__gotorc(browser, end_row, column + 2);
-		SLsmg_write_char(SLSMG_RARROW_CHAR);
-	}
-out:
-	SLsmg_set_char_set(0);
-}
-
-void __ui_browser__line_arrow(struct ui_browser *browser, unsigned int column,
-			      u64 start, u64 end)
-{
-	if (start > end)
-		__ui_browser__line_arrow_up(browser, column, start, end);
-	else
-		__ui_browser__line_arrow_down(browser, column, start, end);
-}
-
-void ui_browser__init(void)
-{
-	int i = 0;
-
-	perf_config(ui_browser__color_config, NULL);
-
-	while (ui_browser__colorsets[i].name) {
-		struct ui_browser_colorset *c = &ui_browser__colorsets[i++];
-		sltt_set_color(c->colorset, c->name, c->fg, c->bg);
-	}
-
-	annotate_browser__init();
-}
diff --git a/src/tools/perf/ui/browser.h b/src/tools/perf/ui/browser.h
deleted file mode 100644
index 404ff66..0000000
--- a/src/tools/perf/ui/browser.h
+++ /dev/null
@@ -1,74 +0,0 @@
-#ifndef _PERF_UI_BROWSER_H_
-#define _PERF_UI_BROWSER_H_ 1
-
-#include <stdbool.h>
-#include <sys/types.h>
-#include "../types.h"
-
-#define HE_COLORSET_TOP		50
-#define HE_COLORSET_MEDIUM	51
-#define HE_COLORSET_NORMAL	52
-#define HE_COLORSET_SELECTED	53
-#define HE_COLORSET_CODE	54
-#define HE_COLORSET_ADDR	55
-#define HE_COLORSET_ROOT	56
-
-struct ui_browser {
-	u64	      index, top_idx;
-	void	      *top, *entries;
-	u16	      y, x, width, height;
-	int	      current_color;
-	void	      *priv;
-	const char    *title;
-	char	      *helpline;
-	unsigned int  (*refresh)(struct ui_browser *self);
-	void	      (*write)(struct ui_browser *self, void *entry, int row);
-	void	      (*seek)(struct ui_browser *self, off_t offset, int whence);
-	bool	      (*filter)(struct ui_browser *self, void *entry);
-	u32	      nr_entries;
-	bool	      navkeypressed;
-	bool	      use_navkeypressed;
-};
-
-int  ui_browser__set_color(struct ui_browser *browser, int color);
-void ui_browser__set_percent_color(struct ui_browser *self,
-				   double percent, bool current);
-bool ui_browser__is_current_entry(struct ui_browser *self, unsigned row);
-void ui_browser__refresh_dimensions(struct ui_browser *self);
-void ui_browser__reset_index(struct ui_browser *self);
-
-void ui_browser__gotorc(struct ui_browser *self, int y, int x);
-void ui_browser__write_graph(struct ui_browser *browser, int graph);
-void __ui_browser__line_arrow(struct ui_browser *browser, unsigned int column,
-			      u64 start, u64 end);
-void __ui_browser__show_title(struct ui_browser *browser, const char *title);
-void ui_browser__show_title(struct ui_browser *browser, const char *title);
-int ui_browser__show(struct ui_browser *self, const char *title,
-		     const char *helpline, ...);
-void ui_browser__hide(struct ui_browser *self);
-int ui_browser__refresh(struct ui_browser *self);
-int ui_browser__run(struct ui_browser *browser, int delay_secs);
-void ui_browser__update_nr_entries(struct ui_browser *browser, u32 nr_entries);
-void ui_browser__handle_resize(struct ui_browser *browser);
-void __ui_browser__vline(struct ui_browser *browser, unsigned int column,
-			 u16 start, u16 end);
-
-int ui_browser__warning(struct ui_browser *browser, int timeout,
-			const char *format, ...);
-int ui_browser__help_window(struct ui_browser *browser, const char *text);
-bool ui_browser__dialog_yesno(struct ui_browser *browser, const char *text);
-int ui_browser__input_window(const char *title, const char *text, char *input,
-			     const char *exit_msg, int delay_sec);
-
-void ui_browser__argv_seek(struct ui_browser *browser, off_t offset, int whence);
-unsigned int ui_browser__argv_refresh(struct ui_browser *browser);
-
-void ui_browser__rb_tree_seek(struct ui_browser *self, off_t offset, int whence);
-unsigned int ui_browser__rb_tree_refresh(struct ui_browser *self);
-
-void ui_browser__list_head_seek(struct ui_browser *self, off_t offset, int whence);
-unsigned int ui_browser__list_head_refresh(struct ui_browser *self);
-
-void ui_browser__init(void);
-void annotate_browser__init(void);
-#endif /* _PERF_UI_BROWSER_H_ */
diff --git a/src/tools/perf/ui/browsers/annotate.c b/src/tools/perf/ui/browsers/annotate.c
deleted file mode 100644
index 08545ae..0000000
--- a/src/tools/perf/ui/browsers/annotate.c
+++ /dev/null
@@ -1,1021 +0,0 @@
-#include "../../util/util.h"
-#include "../browser.h"
-#include "../helpline.h"
-#include "../libslang.h"
-#include "../ui.h"
-#include "../util.h"
-#include "../../util/annotate.h"
-#include "../../util/hist.h"
-#include "../../util/sort.h"
-#include "../../util/symbol.h"
-#include "../../util/evsel.h"
-#include <pthread.h>
-
-struct browser_disasm_line {
-	struct rb_node	rb_node;
-	u32		idx;
-	int		idx_asm;
-	int		jump_sources;
-	/*
-	 * actual length of this array is saved on the nr_events field
-	 * of the struct annotate_browser
-	 */
-	double		percent[1];
-};
-
-static struct annotate_browser_opt {
-	bool hide_src_code,
-	     use_offset,
-	     jump_arrows,
-	     show_nr_jumps;
-} annotate_browser__opts = {
-	.use_offset	= true,
-	.jump_arrows	= true,
-};
-
-struct annotate_browser {
-	struct ui_browser b;
-	struct rb_root	  entries;
-	struct rb_node	  *curr_hot;
-	struct disasm_line  *selection;
-	struct disasm_line  **offsets;
-	int		    nr_events;
-	u64		    start;
-	int		    nr_asm_entries;
-	int		    nr_entries;
-	int		    max_jump_sources;
-	int		    nr_jumps;
-	bool		    searching_backwards;
-	u8		    addr_width;
-	u8		    jumps_width;
-	u8		    target_width;
-	u8		    min_addr_width;
-	u8		    max_addr_width;
-	char		    search_bf[128];
-};
-
-static inline struct browser_disasm_line *disasm_line__browser(struct disasm_line *dl)
-{
-	return (struct browser_disasm_line *)(dl + 1);
-}
-
-static bool disasm_line__filter(struct ui_browser *browser __maybe_unused,
-				void *entry)
-{
-	if (annotate_browser__opts.hide_src_code) {
-		struct disasm_line *dl = list_entry(entry, struct disasm_line, node);
-		return dl->offset == -1;
-	}
-
-	return false;
-}
-
-static int annotate_browser__jumps_percent_color(struct annotate_browser *browser,
-						 int nr, bool current)
-{
-	if (current && (!browser->b.use_navkeypressed || browser->b.navkeypressed))
-		return HE_COLORSET_SELECTED;
-	if (nr == browser->max_jump_sources)
-		return HE_COLORSET_TOP;
-	if (nr > 1)
-		return HE_COLORSET_MEDIUM;
-	return HE_COLORSET_NORMAL;
-}
-
-static int annotate_browser__set_jumps_percent_color(struct annotate_browser *browser,
-						     int nr, bool current)
-{
-	 int color = annotate_browser__jumps_percent_color(browser, nr, current);
-	 return ui_browser__set_color(&browser->b, color);
-}
-
-static void annotate_browser__write(struct ui_browser *browser, void *entry, int row)
-{
-	struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);
-	struct disasm_line *dl = list_entry(entry, struct disasm_line, node);
-	struct browser_disasm_line *bdl = disasm_line__browser(dl);
-	bool current_entry = ui_browser__is_current_entry(browser, row);
-	bool change_color = (!annotate_browser__opts.hide_src_code &&
-			     (!current_entry || (browser->use_navkeypressed &&
-					         !browser->navkeypressed)));
-	int width = browser->width, printed;
-	int i, pcnt_width = 7 * ab->nr_events;
-	double percent_max = 0.0;
-	char bf[256];
-
-	for (i = 0; i < ab->nr_events; i++) {
-		if (bdl->percent[i] > percent_max)
-			percent_max = bdl->percent[i];
-	}
-
-	if (dl->offset != -1 && percent_max != 0.0) {
-		for (i = 0; i < ab->nr_events; i++) {
-			ui_browser__set_percent_color(browser, bdl->percent[i],
-						      current_entry);
-			slsmg_printf("%6.2f ", bdl->percent[i]);
-		}
-	} else {
-		ui_browser__set_percent_color(browser, 0, current_entry);
-		slsmg_write_nstring(" ", pcnt_width);
-	}
-
-	SLsmg_write_char(' ');
-
-	/* The scroll bar isn't being used */
-	if (!browser->navkeypressed)
-		width += 1;
-
-	if (!*dl->line)
-		slsmg_write_nstring(" ", width - pcnt_width);
-	else if (dl->offset == -1) {
-		printed = scnprintf(bf, sizeof(bf), "%*s  ",
-				    ab->addr_width, " ");
-		slsmg_write_nstring(bf, printed);
-		slsmg_write_nstring(dl->line, width - printed - pcnt_width + 1);
-	} else {
-		u64 addr = dl->offset;
-		int color = -1;
-
-		if (!annotate_browser__opts.use_offset)
-			addr += ab->start;
-
-		if (!annotate_browser__opts.use_offset) {
-			printed = scnprintf(bf, sizeof(bf), "%" PRIx64 ": ", addr);
-		} else {
-			if (bdl->jump_sources) {
-				if (annotate_browser__opts.show_nr_jumps) {
-					int prev;
-					printed = scnprintf(bf, sizeof(bf), "%*d ",
-							    ab->jumps_width,
-							    bdl->jump_sources);
-					prev = annotate_browser__set_jumps_percent_color(ab, bdl->jump_sources,
-											 current_entry);
-					slsmg_write_nstring(bf, printed);
-					ui_browser__set_color(browser, prev);
-				}
-
-				printed = scnprintf(bf, sizeof(bf), "%*" PRIx64 ": ",
-						    ab->target_width, addr);
-			} else {
-				printed = scnprintf(bf, sizeof(bf), "%*s  ",
-						    ab->addr_width, " ");
-			}
-		}
-
-		if (change_color)
-			color = ui_browser__set_color(browser, HE_COLORSET_ADDR);
-		slsmg_write_nstring(bf, printed);
-		if (change_color)
-			ui_browser__set_color(browser, color);
-		if (dl->ins && dl->ins->ops->scnprintf) {
-			if (ins__is_jump(dl->ins)) {
-				bool fwd = dl->ops.target.offset > (u64)dl->offset;
-
-				ui_browser__write_graph(browser, fwd ? SLSMG_DARROW_CHAR :
-								    SLSMG_UARROW_CHAR);
-				SLsmg_write_char(' ');
-			} else if (ins__is_call(dl->ins)) {
-				ui_browser__write_graph(browser, SLSMG_RARROW_CHAR);
-				SLsmg_write_char(' ');
-			} else {
-				slsmg_write_nstring(" ", 2);
-			}
-		} else {
-			if (strcmp(dl->name, "retq")) {
-				slsmg_write_nstring(" ", 2);
-			} else {
-				ui_browser__write_graph(browser, SLSMG_LARROW_CHAR);
-				SLsmg_write_char(' ');
-			}
-		}
-
-		disasm_line__scnprintf(dl, bf, sizeof(bf), !annotate_browser__opts.use_offset);
-		slsmg_write_nstring(bf, width - pcnt_width - 3 - printed);
-	}
-
-	if (current_entry)
-		ab->selection = dl;
-}
-
-static bool disasm_line__is_valid_jump(struct disasm_line *dl, struct symbol *sym)
-{
-	if (!dl || !dl->ins || !ins__is_jump(dl->ins)
-	    || !disasm_line__has_offset(dl)
-	    || dl->ops.target.offset >= symbol__size(sym))
-		return false;
-
-	return true;
-}
-
-static void annotate_browser__draw_current_jump(struct ui_browser *browser)
-{
-	struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);
-	struct disasm_line *cursor = ab->selection, *target;
-	struct browser_disasm_line *btarget, *bcursor;
-	unsigned int from, to;
-	struct map_symbol *ms = ab->b.priv;
-	struct symbol *sym = ms->sym;
-	u8 pcnt_width = 7;
-
-	/* PLT symbols contain external offsets */
-	if (strstr(sym->name, "@plt"))
-		return;
-
-	if (!disasm_line__is_valid_jump(cursor, sym))
-		return;
-
-	target = ab->offsets[cursor->ops.target.offset];
-	if (!target)
-		return;
-
-	bcursor = disasm_line__browser(cursor);
-	btarget = disasm_line__browser(target);
-
-	if (annotate_browser__opts.hide_src_code) {
-		from = bcursor->idx_asm;
-		to = btarget->idx_asm;
-	} else {
-		from = (u64)bcursor->idx;
-		to = (u64)btarget->idx;
-	}
-
-	pcnt_width *= ab->nr_events;
-
-	ui_browser__set_color(browser, HE_COLORSET_CODE);
-	__ui_browser__line_arrow(browser, pcnt_width + 2 + ab->addr_width,
-				 from, to);
-}
-
-static unsigned int annotate_browser__refresh(struct ui_browser *browser)
-{
-	struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);
-	int ret = ui_browser__list_head_refresh(browser);
-	int pcnt_width;
-
-	pcnt_width = 7 * ab->nr_events;
-
-	if (annotate_browser__opts.jump_arrows)
-		annotate_browser__draw_current_jump(browser);
-
-	ui_browser__set_color(browser, HE_COLORSET_NORMAL);
-	__ui_browser__vline(browser, pcnt_width, 0, browser->height - 1);
-	return ret;
-}
-
-static int disasm__cmp(struct browser_disasm_line *a,
-		       struct browser_disasm_line *b, int nr_pcnt)
-{
-	int i;
-
-	for (i = 0; i < nr_pcnt; i++) {
-		if (a->percent[i] == b->percent[i])
-			continue;
-		return a->percent[i] < b->percent[i];
-	}
-	return 0;
-}
-
-static void disasm_rb_tree__insert(struct rb_root *root, struct browser_disasm_line *bdl,
-				   int nr_events)
-{
-	struct rb_node **p = &root->rb_node;
-	struct rb_node *parent = NULL;
-	struct browser_disasm_line *l;
-
-	while (*p != NULL) {
-		parent = *p;
-		l = rb_entry(parent, struct browser_disasm_line, rb_node);
-
-		if (disasm__cmp(bdl, l, nr_events))
-			p = &(*p)->rb_left;
-		else
-			p = &(*p)->rb_right;
-	}
-	rb_link_node(&bdl->rb_node, parent, p);
-	rb_insert_color(&bdl->rb_node, root);
-}
-
-static void annotate_browser__set_top(struct annotate_browser *browser,
-				      struct disasm_line *pos, u32 idx)
-{
-	unsigned back;
-
-	ui_browser__refresh_dimensions(&browser->b);
-	back = browser->b.height / 2;
-	browser->b.top_idx = browser->b.index = idx;
-
-	while (browser->b.top_idx != 0 && back != 0) {
-		pos = list_entry(pos->node.prev, struct disasm_line, node);
-
-		if (disasm_line__filter(&browser->b, &pos->node))
-			continue;
-
-		--browser->b.top_idx;
-		--back;
-	}
-
-	browser->b.top = pos;
-	browser->b.navkeypressed = true;
-}
-
-static void annotate_browser__set_rb_top(struct annotate_browser *browser,
-					 struct rb_node *nd)
-{
-	struct browser_disasm_line *bpos;
-	struct disasm_line *pos;
-	u32 idx;
-
-	bpos = rb_entry(nd, struct browser_disasm_line, rb_node);
-	pos = ((struct disasm_line *)bpos) - 1;
-	idx = bpos->idx;
-	if (annotate_browser__opts.hide_src_code)
-		idx = bpos->idx_asm;
-	annotate_browser__set_top(browser, pos, idx);
-	browser->curr_hot = nd;
-}
-
-static void annotate_browser__calc_percent(struct annotate_browser *browser,
-					   struct perf_evsel *evsel)
-{
-	struct map_symbol *ms = browser->b.priv;
-	struct symbol *sym = ms->sym;
-	struct annotation *notes = symbol__annotation(sym);
-	struct disasm_line *pos, *next;
-	s64 len = symbol__size(sym);
-
-	browser->entries = RB_ROOT;
-
-	pthread_mutex_lock(&notes->lock);
-
-	list_for_each_entry(pos, &notes->src->source, node) {
-		struct browser_disasm_line *bpos = disasm_line__browser(pos);
-		const char *path = NULL;
-		double max_percent = 0.0;
-		int i;
-
-		if (pos->offset == -1) {
-			RB_CLEAR_NODE(&bpos->rb_node);
-			continue;
-		}
-
-		next = disasm__get_next_ip_line(&notes->src->source, pos);
-
-		for (i = 0; i < browser->nr_events; i++) {
-			bpos->percent[i] = disasm__calc_percent(notes,
-						evsel->idx + i,
-						pos->offset,
-						next ? next->offset : len,
-					        &path);
-
-			if (max_percent < bpos->percent[i])
-				max_percent = bpos->percent[i];
-		}
-
-		if (max_percent < 0.01) {
-			RB_CLEAR_NODE(&bpos->rb_node);
-			continue;
-		}
-		disasm_rb_tree__insert(&browser->entries, bpos,
-				       browser->nr_events);
-	}
-	pthread_mutex_unlock(&notes->lock);
-
-	browser->curr_hot = rb_last(&browser->entries);
-}
-
-static bool annotate_browser__toggle_source(struct annotate_browser *browser)
-{
-	struct disasm_line *dl;
-	struct browser_disasm_line *bdl;
-	off_t offset = browser->b.index - browser->b.top_idx;
-
-	browser->b.seek(&browser->b, offset, SEEK_CUR);
-	dl = list_entry(browser->b.top, struct disasm_line, node);
-	bdl = disasm_line__browser(dl);
-
-	if (annotate_browser__opts.hide_src_code) {
-		if (bdl->idx_asm < offset)
-			offset = bdl->idx;
-
-		browser->b.nr_entries = browser->nr_entries;
-		annotate_browser__opts.hide_src_code = false;
-		browser->b.seek(&browser->b, -offset, SEEK_CUR);
-		browser->b.top_idx = bdl->idx - offset;
-		browser->b.index = bdl->idx;
-	} else {
-		if (bdl->idx_asm < 0) {
-			ui_helpline__puts("Only available for assembly lines.");
-			browser->b.seek(&browser->b, -offset, SEEK_CUR);
-			return false;
-		}
-
-		if (bdl->idx_asm < offset)
-			offset = bdl->idx_asm;
-
-		browser->b.nr_entries = browser->nr_asm_entries;
-		annotate_browser__opts.hide_src_code = true;
-		browser->b.seek(&browser->b, -offset, SEEK_CUR);
-		browser->b.top_idx = bdl->idx_asm - offset;
-		browser->b.index = bdl->idx_asm;
-	}
-
-	return true;
-}
-
-static void annotate_browser__init_asm_mode(struct annotate_browser *browser)
-{
-	ui_browser__reset_index(&browser->b);
-	browser->b.nr_entries = browser->nr_asm_entries;
-}
-
-#define SYM_TITLE_MAX_SIZE (PATH_MAX + 64)
-
-static int sym_title(struct symbol *sym, struct map *map, char *title,
-		     size_t sz)
-{
-	return snprintf(title, sz, "%s  %s", sym->name, map->dso->long_name);
-}
-
-static bool annotate_browser__callq(struct annotate_browser *browser,
-				    struct perf_evsel *evsel,
-				    struct hist_browser_timer *hbt)
-{
-	struct map_symbol *ms = browser->b.priv;
-	struct disasm_line *dl = browser->selection;
-	struct symbol *sym = ms->sym;
-	struct annotation *notes;
-	struct symbol *target;
-	u64 ip;
-	char title[SYM_TITLE_MAX_SIZE];
-
-	if (!ins__is_call(dl->ins))
-		return false;
-
-	ip = ms->map->map_ip(ms->map, dl->ops.target.addr);
-	target = map__find_symbol(ms->map, ip, NULL);
-	if (target == NULL) {
-		ui_helpline__puts("The called function was not found.");
-		return true;
-	}
-
-	notes = symbol__annotation(target);
-	pthread_mutex_lock(&notes->lock);
-
-	if (notes->src == NULL && symbol__alloc_hist(target) < 0) {
-		pthread_mutex_unlock(&notes->lock);
-		ui__warning("Not enough memory for annotating '%s' symbol!\n",
-			    target->name);
-		return true;
-	}
-
-	pthread_mutex_unlock(&notes->lock);
-	symbol__tui_annotate(target, ms->map, evsel, hbt);
-	sym_title(sym, ms->map, title, sizeof(title));
-	ui_browser__show_title(&browser->b, title);
-	return true;
-}
-
-static
-struct disasm_line *annotate_browser__find_offset(struct annotate_browser *browser,
-					  s64 offset, s64 *idx)
-{
-	struct map_symbol *ms = browser->b.priv;
-	struct symbol *sym = ms->sym;
-	struct annotation *notes = symbol__annotation(sym);
-	struct disasm_line *pos;
-
-	*idx = 0;
-	list_for_each_entry(pos, &notes->src->source, node) {
-		if (pos->offset == offset)
-			return pos;
-		if (!disasm_line__filter(&browser->b, &pos->node))
-			++*idx;
-	}
-
-	return NULL;
-}
-
-static bool annotate_browser__jump(struct annotate_browser *browser)
-{
-	struct disasm_line *dl = browser->selection;
-	s64 idx;
-
-	if (!ins__is_jump(dl->ins))
-		return false;
-
-	dl = annotate_browser__find_offset(browser, dl->ops.target.offset, &idx);
-	if (dl == NULL) {
-		ui_helpline__puts("Invalid jump offset");
-		return true;
-	}
-
-	annotate_browser__set_top(browser, dl, idx);
-	
-	return true;
-}
-
-static
-struct disasm_line *annotate_browser__find_string(struct annotate_browser *browser,
-					  char *s, s64 *idx)
-{
-	struct map_symbol *ms = browser->b.priv;
-	struct symbol *sym = ms->sym;
-	struct annotation *notes = symbol__annotation(sym);
-	struct disasm_line *pos = browser->selection;
-
-	*idx = browser->b.index;
-	list_for_each_entry_continue(pos, &notes->src->source, node) {
-		if (disasm_line__filter(&browser->b, &pos->node))
-			continue;
-
-		++*idx;
-
-		if (pos->line && strstr(pos->line, s) != NULL)
-			return pos;
-	}
-
-	return NULL;
-}
-
-static bool __annotate_browser__search(struct annotate_browser *browser)
-{
-	struct disasm_line *dl;
-	s64 idx;
-
-	dl = annotate_browser__find_string(browser, browser->search_bf, &idx);
-	if (dl == NULL) {
-		ui_helpline__puts("String not found!");
-		return false;
-	}
-
-	annotate_browser__set_top(browser, dl, idx);
-	browser->searching_backwards = false;
-	return true;
-}
-
-static
-struct disasm_line *annotate_browser__find_string_reverse(struct annotate_browser *browser,
-						  char *s, s64 *idx)
-{
-	struct map_symbol *ms = browser->b.priv;
-	struct symbol *sym = ms->sym;
-	struct annotation *notes = symbol__annotation(sym);
-	struct disasm_line *pos = browser->selection;
-
-	*idx = browser->b.index;
-	list_for_each_entry_continue_reverse(pos, &notes->src->source, node) {
-		if (disasm_line__filter(&browser->b, &pos->node))
-			continue;
-
-		--*idx;
-
-		if (pos->line && strstr(pos->line, s) != NULL)
-			return pos;
-	}
-
-	return NULL;
-}
-
-static bool __annotate_browser__search_reverse(struct annotate_browser *browser)
-{
-	struct disasm_line *dl;
-	s64 idx;
-
-	dl = annotate_browser__find_string_reverse(browser, browser->search_bf, &idx);
-	if (dl == NULL) {
-		ui_helpline__puts("String not found!");
-		return false;
-	}
-
-	annotate_browser__set_top(browser, dl, idx);
-	browser->searching_backwards = true;
-	return true;
-}
-
-static bool annotate_browser__search_window(struct annotate_browser *browser,
-					    int delay_secs)
-{
-	if (ui_browser__input_window("Search", "String: ", browser->search_bf,
-				     "ENTER: OK, ESC: Cancel",
-				     delay_secs * 2) != K_ENTER ||
-	    !*browser->search_bf)
-		return false;
-
-	return true;
-}
-
-static bool annotate_browser__search(struct annotate_browser *browser, int delay_secs)
-{
-	if (annotate_browser__search_window(browser, delay_secs))
-		return __annotate_browser__search(browser);
-
-	return false;
-}
-
-static bool annotate_browser__continue_search(struct annotate_browser *browser,
-					      int delay_secs)
-{
-	if (!*browser->search_bf)
-		return annotate_browser__search(browser, delay_secs);
-
-	return __annotate_browser__search(browser);
-}
-
-static bool annotate_browser__search_reverse(struct annotate_browser *browser,
-					   int delay_secs)
-{
-	if (annotate_browser__search_window(browser, delay_secs))
-		return __annotate_browser__search_reverse(browser);
-
-	return false;
-}
-
-static
-bool annotate_browser__continue_search_reverse(struct annotate_browser *browser,
-					       int delay_secs)
-{
-	if (!*browser->search_bf)
-		return annotate_browser__search_reverse(browser, delay_secs);
-
-	return __annotate_browser__search_reverse(browser);
-}
-
-static void annotate_browser__update_addr_width(struct annotate_browser *browser)
-{
-	if (annotate_browser__opts.use_offset)
-		browser->target_width = browser->min_addr_width;
-	else
-		browser->target_width = browser->max_addr_width;
-
-	browser->addr_width = browser->target_width;
-
-	if (annotate_browser__opts.show_nr_jumps)
-		browser->addr_width += browser->jumps_width + 1;
-}
-
-static int annotate_browser__run(struct annotate_browser *browser,
-				 struct perf_evsel *evsel,
-				 struct hist_browser_timer *hbt)
-{
-	struct rb_node *nd = NULL;
-	struct map_symbol *ms = browser->b.priv;
-	struct symbol *sym = ms->sym;
-	const char *help = "Press 'h' for help on key bindings";
-	int delay_secs = hbt ? hbt->refresh : 0;
-	int key;
-	char title[SYM_TITLE_MAX_SIZE];
-
-	sym_title(sym, ms->map, title, sizeof(title));
-	if (ui_browser__show(&browser->b, title, help) < 0)
-		return -1;
-
-	annotate_browser__calc_percent(browser, evsel);
-
-	if (browser->curr_hot) {
-		annotate_browser__set_rb_top(browser, browser->curr_hot);
-		browser->b.navkeypressed = false;
-	}
-
-	nd = browser->curr_hot;
-
-	while (1) {
-		key = ui_browser__run(&browser->b, delay_secs);
-
-		if (delay_secs != 0) {
-			annotate_browser__calc_percent(browser, evsel);
-			/*
-			 * Current line focus got out of the list of most active
-			 * lines, NULL it so that if TAB|UNTAB is pressed, we
-			 * move to curr_hot (current hottest line).
-			 */
-			if (nd != NULL && RB_EMPTY_NODE(nd))
-				nd = NULL;
-		}
-
-		switch (key) {
-		case K_TIMER:
-			if (hbt)
-				hbt->timer(hbt->arg);
-
-			if (delay_secs != 0)
-				symbol__annotate_decay_histogram(sym, evsel->idx);
-			continue;
-		case K_TAB:
-			if (nd != NULL) {
-				nd = rb_prev(nd);
-				if (nd == NULL)
-					nd = rb_last(&browser->entries);
-			} else
-				nd = browser->curr_hot;
-			break;
-		case K_UNTAB:
-			if (nd != NULL)
-				nd = rb_next(nd);
-				if (nd == NULL)
-					nd = rb_first(&browser->entries);
-			else
-				nd = browser->curr_hot;
-			break;
-		case K_F1:
-		case 'h':
-			ui_browser__help_window(&browser->b,
-		"UP/DOWN/PGUP\n"
-		"PGDN/SPACE    Navigate\n"
-		"q/ESC/CTRL+C  Exit\n\n"
-		"->            Go to target\n"
-		"<-            Exit\n"
-		"H             Cycle thru hottest instructions\n"
-		"j             Toggle showing jump to target arrows\n"
-		"J             Toggle showing number of jump sources on targets\n"
-		"n             Search next string\n"
-		"o             Toggle disassembler output/simplified view\n"
-		"s             Toggle source code view\n"
-		"/             Search string\n"
-		"r             Run available scripts\n"
-		"?             Search string backwards\n");
-			continue;
-		case 'r':
-			{
-				script_browse(NULL);
-				continue;
-			}
-		case 'H':
-			nd = browser->curr_hot;
-			break;
-		case 's':
-			if (annotate_browser__toggle_source(browser))
-				ui_helpline__puts(help);
-			continue;
-		case 'o':
-			annotate_browser__opts.use_offset = !annotate_browser__opts.use_offset;
-			annotate_browser__update_addr_width(browser);
-			continue;
-		case 'j':
-			annotate_browser__opts.jump_arrows = !annotate_browser__opts.jump_arrows;
-			continue;
-		case 'J':
-			annotate_browser__opts.show_nr_jumps = !annotate_browser__opts.show_nr_jumps;
-			annotate_browser__update_addr_width(browser);
-			continue;
-		case '/':
-			if (annotate_browser__search(browser, delay_secs)) {
-show_help:
-				ui_helpline__puts(help);
-			}
-			continue;
-		case 'n':
-			if (browser->searching_backwards ?
-			    annotate_browser__continue_search_reverse(browser, delay_secs) :
-			    annotate_browser__continue_search(browser, delay_secs))
-				goto show_help;
-			continue;
-		case '?':
-			if (annotate_browser__search_reverse(browser, delay_secs))
-				goto show_help;
-			continue;
-		case 'D': {
-			static int seq;
-			ui_helpline__pop();
-			ui_helpline__fpush("%d: nr_ent=%d, height=%d, idx=%d, top_idx=%d, nr_asm_entries=%d",
-					   seq++, browser->b.nr_entries,
-					   browser->b.height,
-					   browser->b.index,
-					   browser->b.top_idx,
-					   browser->nr_asm_entries);
-		}
-			continue;
-		case K_ENTER:
-		case K_RIGHT:
-			if (browser->selection == NULL)
-				ui_helpline__puts("Huh? No selection. Report to linux-kernel@vger.kernel.org");
-			else if (browser->selection->offset == -1)
-				ui_helpline__puts("Actions are only available for assembly lines.");
-			else if (!browser->selection->ins) {
-				if (strcmp(browser->selection->name, "retq"))
-					goto show_sup_ins;
-				goto out;
-			} else if (!(annotate_browser__jump(browser) ||
-				     annotate_browser__callq(browser, evsel, hbt))) {
-show_sup_ins:
-				ui_helpline__puts("Actions are only available for 'callq', 'retq' & jump instructions.");
-			}
-			continue;
-		case K_LEFT:
-		case K_ESC:
-		case 'q':
-		case CTRL('c'):
-			goto out;
-		default:
-			continue;
-		}
-
-		if (nd != NULL)
-			annotate_browser__set_rb_top(browser, nd);
-	}
-out:
-	ui_browser__hide(&browser->b);
-	return key;
-}
-
-int hist_entry__tui_annotate(struct hist_entry *he, struct perf_evsel *evsel,
-			     struct hist_browser_timer *hbt)
-{
-	return symbol__tui_annotate(he->ms.sym, he->ms.map, evsel, hbt);
-}
-
-static void annotate_browser__mark_jump_targets(struct annotate_browser *browser,
-						size_t size)
-{
-	u64 offset;
-	struct map_symbol *ms = browser->b.priv;
-	struct symbol *sym = ms->sym;
-
-	/* PLT symbols contain external offsets */
-	if (strstr(sym->name, "@plt"))
-		return;
-
-	for (offset = 0; offset < size; ++offset) {
-		struct disasm_line *dl = browser->offsets[offset], *dlt;
-		struct browser_disasm_line *bdlt;
-
-		if (!disasm_line__is_valid_jump(dl, sym))
-			continue;
-
-		dlt = browser->offsets[dl->ops.target.offset];
-		/*
- 		 * FIXME: Oops, no jump target? Buggy disassembler? Or do we
- 		 * have to adjust to the previous offset?
- 		 */
-		if (dlt == NULL)
-			continue;
-
-		bdlt = disasm_line__browser(dlt);
-		if (++bdlt->jump_sources > browser->max_jump_sources)
-			browser->max_jump_sources = bdlt->jump_sources;
-
-		++browser->nr_jumps;
-	}
-		
-}
-
-static inline int width_jumps(int n)
-{
-	if (n >= 100)
-		return 5;
-	if (n / 10)
-		return 2;
-	return 1;
-}
-
-int symbol__tui_annotate(struct symbol *sym, struct map *map,
-			 struct perf_evsel *evsel,
-			 struct hist_browser_timer *hbt)
-{
-	struct disasm_line *pos, *n;
-	struct annotation *notes;
-	size_t size;
-	struct map_symbol ms = {
-		.map = map,
-		.sym = sym,
-	};
-	struct annotate_browser browser = {
-		.b = {
-			.refresh = annotate_browser__refresh,
-			.seek	 = ui_browser__list_head_seek,
-			.write	 = annotate_browser__write,
-			.filter  = disasm_line__filter,
-			.priv	 = &ms,
-			.use_navkeypressed = true,
-		},
-	};
-	int ret = -1;
-	int nr_pcnt = 1;
-	size_t sizeof_bdl = sizeof(struct browser_disasm_line);
-
-	if (sym == NULL)
-		return -1;
-
-	size = symbol__size(sym);
-
-	if (map->dso->annotate_warned)
-		return -1;
-
-	browser.offsets = zalloc(size * sizeof(struct disasm_line *));
-	if (browser.offsets == NULL) {
-		ui__error("Not enough memory!");
-		return -1;
-	}
-
-	if (perf_evsel__is_group_event(evsel)) {
-		nr_pcnt = evsel->nr_members;
-		sizeof_bdl += sizeof(double) * (nr_pcnt - 1);
-	}
-
-	if (symbol__annotate(sym, map, sizeof_bdl) < 0) {
-		ui__error("%s", ui_helpline__last_msg);
-		goto out_free_offsets;
-	}
-
-	ui_helpline__push("Press <- or ESC to exit");
-
-	notes = symbol__annotation(sym);
-	browser.start = map__rip_2objdump(map, sym->start);
-
-	list_for_each_entry(pos, &notes->src->source, node) {
-		struct browser_disasm_line *bpos;
-		size_t line_len = strlen(pos->line);
-
-		if (browser.b.width < line_len)
-			browser.b.width = line_len;
-		bpos = disasm_line__browser(pos);
-		bpos->idx = browser.nr_entries++;
-		if (pos->offset != -1) {
-			bpos->idx_asm = browser.nr_asm_entries++;
-			/*
-			 * FIXME: short term bandaid to cope with assembly
-			 * routines that comes with labels in the same column
-			 * as the address in objdump, sigh.
-			 *
-			 * E.g. copy_user_generic_unrolled
- 			 */
-			if (pos->offset < (s64)size)
-				browser.offsets[pos->offset] = pos;
-		} else
-			bpos->idx_asm = -1;
-	}
-
-	annotate_browser__mark_jump_targets(&browser, size);
-
-	browser.addr_width = browser.target_width = browser.min_addr_width = hex_width(size);
-	browser.max_addr_width = hex_width(sym->end);
-	browser.jumps_width = width_jumps(browser.max_jump_sources);
-	browser.nr_events = nr_pcnt;
-	browser.b.nr_entries = browser.nr_entries;
-	browser.b.entries = &notes->src->source,
-	browser.b.width += 18; /* Percentage */
-
-	if (annotate_browser__opts.hide_src_code)
-		annotate_browser__init_asm_mode(&browser);
-
-	annotate_browser__update_addr_width(&browser);
-
-	ret = annotate_browser__run(&browser, evsel, hbt);
-	list_for_each_entry_safe(pos, n, &notes->src->source, node) {
-		list_del(&pos->node);
-		disasm_line__free(pos);
-	}
-
-out_free_offsets:
-	free(browser.offsets);
-	return ret;
-}
-
-#define ANNOTATE_CFG(n) \
-	{ .name = #n, .value = &annotate_browser__opts.n, }
-
-/*
- * Keep the entries sorted, they are bsearch'ed
- */
-static struct annotate_config {
-	const char *name;
-	bool *value;
-} annotate__configs[] = {
-	ANNOTATE_CFG(hide_src_code),
-	ANNOTATE_CFG(jump_arrows),
-	ANNOTATE_CFG(show_nr_jumps),
-	ANNOTATE_CFG(use_offset),
-};
-
-#undef ANNOTATE_CFG
-
-static int annotate_config__cmp(const void *name, const void *cfgp)
-{
-	const struct annotate_config *cfg = cfgp;
-
-	return strcmp(name, cfg->name);
-}
-
-static int annotate__config(const char *var, const char *value,
-			    void *data __maybe_unused)
-{
-	struct annotate_config *cfg;
-	const char *name;
-
-	if (prefixcmp(var, "annotate.") != 0)
-		return 0;
-
-	name = var + 9;
-	cfg = bsearch(name, annotate__configs, ARRAY_SIZE(annotate__configs),
-		      sizeof(struct annotate_config), annotate_config__cmp);
-
-	if (cfg == NULL)
-		return -1;
-
-	*cfg->value = perf_config_bool(name, value);
-	return 0;
-}
-
-void annotate_browser__init(void)
-{
-	perf_config(annotate__config, NULL);
-}
diff --git a/src/tools/perf/ui/browsers/hists.c b/src/tools/perf/ui/browsers/hists.c
deleted file mode 100644
index 7ef36c3..0000000
--- a/src/tools/perf/ui/browsers/hists.c
+++ /dev/null
@@ -1,1969 +0,0 @@
-#include <stdio.h>
-#include "../libslang.h"
-#include <stdlib.h>
-#include <string.h>
-#include <linux/rbtree.h>
-
-#include "../../util/evsel.h"
-#include "../../util/evlist.h"
-#include "../../util/hist.h"
-#include "../../util/pstack.h"
-#include "../../util/sort.h"
-#include "../../util/util.h"
-#include "../../arch/common.h"
-
-#include "../browser.h"
-#include "../helpline.h"
-#include "../util.h"
-#include "../ui.h"
-#include "map.h"
-
-struct hist_browser {
-	struct ui_browser   b;
-	struct hists	    *hists;
-	struct hist_entry   *he_selection;
-	struct map_symbol   *selection;
-	int		     print_seq;
-	bool		     show_dso;
-	float		     min_pcnt;
-	u64		     nr_pcnt_entries;
-};
-
-extern void hist_browser__init_hpp(void);
-
-static int hists__browser_title(struct hists *hists, char *bf, size_t size,
-				const char *ev_name);
-
-static void hist_browser__refresh_dimensions(struct hist_browser *browser)
-{
-	/* 3 == +/- toggle symbol before actual hist_entry rendering */
-	browser->b.width = 3 + (hists__sort_list_width(browser->hists) +
-			     sizeof("[k]"));
-}
-
-static void hist_browser__reset(struct hist_browser *browser)
-{
-	browser->b.nr_entries = browser->hists->nr_entries;
-	hist_browser__refresh_dimensions(browser);
-	ui_browser__reset_index(&browser->b);
-}
-
-static char tree__folded_sign(bool unfolded)
-{
-	return unfolded ? '-' : '+';
-}
-
-static char map_symbol__folded(const struct map_symbol *ms)
-{
-	return ms->has_children ? tree__folded_sign(ms->unfolded) : ' ';
-}
-
-static char hist_entry__folded(const struct hist_entry *he)
-{
-	return map_symbol__folded(&he->ms);
-}
-
-static char callchain_list__folded(const struct callchain_list *cl)
-{
-	return map_symbol__folded(&cl->ms);
-}
-
-static void map_symbol__set_folding(struct map_symbol *ms, bool unfold)
-{
-	ms->unfolded = unfold ? ms->has_children : false;
-}
-
-static int callchain_node__count_rows_rb_tree(struct callchain_node *node)
-{
-	int n = 0;
-	struct rb_node *nd;
-
-	for (nd = rb_first(&node->rb_root); nd; nd = rb_next(nd)) {
-		struct callchain_node *child = rb_entry(nd, struct callchain_node, rb_node);
-		struct callchain_list *chain;
-		char folded_sign = ' '; /* No children */
-
-		list_for_each_entry(chain, &child->val, list) {
-			++n;
-			/* We need this because we may not have children */
-			folded_sign = callchain_list__folded(chain);
-			if (folded_sign == '+')
-				break;
-		}
-
-		if (folded_sign == '-') /* Have children and they're unfolded */
-			n += callchain_node__count_rows_rb_tree(child);
-	}
-
-	return n;
-}
-
-static int callchain_node__count_rows(struct callchain_node *node)
-{
-	struct callchain_list *chain;
-	bool unfolded = false;
-	int n = 0;
-
-	list_for_each_entry(chain, &node->val, list) {
-		++n;
-		unfolded = chain->ms.unfolded;
-	}
-
-	if (unfolded)
-		n += callchain_node__count_rows_rb_tree(node);
-
-	return n;
-}
-
-static int callchain__count_rows(struct rb_root *chain)
-{
-	struct rb_node *nd;
-	int n = 0;
-
-	for (nd = rb_first(chain); nd; nd = rb_next(nd)) {
-		struct callchain_node *node = rb_entry(nd, struct callchain_node, rb_node);
-		n += callchain_node__count_rows(node);
-	}
-
-	return n;
-}
-
-static bool map_symbol__toggle_fold(struct map_symbol *ms)
-{
-	if (!ms)
-		return false;
-
-	if (!ms->has_children)
-		return false;
-
-	ms->unfolded = !ms->unfolded;
-	return true;
-}
-
-static void callchain_node__init_have_children_rb_tree(struct callchain_node *node)
-{
-	struct rb_node *nd = rb_first(&node->rb_root);
-
-	for (nd = rb_first(&node->rb_root); nd; nd = rb_next(nd)) {
-		struct callchain_node *child = rb_entry(nd, struct callchain_node, rb_node);
-		struct callchain_list *chain;
-		bool first = true;
-
-		list_for_each_entry(chain, &child->val, list) {
-			if (first) {
-				first = false;
-				chain->ms.has_children = chain->list.next != &child->val ||
-							 !RB_EMPTY_ROOT(&child->rb_root);
-			} else
-				chain->ms.has_children = chain->list.next == &child->val &&
-							 !RB_EMPTY_ROOT(&child->rb_root);
-		}
-
-		callchain_node__init_have_children_rb_tree(child);
-	}
-}
-
-static void callchain_node__init_have_children(struct callchain_node *node)
-{
-	struct callchain_list *chain;
-
-	list_for_each_entry(chain, &node->val, list)
-		chain->ms.has_children = !RB_EMPTY_ROOT(&node->rb_root);
-
-	callchain_node__init_have_children_rb_tree(node);
-}
-
-static void callchain__init_have_children(struct rb_root *root)
-{
-	struct rb_node *nd;
-
-	for (nd = rb_first(root); nd; nd = rb_next(nd)) {
-		struct callchain_node *node = rb_entry(nd, struct callchain_node, rb_node);
-		callchain_node__init_have_children(node);
-	}
-}
-
-static void hist_entry__init_have_children(struct hist_entry *he)
-{
-	if (!he->init_have_children) {
-		he->ms.has_children = !RB_EMPTY_ROOT(&he->sorted_chain);
-		callchain__init_have_children(&he->sorted_chain);
-		he->init_have_children = true;
-	}
-}
-
-static bool hist_browser__toggle_fold(struct hist_browser *browser)
-{
-	if (map_symbol__toggle_fold(browser->selection)) {
-		struct hist_entry *he = browser->he_selection;
-
-		hist_entry__init_have_children(he);
-		browser->hists->nr_entries -= he->nr_rows;
-
-		if (he->ms.unfolded)
-			he->nr_rows = callchain__count_rows(&he->sorted_chain);
-		else
-			he->nr_rows = 0;
-		browser->hists->nr_entries += he->nr_rows;
-		browser->b.nr_entries = browser->hists->nr_entries;
-
-		return true;
-	}
-
-	/* If it doesn't have children, no toggling performed */
-	return false;
-}
-
-static int callchain_node__set_folding_rb_tree(struct callchain_node *node, bool unfold)
-{
-	int n = 0;
-	struct rb_node *nd;
-
-	for (nd = rb_first(&node->rb_root); nd; nd = rb_next(nd)) {
-		struct callchain_node *child = rb_entry(nd, struct callchain_node, rb_node);
-		struct callchain_list *chain;
-		bool has_children = false;
-
-		list_for_each_entry(chain, &child->val, list) {
-			++n;
-			map_symbol__set_folding(&chain->ms, unfold);
-			has_children = chain->ms.has_children;
-		}
-
-		if (has_children)
-			n += callchain_node__set_folding_rb_tree(child, unfold);
-	}
-
-	return n;
-}
-
-static int callchain_node__set_folding(struct callchain_node *node, bool unfold)
-{
-	struct callchain_list *chain;
-	bool has_children = false;
-	int n = 0;
-
-	list_for_each_entry(chain, &node->val, list) {
-		++n;
-		map_symbol__set_folding(&chain->ms, unfold);
-		has_children = chain->ms.has_children;
-	}
-
-	if (has_children)
-		n += callchain_node__set_folding_rb_tree(node, unfold);
-
-	return n;
-}
-
-static int callchain__set_folding(struct rb_root *chain, bool unfold)
-{
-	struct rb_node *nd;
-	int n = 0;
-
-	for (nd = rb_first(chain); nd; nd = rb_next(nd)) {
-		struct callchain_node *node = rb_entry(nd, struct callchain_node, rb_node);
-		n += callchain_node__set_folding(node, unfold);
-	}
-
-	return n;
-}
-
-static void hist_entry__set_folding(struct hist_entry *he, bool unfold)
-{
-	hist_entry__init_have_children(he);
-	map_symbol__set_folding(&he->ms, unfold);
-
-	if (he->ms.has_children) {
-		int n = callchain__set_folding(&he->sorted_chain, unfold);
-		he->nr_rows = unfold ? n : 0;
-	} else
-		he->nr_rows = 0;
-}
-
-static void hists__set_folding(struct hists *hists, bool unfold)
-{
-	struct rb_node *nd;
-
-	hists->nr_entries = 0;
-
-	for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) {
-		struct hist_entry *he = rb_entry(nd, struct hist_entry, rb_node);
-		hist_entry__set_folding(he, unfold);
-		hists->nr_entries += 1 + he->nr_rows;
-	}
-}
-
-static void hist_browser__set_folding(struct hist_browser *browser, bool unfold)
-{
-	hists__set_folding(browser->hists, unfold);
-	browser->b.nr_entries = browser->hists->nr_entries;
-	/* Go to the start, we may be way after valid entries after a collapse */
-	ui_browser__reset_index(&browser->b);
-}
-
-static void ui_browser__warn_lost_events(struct ui_browser *browser)
-{
-	ui_browser__warning(browser, 4,
-		"Events are being lost, check IO/CPU overload!\n\n"
-		"You may want to run 'perf' using a RT scheduler policy:\n\n"
-		" perf top -r 80\n\n"
-		"Or reduce the sampling frequency.");
-}
-
-static void hist_browser__update_pcnt_entries(struct hist_browser *hb);
-
-static int hist_browser__run(struct hist_browser *browser, const char *ev_name,
-			     struct hist_browser_timer *hbt)
-{
-	int key;
-	char title[160];
-	int delay_secs = hbt ? hbt->refresh : 0;
-
-	browser->b.entries = &browser->hists->entries;
-	browser->b.nr_entries = browser->hists->nr_entries;
-	if (browser->min_pcnt)
-		browser->b.nr_entries = browser->nr_pcnt_entries;
-
-	hist_browser__refresh_dimensions(browser);
-	hists__browser_title(browser->hists, title, sizeof(title), ev_name);
-
-	if (ui_browser__show(&browser->b, title,
-			     "Press '?' for help on key bindings") < 0)
-		return -1;
-
-	while (1) {
-		key = ui_browser__run(&browser->b, delay_secs);
-
-		switch (key) {
-		case K_TIMER: {
-			u64 nr_entries;
-			hbt->timer(hbt->arg);
-
-			if (browser->min_pcnt) {
-				hist_browser__update_pcnt_entries(browser);
-				nr_entries = browser->nr_pcnt_entries;
-			} else {
-				nr_entries = browser->hists->nr_entries;
-			}
-
-			ui_browser__update_nr_entries(&browser->b, nr_entries);
-
-			if (browser->hists->stats.nr_lost_warned !=
-			    browser->hists->stats.nr_events[PERF_RECORD_LOST]) {
-				browser->hists->stats.nr_lost_warned =
-					browser->hists->stats.nr_events[PERF_RECORD_LOST];
-				ui_browser__warn_lost_events(&browser->b);
-			}
-
-			hists__browser_title(browser->hists, title, sizeof(title), ev_name);
-			ui_browser__show_title(&browser->b, title);
-			continue;
-		}
-		case 'D': { /* Debug */
-			static int seq;
-			struct hist_entry *h = rb_entry(browser->b.top,
-							struct hist_entry, rb_node);
-			ui_helpline__pop();
-			ui_helpline__fpush("%d: nr_ent=(%d,%d), height=%d, idx=%d, fve: idx=%d, row_off=%d, nrows=%d",
-					   seq++, browser->b.nr_entries,
-					   browser->hists->nr_entries,
-					   browser->b.height,
-					   browser->b.index,
-					   browser->b.top_idx,
-					   h->row_offset, h->nr_rows);
-		}
-			break;
-		case 'C':
-			/* Collapse the whole world. */
-			hist_browser__set_folding(browser, false);
-			break;
-		case 'E':
-			/* Expand the whole world. */
-			hist_browser__set_folding(browser, true);
-			break;
-		case K_ENTER:
-			if (hist_browser__toggle_fold(browser))
-				break;
-			/* fall thru */
-		default:
-			goto out;
-		}
-	}
-out:
-	ui_browser__hide(&browser->b);
-	return key;
-}
-
-static char *callchain_list__sym_name(struct callchain_list *cl,
-				      char *bf, size_t bfsize, bool show_dso)
-{
-	int printed;
-
-	if (cl->ms.sym)
-		printed = scnprintf(bf, bfsize, "%s", cl->ms.sym->name);
-	else
-		printed = scnprintf(bf, bfsize, "%#" PRIx64, cl->ip);
-
-	if (show_dso)
-		scnprintf(bf + printed, bfsize - printed, " %s",
-			  cl->ms.map ? cl->ms.map->dso->short_name : "unknown");
-
-	return bf;
-}
-
-#define LEVEL_OFFSET_STEP 3
-
-static int hist_browser__show_callchain_node_rb_tree(struct hist_browser *browser,
-						     struct callchain_node *chain_node,
-						     u64 total, int level,
-						     unsigned short row,
-						     off_t *row_offset,
-						     bool *is_current_entry)
-{
-	struct rb_node *node;
-	int first_row = row, width, offset = level * LEVEL_OFFSET_STEP;
-	u64 new_total, remaining;
-
-	if (callchain_param.mode == CHAIN_GRAPH_REL)
-		new_total = chain_node->children_hit;
-	else
-		new_total = total;
-
-	remaining = new_total;
-	node = rb_first(&chain_node->rb_root);
-	while (node) {
-		struct callchain_node *child = rb_entry(node, struct callchain_node, rb_node);
-		struct rb_node *next = rb_next(node);
-		u64 cumul = callchain_cumul_hits(child);
-		struct callchain_list *chain;
-		char folded_sign = ' ';
-		int first = true;
-		int extra_offset = 0;
-
-		remaining -= cumul;
-
-		list_for_each_entry(chain, &child->val, list) {
-			char bf[1024], *alloc_str;
-			const char *str;
-			int color;
-			bool was_first = first;
-
-			if (first)
-				first = false;
-			else
-				extra_offset = LEVEL_OFFSET_STEP;
-
-			folded_sign = callchain_list__folded(chain);
-			if (*row_offset != 0) {
-				--*row_offset;
-				goto do_next;
-			}
-
-			alloc_str = NULL;
-			str = callchain_list__sym_name(chain, bf, sizeof(bf),
-						       browser->show_dso);
-			if (was_first) {
-				double percent = cumul * 100.0 / new_total;
-
-				if (asprintf(&alloc_str, "%2.2f%% %s", percent, str) < 0)
-					str = "Not enough memory!";
-				else
-					str = alloc_str;
-			}
-
-			color = HE_COLORSET_NORMAL;
-			width = browser->b.width - (offset + extra_offset + 2);
-			if (ui_browser__is_current_entry(&browser->b, row)) {
-				browser->selection = &chain->ms;
-				color = HE_COLORSET_SELECTED;
-				*is_current_entry = true;
-			}
-
-			ui_browser__set_color(&browser->b, color);
-			ui_browser__gotorc(&browser->b, row, 0);
-			slsmg_write_nstring(" ", offset + extra_offset);
-			slsmg_printf("%c ", folded_sign);
-			slsmg_write_nstring(str, width);
-			free(alloc_str);
-
-			if (++row == browser->b.height)
-				goto out;
-do_next:
-			if (folded_sign == '+')
-				break;
-		}
-
-		if (folded_sign == '-') {
-			const int new_level = level + (extra_offset ? 2 : 1);
-			row += hist_browser__show_callchain_node_rb_tree(browser, child, new_total,
-									 new_level, row, row_offset,
-									 is_current_entry);
-		}
-		if (row == browser->b.height)
-			goto out;
-		node = next;
-	}
-out:
-	return row - first_row;
-}
-
-static int hist_browser__show_callchain_node(struct hist_browser *browser,
-					     struct callchain_node *node,
-					     int level, unsigned short row,
-					     off_t *row_offset,
-					     bool *is_current_entry)
-{
-	struct callchain_list *chain;
-	int first_row = row,
-	     offset = level * LEVEL_OFFSET_STEP,
-	     width = browser->b.width - offset;
-	char folded_sign = ' ';
-
-	list_for_each_entry(chain, &node->val, list) {
-		char bf[1024], *s;
-		int color;
-
-		folded_sign = callchain_list__folded(chain);
-
-		if (*row_offset != 0) {
-			--*row_offset;
-			continue;
-		}
-
-		color = HE_COLORSET_NORMAL;
-		if (ui_browser__is_current_entry(&browser->b, row)) {
-			browser->selection = &chain->ms;
-			color = HE_COLORSET_SELECTED;
-			*is_current_entry = true;
-		}
-
-		s = callchain_list__sym_name(chain, bf, sizeof(bf),
-					     browser->show_dso);
-		ui_browser__gotorc(&browser->b, row, 0);
-		ui_browser__set_color(&browser->b, color);
-		slsmg_write_nstring(" ", offset);
-		slsmg_printf("%c ", folded_sign);
-		slsmg_write_nstring(s, width - 2);
-
-		if (++row == browser->b.height)
-			goto out;
-	}
-
-	if (folded_sign == '-')
-		row += hist_browser__show_callchain_node_rb_tree(browser, node,
-								 browser->hists->stats.total_period,
-								 level + 1, row,
-								 row_offset,
-								 is_current_entry);
-out:
-	return row - first_row;
-}
-
-static int hist_browser__show_callchain(struct hist_browser *browser,
-					struct rb_root *chain,
-					int level, unsigned short row,
-					off_t *row_offset,
-					bool *is_current_entry)
-{
-	struct rb_node *nd;
-	int first_row = row;
-
-	for (nd = rb_first(chain); nd; nd = rb_next(nd)) {
-		struct callchain_node *node = rb_entry(nd, struct callchain_node, rb_node);
-
-		row += hist_browser__show_callchain_node(browser, node, level,
-							 row, row_offset,
-							 is_current_entry);
-		if (row == browser->b.height)
-			break;
-	}
-
-	return row - first_row;
-}
-
-struct hpp_arg {
-	struct ui_browser *b;
-	char folded_sign;
-	bool current_entry;
-};
-
-static int __hpp__color_callchain(struct hpp_arg *arg)
-{
-	if (!symbol_conf.use_callchain)
-		return 0;
-
-	slsmg_printf("%c ", arg->folded_sign);
-	return 2;
-}
-
-static int __hpp__color_fmt(struct perf_hpp *hpp, struct hist_entry *he,
-			    u64 (*get_field)(struct hist_entry *),
-			    int (*callchain_cb)(struct hpp_arg *))
-{
-	int ret = 0;
-	double percent = 0.0;
-	struct hists *hists = he->hists;
-	struct hpp_arg *arg = hpp->ptr;
-
-	if (hists->stats.total_period)
-		percent = 100.0 * get_field(he) / hists->stats.total_period;
-
-	ui_browser__set_percent_color(arg->b, percent, arg->current_entry);
-
-	if (callchain_cb)
-		ret += callchain_cb(arg);
-
-	ret += scnprintf(hpp->buf, hpp->size, "%6.2f%%", percent);
-	slsmg_printf("%s", hpp->buf);
-
-	if (symbol_conf.event_group) {
-		int prev_idx, idx_delta;
-		struct perf_evsel *evsel = hists_to_evsel(hists);
-		struct hist_entry *pair;
-		int nr_members = evsel->nr_members;
-
-		if (nr_members <= 1)
-			goto out;
-
-		prev_idx = perf_evsel__group_idx(evsel);
-
-		list_for_each_entry(pair, &he->pairs.head, pairs.node) {
-			u64 period = get_field(pair);
-			u64 total = pair->hists->stats.total_period;
-
-			if (!total)
-				continue;
-
-			evsel = hists_to_evsel(pair->hists);
-			idx_delta = perf_evsel__group_idx(evsel) - prev_idx - 1;
-
-			while (idx_delta--) {
-				/*
-				 * zero-fill group members in the middle which
-				 * have no sample
-				 */
-				ui_browser__set_percent_color(arg->b, 0.0,
-							arg->current_entry);
-				ret += scnprintf(hpp->buf, hpp->size,
-						 " %6.2f%%", 0.0);
-				slsmg_printf("%s", hpp->buf);
-			}
-
-			percent = 100.0 * period / total;
-			ui_browser__set_percent_color(arg->b, percent,
-						      arg->current_entry);
-			ret += scnprintf(hpp->buf, hpp->size,
-					 " %6.2f%%", percent);
-			slsmg_printf("%s", hpp->buf);
-
-			prev_idx = perf_evsel__group_idx(evsel);
-		}
-
-		idx_delta = nr_members - prev_idx - 1;
-
-		while (idx_delta--) {
-			/*
-			 * zero-fill group members at last which have no sample
-			 */
-			ui_browser__set_percent_color(arg->b, 0.0,
-						      arg->current_entry);
-			ret += scnprintf(hpp->buf, hpp->size,
-					 " %6.2f%%", 0.0);
-			slsmg_printf("%s", hpp->buf);
-		}
-	}
-out:
-	if (!arg->current_entry || !arg->b->navkeypressed)
-		ui_browser__set_color(arg->b, HE_COLORSET_NORMAL);
-
-	return ret;
-}
-
-#define __HPP_COLOR_PERCENT_FN(_type, _field, _cb)			\
-static u64 __hpp_get_##_field(struct hist_entry *he)			\
-{									\
-	return he->stat._field;						\
-}									\
-									\
-static int								\
-hist_browser__hpp_color_##_type(struct perf_hpp_fmt *fmt __maybe_unused,\
-				struct perf_hpp *hpp,			\
-				struct hist_entry *he)			\
-{									\
-	return __hpp__color_fmt(hpp, he, __hpp_get_##_field, _cb);	\
-}
-
-__HPP_COLOR_PERCENT_FN(overhead, period, __hpp__color_callchain)
-__HPP_COLOR_PERCENT_FN(overhead_sys, period_sys, NULL)
-__HPP_COLOR_PERCENT_FN(overhead_us, period_us, NULL)
-__HPP_COLOR_PERCENT_FN(overhead_guest_sys, period_guest_sys, NULL)
-__HPP_COLOR_PERCENT_FN(overhead_guest_us, period_guest_us, NULL)
-
-#undef __HPP_COLOR_PERCENT_FN
-
-void hist_browser__init_hpp(void)
-{
-	perf_hpp__init();
-
-	perf_hpp__format[PERF_HPP__OVERHEAD].color =
-				hist_browser__hpp_color_overhead;
-	perf_hpp__format[PERF_HPP__OVERHEAD_SYS].color =
-				hist_browser__hpp_color_overhead_sys;
-	perf_hpp__format[PERF_HPP__OVERHEAD_US].color =
-				hist_browser__hpp_color_overhead_us;
-	perf_hpp__format[PERF_HPP__OVERHEAD_GUEST_SYS].color =
-				hist_browser__hpp_color_overhead_guest_sys;
-	perf_hpp__format[PERF_HPP__OVERHEAD_GUEST_US].color =
-				hist_browser__hpp_color_overhead_guest_us;
-}
-
-static int hist_browser__show_entry(struct hist_browser *browser,
-				    struct hist_entry *entry,
-				    unsigned short row)
-{
-	char s[256];
-	int printed = 0;
-	int width = browser->b.width;
-	char folded_sign = ' ';
-	bool current_entry = ui_browser__is_current_entry(&browser->b, row);
-	off_t row_offset = entry->row_offset;
-	bool first = true;
-	struct perf_hpp_fmt *fmt;
-
-	if (current_entry) {
-		browser->he_selection = entry;
-		browser->selection = &entry->ms;
-	}
-
-	if (symbol_conf.use_callchain) {
-		hist_entry__init_have_children(entry);
-		folded_sign = hist_entry__folded(entry);
-	}
-
-	if (row_offset == 0) {
-		struct hpp_arg arg = {
-			.b 		= &browser->b,
-			.folded_sign	= folded_sign,
-			.current_entry	= current_entry,
-		};
-		struct perf_hpp hpp = {
-			.buf		= s,
-			.size		= sizeof(s),
-			.ptr		= &arg,
-		};
-
-		ui_browser__gotorc(&browser->b, row, 0);
-
-		perf_hpp__for_each_format(fmt) {
-			if (!first) {
-				slsmg_printf("  ");
-				width -= 2;
-			}
-			first = false;
-
-			if (fmt->color) {
-				width -= fmt->color(fmt, &hpp, entry);
-			} else {
-				width -= fmt->entry(fmt, &hpp, entry);
-				slsmg_printf("%s", s);
-			}
-		}
-
-		/* The scroll bar isn't being used */
-		if (!browser->b.navkeypressed)
-			width += 1;
-
-		hist_entry__sort_snprintf(entry, s, sizeof(s), browser->hists);
-		slsmg_write_nstring(s, width);
-		++row;
-		++printed;
-	} else
-		--row_offset;
-
-	if (folded_sign == '-' && row != browser->b.height) {
-		printed += hist_browser__show_callchain(browser, &entry->sorted_chain,
-							1, row, &row_offset,
-							&current_entry);
-		if (current_entry)
-			browser->he_selection = entry;
-	}
-
-	return printed;
-}
-
-static void ui_browser__hists_init_top(struct ui_browser *browser)
-{
-	if (browser->top == NULL) {
-		struct hist_browser *hb;
-
-		hb = container_of(browser, struct hist_browser, b);
-		browser->top = rb_first(&hb->hists->entries);
-	}
-}
-
-static unsigned int hist_browser__refresh(struct ui_browser *browser)
-{
-	unsigned row = 0;
-	struct rb_node *nd;
-	struct hist_browser *hb = container_of(browser, struct hist_browser, b);
-
-	ui_browser__hists_init_top(browser);
-
-	for (nd = browser->top; nd; nd = rb_next(nd)) {
-		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
-		float percent = h->stat.period * 100.0 /
-					hb->hists->stats.total_period;
-
-		if (h->filtered)
-			continue;
-
-		if (percent < hb->min_pcnt)
-			continue;
-
-		row += hist_browser__show_entry(hb, h, row);
-		if (row == browser->height)
-			break;
-	}
-
-	return row;
-}
-
-static struct rb_node *hists__filter_entries(struct rb_node *nd,
-					     struct hists *hists,
-					     float min_pcnt)
-{
-	while (nd != NULL) {
-		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
-		float percent = h->stat.period * 100.0 /
-					hists->stats.total_period;
-
-		if (percent < min_pcnt)
-			return NULL;
-
-		if (!h->filtered)
-			return nd;
-
-		nd = rb_next(nd);
-	}
-
-	return NULL;
-}
-
-static struct rb_node *hists__filter_prev_entries(struct rb_node *nd,
-						  struct hists *hists,
-						  float min_pcnt)
-{
-	while (nd != NULL) {
-		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
-		float percent = h->stat.period * 100.0 /
-					hists->stats.total_period;
-
-		if (!h->filtered && percent >= min_pcnt)
-			return nd;
-
-		nd = rb_prev(nd);
-	}
-
-	return NULL;
-}
-
-static void ui_browser__hists_seek(struct ui_browser *browser,
-				   off_t offset, int whence)
-{
-	struct hist_entry *h;
-	struct rb_node *nd;
-	bool first = true;
-	struct hist_browser *hb;
-
-	hb = container_of(browser, struct hist_browser, b);
-
-	if (browser->nr_entries == 0)
-		return;
-
-	ui_browser__hists_init_top(browser);
-
-	switch (whence) {
-	case SEEK_SET:
-		nd = hists__filter_entries(rb_first(browser->entries),
-					   hb->hists, hb->min_pcnt);
-		break;
-	case SEEK_CUR:
-		nd = browser->top;
-		goto do_offset;
-	case SEEK_END:
-		nd = hists__filter_prev_entries(rb_last(browser->entries),
-						hb->hists, hb->min_pcnt);
-		first = false;
-		break;
-	default:
-		return;
-	}
-
-	/*
-	 * Moves not relative to the first visible entry invalidates its
-	 * row_offset:
-	 */
-	h = rb_entry(browser->top, struct hist_entry, rb_node);
-	h->row_offset = 0;
-
-	/*
-	 * Here we have to check if nd is expanded (+), if it is we can't go
-	 * the next top level hist_entry, instead we must compute an offset of
-	 * what _not_ to show and not change the first visible entry.
-	 *
-	 * This offset increments when we are going from top to bottom and
-	 * decreases when we're going from bottom to top.
-	 *
-	 * As we don't have backpointers to the top level in the callchains
-	 * structure, we need to always print the whole hist_entry callchain,
-	 * skipping the first ones that are before the first visible entry
-	 * and stop when we printed enough lines to fill the screen.
-	 */
-do_offset:
-	if (offset > 0) {
-		do {
-			h = rb_entry(nd, struct hist_entry, rb_node);
-			if (h->ms.unfolded) {
-				u16 remaining = h->nr_rows - h->row_offset;
-				if (offset > remaining) {
-					offset -= remaining;
-					h->row_offset = 0;
-				} else {
-					h->row_offset += offset;
-					offset = 0;
-					browser->top = nd;
-					break;
-				}
-			}
-			nd = hists__filter_entries(rb_next(nd), hb->hists,
-						   hb->min_pcnt);
-			if (nd == NULL)
-				break;
-			--offset;
-			browser->top = nd;
-		} while (offset != 0);
-	} else if (offset < 0) {
-		while (1) {
-			h = rb_entry(nd, struct hist_entry, rb_node);
-			if (h->ms.unfolded) {
-				if (first) {
-					if (-offset > h->row_offset) {
-						offset += h->row_offset;
-						h->row_offset = 0;
-					} else {
-						h->row_offset += offset;
-						offset = 0;
-						browser->top = nd;
-						break;
-					}
-				} else {
-					if (-offset > h->nr_rows) {
-						offset += h->nr_rows;
-						h->row_offset = 0;
-					} else {
-						h->row_offset = h->nr_rows + offset;
-						offset = 0;
-						browser->top = nd;
-						break;
-					}
-				}
-			}
-
-			nd = hists__filter_prev_entries(rb_prev(nd), hb->hists,
-							hb->min_pcnt);
-			if (nd == NULL)
-				break;
-			++offset;
-			browser->top = nd;
-			if (offset == 0) {
-				/*
-				 * Last unfiltered hist_entry, check if it is
-				 * unfolded, if it is then we should have
-				 * row_offset at its last entry.
-				 */
-				h = rb_entry(nd, struct hist_entry, rb_node);
-				if (h->ms.unfolded)
-					h->row_offset = h->nr_rows;
-				break;
-			}
-			first = false;
-		}
-	} else {
-		browser->top = nd;
-		h = rb_entry(nd, struct hist_entry, rb_node);
-		h->row_offset = 0;
-	}
-}
-
-static int hist_browser__fprintf_callchain_node_rb_tree(struct hist_browser *browser,
-							struct callchain_node *chain_node,
-							u64 total, int level,
-							FILE *fp)
-{
-	struct rb_node *node;
-	int offset = level * LEVEL_OFFSET_STEP;
-	u64 new_total, remaining;
-	int printed = 0;
-
-	if (callchain_param.mode == CHAIN_GRAPH_REL)
-		new_total = chain_node->children_hit;
-	else
-		new_total = total;
-
-	remaining = new_total;
-	node = rb_first(&chain_node->rb_root);
-	while (node) {
-		struct callchain_node *child = rb_entry(node, struct callchain_node, rb_node);
-		struct rb_node *next = rb_next(node);
-		u64 cumul = callchain_cumul_hits(child);
-		struct callchain_list *chain;
-		char folded_sign = ' ';
-		int first = true;
-		int extra_offset = 0;
-
-		remaining -= cumul;
-
-		list_for_each_entry(chain, &child->val, list) {
-			char bf[1024], *alloc_str;
-			const char *str;
-			bool was_first = first;
-
-			if (first)
-				first = false;
-			else
-				extra_offset = LEVEL_OFFSET_STEP;
-
-			folded_sign = callchain_list__folded(chain);
-
-			alloc_str = NULL;
-			str = callchain_list__sym_name(chain, bf, sizeof(bf),
-						       browser->show_dso);
-			if (was_first) {
-				double percent = cumul * 100.0 / new_total;
-
-				if (asprintf(&alloc_str, "%2.2f%% %s", percent, str) < 0)
-					str = "Not enough memory!";
-				else
-					str = alloc_str;
-			}
-
-			printed += fprintf(fp, "%*s%c %s\n", offset + extra_offset, " ", folded_sign, str);
-			free(alloc_str);
-			if (folded_sign == '+')
-				break;
-		}
-
-		if (folded_sign == '-') {
-			const int new_level = level + (extra_offset ? 2 : 1);
-			printed += hist_browser__fprintf_callchain_node_rb_tree(browser, child, new_total,
-										new_level, fp);
-		}
-
-		node = next;
-	}
-
-	return printed;
-}
-
-static int hist_browser__fprintf_callchain_node(struct hist_browser *browser,
-						struct callchain_node *node,
-						int level, FILE *fp)
-{
-	struct callchain_list *chain;
-	int offset = level * LEVEL_OFFSET_STEP;
-	char folded_sign = ' ';
-	int printed = 0;
-
-	list_for_each_entry(chain, &node->val, list) {
-		char bf[1024], *s;
-
-		folded_sign = callchain_list__folded(chain);
-		s = callchain_list__sym_name(chain, bf, sizeof(bf), browser->show_dso);
-		printed += fprintf(fp, "%*s%c %s\n", offset, " ", folded_sign, s);
-	}
-
-	if (folded_sign == '-')
-		printed += hist_browser__fprintf_callchain_node_rb_tree(browser, node,
-									browser->hists->stats.total_period,
-									level + 1,  fp);
-	return printed;
-}
-
-static int hist_browser__fprintf_callchain(struct hist_browser *browser,
-					   struct rb_root *chain, int level, FILE *fp)
-{
-	struct rb_node *nd;
-	int printed = 0;
-
-	for (nd = rb_first(chain); nd; nd = rb_next(nd)) {
-		struct callchain_node *node = rb_entry(nd, struct callchain_node, rb_node);
-
-		printed += hist_browser__fprintf_callchain_node(browser, node, level, fp);
-	}
-
-	return printed;
-}
-
-static int hist_browser__fprintf_entry(struct hist_browser *browser,
-				       struct hist_entry *he, FILE *fp)
-{
-	char s[8192];
-	double percent;
-	int printed = 0;
-	char folded_sign = ' ';
-
-	if (symbol_conf.use_callchain)
-		folded_sign = hist_entry__folded(he);
-
-	hist_entry__sort_snprintf(he, s, sizeof(s), browser->hists);
-	percent = (he->stat.period * 100.0) / browser->hists->stats.total_period;
-
-	if (symbol_conf.use_callchain)
-		printed += fprintf(fp, "%c ", folded_sign);
-
-	printed += fprintf(fp, " %5.2f%%", percent);
-
-	if (symbol_conf.show_nr_samples)
-		printed += fprintf(fp, " %11u", he->stat.nr_events);
-
-	if (symbol_conf.show_total_period)
-		printed += fprintf(fp, " %12" PRIu64, he->stat.period);
-
-	printed += fprintf(fp, "%s\n", rtrim(s));
-
-	if (folded_sign == '-')
-		printed += hist_browser__fprintf_callchain(browser, &he->sorted_chain, 1, fp);
-
-	return printed;
-}
-
-static int hist_browser__fprintf(struct hist_browser *browser, FILE *fp)
-{
-	struct rb_node *nd = hists__filter_entries(rb_first(browser->b.entries),
-						   browser->hists,
-						   browser->min_pcnt);
-	int printed = 0;
-
-	while (nd) {
-		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
-
-		printed += hist_browser__fprintf_entry(browser, h, fp);
-		nd = hists__filter_entries(rb_next(nd), browser->hists,
-					   browser->min_pcnt);
-	}
-
-	return printed;
-}
-
-static int hist_browser__dump(struct hist_browser *browser)
-{
-	char filename[64];
-	FILE *fp;
-
-	while (1) {
-		scnprintf(filename, sizeof(filename), "perf.hist.%d", browser->print_seq);
-		if (access(filename, F_OK))
-			break;
-		/*
- 		 * XXX: Just an arbitrary lazy upper limit
- 		 */
-		if (++browser->print_seq == 8192) {
-			ui_helpline__fpush("Too many perf.hist.N files, nothing written!");
-			return -1;
-		}
-	}
-
-	fp = fopen(filename, "w");
-	if (fp == NULL) {
-		char bf[64];
-		const char *err = strerror_r(errno, bf, sizeof(bf));
-		ui_helpline__fpush("Couldn't write to %s: %s", filename, err);
-		return -1;
-	}
-
-	++browser->print_seq;
-	hist_browser__fprintf(browser, fp);
-	fclose(fp);
-	ui_helpline__fpush("%s written!", filename);
-
-	return 0;
-}
-
-static struct hist_browser *hist_browser__new(struct hists *hists)
-{
-	struct hist_browser *browser = zalloc(sizeof(*browser));
-
-	if (browser) {
-		browser->hists = hists;
-		browser->b.refresh = hist_browser__refresh;
-		browser->b.seek = ui_browser__hists_seek;
-		browser->b.use_navkeypressed = true;
-	}
-
-	return browser;
-}
-
-static void hist_browser__delete(struct hist_browser *browser)
-{
-	free(browser);
-}
-
-static struct hist_entry *hist_browser__selected_entry(struct hist_browser *browser)
-{
-	return browser->he_selection;
-}
-
-static struct thread *hist_browser__selected_thread(struct hist_browser *browser)
-{
-	return browser->he_selection->thread;
-}
-
-static int hists__browser_title(struct hists *hists, char *bf, size_t size,
-				const char *ev_name)
-{
-	char unit;
-	int printed;
-	const struct dso *dso = hists->dso_filter;
-	const struct thread *thread = hists->thread_filter;
-	unsigned long nr_samples = hists->stats.nr_events[PERF_RECORD_SAMPLE];
-	u64 nr_events = hists->stats.total_period;
-	struct perf_evsel *evsel = hists_to_evsel(hists);
-	char buf[512];
-	size_t buflen = sizeof(buf);
-
-	if (perf_evsel__is_group_event(evsel)) {
-		struct perf_evsel *pos;
-
-		perf_evsel__group_desc(evsel, buf, buflen);
-		ev_name = buf;
-
-		for_each_group_member(pos, evsel) {
-			nr_samples += pos->hists.stats.nr_events[PERF_RECORD_SAMPLE];
-			nr_events += pos->hists.stats.total_period;
-		}
-	}
-
-	nr_samples = convert_unit(nr_samples, &unit);
-	printed = scnprintf(bf, size,
-			   "Samples: %lu%c of event '%s', Event count (approx.): %lu",
-			   nr_samples, unit, ev_name, nr_events);
-
-
-	if (hists->uid_filter_str)
-		printed += snprintf(bf + printed, size - printed,
-				    ", UID: %s", hists->uid_filter_str);
-	if (thread)
-		printed += scnprintf(bf + printed, size - printed,
-				    ", Thread: %s(%d)",
-				    (thread->comm_set ? thread->comm : ""),
-				    thread->tid);
-	if (dso)
-		printed += scnprintf(bf + printed, size - printed,
-				    ", DSO: %s", dso->short_name);
-	return printed;
-}
-
-static inline void free_popup_options(char **options, int n)
-{
-	int i;
-
-	for (i = 0; i < n; ++i) {
-		free(options[i]);
-		options[i] = NULL;
-	}
-}
-
-/* Check whether the browser is for 'top' or 'report' */
-static inline bool is_report_browser(void *timer)
-{
-	return timer == NULL;
-}
-
-/*
- * Only runtime switching of perf data file will make "input_name" point
- * to a malloced buffer. So add "is_input_name_malloced" flag to decide
- * whether we need to call free() for current "input_name" during the switch.
- */
-static bool is_input_name_malloced = false;
-
-static int switch_data_file(void)
-{
-	char *pwd, *options[32], *abs_path[32], *tmp;
-	DIR *pwd_dir;
-	int nr_options = 0, choice = -1, ret = -1;
-	struct dirent *dent;
-
-	pwd = getenv("PWD");
-	if (!pwd)
-		return ret;
-
-	pwd_dir = opendir(pwd);
-	if (!pwd_dir)
-		return ret;
-
-	memset(options, 0, sizeof(options));
-	memset(options, 0, sizeof(abs_path));
-
-	while ((dent = readdir(pwd_dir))) {
-		char path[PATH_MAX];
-		u64 magic;
-		char *name = dent->d_name;
-		FILE *file;
-
-		if (!(dent->d_type == DT_REG))
-			continue;
-
-		snprintf(path, sizeof(path), "%s/%s", pwd, name);
-
-		file = fopen(path, "r");
-		if (!file)
-			continue;
-
-		if (fread(&magic, 1, 8, file) < 8)
-			goto close_file_and_continue;
-
-		if (is_perf_magic(magic)) {
-			options[nr_options] = strdup(name);
-			if (!options[nr_options])
-				goto close_file_and_continue;
-
-			abs_path[nr_options] = strdup(path);
-			if (!abs_path[nr_options]) {
-				free(options[nr_options]);
-				ui__warning("Can't search all data files due to memory shortage.\n");
-				fclose(file);
-				break;
-			}
-
-			nr_options++;
-		}
-
-close_file_and_continue:
-		fclose(file);
-		if (nr_options >= 32) {
-			ui__warning("Too many perf data files in PWD!\n"
-				    "Only the first 32 files will be listed.\n");
-			break;
-		}
-	}
-	closedir(pwd_dir);
-
-	if (nr_options) {
-		choice = ui__popup_menu(nr_options, options);
-		if (choice < nr_options && choice >= 0) {
-			tmp = strdup(abs_path[choice]);
-			if (tmp) {
-				if (is_input_name_malloced)
-					free((void *)input_name);
-				input_name = tmp;
-				is_input_name_malloced = true;
-				ret = 0;
-			} else
-				ui__warning("Data switch failed due to memory shortage!\n");
-		}
-	}
-
-	free_popup_options(options, nr_options);
-	free_popup_options(abs_path, nr_options);
-	return ret;
-}
-
-static void hist_browser__update_pcnt_entries(struct hist_browser *hb)
-{
-	u64 nr_entries = 0;
-	struct rb_node *nd = rb_first(&hb->hists->entries);
-
-	while (nd) {
-		nr_entries++;
-		nd = hists__filter_entries(rb_next(nd), hb->hists,
-					   hb->min_pcnt);
-	}
-
-	hb->nr_pcnt_entries = nr_entries;
-}
-
-static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
-				    const char *helpline, const char *ev_name,
-				    bool left_exits,
-				    struct hist_browser_timer *hbt,
-				    float min_pcnt,
-				    struct perf_session_env *env)
-{
-	struct hists *hists = &evsel->hists;
-	struct hist_browser *browser = hist_browser__new(hists);
-	struct branch_info *bi;
-	struct pstack *fstack;
-	char *options[16];
-	int nr_options = 0;
-	int key = -1;
-	char buf[64];
-	char script_opt[64];
-	int delay_secs = hbt ? hbt->refresh : 0;
-
-	if (browser == NULL)
-		return -1;
-
-	if (min_pcnt) {
-		browser->min_pcnt = min_pcnt;
-		hist_browser__update_pcnt_entries(browser);
-	}
-
-	fstack = pstack__new(2);
-	if (fstack == NULL)
-		goto out;
-
-	ui_helpline__push(helpline);
-
-	memset(options, 0, sizeof(options));
-
-	while (1) {
-		const struct thread *thread = NULL;
-		const struct dso *dso = NULL;
-		int choice = 0,
-		    annotate = -2, zoom_dso = -2, zoom_thread = -2,
-		    annotate_f = -2, annotate_t = -2, browse_map = -2;
-		int scripts_comm = -2, scripts_symbol = -2,
-		    scripts_all = -2, switch_data = -2;
-
-		nr_options = 0;
-
-		key = hist_browser__run(browser, ev_name, hbt);
-
-		if (browser->he_selection != NULL) {
-			thread = hist_browser__selected_thread(browser);
-			dso = browser->selection->map ? browser->selection->map->dso : NULL;
-		}
-		switch (key) {
-		case K_TAB:
-		case K_UNTAB:
-			if (nr_events == 1)
-				continue;
-			/*
-			 * Exit the browser, let hists__browser_tree
-			 * go to the next or previous
-			 */
-			goto out_free_stack;
-		case 'a':
-			if (!sort__has_sym) {
-				ui_browser__warning(&browser->b, delay_secs * 2,
-			"Annotation is only available for symbolic views, "
-			"include \"sym*\" in --sort to use it.");
-				continue;
-			}
-
-			if (browser->selection == NULL ||
-			    browser->selection->sym == NULL ||
-			    browser->selection->map->dso->annotate_warned)
-				continue;
-			goto do_annotate;
-		case 'P':
-			hist_browser__dump(browser);
-			continue;
-		case 'd':
-			goto zoom_dso;
-		case 'V':
-			browser->show_dso = !browser->show_dso;
-			continue;
-		case 't':
-			goto zoom_thread;
-		case '/':
-			if (ui_browser__input_window("Symbol to show",
-					"Please enter the name of symbol you want to see",
-					buf, "ENTER: OK, ESC: Cancel",
-					delay_secs * 2) == K_ENTER) {
-				hists->symbol_filter_str = *buf ? buf : NULL;
-				hists__filter_by_symbol(hists);
-				hist_browser__reset(browser);
-			}
-			continue;
-		case 'r':
-			if (is_report_browser(hbt))
-				goto do_scripts;
-			continue;
-		case 's':
-			if (is_report_browser(hbt))
-				goto do_data_switch;
-			continue;
-		case K_F1:
-		case 'h':
-		case '?':
-			ui_browser__help_window(&browser->b,
-					"h/?/F1        Show this window\n"
-					"UP/DOWN/PGUP\n"
-					"PGDN/SPACE    Navigate\n"
-					"q/ESC/CTRL+C  Exit browser\n\n"
-					"For multiple event sessions:\n\n"
-					"TAB/UNTAB Switch events\n\n"
-					"For symbolic views (--sort has sym):\n\n"
-					"->            Zoom into DSO/Threads & Annotate current symbol\n"
-					"<-            Zoom out\n"
-					"a             Annotate current symbol\n"
-					"C             Collapse all callchains\n"
-					"E             Expand all callchains\n"
-					"d             Zoom into current DSO\n"
-					"t             Zoom into current Thread\n"
-					"r             Run available scripts('perf report' only)\n"
-					"s             Switch to another data file in PWD ('perf report' only)\n"
-					"P             Print histograms to perf.hist.N\n"
-					"V             Verbose (DSO names in callchains, etc)\n"
-					"/             Filter symbol by name");
-			continue;
-		case K_ENTER:
-		case K_RIGHT:
-			/* menu */
-			break;
-		case K_LEFT: {
-			const void *top;
-
-			if (pstack__empty(fstack)) {
-				/*
-				 * Go back to the perf_evsel_menu__run or other user
-				 */
-				if (left_exits)
-					goto out_free_stack;
-				continue;
-			}
-			top = pstack__pop(fstack);
-			if (top == &browser->hists->dso_filter)
-				goto zoom_out_dso;
-			if (top == &browser->hists->thread_filter)
-				goto zoom_out_thread;
-			continue;
-		}
-		case K_ESC:
-			if (!left_exits &&
-			    !ui_browser__dialog_yesno(&browser->b,
-					       "Do you really want to exit?"))
-				continue;
-			/* Fall thru */
-		case 'q':
-		case CTRL('c'):
-			goto out_free_stack;
-		default:
-			continue;
-		}
-
-		if (!sort__has_sym)
-			goto add_exit_option;
-
-		if (sort__mode == SORT_MODE__BRANCH) {
-			bi = browser->he_selection->branch_info;
-			if (browser->selection != NULL &&
-			    bi &&
-			    bi->from.sym != NULL &&
-			    !bi->from.map->dso->annotate_warned &&
-				asprintf(&options[nr_options], "Annotate %s",
-					 bi->from.sym->name) > 0)
-				annotate_f = nr_options++;
-
-			if (browser->selection != NULL &&
-			    bi &&
-			    bi->to.sym != NULL &&
-			    !bi->to.map->dso->annotate_warned &&
-			    (bi->to.sym != bi->from.sym ||
-			     bi->to.map->dso != bi->from.map->dso) &&
-				asprintf(&options[nr_options], "Annotate %s",
-					 bi->to.sym->name) > 0)
-				annotate_t = nr_options++;
-		} else {
-
-			if (browser->selection != NULL &&
-			    browser->selection->sym != NULL &&
-			    !browser->selection->map->dso->annotate_warned &&
-				asprintf(&options[nr_options], "Annotate %s",
-					 browser->selection->sym->name) > 0)
-				annotate = nr_options++;
-		}
-
-		if (thread != NULL &&
-		    asprintf(&options[nr_options], "Zoom %s %s(%d) thread",
-			     (browser->hists->thread_filter ? "out of" : "into"),
-			     (thread->comm_set ? thread->comm : ""),
-			     thread->tid) > 0)
-			zoom_thread = nr_options++;
-
-		if (dso != NULL &&
-		    asprintf(&options[nr_options], "Zoom %s %s DSO",
-			     (browser->hists->dso_filter ? "out of" : "into"),
-			     (dso->kernel ? "the Kernel" : dso->short_name)) > 0)
-			zoom_dso = nr_options++;
-
-		if (browser->selection != NULL &&
-		    browser->selection->map != NULL &&
-		    asprintf(&options[nr_options], "Browse map details") > 0)
-			browse_map = nr_options++;
-
-		/* perf script support */
-		if (browser->he_selection) {
-			struct symbol *sym;
-
-			if (asprintf(&options[nr_options], "Run scripts for samples of thread [%s]",
-				browser->he_selection->thread->comm) > 0)
-				scripts_comm = nr_options++;
-
-			sym = browser->he_selection->ms.sym;
-			if (sym && sym->namelen &&
-				asprintf(&options[nr_options], "Run scripts for samples of symbol [%s]",
-						sym->name) > 0)
-				scripts_symbol = nr_options++;
-		}
-
-		if (asprintf(&options[nr_options], "Run scripts for all samples") > 0)
-			scripts_all = nr_options++;
-
-		if (is_report_browser(hbt) && asprintf(&options[nr_options],
-				"Switch to another data file in PWD") > 0)
-			switch_data = nr_options++;
-add_exit_option:
-		options[nr_options++] = (char *)"Exit";
-retry_popup_menu:
-		choice = ui__popup_menu(nr_options, options);
-
-		if (choice == nr_options - 1)
-			break;
-
-		if (choice == -1) {
-			free_popup_options(options, nr_options - 1);
-			continue;
-		}
-
-		if (choice == annotate || choice == annotate_t || choice == annotate_f) {
-			struct hist_entry *he;
-			int err;
-do_annotate:
-			if (!objdump_path && perf_session_env__lookup_objdump(env))
-				continue;
-
-			he = hist_browser__selected_entry(browser);
-			if (he == NULL)
-				continue;
-
-			/*
-			 * we stash the branch_info symbol + map into the
-			 * the ms so we don't have to rewrite all the annotation
-			 * code to use branch_info.
-			 * in branch mode, the ms struct is not used
-			 */
-			if (choice == annotate_f) {
-				he->ms.sym = he->branch_info->from.sym;
-				he->ms.map = he->branch_info->from.map;
-			}  else if (choice == annotate_t) {
-				he->ms.sym = he->branch_info->to.sym;
-				he->ms.map = he->branch_info->to.map;
-			}
-
-			/*
-			 * Don't let this be freed, say, by hists__decay_entry.
-			 */
-			he->used = true;
-			err = hist_entry__tui_annotate(he, evsel, hbt);
-			he->used = false;
-			/*
-			 * offer option to annotate the other branch source or target
-			 * (if they exists) when returning from annotate
-			 */
-			if ((err == 'q' || err == CTRL('c'))
-			    && annotate_t != -2 && annotate_f != -2)
-				goto retry_popup_menu;
-
-			ui_browser__update_nr_entries(&browser->b, browser->hists->nr_entries);
-			if (err)
-				ui_browser__handle_resize(&browser->b);
-
-		} else if (choice == browse_map)
-			map__browse(browser->selection->map);
-		else if (choice == zoom_dso) {
-zoom_dso:
-			if (browser->hists->dso_filter) {
-				pstack__remove(fstack, &browser->hists->dso_filter);
-zoom_out_dso:
-				ui_helpline__pop();
-				browser->hists->dso_filter = NULL;
-				sort_dso.elide = false;
-			} else {
-				if (dso == NULL)
-					continue;
-				ui_helpline__fpush("To zoom out press <- or -> + \"Zoom out of %s DSO\"",
-						   dso->kernel ? "the Kernel" : dso->short_name);
-				browser->hists->dso_filter = dso;
-				sort_dso.elide = true;
-				pstack__push(fstack, &browser->hists->dso_filter);
-			}
-			hists__filter_by_dso(hists);
-			hist_browser__reset(browser);
-		} else if (choice == zoom_thread) {
-zoom_thread:
-			if (browser->hists->thread_filter) {
-				pstack__remove(fstack, &browser->hists->thread_filter);
-zoom_out_thread:
-				ui_helpline__pop();
-				browser->hists->thread_filter = NULL;
-				sort_thread.elide = false;
-			} else {
-				ui_helpline__fpush("To zoom out press <- or -> + \"Zoom out of %s(%d) thread\"",
-						   thread->comm_set ? thread->comm : "",
-						   thread->tid);
-				browser->hists->thread_filter = thread;
-				sort_thread.elide = true;
-				pstack__push(fstack, &browser->hists->thread_filter);
-			}
-			hists__filter_by_thread(hists);
-			hist_browser__reset(browser);
-		}
-		/* perf scripts support */
-		else if (choice == scripts_all || choice == scripts_comm ||
-				choice == scripts_symbol) {
-do_scripts:
-			memset(script_opt, 0, 64);
-
-			if (choice == scripts_comm)
-				sprintf(script_opt, " -c %s ", browser->he_selection->thread->comm);
-
-			if (choice == scripts_symbol)
-				sprintf(script_opt, " -S %s ", browser->he_selection->ms.sym->name);
-
-			script_browse(script_opt);
-		}
-		/* Switch to another data file */
-		else if (choice == switch_data) {
-do_data_switch:
-			if (!switch_data_file()) {
-				key = K_SWITCH_INPUT_DATA;
-				break;
-			} else
-				ui__warning("Won't switch the data files due to\n"
-					"no valid data file get selected!\n");
-		}
-	}
-out_free_stack:
-	pstack__delete(fstack);
-out:
-	hist_browser__delete(browser);
-	free_popup_options(options, nr_options - 1);
-	return key;
-}
-
-struct perf_evsel_menu {
-	struct ui_browser b;
-	struct perf_evsel *selection;
-	bool lost_events, lost_events_warned;
-	float min_pcnt;
-	struct perf_session_env *env;
-};
-
-static void perf_evsel_menu__write(struct ui_browser *browser,
-				   void *entry, int row)
-{
-	struct perf_evsel_menu *menu = container_of(browser,
-						    struct perf_evsel_menu, b);
-	struct perf_evsel *evsel = list_entry(entry, struct perf_evsel, node);
-	bool current_entry = ui_browser__is_current_entry(browser, row);
-	unsigned long nr_events = evsel->hists.stats.nr_events[PERF_RECORD_SAMPLE];
-	const char *ev_name = perf_evsel__name(evsel);
-	char bf[256], unit;
-	const char *warn = " ";
-	size_t printed;
-
-	ui_browser__set_color(browser, current_entry ? HE_COLORSET_SELECTED :
-						       HE_COLORSET_NORMAL);
-
-	if (perf_evsel__is_group_event(evsel)) {
-		struct perf_evsel *pos;
-
-		ev_name = perf_evsel__group_name(evsel);
-
-		for_each_group_member(pos, evsel) {
-			nr_events += pos->hists.stats.nr_events[PERF_RECORD_SAMPLE];
-		}
-	}
-
-	nr_events = convert_unit(nr_events, &unit);
-	printed = scnprintf(bf, sizeof(bf), "%lu%c%s%s", nr_events,
-			   unit, unit == ' ' ? "" : " ", ev_name);
-	slsmg_printf("%s", bf);
-
-	nr_events = evsel->hists.stats.nr_events[PERF_RECORD_LOST];
-	if (nr_events != 0) {
-		menu->lost_events = true;
-		if (!current_entry)
-			ui_browser__set_color(browser, HE_COLORSET_TOP);
-		nr_events = convert_unit(nr_events, &unit);
-		printed += scnprintf(bf, sizeof(bf), ": %ld%c%schunks LOST!",
-				     nr_events, unit, unit == ' ' ? "" : " ");
-		warn = bf;
-	}
-
-	slsmg_write_nstring(warn, browser->width - printed);
-
-	if (current_entry)
-		menu->selection = evsel;
-}
-
-static int perf_evsel_menu__run(struct perf_evsel_menu *menu,
-				int nr_events, const char *help,
-				struct hist_browser_timer *hbt)
-{
-	struct perf_evlist *evlist = menu->b.priv;
-	struct perf_evsel *pos;
-	const char *ev_name, *title = "Available samples";
-	int delay_secs = hbt ? hbt->refresh : 0;
-	int key;
-
-	if (ui_browser__show(&menu->b, title,
-			     "ESC: exit, ENTER|->: Browse histograms") < 0)
-		return -1;
-
-	while (1) {
-		key = ui_browser__run(&menu->b, delay_secs);
-
-		switch (key) {
-		case K_TIMER:
-			hbt->timer(hbt->arg);
-
-			if (!menu->lost_events_warned && menu->lost_events) {
-				ui_browser__warn_lost_events(&menu->b);
-				menu->lost_events_warned = true;
-			}
-			continue;
-		case K_RIGHT:
-		case K_ENTER:
-			if (!menu->selection)
-				continue;
-			pos = menu->selection;
-browse_hists:
-			perf_evlist__set_selected(evlist, pos);
-			/*
-			 * Give the calling tool a chance to populate the non
-			 * default evsel resorted hists tree.
-			 */
-			if (hbt)
-				hbt->timer(hbt->arg);
-			ev_name = perf_evsel__name(pos);
-			key = perf_evsel__hists_browse(pos, nr_events, help,
-						       ev_name, true, hbt,
-						       menu->min_pcnt,
-						       menu->env);
-			ui_browser__show_title(&menu->b, title);
-			switch (key) {
-			case K_TAB:
-				if (pos->node.next == &evlist->entries)
-					pos = list_entry(evlist->entries.next, struct perf_evsel, node);
-				else
-					pos = list_entry(pos->node.next, struct perf_evsel, node);
-				goto browse_hists;
-			case K_UNTAB:
-				if (pos->node.prev == &evlist->entries)
-					pos = list_entry(evlist->entries.prev, struct perf_evsel, node);
-				else
-					pos = list_entry(pos->node.prev, struct perf_evsel, node);
-				goto browse_hists;
-			case K_ESC:
-				if (!ui_browser__dialog_yesno(&menu->b,
-						"Do you really want to exit?"))
-					continue;
-				/* Fall thru */
-			case K_SWITCH_INPUT_DATA:
-			case 'q':
-			case CTRL('c'):
-				goto out;
-			default:
-				continue;
-			}
-		case K_LEFT:
-			continue;
-		case K_ESC:
-			if (!ui_browser__dialog_yesno(&menu->b,
-					       "Do you really want to exit?"))
-				continue;
-			/* Fall thru */
-		case 'q':
-		case CTRL('c'):
-			goto out;
-		default:
-			continue;
-		}
-	}
-
-out:
-	ui_browser__hide(&menu->b);
-	return key;
-}
-
-static bool filter_group_entries(struct ui_browser *self __maybe_unused,
-				 void *entry)
-{
-	struct perf_evsel *evsel = list_entry(entry, struct perf_evsel, node);
-
-	if (symbol_conf.event_group && !perf_evsel__is_group_leader(evsel))
-		return true;
-
-	return false;
-}
-
-static int __perf_evlist__tui_browse_hists(struct perf_evlist *evlist,
-					   int nr_entries, const char *help,
-					   struct hist_browser_timer *hbt,
-					   float min_pcnt,
-					   struct perf_session_env *env)
-{
-	struct perf_evsel *pos;
-	struct perf_evsel_menu menu = {
-		.b = {
-			.entries    = &evlist->entries,
-			.refresh    = ui_browser__list_head_refresh,
-			.seek	    = ui_browser__list_head_seek,
-			.write	    = perf_evsel_menu__write,
-			.filter	    = filter_group_entries,
-			.nr_entries = nr_entries,
-			.priv	    = evlist,
-		},
-		.min_pcnt = min_pcnt,
-		.env = env,
-	};
-
-	ui_helpline__push("Press ESC to exit");
-
-	list_for_each_entry(pos, &evlist->entries, node) {
-		const char *ev_name = perf_evsel__name(pos);
-		size_t line_len = strlen(ev_name) + 7;
-
-		if (menu.b.width < line_len)
-			menu.b.width = line_len;
-	}
-
-	return perf_evsel_menu__run(&menu, nr_entries, help, hbt);
-}
-
-int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help,
-				  struct hist_browser_timer *hbt,
-				  float min_pcnt,
-				  struct perf_session_env *env)
-{
-	int nr_entries = evlist->nr_entries;
-
-single_entry:
-	if (nr_entries == 1) {
-		struct perf_evsel *first = list_entry(evlist->entries.next,
-						      struct perf_evsel, node);
-		const char *ev_name = perf_evsel__name(first);
-
-		return perf_evsel__hists_browse(first, nr_entries, help,
-						ev_name, false, hbt, min_pcnt,
-						env);
-	}
-
-	if (symbol_conf.event_group) {
-		struct perf_evsel *pos;
-
-		nr_entries = 0;
-		list_for_each_entry(pos, &evlist->entries, node)
-			if (perf_evsel__is_group_leader(pos))
-				nr_entries++;
-
-		if (nr_entries == 1)
-			goto single_entry;
-	}
-
-	return __perf_evlist__tui_browse_hists(evlist, nr_entries, help,
-					       hbt, min_pcnt, env);
-}
diff --git a/src/tools/perf/ui/browsers/map.c b/src/tools/perf/ui/browsers/map.c
deleted file mode 100644
index 95c7cfb..0000000
--- a/src/tools/perf/ui/browsers/map.c
+++ /dev/null
@@ -1,130 +0,0 @@
-#include "../libslang.h"
-#include <elf.h>
-#include <inttypes.h>
-#include <sys/ttydefaults.h>
-#include <string.h>
-#include <linux/bitops.h>
-#include "../../util/util.h"
-#include "../../util/debug.h"
-#include "../../util/symbol.h"
-#include "../browser.h"
-#include "../helpline.h"
-#include "../keysyms.h"
-#include "map.h"
-
-struct map_browser {
-	struct ui_browser b;
-	struct map	  *map;
-	u8		  addrlen;
-};
-
-static void map_browser__write(struct ui_browser *self, void *nd, int row)
-{
-	struct symbol *sym = rb_entry(nd, struct symbol, rb_node);
-	struct map_browser *mb = container_of(self, struct map_browser, b);
-	bool current_entry = ui_browser__is_current_entry(self, row);
-	int width;
-
-	ui_browser__set_percent_color(self, 0, current_entry);
-	slsmg_printf("%*" PRIx64 " %*" PRIx64 " %c ",
-		     mb->addrlen, sym->start, mb->addrlen, sym->end,
-		     sym->binding == STB_GLOBAL ? 'g' :
-		     sym->binding == STB_LOCAL  ? 'l' : 'w');
-	width = self->width - ((mb->addrlen * 2) + 4);
-	if (width > 0)
-		slsmg_write_nstring(sym->name, width);
-}
-
-/* FIXME uber-kludgy, see comment on cmd_report... */
-static u32 *symbol__browser_index(struct symbol *self)
-{
-	return ((void *)self) - sizeof(struct rb_node) - sizeof(u32);
-}
-
-static int map_browser__search(struct map_browser *self)
-{
-	char target[512];
-	struct symbol *sym;
-	int err = ui_browser__input_window("Search by name/addr",
-					   "Prefix with 0x to search by address",
-					   target, "ENTER: OK, ESC: Cancel", 0);
-	if (err != K_ENTER)
-		return -1;
-
-	if (target[0] == '0' && tolower(target[1]) == 'x') {
-		u64 addr = strtoull(target, NULL, 16);
-		sym = map__find_symbol(self->map, addr, NULL);
-	} else
-		sym = map__find_symbol_by_name(self->map, target, NULL);
-
-	if (sym != NULL) {
-		u32 *idx = symbol__browser_index(sym);
-
-		self->b.top = &sym->rb_node;
-		self->b.index = self->b.top_idx = *idx;
-	} else
-		ui_helpline__fpush("%s not found!", target);
-
-	return 0;
-}
-
-static int map_browser__run(struct map_browser *self)
-{
-	int key;
-
-	if (ui_browser__show(&self->b, self->map->dso->long_name,
-			     "Press <- or ESC to exit, %s / to search",
-			     verbose ? "" : "restart with -v to use") < 0)
-		return -1;
-
-	while (1) {
-		key = ui_browser__run(&self->b, 0);
-
-		switch (key) {
-		case '/':
-			if (verbose)
-				map_browser__search(self);
-		default:
-			break;
-                case K_LEFT:
-                case K_ESC:
-                case 'q':
-                case CTRL('c'):
-                        goto out;
-		}
-	}
-out:
-	ui_browser__hide(&self->b);
-	return key;
-}
-
-int map__browse(struct map *self)
-{
-	struct map_browser mb = {
-		.b = {
-			.entries = &self->dso->symbols[self->type],
-			.refresh = ui_browser__rb_tree_refresh,
-			.seek	 = ui_browser__rb_tree_seek,
-			.write	 = map_browser__write,
-		},
-		.map = self,
-	};
-	struct rb_node *nd;
-	char tmp[BITS_PER_LONG / 4];
-	u64 maxaddr = 0;
-
-	for (nd = rb_first(mb.b.entries); nd; nd = rb_next(nd)) {
-		struct symbol *pos = rb_entry(nd, struct symbol, rb_node);
-
-		if (maxaddr < pos->end)
-			maxaddr = pos->end;
-		if (verbose) {
-			u32 *idx = symbol__browser_index(pos);
-			*idx = mb.b.nr_entries;
-		}
-		++mb.b.nr_entries;
-	}
-
-	mb.addrlen = snprintf(tmp, sizeof(tmp), "%" PRIx64, maxaddr);
-	return map_browser__run(&mb);
-}
diff --git a/src/tools/perf/ui/browsers/map.h b/src/tools/perf/ui/browsers/map.h
deleted file mode 100644
index df8581a..0000000
--- a/src/tools/perf/ui/browsers/map.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef _PERF_UI_MAP_BROWSER_H_
-#define _PERF_UI_MAP_BROWSER_H_ 1
-struct map;
-
-int map__browse(struct map *self);
-#endif /* _PERF_UI_MAP_BROWSER_H_ */
diff --git a/src/tools/perf/ui/browsers/scripts.c b/src/tools/perf/ui/browsers/scripts.c
deleted file mode 100644
index 12f009e..0000000
--- a/src/tools/perf/ui/browsers/scripts.c
+++ /dev/null
@@ -1,188 +0,0 @@
-#include <elf.h>
-#include <inttypes.h>
-#include <sys/ttydefaults.h>
-#include <string.h>
-#include "../../util/sort.h"
-#include "../../util/util.h"
-#include "../../util/hist.h"
-#include "../../util/debug.h"
-#include "../../util/symbol.h"
-#include "../browser.h"
-#include "../helpline.h"
-#include "../libslang.h"
-
-/* 2048 lines should be enough for a script output */
-#define MAX_LINES		2048
-
-/* 160 bytes for one output line */
-#define AVERAGE_LINE_LEN	160
-
-struct script_line {
-	struct list_head node;
-	char line[AVERAGE_LINE_LEN];
-};
-
-struct perf_script_browser {
-	struct ui_browser b;
-	struct list_head entries;
-	const char *script_name;
-	int nr_lines;
-};
-
-#define SCRIPT_NAMELEN	128
-#define SCRIPT_MAX_NO	64
-/*
- * Usually the full path for a script is:
- *	/home/username/libexec/perf-core/scripts/python/xxx.py
- *	/home/username/libexec/perf-core/scripts/perl/xxx.pl
- * So 256 should be long enough to contain the full path.
- */
-#define SCRIPT_FULLPATH_LEN	256
-
-/*
- * When success, will copy the full path of the selected script
- * into  the buffer pointed by script_name, and return 0.
- * Return -1 on failure.
- */
-static int list_scripts(char *script_name)
-{
-	char *buf, *names[SCRIPT_MAX_NO], *paths[SCRIPT_MAX_NO];
-	int i, num, choice, ret = -1;
-
-	/* Preset the script name to SCRIPT_NAMELEN */
-	buf = malloc(SCRIPT_MAX_NO * (SCRIPT_NAMELEN + SCRIPT_FULLPATH_LEN));
-	if (!buf)
-		return ret;
-
-	for (i = 0; i < SCRIPT_MAX_NO; i++) {
-		names[i] = buf + i * (SCRIPT_NAMELEN + SCRIPT_FULLPATH_LEN);
-		paths[i] = names[i] + SCRIPT_NAMELEN;
-	}
-
-	num = find_scripts(names, paths);
-	if (num > 0) {
-		choice = ui__popup_menu(num, names);
-		if (choice < num && choice >= 0) {
-			strcpy(script_name, paths[choice]);
-			ret = 0;
-		}
-	}
-
-	free(buf);
-	return ret;
-}
-
-static void script_browser__write(struct ui_browser *browser,
-				   void *entry, int row)
-{
-	struct script_line *sline = list_entry(entry, struct script_line, node);
-	bool current_entry = ui_browser__is_current_entry(browser, row);
-
-	ui_browser__set_color(browser, current_entry ? HE_COLORSET_SELECTED :
-						       HE_COLORSET_NORMAL);
-
-	slsmg_write_nstring(sline->line, browser->width);
-}
-
-static int script_browser__run(struct perf_script_browser *self)
-{
-	int key;
-
-	if (ui_browser__show(&self->b, self->script_name,
-			     "Press <- or ESC to exit") < 0)
-		return -1;
-
-	while (1) {
-		key = ui_browser__run(&self->b, 0);
-
-		/* We can add some special key handling here if needed */
-		break;
-	}
-
-	ui_browser__hide(&self->b);
-	return key;
-}
-
-
-int script_browse(const char *script_opt)
-{
-	char cmd[SCRIPT_FULLPATH_LEN*2], script_name[SCRIPT_FULLPATH_LEN];
-	char *line = NULL;
-	size_t len = 0;
-	ssize_t retlen;
-	int ret = -1, nr_entries = 0;
-	FILE *fp;
-	void *buf;
-	struct script_line *sline;
-
-	struct perf_script_browser script = {
-		.b = {
-			.refresh    = ui_browser__list_head_refresh,
-			.seek	    = ui_browser__list_head_seek,
-			.write	    = script_browser__write,
-		},
-		.script_name = script_name,
-	};
-
-	INIT_LIST_HEAD(&script.entries);
-
-	/* Save each line of the output in one struct script_line object. */
-	buf = zalloc((sizeof(*sline)) * MAX_LINES);
-	if (!buf)
-		return -1;
-	sline = buf;
-
-	memset(script_name, 0, SCRIPT_FULLPATH_LEN);
-	if (list_scripts(script_name))
-		goto exit;
-
-	sprintf(cmd, "perf script -s %s ", script_name);
-
-	if (script_opt)
-		strcat(cmd, script_opt);
-
-	if (input_name) {
-		strcat(cmd, " -i ");
-		strcat(cmd, input_name);
-	}
-
-	strcat(cmd, " 2>&1");
-
-	fp = popen(cmd, "r");
-	if (!fp)
-		goto exit;
-
-	while ((retlen = getline(&line, &len, fp)) != -1) {
-		strncpy(sline->line, line, AVERAGE_LINE_LEN);
-
-		/* If one output line is very large, just cut it short */
-		if (retlen >= AVERAGE_LINE_LEN) {
-			sline->line[AVERAGE_LINE_LEN - 1] = '\0';
-			sline->line[AVERAGE_LINE_LEN - 2] = '\n';
-		}
-		list_add_tail(&sline->node, &script.entries);
-
-		if (script.b.width < retlen)
-			script.b.width = retlen;
-
-		if (nr_entries++ >= MAX_LINES - 1)
-			break;
-		sline++;
-	}
-
-	if (script.b.width > AVERAGE_LINE_LEN)
-		script.b.width = AVERAGE_LINE_LEN;
-
-	if (line)
-		free(line);
-	pclose(fp);
-
-	script.nr_lines = nr_entries;
-	script.b.nr_entries = nr_entries;
-	script.b.entries = &script.entries;
-
-	ret = script_browser__run(&script);
-exit:
-	free(buf);
-	return ret;
-}
diff --git a/src/tools/perf/ui/gtk/annotate.c b/src/tools/perf/ui/gtk/annotate.c
deleted file mode 100644
index f538794..0000000
--- a/src/tools/perf/ui/gtk/annotate.c
+++ /dev/null
@@ -1,245 +0,0 @@
-#include "gtk.h"
-#include "util/debug.h"
-#include "util/annotate.h"
-#include "util/evsel.h"
-#include "ui/helpline.h"
-
-
-enum {
-	ANN_COL__PERCENT,
-	ANN_COL__OFFSET,
-	ANN_COL__LINE,
-
-	MAX_ANN_COLS
-};
-
-static const char *const col_names[] = {
-	"Overhead",
-	"Offset",
-	"Line"
-};
-
-static int perf_gtk__get_percent(char *buf, size_t size, struct symbol *sym,
-				 struct disasm_line *dl, int evidx)
-{
-	struct sym_hist *symhist;
-	double percent = 0.0;
-	const char *markup;
-	int ret = 0;
-
-	strcpy(buf, "");
-
-	if (dl->offset == (s64) -1)
-		return 0;
-
-	symhist = annotation__histogram(symbol__annotation(sym), evidx);
-	if (!symbol_conf.event_group && !symhist->addr[dl->offset])
-		return 0;
-
-	percent = 100.0 * symhist->addr[dl->offset] / symhist->sum;
-
-	markup = perf_gtk__get_percent_color(percent);
-	if (markup)
-		ret += scnprintf(buf, size, "%s", markup);
-	ret += scnprintf(buf + ret, size - ret, "%6.2f%%", percent);
-	if (markup)
-		ret += scnprintf(buf + ret, size - ret, "</span>");
-
-	return ret;
-}
-
-static int perf_gtk__get_offset(char *buf, size_t size, struct symbol *sym,
-				struct map *map, struct disasm_line *dl)
-{
-	u64 start = map__rip_2objdump(map, sym->start);
-
-	strcpy(buf, "");
-
-	if (dl->offset == (s64) -1)
-		return 0;
-
-	return scnprintf(buf, size, "%"PRIx64, start + dl->offset);
-}
-
-static int perf_gtk__get_line(char *buf, size_t size, struct disasm_line *dl)
-{
-	int ret = 0;
-	char *line = g_markup_escape_text(dl->line, -1);
-	const char *markup = "<span fgcolor='gray'>";
-
-	strcpy(buf, "");
-
-	if (!line)
-		return 0;
-
-	if (dl->offset != (s64) -1)
-		markup = NULL;
-
-	if (markup)
-		ret += scnprintf(buf, size, "%s", markup);
-	ret += scnprintf(buf + ret, size - ret, "%s", line);
-	if (markup)
-		ret += scnprintf(buf + ret, size - ret, "</span>");
-
-	g_free(line);
-	return ret;
-}
-
-static int perf_gtk__annotate_symbol(GtkWidget *window, struct symbol *sym,
-				struct map *map, struct perf_evsel *evsel,
-				struct hist_browser_timer *hbt __maybe_unused)
-{
-	struct disasm_line *pos, *n;
-	struct annotation *notes;
-	GType col_types[MAX_ANN_COLS];
-	GtkCellRenderer *renderer;
-	GtkListStore *store;
-	GtkWidget *view;
-	int i;
-	char s[512];
-
-	notes = symbol__annotation(sym);
-
-	for (i = 0; i < MAX_ANN_COLS; i++) {
-		col_types[i] = G_TYPE_STRING;
-	}
-	store = gtk_list_store_newv(MAX_ANN_COLS, col_types);
-
-	view = gtk_tree_view_new();
-	renderer = gtk_cell_renderer_text_new();
-
-	for (i = 0; i < MAX_ANN_COLS; i++) {
-		gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
-					-1, col_names[i], renderer, "markup",
-					i, NULL);
-	}
-
-	gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store));
-	g_object_unref(GTK_TREE_MODEL(store));
-
-	list_for_each_entry(pos, &notes->src->source, node) {
-		GtkTreeIter iter;
-		int ret = 0;
-
-		gtk_list_store_append(store, &iter);
-
-		if (perf_evsel__is_group_event(evsel)) {
-			for (i = 0; i < evsel->nr_members; i++) {
-				ret += perf_gtk__get_percent(s + ret,
-							     sizeof(s) - ret,
-							     sym, pos,
-							     evsel->idx + i);
-				ret += scnprintf(s + ret, sizeof(s) - ret, " ");
-			}
-		} else {
-			ret = perf_gtk__get_percent(s, sizeof(s), sym, pos,
-						    evsel->idx);
-		}
-
-		if (ret)
-			gtk_list_store_set(store, &iter, ANN_COL__PERCENT, s, -1);
-		if (perf_gtk__get_offset(s, sizeof(s), sym, map, pos))
-			gtk_list_store_set(store, &iter, ANN_COL__OFFSET, s, -1);
-		if (perf_gtk__get_line(s, sizeof(s), pos))
-			gtk_list_store_set(store, &iter, ANN_COL__LINE, s, -1);
-	}
-
-	gtk_container_add(GTK_CONTAINER(window), view);
-
-	list_for_each_entry_safe(pos, n, &notes->src->source, node) {
-		list_del(&pos->node);
-		disasm_line__free(pos);
-	}
-
-	return 0;
-}
-
-int symbol__gtk_annotate(struct symbol *sym, struct map *map,
-			 struct perf_evsel *evsel,
-			 struct hist_browser_timer *hbt)
-{
-	GtkWidget *window;
-	GtkWidget *notebook;
-	GtkWidget *scrolled_window;
-	GtkWidget *tab_label;
-
-	if (map->dso->annotate_warned)
-		return -1;
-
-	if (symbol__annotate(sym, map, 0) < 0) {
-		ui__error("%s", ui_helpline__current);
-		return -1;
-	}
-
-	if (perf_gtk__is_active_context(pgctx)) {
-		window = pgctx->main_window;
-		notebook = pgctx->notebook;
-	} else {
-		GtkWidget *vbox;
-		GtkWidget *infobar;
-		GtkWidget *statbar;
-
-		signal(SIGSEGV, perf_gtk__signal);
-		signal(SIGFPE,  perf_gtk__signal);
-		signal(SIGINT,  perf_gtk__signal);
-		signal(SIGQUIT, perf_gtk__signal);
-		signal(SIGTERM, perf_gtk__signal);
-
-		window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-		gtk_window_set_title(GTK_WINDOW(window), "perf annotate");
-
-		g_signal_connect(window, "delete_event", gtk_main_quit, NULL);
-
-		pgctx = perf_gtk__activate_context(window);
-		if (!pgctx)
-			return -1;
-
-		vbox = gtk_vbox_new(FALSE, 0);
-		notebook = gtk_notebook_new();
-		pgctx->notebook = notebook;
-
-		gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
-
-		infobar = perf_gtk__setup_info_bar();
-		if (infobar) {
-			gtk_box_pack_start(GTK_BOX(vbox), infobar,
-					   FALSE, FALSE, 0);
-		}
-
-		statbar = perf_gtk__setup_statusbar();
-		gtk_box_pack_start(GTK_BOX(vbox), statbar, FALSE, FALSE, 0);
-
-		gtk_container_add(GTK_CONTAINER(window), vbox);
-	}
-
-	scrolled_window = gtk_scrolled_window_new(NULL, NULL);
-	tab_label = gtk_label_new(sym->name);
-
-	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
-				       GTK_POLICY_AUTOMATIC,
-				       GTK_POLICY_AUTOMATIC);
-
-	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), scrolled_window,
-				 tab_label);
-
-	perf_gtk__annotate_symbol(scrolled_window, sym, map, evsel, hbt);
-	return 0;
-}
-
-void perf_gtk__show_annotations(void)
-{
-	GtkWidget *window;
-
-	if (!perf_gtk__is_active_context(pgctx))
-		return;
-
-	window = pgctx->main_window;
-	gtk_widget_show_all(window);
-
-	perf_gtk__resize_window(window);
-	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
-
-	gtk_main();
-
-	perf_gtk__deactivate_context(&pgctx);
-}
diff --git a/src/tools/perf/ui/gtk/browser.c b/src/tools/perf/ui/gtk/browser.c
deleted file mode 100644
index c95012c..0000000
--- a/src/tools/perf/ui/gtk/browser.c
+++ /dev/null
@@ -1,87 +0,0 @@
-#include "../evlist.h"
-#include "../cache.h"
-#include "../evsel.h"
-#include "../sort.h"
-#include "../hist.h"
-#include "../helpline.h"
-#include "gtk.h"
-
-#include <signal.h>
-
-void perf_gtk__signal(int sig)
-{
-	perf_gtk__exit(false);
-	psignal(sig, "perf");
-}
-
-void perf_gtk__resize_window(GtkWidget *window)
-{
-	GdkRectangle rect;
-	GdkScreen *screen;
-	int monitor;
-	int height;
-	int width;
-
-	screen = gtk_widget_get_screen(window);
-
-	monitor = gdk_screen_get_monitor_at_window(screen, window->window);
-
-	gdk_screen_get_monitor_geometry(screen, monitor, &rect);
-
-	width	= rect.width * 3 / 4;
-	height	= rect.height * 3 / 4;
-
-	gtk_window_resize(GTK_WINDOW(window), width, height);
-}
-
-const char *perf_gtk__get_percent_color(double percent)
-{
-	if (percent >= MIN_RED)
-		return "<span fgcolor='red'>";
-	if (percent >= MIN_GREEN)
-		return "<span fgcolor='dark green'>";
-	return NULL;
-}
-
-#ifdef HAVE_GTK_INFO_BAR
-GtkWidget *perf_gtk__setup_info_bar(void)
-{
-	GtkWidget *info_bar;
-	GtkWidget *label;
-	GtkWidget *content_area;
-
-	info_bar = gtk_info_bar_new();
-	gtk_widget_set_no_show_all(info_bar, TRUE);
-
-	label = gtk_label_new("");
-	gtk_widget_show(label);
-
-	content_area = gtk_info_bar_get_content_area(GTK_INFO_BAR(info_bar));
-	gtk_container_add(GTK_CONTAINER(content_area), label);
-
-	gtk_info_bar_add_button(GTK_INFO_BAR(info_bar), GTK_STOCK_OK,
-				GTK_RESPONSE_OK);
-	g_signal_connect(info_bar, "response",
-			 G_CALLBACK(gtk_widget_hide), NULL);
-
-	pgctx->info_bar = info_bar;
-	pgctx->message_label = label;
-
-	return info_bar;
-}
-#endif
-
-GtkWidget *perf_gtk__setup_statusbar(void)
-{
-	GtkWidget *stbar;
-	unsigned ctxid;
-
-	stbar = gtk_statusbar_new();
-
-	ctxid = gtk_statusbar_get_context_id(GTK_STATUSBAR(stbar),
-					     "perf report");
-	pgctx->statbar = stbar;
-	pgctx->statbar_ctx_id = ctxid;
-
-	return stbar;
-}
diff --git a/src/tools/perf/ui/gtk/gtk.h b/src/tools/perf/ui/gtk/gtk.h
deleted file mode 100644
index 3d96785..0000000
--- a/src/tools/perf/ui/gtk/gtk.h
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef _PERF_GTK_H_
-#define _PERF_GTK_H_ 1
-
-#include <stdbool.h>
-
-#pragma GCC diagnostic ignored "-Wstrict-prototypes"
-#include <gtk/gtk.h>
-#pragma GCC diagnostic error "-Wstrict-prototypes"
-
-
-struct perf_gtk_context {
-	GtkWidget *main_window;
-	GtkWidget *notebook;
-
-#ifdef HAVE_GTK_INFO_BAR
-	GtkWidget *info_bar;
-	GtkWidget *message_label;
-#endif
-	GtkWidget *statbar;
-	guint statbar_ctx_id;
-};
-
-extern struct perf_gtk_context *pgctx;
-
-static inline bool perf_gtk__is_active_context(struct perf_gtk_context *ctx)
-{
-	return ctx && ctx->main_window;
-}
-
-struct perf_gtk_context *perf_gtk__activate_context(GtkWidget *window);
-int perf_gtk__deactivate_context(struct perf_gtk_context **ctx);
-
-void perf_gtk__init_helpline(void);
-void perf_gtk__init_progress(void);
-void perf_gtk__init_hpp(void);
-
-void perf_gtk__signal(int sig);
-void perf_gtk__resize_window(GtkWidget *window);
-const char *perf_gtk__get_percent_color(double percent);
-GtkWidget *perf_gtk__setup_statusbar(void);
-
-#ifdef HAVE_GTK_INFO_BAR
-GtkWidget *perf_gtk__setup_info_bar(void);
-#else
-static inline GtkWidget *perf_gtk__setup_info_bar(void)
-{
-	return NULL;
-}
-#endif
-
-#endif /* _PERF_GTK_H_ */
diff --git a/src/tools/perf/ui/gtk/helpline.c b/src/tools/perf/ui/gtk/helpline.c
deleted file mode 100644
index 3388cbd..0000000
--- a/src/tools/perf/ui/gtk/helpline.c
+++ /dev/null
@@ -1,57 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-
-#include "gtk.h"
-#include "../ui.h"
-#include "../helpline.h"
-#include "../../util/debug.h"
-
-static void gtk_helpline_pop(void)
-{
-	if (!perf_gtk__is_active_context(pgctx))
-		return;
-
-	gtk_statusbar_pop(GTK_STATUSBAR(pgctx->statbar),
-			  pgctx->statbar_ctx_id);
-}
-
-static void gtk_helpline_push(const char *msg)
-{
-	if (!perf_gtk__is_active_context(pgctx))
-		return;
-
-	gtk_statusbar_push(GTK_STATUSBAR(pgctx->statbar),
-			   pgctx->statbar_ctx_id, msg);
-}
-
-static int gtk_helpline_show(const char *fmt, va_list ap)
-{
-	int ret;
-	char *ptr;
-	static int backlog;
-
-	ret = vscnprintf(ui_helpline__current + backlog,
-			 sizeof(ui_helpline__current) - backlog, fmt, ap);
-	backlog += ret;
-
-	/* only first line can be displayed */
-	ptr = strchr(ui_helpline__current, '\n');
-	if (ptr && (ptr - ui_helpline__current) <= backlog) {
-		*ptr = '\0';
-		ui_helpline__puts(ui_helpline__current);
-		backlog = 0;
-	}
-
-	return ret;
-}
-
-static struct ui_helpline gtk_helpline_fns = {
-	.pop	= gtk_helpline_pop,
-	.push	= gtk_helpline_push,
-	.show	= gtk_helpline_show,
-};
-
-void perf_gtk__init_helpline(void)
-{
-	helpline_fns = &gtk_helpline_fns;
-}
diff --git a/src/tools/perf/ui/gtk/hists.c b/src/tools/perf/ui/gtk/hists.c
deleted file mode 100644
index 2ca66cc..0000000
--- a/src/tools/perf/ui/gtk/hists.c
+++ /dev/null
@@ -1,422 +0,0 @@
-#include "../evlist.h"
-#include "../cache.h"
-#include "../evsel.h"
-#include "../sort.h"
-#include "../hist.h"
-#include "../helpline.h"
-#include "gtk.h"
-
-#define MAX_COLUMNS			32
-
-static int __percent_color_snprintf(char *buf, size_t size, double percent)
-{
-	int ret = 0;
-	const char *markup;
-
-	markup = perf_gtk__get_percent_color(percent);
-	if (markup)
-		ret += scnprintf(buf, size, markup);
-
-	ret += scnprintf(buf + ret, size - ret, " %6.2f%%", percent);
-
-	if (markup)
-		ret += scnprintf(buf + ret, size - ret, "</span>");
-
-	return ret;
-}
-
-
-static int __hpp__color_fmt(struct perf_hpp *hpp, struct hist_entry *he,
-			    u64 (*get_field)(struct hist_entry *))
-{
-	int ret;
-	double percent = 0.0;
-	struct hists *hists = he->hists;
-	struct perf_evsel *evsel = hists_to_evsel(hists);
-
-	if (hists->stats.total_period)
-		percent = 100.0 * get_field(he) / hists->stats.total_period;
-
-	ret = __percent_color_snprintf(hpp->buf, hpp->size, percent);
-
-	if (perf_evsel__is_group_event(evsel)) {
-		int prev_idx, idx_delta;
-		struct hist_entry *pair;
-		int nr_members = evsel->nr_members;
-
-		prev_idx = perf_evsel__group_idx(evsel);
-
-		list_for_each_entry(pair, &he->pairs.head, pairs.node) {
-			u64 period = get_field(pair);
-			u64 total = pair->hists->stats.total_period;
-
-			evsel = hists_to_evsel(pair->hists);
-			idx_delta = perf_evsel__group_idx(evsel) - prev_idx - 1;
-
-			while (idx_delta--) {
-				/*
-				 * zero-fill group members in the middle which
-				 * have no sample
-				 */
-				ret += __percent_color_snprintf(hpp->buf + ret,
-								hpp->size - ret,
-								0.0);
-			}
-
-			percent = 100.0 * period / total;
-			ret += __percent_color_snprintf(hpp->buf + ret,
-							hpp->size - ret,
-							percent);
-
-			prev_idx = perf_evsel__group_idx(evsel);
-		}
-
-		idx_delta = nr_members - prev_idx - 1;
-
-		while (idx_delta--) {
-			/*
-			 * zero-fill group members at last which have no sample
-			 */
-			ret += __percent_color_snprintf(hpp->buf + ret,
-							hpp->size - ret,
-							0.0);
-		}
-	}
-	return ret;
-}
-
-#define __HPP_COLOR_PERCENT_FN(_type, _field)					\
-static u64 he_get_##_field(struct hist_entry *he)				\
-{										\
-	return he->stat._field;							\
-}										\
-										\
-static int perf_gtk__hpp_color_##_type(struct perf_hpp_fmt *fmt __maybe_unused,	\
-				       struct perf_hpp *hpp,			\
-				       struct hist_entry *he)			\
-{										\
-	return __hpp__color_fmt(hpp, he, he_get_##_field);			\
-}
-
-__HPP_COLOR_PERCENT_FN(overhead, period)
-__HPP_COLOR_PERCENT_FN(overhead_sys, period_sys)
-__HPP_COLOR_PERCENT_FN(overhead_us, period_us)
-__HPP_COLOR_PERCENT_FN(overhead_guest_sys, period_guest_sys)
-__HPP_COLOR_PERCENT_FN(overhead_guest_us, period_guest_us)
-
-#undef __HPP_COLOR_PERCENT_FN
-
-
-void perf_gtk__init_hpp(void)
-{
-	perf_hpp__init();
-
-	perf_hpp__format[PERF_HPP__OVERHEAD].color =
-				perf_gtk__hpp_color_overhead;
-	perf_hpp__format[PERF_HPP__OVERHEAD_SYS].color =
-				perf_gtk__hpp_color_overhead_sys;
-	perf_hpp__format[PERF_HPP__OVERHEAD_US].color =
-				perf_gtk__hpp_color_overhead_us;
-	perf_hpp__format[PERF_HPP__OVERHEAD_GUEST_SYS].color =
-				perf_gtk__hpp_color_overhead_guest_sys;
-	perf_hpp__format[PERF_HPP__OVERHEAD_GUEST_US].color =
-				perf_gtk__hpp_color_overhead_guest_us;
-}
-
-static void callchain_list__sym_name(struct callchain_list *cl,
-				     char *bf, size_t bfsize)
-{
-	if (cl->ms.sym)
-		scnprintf(bf, bfsize, "%s", cl->ms.sym->name);
-	else
-		scnprintf(bf, bfsize, "%#" PRIx64, cl->ip);
-}
-
-static void perf_gtk__add_callchain(struct rb_root *root, GtkTreeStore *store,
-				    GtkTreeIter *parent, int col, u64 total)
-{
-	struct rb_node *nd;
-	bool has_single_node = (rb_first(root) == rb_last(root));
-
-	for (nd = rb_first(root); nd; nd = rb_next(nd)) {
-		struct callchain_node *node;
-		struct callchain_list *chain;
-		GtkTreeIter iter, new_parent;
-		bool need_new_parent;
-		double percent;
-		u64 hits, child_total;
-
-		node = rb_entry(nd, struct callchain_node, rb_node);
-
-		hits = callchain_cumul_hits(node);
-		percent = 100.0 * hits / total;
-
-		new_parent = *parent;
-		need_new_parent = !has_single_node && (node->val_nr > 1);
-
-		list_for_each_entry(chain, &node->val, list) {
-			char buf[128];
-
-			gtk_tree_store_append(store, &iter, &new_parent);
-
-			scnprintf(buf, sizeof(buf), "%5.2f%%", percent);
-			gtk_tree_store_set(store, &iter, 0, buf, -1);
-
-			callchain_list__sym_name(chain, buf, sizeof(buf));
-			gtk_tree_store_set(store, &iter, col, buf, -1);
-
-			if (need_new_parent) {
-				/*
-				 * Only show the top-most symbol in a callchain
-				 * if it's not the only callchain.
-				 */
-				new_parent = iter;
-				need_new_parent = false;
-			}
-		}
-
-		if (callchain_param.mode == CHAIN_GRAPH_REL)
-			child_total = node->children_hit;
-		else
-			child_total = total;
-
-		/* Now 'iter' contains info of the last callchain_list */
-		perf_gtk__add_callchain(&node->rb_root, store, &iter, col,
-					child_total);
-	}
-}
-
-static void on_row_activated(GtkTreeView *view, GtkTreePath *path,
-			     GtkTreeViewColumn *col __maybe_unused,
-			     gpointer user_data __maybe_unused)
-{
-	bool expanded = gtk_tree_view_row_expanded(view, path);
-
-	if (expanded)
-		gtk_tree_view_collapse_row(view, path);
-	else
-		gtk_tree_view_expand_row(view, path, FALSE);
-}
-
-static void perf_gtk__show_hists(GtkWidget *window, struct hists *hists,
-				 float min_pcnt)
-{
-	struct perf_hpp_fmt *fmt;
-	GType col_types[MAX_COLUMNS];
-	GtkCellRenderer *renderer;
-	struct sort_entry *se;
-	GtkTreeStore *store;
-	struct rb_node *nd;
-	GtkWidget *view;
-	int col_idx;
-	int sym_col = -1;
-	int nr_cols;
-	char s[512];
-
-	struct perf_hpp hpp = {
-		.buf		= s,
-		.size		= sizeof(s),
-		.ptr		= hists_to_evsel(hists),
-	};
-
-	nr_cols = 0;
-
-	perf_hpp__for_each_format(fmt)
-		col_types[nr_cols++] = G_TYPE_STRING;
-
-	list_for_each_entry(se, &hist_entry__sort_list, list) {
-		if (se->elide)
-			continue;
-
-		if (se == &sort_sym)
-			sym_col = nr_cols;
-
-		col_types[nr_cols++] = G_TYPE_STRING;
-	}
-
-	store = gtk_tree_store_newv(nr_cols, col_types);
-
-	view = gtk_tree_view_new();
-
-	renderer = gtk_cell_renderer_text_new();
-
-	col_idx = 0;
-
-	perf_hpp__for_each_format(fmt) {
-		fmt->header(fmt, &hpp);
-
-		gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
-							    -1, ltrim(s),
-							    renderer, "markup",
-							    col_idx++, NULL);
-	}
-
-	list_for_each_entry(se, &hist_entry__sort_list, list) {
-		if (se->elide)
-			continue;
-
-		gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
-							    -1, se->se_header,
-							    renderer, "text",
-							    col_idx++, NULL);
-	}
-
-	for (col_idx = 0; col_idx < nr_cols; col_idx++) {
-		GtkTreeViewColumn *column;
-
-		column = gtk_tree_view_get_column(GTK_TREE_VIEW(view), col_idx);
-		gtk_tree_view_column_set_resizable(column, TRUE);
-
-		if (col_idx == sym_col) {
-			gtk_tree_view_set_expander_column(GTK_TREE_VIEW(view),
-							  column);
-		}
-	}
-
-	gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store));
-
-	g_object_unref(GTK_TREE_MODEL(store));
-
-	for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) {
-		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
-		GtkTreeIter iter;
-		float percent = h->stat.period * 100.0 /
-					hists->stats.total_period;
-
-		if (h->filtered)
-			continue;
-
-		if (percent < min_pcnt)
-			continue;
-
-		gtk_tree_store_append(store, &iter, NULL);
-
-		col_idx = 0;
-
-		perf_hpp__for_each_format(fmt) {
-			if (fmt->color)
-				fmt->color(fmt, &hpp, h);
-			else
-				fmt->entry(fmt, &hpp, h);
-
-			gtk_tree_store_set(store, &iter, col_idx++, s, -1);
-		}
-
-		list_for_each_entry(se, &hist_entry__sort_list, list) {
-			if (se->elide)
-				continue;
-
-			se->se_snprintf(h, s, ARRAY_SIZE(s),
-					hists__col_len(hists, se->se_width_idx));
-
-			gtk_tree_store_set(store, &iter, col_idx++, s, -1);
-		}
-
-		if (symbol_conf.use_callchain && sort__has_sym) {
-			u64 total;
-
-			if (callchain_param.mode == CHAIN_GRAPH_REL)
-				total = h->stat.period;
-			else
-				total = hists->stats.total_period;
-
-			perf_gtk__add_callchain(&h->sorted_chain, store, &iter,
-						sym_col, total);
-		}
-	}
-
-	gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(view), TRUE);
-
-	g_signal_connect(view, "row-activated",
-			 G_CALLBACK(on_row_activated), NULL);
-	gtk_container_add(GTK_CONTAINER(window), view);
-}
-
-int perf_evlist__gtk_browse_hists(struct perf_evlist *evlist,
-				  const char *help,
-				  struct hist_browser_timer *hbt __maybe_unused,
-				  float min_pcnt)
-{
-	struct perf_evsel *pos;
-	GtkWidget *vbox;
-	GtkWidget *notebook;
-	GtkWidget *info_bar;
-	GtkWidget *statbar;
-	GtkWidget *window;
-
-	signal(SIGSEGV, perf_gtk__signal);
-	signal(SIGFPE,  perf_gtk__signal);
-	signal(SIGINT,  perf_gtk__signal);
-	signal(SIGQUIT, perf_gtk__signal);
-	signal(SIGTERM, perf_gtk__signal);
-
-	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-
-	gtk_window_set_title(GTK_WINDOW(window), "perf report");
-
-	g_signal_connect(window, "delete_event", gtk_main_quit, NULL);
-
-	pgctx = perf_gtk__activate_context(window);
-	if (!pgctx)
-		return -1;
-
-	vbox = gtk_vbox_new(FALSE, 0);
-
-	notebook = gtk_notebook_new();
-
-	gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
-
-	info_bar = perf_gtk__setup_info_bar();
-	if (info_bar)
-		gtk_box_pack_start(GTK_BOX(vbox), info_bar, FALSE, FALSE, 0);
-
-	statbar = perf_gtk__setup_statusbar();
-	gtk_box_pack_start(GTK_BOX(vbox), statbar, FALSE, FALSE, 0);
-
-	gtk_container_add(GTK_CONTAINER(window), vbox);
-
-	list_for_each_entry(pos, &evlist->entries, node) {
-		struct hists *hists = &pos->hists;
-		const char *evname = perf_evsel__name(pos);
-		GtkWidget *scrolled_window;
-		GtkWidget *tab_label;
-		char buf[512];
-		size_t size = sizeof(buf);
-
-		if (symbol_conf.event_group) {
-			if (!perf_evsel__is_group_leader(pos))
-				continue;
-
-			if (pos->nr_members > 1) {
-				perf_evsel__group_desc(pos, buf, size);
-				evname = buf;
-			}
-		}
-
-		scrolled_window = gtk_scrolled_window_new(NULL, NULL);
-
-		gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
-							GTK_POLICY_AUTOMATIC,
-							GTK_POLICY_AUTOMATIC);
-
-		perf_gtk__show_hists(scrolled_window, hists, min_pcnt);
-
-		tab_label = gtk_label_new(evname);
-
-		gtk_notebook_append_page(GTK_NOTEBOOK(notebook), scrolled_window, tab_label);
-	}
-
-	gtk_widget_show_all(window);
-
-	perf_gtk__resize_window(window);
-
-	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
-
-	ui_helpline__push(help);
-
-	gtk_main();
-
-	perf_gtk__deactivate_context(&pgctx);
-
-	return 0;
-}
diff --git a/src/tools/perf/ui/gtk/progress.c b/src/tools/perf/ui/gtk/progress.c
deleted file mode 100644
index 482bcf3..0000000
--- a/src/tools/perf/ui/gtk/progress.c
+++ /dev/null
@@ -1,59 +0,0 @@
-#include <inttypes.h>
-
-#include "gtk.h"
-#include "../progress.h"
-#include "util.h"
-
-static GtkWidget *dialog;
-static GtkWidget *progress;
-
-static void gtk_progress_update(u64 curr, u64 total, const char *title)
-{
-	double fraction = total ? 1.0 * curr / total : 0.0;
-	char buf[1024];
-
-	if (dialog == NULL) {
-		GtkWidget *vbox = gtk_vbox_new(TRUE, 5);
-		GtkWidget *label = gtk_label_new(title);
-
-		dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-		progress = gtk_progress_bar_new();
-
-		gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, FALSE, 3);
-		gtk_box_pack_start(GTK_BOX(vbox), progress, TRUE, TRUE, 3);
-
-		gtk_container_add(GTK_CONTAINER(dialog), vbox);
-
-		gtk_window_set_title(GTK_WINDOW(dialog), "perf");
-		gtk_window_resize(GTK_WINDOW(dialog), 300, 80);
-		gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
-
-		gtk_widget_show_all(dialog);
-	}
-
-	gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress), fraction);
-	snprintf(buf, sizeof(buf), "%"PRIu64" / %"PRIu64, curr, total);
-	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress), buf);
-
-	/* we didn't call gtk_main yet, so do it manually */
-	while (gtk_events_pending())
-		gtk_main_iteration();
-}
-
-static void gtk_progress_finish(void)
-{
-	/* this will also destroy all of its children */
-	gtk_widget_destroy(dialog);
-
-	dialog = NULL;
-}
-
-static struct ui_progress gtk_progress_fns = {
-	.update		= gtk_progress_update,
-	.finish		= gtk_progress_finish,
-};
-
-void perf_gtk__init_progress(void)
-{
-	progress_fns = &gtk_progress_fns;
-}
diff --git a/src/tools/perf/ui/gtk/setup.c b/src/tools/perf/ui/gtk/setup.c
deleted file mode 100644
index 6c2dd2e..0000000
--- a/src/tools/perf/ui/gtk/setup.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include "gtk.h"
-#include "../../util/cache.h"
-#include "../../util/debug.h"
-
-extern struct perf_error_ops perf_gtk_eops;
-
-int perf_gtk__init(void)
-{
-	perf_error__register(&perf_gtk_eops);
-	perf_gtk__init_helpline();
-	perf_gtk__init_progress();
-	perf_gtk__init_hpp();
-
-	return gtk_init_check(NULL, NULL) ? 0 : -1;
-}
-
-void perf_gtk__exit(bool wait_for_ok __maybe_unused)
-{
-	if (!perf_gtk__is_active_context(pgctx))
-		return;
-	perf_error__unregister(&perf_gtk_eops);
-	gtk_main_quit();
-}
diff --git a/src/tools/perf/ui/gtk/util.c b/src/tools/perf/ui/gtk/util.c
deleted file mode 100644
index c06942a..0000000
--- a/src/tools/perf/ui/gtk/util.c
+++ /dev/null
@@ -1,113 +0,0 @@
-#include "../util.h"
-#include "../../util/debug.h"
-#include "gtk.h"
-
-#include <string.h>
-
-
-struct perf_gtk_context *pgctx;
-
-struct perf_gtk_context *perf_gtk__activate_context(GtkWidget *window)
-{
-	struct perf_gtk_context *ctx;
-
-	ctx = malloc(sizeof(*pgctx));
-	if (ctx)
-		ctx->main_window = window;
-
-	return ctx;
-}
-
-int perf_gtk__deactivate_context(struct perf_gtk_context **ctx)
-{
-	if (!perf_gtk__is_active_context(*ctx))
-		return -1;
-
-	free(*ctx);
-	*ctx = NULL;
-	return 0;
-}
-
-static int perf_gtk__error(const char *format, va_list args)
-{
-	char *msg;
-	GtkWidget *dialog;
-
-	if (!perf_gtk__is_active_context(pgctx) ||
-	    vasprintf(&msg, format, args) < 0) {
-		fprintf(stderr, "Error:\n");
-		vfprintf(stderr, format, args);
-		fprintf(stderr, "\n");
-		return -1;
-	}
-
-	dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(pgctx->main_window),
-					GTK_DIALOG_DESTROY_WITH_PARENT,
-					GTK_MESSAGE_ERROR,
-					GTK_BUTTONS_CLOSE,
-					"<b>Error</b>\n\n%s", msg);
-	gtk_dialog_run(GTK_DIALOG(dialog));
-
-	gtk_widget_destroy(dialog);
-	free(msg);
-	return 0;
-}
-
-#ifdef HAVE_GTK_INFO_BAR
-static int perf_gtk__warning_info_bar(const char *format, va_list args)
-{
-	char *msg;
-
-	if (!perf_gtk__is_active_context(pgctx) ||
-	    vasprintf(&msg, format, args) < 0) {
-		fprintf(stderr, "Warning:\n");
-		vfprintf(stderr, format, args);
-		fprintf(stderr, "\n");
-		return -1;
-	}
-
-	gtk_label_set_text(GTK_LABEL(pgctx->message_label), msg);
-	gtk_info_bar_set_message_type(GTK_INFO_BAR(pgctx->info_bar),
-				      GTK_MESSAGE_WARNING);
-	gtk_widget_show(pgctx->info_bar);
-
-	free(msg);
-	return 0;
-}
-#else
-static int perf_gtk__warning_statusbar(const char *format, va_list args)
-{
-	char *msg, *p;
-
-	if (!perf_gtk__is_active_context(pgctx) ||
-	    vasprintf(&msg, format, args) < 0) {
-		fprintf(stderr, "Warning:\n");
-		vfprintf(stderr, format, args);
-		fprintf(stderr, "\n");
-		return -1;
-	}
-
-	gtk_statusbar_pop(GTK_STATUSBAR(pgctx->statbar),
-			  pgctx->statbar_ctx_id);
-
-	/* Only first line can be displayed */
-	p = strchr(msg, '\n');
-	if (p)
-		*p = '\0';
-
-	gtk_statusbar_push(GTK_STATUSBAR(pgctx->statbar),
-			   pgctx->statbar_ctx_id, msg);
-
-	free(msg);
-	return 0;
-}
-#endif
-
-struct perf_error_ops perf_gtk_eops = {
-	.error		= perf_gtk__error,
-#ifdef HAVE_GTK_INFO_BAR
-	.warning	= perf_gtk__warning_info_bar,
-#else
-	.warning	= perf_gtk__warning_statusbar,
-#endif
-};
diff --git a/src/tools/perf/ui/helpline.c b/src/tools/perf/ui/helpline.c
deleted file mode 100644
index 700fb3c..0000000
--- a/src/tools/perf/ui/helpline.c
+++ /dev/null
@@ -1,73 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "../debug.h"
-#include "helpline.h"
-#include "ui.h"
-
-char ui_helpline__current[512];
-
-static void nop_helpline__pop(void)
-{
-}
-
-static void nop_helpline__push(const char *msg __maybe_unused)
-{
-}
-
-static int nop_helpline__show(const char *fmt __maybe_unused,
-			       va_list ap __maybe_unused)
-{
-	return 0;
-}
-
-static struct ui_helpline default_helpline_fns = {
-	.pop	= nop_helpline__pop,
-	.push	= nop_helpline__push,
-	.show	= nop_helpline__show,
-};
-
-struct ui_helpline *helpline_fns = &default_helpline_fns;
-
-void ui_helpline__pop(void)
-{
-	helpline_fns->pop();
-}
-
-void ui_helpline__push(const char *msg)
-{
-	helpline_fns->push(msg);
-}
-
-void ui_helpline__vpush(const char *fmt, va_list ap)
-{
-	char *s;
-
-	if (vasprintf(&s, fmt, ap) < 0)
-		vfprintf(stderr, fmt, ap);
-	else {
-		ui_helpline__push(s);
-		free(s);
-	}
-}
-
-void ui_helpline__fpush(const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	ui_helpline__vpush(fmt, ap);
-	va_end(ap);
-}
-
-void ui_helpline__puts(const char *msg)
-{
-	ui_helpline__pop();
-	ui_helpline__push(msg);
-}
-
-int ui_helpline__vshow(const char *fmt, va_list ap)
-{
-	return helpline_fns->show(fmt, ap);
-}
diff --git a/src/tools/perf/ui/helpline.h b/src/tools/perf/ui/helpline.h
deleted file mode 100644
index 46181f4..0000000
--- a/src/tools/perf/ui/helpline.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef _PERF_UI_HELPLINE_H_
-#define _PERF_UI_HELPLINE_H_ 1
-
-#include <stdio.h>
-#include <stdarg.h>
-
-#include "../util/cache.h"
-
-struct ui_helpline {
-	void (*pop)(void);
-	void (*push)(const char *msg);
-	int  (*show)(const char *fmt, va_list ap);
-};
-
-extern struct ui_helpline *helpline_fns;
-
-void ui_helpline__init(void);
-
-void ui_helpline__pop(void);
-void ui_helpline__push(const char *msg);
-void ui_helpline__vpush(const char *fmt, va_list ap);
-void ui_helpline__fpush(const char *fmt, ...);
-void ui_helpline__puts(const char *msg);
-int  ui_helpline__vshow(const char *fmt, va_list ap);
-
-extern char ui_helpline__current[512];
-extern char ui_helpline__last_msg[];
-
-#endif /* _PERF_UI_HELPLINE_H_ */
diff --git a/src/tools/perf/ui/hist.c b/src/tools/perf/ui/hist.c
deleted file mode 100644
index 78f4c92..0000000
--- a/src/tools/perf/ui/hist.c
+++ /dev/null
@@ -1,285 +0,0 @@
-#include <math.h>
-#include <linux/compiler.h>
-
-#include "../util/hist.h"
-#include "../util/util.h"
-#include "../util/sort.h"
-#include "../util/evsel.h"
-
-/* hist period print (hpp) functions */
-
-typedef int (*hpp_snprint_fn)(char *buf, size_t size, const char *fmt, ...);
-
-static int __hpp__fmt(struct perf_hpp *hpp, struct hist_entry *he,
-		      u64 (*get_field)(struct hist_entry *),
-		      const char *fmt, hpp_snprint_fn print_fn,
-		      bool fmt_percent)
-{
-	int ret;
-	struct hists *hists = he->hists;
-	struct perf_evsel *evsel = hists_to_evsel(hists);
-
-	if (fmt_percent) {
-		double percent = 0.0;
-
-		if (hists->stats.total_period)
-			percent = 100.0 * get_field(he) /
-				  hists->stats.total_period;
-
-		ret = print_fn(hpp->buf, hpp->size, fmt, percent);
-	} else
-		ret = print_fn(hpp->buf, hpp->size, fmt, get_field(he));
-
-	if (perf_evsel__is_group_event(evsel)) {
-		int prev_idx, idx_delta;
-		struct hist_entry *pair;
-		int nr_members = evsel->nr_members;
-
-		prev_idx = perf_evsel__group_idx(evsel);
-
-		list_for_each_entry(pair, &he->pairs.head, pairs.node) {
-			u64 period = get_field(pair);
-			u64 total = pair->hists->stats.total_period;
-
-			if (!total)
-				continue;
-
-			evsel = hists_to_evsel(pair->hists);
-			idx_delta = perf_evsel__group_idx(evsel) - prev_idx - 1;
-
-			while (idx_delta--) {
-				/*
-				 * zero-fill group members in the middle which
-				 * have no sample
-				 */
-				ret += print_fn(hpp->buf + ret, hpp->size - ret,
-						fmt, 0);
-			}
-
-			if (fmt_percent)
-				ret += print_fn(hpp->buf + ret, hpp->size - ret,
-						fmt, 100.0 * period / total);
-			else
-				ret += print_fn(hpp->buf + ret, hpp->size - ret,
-						fmt, period);
-
-			prev_idx = perf_evsel__group_idx(evsel);
-		}
-
-		idx_delta = nr_members - prev_idx - 1;
-
-		while (idx_delta--) {
-			/*
-			 * zero-fill group members at last which have no sample
-			 */
-			ret += print_fn(hpp->buf + ret, hpp->size - ret,
-					fmt, 0);
-		}
-	}
-	return ret;
-}
-
-#define __HPP_HEADER_FN(_type, _str, _min_width, _unit_width) 		\
-static int hpp__header_##_type(struct perf_hpp_fmt *fmt __maybe_unused,	\
-			       struct perf_hpp *hpp)			\
-{									\
-	int len = _min_width;						\
-									\
-	if (symbol_conf.event_group) {					\
-		struct perf_evsel *evsel = hpp->ptr;			\
-									\
-		len = max(len, evsel->nr_members * _unit_width);	\
-	}								\
-	return scnprintf(hpp->buf, hpp->size, "%*s", len, _str);	\
-}
-
-#define __HPP_WIDTH_FN(_type, _min_width, _unit_width) 			\
-static int hpp__width_##_type(struct perf_hpp_fmt *fmt __maybe_unused,	\
-			      struct perf_hpp *hpp __maybe_unused)	\
-{									\
-	int len = _min_width;						\
-									\
-	if (symbol_conf.event_group) {					\
-		struct perf_evsel *evsel = hpp->ptr;			\
-									\
-		len = max(len, evsel->nr_members * _unit_width);	\
-	}								\
-	return len;							\
-}
-
-#define __HPP_COLOR_PERCENT_FN(_type, _field)					\
-static u64 he_get_##_field(struct hist_entry *he)				\
-{										\
-	return he->stat._field;							\
-}										\
-										\
-static int hpp__color_##_type(struct perf_hpp_fmt *fmt __maybe_unused,		\
-			      struct perf_hpp *hpp, struct hist_entry *he) 	\
-{										\
-	return __hpp__fmt(hpp, he, he_get_##_field, " %6.2f%%",			\
-			  percent_color_snprintf, true);			\
-}
-
-#define __HPP_ENTRY_PERCENT_FN(_type, _field)					\
-static int hpp__entry_##_type(struct perf_hpp_fmt *_fmt __maybe_unused,		\
-			      struct perf_hpp *hpp, struct hist_entry *he) 	\
-{										\
-	const char *fmt = symbol_conf.field_sep ? " %.2f" : " %6.2f%%";		\
-	return __hpp__fmt(hpp, he, he_get_##_field, fmt,			\
-			  scnprintf, true);					\
-}
-
-#define __HPP_ENTRY_RAW_FN(_type, _field)					\
-static u64 he_get_raw_##_field(struct hist_entry *he)				\
-{										\
-	return he->stat._field;							\
-}										\
-										\
-static int hpp__entry_##_type(struct perf_hpp_fmt *_fmt __maybe_unused,		\
-			      struct perf_hpp *hpp, struct hist_entry *he) 	\
-{										\
-	const char *fmt = symbol_conf.field_sep ? " %"PRIu64 : " %11"PRIu64;	\
-	return __hpp__fmt(hpp, he, he_get_raw_##_field, fmt, scnprintf, false);	\
-}
-
-#define HPP_PERCENT_FNS(_type, _str, _field, _min_width, _unit_width)	\
-__HPP_HEADER_FN(_type, _str, _min_width, _unit_width)			\
-__HPP_WIDTH_FN(_type, _min_width, _unit_width)				\
-__HPP_COLOR_PERCENT_FN(_type, _field)					\
-__HPP_ENTRY_PERCENT_FN(_type, _field)
-
-#define HPP_RAW_FNS(_type, _str, _field, _min_width, _unit_width)	\
-__HPP_HEADER_FN(_type, _str, _min_width, _unit_width)			\
-__HPP_WIDTH_FN(_type, _min_width, _unit_width)				\
-__HPP_ENTRY_RAW_FN(_type, _field)
-
-
-HPP_PERCENT_FNS(overhead, "Overhead", period, 8, 8)
-HPP_PERCENT_FNS(overhead_sys, "sys", period_sys, 8, 8)
-HPP_PERCENT_FNS(overhead_us, "usr", period_us, 8, 8)
-HPP_PERCENT_FNS(overhead_guest_sys, "guest sys", period_guest_sys, 9, 8)
-HPP_PERCENT_FNS(overhead_guest_us, "guest usr", period_guest_us, 9, 8)
-
-HPP_RAW_FNS(samples, "Samples", nr_events, 12, 12)
-HPP_RAW_FNS(period, "Period", period, 12, 12)
-
-#define HPP__COLOR_PRINT_FNS(_name)			\
-	{						\
-		.header	= hpp__header_ ## _name,	\
-		.width	= hpp__width_ ## _name,		\
-		.color	= hpp__color_ ## _name,		\
-		.entry	= hpp__entry_ ## _name		\
-	}
-
-#define HPP__PRINT_FNS(_name)				\
-	{						\
-		.header	= hpp__header_ ## _name,	\
-		.width	= hpp__width_ ## _name,		\
-		.entry	= hpp__entry_ ## _name		\
-	}
-
-struct perf_hpp_fmt perf_hpp__format[] = {
-	HPP__COLOR_PRINT_FNS(overhead),
-	HPP__COLOR_PRINT_FNS(overhead_sys),
-	HPP__COLOR_PRINT_FNS(overhead_us),
-	HPP__COLOR_PRINT_FNS(overhead_guest_sys),
-	HPP__COLOR_PRINT_FNS(overhead_guest_us),
-	HPP__PRINT_FNS(samples),
-	HPP__PRINT_FNS(period)
-};
-
-LIST_HEAD(perf_hpp__list);
-
-
-#undef HPP__COLOR_PRINT_FNS
-#undef HPP__PRINT_FNS
-
-#undef HPP_PERCENT_FNS
-#undef HPP_RAW_FNS
-
-#undef __HPP_HEADER_FN
-#undef __HPP_WIDTH_FN
-#undef __HPP_COLOR_PERCENT_FN
-#undef __HPP_ENTRY_PERCENT_FN
-#undef __HPP_ENTRY_RAW_FN
-
-
-void perf_hpp__init(void)
-{
-	perf_hpp__column_enable(PERF_HPP__OVERHEAD);
-
-	if (symbol_conf.show_cpu_utilization) {
-		perf_hpp__column_enable(PERF_HPP__OVERHEAD_SYS);
-		perf_hpp__column_enable(PERF_HPP__OVERHEAD_US);
-
-		if (perf_guest) {
-			perf_hpp__column_enable(PERF_HPP__OVERHEAD_GUEST_SYS);
-			perf_hpp__column_enable(PERF_HPP__OVERHEAD_GUEST_US);
-		}
-	}
-
-	if (symbol_conf.show_nr_samples)
-		perf_hpp__column_enable(PERF_HPP__SAMPLES);
-
-	if (symbol_conf.show_total_period)
-		perf_hpp__column_enable(PERF_HPP__PERIOD);
-}
-
-void perf_hpp__column_register(struct perf_hpp_fmt *format)
-{
-	list_add_tail(&format->list, &perf_hpp__list);
-}
-
-void perf_hpp__column_enable(unsigned col)
-{
-	BUG_ON(col >= PERF_HPP__MAX_INDEX);
-	perf_hpp__column_register(&perf_hpp__format[col]);
-}
-
-int hist_entry__sort_snprintf(struct hist_entry *he, char *s, size_t size,
-			      struct hists *hists)
-{
-	const char *sep = symbol_conf.field_sep;
-	struct sort_entry *se;
-	int ret = 0;
-
-	list_for_each_entry(se, &hist_entry__sort_list, list) {
-		if (se->elide)
-			continue;
-
-		ret += scnprintf(s + ret, size - ret, "%s", sep ?: "  ");
-		ret += se->se_snprintf(he, s + ret, size - ret,
-				       hists__col_len(hists, se->se_width_idx));
-	}
-
-	return ret;
-}
-
-/*
- * See hists__fprintf to match the column widths
- */
-unsigned int hists__sort_list_width(struct hists *hists)
-{
-	struct perf_hpp_fmt *fmt;
-	struct sort_entry *se;
-	int i = 0, ret = 0;
-	struct perf_hpp dummy_hpp = {
-		.ptr	= hists_to_evsel(hists),
-	};
-
-	perf_hpp__for_each_format(fmt) {
-		if (i)
-			ret += 2;
-
-		ret += fmt->width(fmt, &dummy_hpp);
-	}
-
-	list_for_each_entry(se, &hist_entry__sort_list, list)
-		if (!se->elide)
-			ret += 2 + hists__col_len(hists, se->se_width_idx);
-
-	if (verbose) /* Addr + origin */
-		ret += 3 + BITS_PER_LONG / 4;
-
-	return ret;
-}
diff --git a/src/tools/perf/ui/keysyms.h b/src/tools/perf/ui/keysyms.h
deleted file mode 100644
index 65092d5..0000000
--- a/src/tools/perf/ui/keysyms.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef _PERF_KEYSYMS_H_
-#define _PERF_KEYSYMS_H_ 1
-
-#include "libslang.h"
-
-#define K_DOWN	SL_KEY_DOWN
-#define K_END	SL_KEY_END
-#define K_ENTER	'\r'
-#define K_ESC	033
-#define K_F1	SL_KEY_F(1)
-#define K_HOME	SL_KEY_HOME
-#define K_LEFT	SL_KEY_LEFT
-#define K_PGDN	SL_KEY_NPAGE
-#define K_PGUP	SL_KEY_PPAGE
-#define K_RIGHT	SL_KEY_RIGHT
-#define K_TAB	'\t'
-#define K_UNTAB	SL_KEY_UNTAB
-#define K_UP	SL_KEY_UP
-#define K_BKSPC 0x7f
-#define K_DEL	SL_KEY_DELETE
-
-/* Not really keys */
-#define K_TIMER	 -1
-#define K_ERROR	 -2
-#define K_RESIZE -3
-#define K_SWITCH_INPUT_DATA -4
-
-#endif /* _PERF_KEYSYMS_H_ */
diff --git a/src/tools/perf/ui/libslang.h b/src/tools/perf/ui/libslang.h
deleted file mode 100644
index 4d54b64..0000000
--- a/src/tools/perf/ui/libslang.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef _PERF_UI_SLANG_H_
-#define _PERF_UI_SLANG_H_ 1
-/*
- * slang versions <= 2.0.6 have a "#if HAVE_LONG_LONG" that breaks
- * the build if it isn't defined. Use the equivalent one that glibc
- * has on features.h.
- */
-#include <features.h>
-#ifndef HAVE_LONG_LONG
-#define HAVE_LONG_LONG __GLIBC_HAVE_LONG_LONG
-#endif
-#include <slang.h>
-
-#if SLANG_VERSION < 20104
-#define slsmg_printf(msg, args...) \
-	SLsmg_printf((char *)(msg), ##args)
-#define slsmg_write_nstring(msg, len) \
-	SLsmg_write_nstring((char *)(msg), len)
-#define sltt_set_color(obj, name, fg, bg) \
-	SLtt_set_color(obj,(char *)(name), (char *)(fg), (char *)(bg))
-#else
-#define slsmg_printf SLsmg_printf
-#define slsmg_write_nstring SLsmg_write_nstring
-#define sltt_set_color SLtt_set_color
-#endif
-
-#define SL_KEY_UNTAB 0x1000
-
-#endif /* _PERF_UI_SLANG_H_ */
diff --git a/src/tools/perf/ui/progress.c b/src/tools/perf/ui/progress.c
deleted file mode 100644
index 3ec6956..0000000
--- a/src/tools/perf/ui/progress.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include "../cache.h"
-#include "progress.h"
-
-static void nop_progress_update(u64 curr __maybe_unused,
-				u64 total __maybe_unused,
-				const char *title __maybe_unused)
-{
-}
-
-static struct ui_progress default_progress_fns =
-{
-	.update		= nop_progress_update,
-};
-
-struct ui_progress *progress_fns = &default_progress_fns;
-
-void ui_progress__update(u64 curr, u64 total, const char *title)
-{
-	return progress_fns->update(curr, total, title);
-}
-
-void ui_progress__finish(void)
-{
-	if (progress_fns->finish)
-		progress_fns->finish();
-}
diff --git a/src/tools/perf/ui/progress.h b/src/tools/perf/ui/progress.h
deleted file mode 100644
index 257cc22..0000000
--- a/src/tools/perf/ui/progress.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef _PERF_UI_PROGRESS_H_
-#define _PERF_UI_PROGRESS_H_ 1
-
-#include <../types.h>
-
-struct ui_progress {
-	void (*update)(u64, u64, const char *);
-	void (*finish)(void);
-};
-
-extern struct ui_progress *progress_fns;
-
-void ui_progress__init(void);
-
-void ui_progress__update(u64 curr, u64 total, const char *title);
-void ui_progress__finish(void);
-
-#endif
diff --git a/src/tools/perf/ui/setup.c b/src/tools/perf/ui/setup.c
deleted file mode 100644
index 47d9a57..0000000
--- a/src/tools/perf/ui/setup.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <pthread.h>
-
-#include "../util/cache.h"
-#include "../util/debug.h"
-#include "../util/hist.h"
-
-pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER;
-
-void setup_browser(bool fallback_to_pager)
-{
-	if (use_browser < 2 && (!isatty(1) || dump_trace))
-		use_browser = 0;
-
-	/* default to TUI */
-	if (use_browser < 0)
-		use_browser = 1;
-
-	switch (use_browser) {
-	case 2:
-		if (perf_gtk__init() == 0)
-			break;
-		/* fall through */
-	case 1:
-		use_browser = 1;
-		if (ui__init() == 0)
-			break;
-		/* fall through */
-	default:
-		use_browser = 0;
-		if (fallback_to_pager)
-			setup_pager();
-
-		perf_hpp__init();
-		break;
-	}
-}
-
-void exit_browser(bool wait_for_ok)
-{
-	switch (use_browser) {
-	case 2:
-		perf_gtk__exit(wait_for_ok);
-		break;
-
-	case 1:
-		ui__exit(wait_for_ok);
-		break;
-
-	default:
-		break;
-	}
-}
diff --git a/src/tools/perf/ui/stdio/hist.c b/src/tools/perf/ui/stdio/hist.c
deleted file mode 100644
index 6c15268..0000000
--- a/src/tools/perf/ui/stdio/hist.c
+++ /dev/null
@@ -1,540 +0,0 @@
-#include <stdio.h>
-
-#include "../../util/util.h"
-#include "../../util/hist.h"
-#include "../../util/sort.h"
-#include "../../util/evsel.h"
-
-
-static size_t callchain__fprintf_left_margin(FILE *fp, int left_margin)
-{
-	int i;
-	int ret = fprintf(fp, "            ");
-
-	for (i = 0; i < left_margin; i++)
-		ret += fprintf(fp, " ");
-
-	return ret;
-}
-
-static size_t ipchain__fprintf_graph_line(FILE *fp, int depth, int depth_mask,
-					  int left_margin)
-{
-	int i;
-	size_t ret = callchain__fprintf_left_margin(fp, left_margin);
-
-	for (i = 0; i < depth; i++)
-		if (depth_mask & (1 << i))
-			ret += fprintf(fp, "|          ");
-		else
-			ret += fprintf(fp, "           ");
-
-	ret += fprintf(fp, "\n");
-
-	return ret;
-}
-
-static size_t ipchain__fprintf_graph(FILE *fp, struct callchain_list *chain,
-				     int depth, int depth_mask, int period,
-				     u64 total_samples, u64 hits,
-				     int left_margin)
-{
-	int i;
-	size_t ret = 0;
-
-	ret += callchain__fprintf_left_margin(fp, left_margin);
-	for (i = 0; i < depth; i++) {
-		if (depth_mask & (1 << i))
-			ret += fprintf(fp, "|");
-		else
-			ret += fprintf(fp, " ");
-		if (!period && i == depth - 1) {
-			double percent;
-
-			percent = hits * 100.0 / total_samples;
-			ret += percent_color_fprintf(fp, "--%2.2f%%-- ", percent);
-		} else
-			ret += fprintf(fp, "%s", "          ");
-	}
-	if (chain->ms.sym)
-		ret += fprintf(fp, "%s\n", chain->ms.sym->name);
-	else
-		ret += fprintf(fp, "0x%0" PRIx64 "\n", chain->ip);
-
-	return ret;
-}
-
-static struct symbol *rem_sq_bracket;
-static struct callchain_list rem_hits;
-
-static void init_rem_hits(void)
-{
-	rem_sq_bracket = malloc(sizeof(*rem_sq_bracket) + 6);
-	if (!rem_sq_bracket) {
-		fprintf(stderr, "Not enough memory to display remaining hits\n");
-		return;
-	}
-
-	strcpy(rem_sq_bracket->name, "[...]");
-	rem_hits.ms.sym = rem_sq_bracket;
-}
-
-static size_t __callchain__fprintf_graph(FILE *fp, struct rb_root *root,
-					 u64 total_samples, int depth,
-					 int depth_mask, int left_margin)
-{
-	struct rb_node *node, *next;
-	struct callchain_node *child;
-	struct callchain_list *chain;
-	int new_depth_mask = depth_mask;
-	u64 remaining;
-	size_t ret = 0;
-	int i;
-	uint entries_printed = 0;
-
-	remaining = total_samples;
-
-	node = rb_first(root);
-	while (node) {
-		u64 new_total;
-		u64 cumul;
-
-		child = rb_entry(node, struct callchain_node, rb_node);
-		cumul = callchain_cumul_hits(child);
-		remaining -= cumul;
-
-		/*
-		 * The depth mask manages the output of pipes that show
-		 * the depth. We don't want to keep the pipes of the current
-		 * level for the last child of this depth.
-		 * Except if we have remaining filtered hits. They will
-		 * supersede the last child
-		 */
-		next = rb_next(node);
-		if (!next && (callchain_param.mode != CHAIN_GRAPH_REL || !remaining))
-			new_depth_mask &= ~(1 << (depth - 1));
-
-		/*
-		 * But we keep the older depth mask for the line separator
-		 * to keep the level link until we reach the last child
-		 */
-		ret += ipchain__fprintf_graph_line(fp, depth, depth_mask,
-						   left_margin);
-		i = 0;
-		list_for_each_entry(chain, &child->val, list) {
-			ret += ipchain__fprintf_graph(fp, chain, depth,
-						      new_depth_mask, i++,
-						      total_samples,
-						      cumul,
-						      left_margin);
-		}
-
-		if (callchain_param.mode == CHAIN_GRAPH_REL)
-			new_total = child->children_hit;
-		else
-			new_total = total_samples;
-
-		ret += __callchain__fprintf_graph(fp, &child->rb_root, new_total,
-						  depth + 1,
-						  new_depth_mask | (1 << depth),
-						  left_margin);
-		node = next;
-		if (++entries_printed == callchain_param.print_limit)
-			break;
-	}
-
-	if (callchain_param.mode == CHAIN_GRAPH_REL &&
-		remaining && remaining != total_samples) {
-
-		if (!rem_sq_bracket)
-			return ret;
-
-		new_depth_mask &= ~(1 << (depth - 1));
-		ret += ipchain__fprintf_graph(fp, &rem_hits, depth,
-					      new_depth_mask, 0, total_samples,
-					      remaining, left_margin);
-	}
-
-	return ret;
-}
-
-static size_t callchain__fprintf_graph(FILE *fp, struct rb_root *root,
-				       u64 total_samples, int left_margin)
-{
-	struct callchain_node *cnode;
-	struct callchain_list *chain;
-	u32 entries_printed = 0;
-	bool printed = false;
-	struct rb_node *node;
-	int i = 0;
-	int ret = 0;
-
-	/*
-	 * If have one single callchain root, don't bother printing
-	 * its percentage (100 % in fractal mode and the same percentage
-	 * than the hist in graph mode). This also avoid one level of column.
-	 */
-	node = rb_first(root);
-	if (node && !rb_next(node)) {
-		cnode = rb_entry(node, struct callchain_node, rb_node);
-		list_for_each_entry(chain, &cnode->val, list) {
-			/*
-			 * If we sort by symbol, the first entry is the same than
-			 * the symbol. No need to print it otherwise it appears as
-			 * displayed twice.
-			 */
-			if (!i++ && sort__first_dimension == SORT_SYM)
-				continue;
-			if (!printed) {
-				ret += callchain__fprintf_left_margin(fp, left_margin);
-				ret += fprintf(fp, "|\n");
-				ret += callchain__fprintf_left_margin(fp, left_margin);
-				ret += fprintf(fp, "---");
-				left_margin += 3;
-				printed = true;
-			} else
-				ret += callchain__fprintf_left_margin(fp, left_margin);
-
-			if (chain->ms.sym)
-				ret += fprintf(fp, " %s\n", chain->ms.sym->name);
-			else
-				ret += fprintf(fp, " %p\n", (void *)(long)chain->ip);
-
-			if (++entries_printed == callchain_param.print_limit)
-				break;
-		}
-		root = &cnode->rb_root;
-	}
-
-	ret += __callchain__fprintf_graph(fp, root, total_samples,
-					  1, 1, left_margin);
-	ret += fprintf(fp, "\n");
-
-	return ret;
-}
-
-static size_t __callchain__fprintf_flat(FILE *fp,
-					struct callchain_node *self,
-					u64 total_samples)
-{
-	struct callchain_list *chain;
-	size_t ret = 0;
-
-	if (!self)
-		return 0;
-
-	ret += __callchain__fprintf_flat(fp, self->parent, total_samples);
-
-
-	list_for_each_entry(chain, &self->val, list) {
-		if (chain->ip >= PERF_CONTEXT_MAX)
-			continue;
-		if (chain->ms.sym)
-			ret += fprintf(fp, "                %s\n", chain->ms.sym->name);
-		else
-			ret += fprintf(fp, "                %p\n",
-					(void *)(long)chain->ip);
-	}
-
-	return ret;
-}
-
-static size_t callchain__fprintf_flat(FILE *fp, struct rb_root *self,
-				      u64 total_samples)
-{
-	size_t ret = 0;
-	u32 entries_printed = 0;
-	struct rb_node *rb_node;
-	struct callchain_node *chain;
-
-	rb_node = rb_first(self);
-	while (rb_node) {
-		double percent;
-
-		chain = rb_entry(rb_node, struct callchain_node, rb_node);
-		percent = chain->hit * 100.0 / total_samples;
-
-		ret = percent_color_fprintf(fp, "           %6.2f%%\n", percent);
-		ret += __callchain__fprintf_flat(fp, chain, total_samples);
-		ret += fprintf(fp, "\n");
-		if (++entries_printed == callchain_param.print_limit)
-			break;
-
-		rb_node = rb_next(rb_node);
-	}
-
-	return ret;
-}
-
-static size_t hist_entry_callchain__fprintf(struct hist_entry *he,
-					    u64 total_samples, int left_margin,
-					    FILE *fp)
-{
-	switch (callchain_param.mode) {
-	case CHAIN_GRAPH_REL:
-		return callchain__fprintf_graph(fp, &he->sorted_chain, he->stat.period,
-						left_margin);
-		break;
-	case CHAIN_GRAPH_ABS:
-		return callchain__fprintf_graph(fp, &he->sorted_chain, total_samples,
-						left_margin);
-		break;
-	case CHAIN_FLAT:
-		return callchain__fprintf_flat(fp, &he->sorted_chain, total_samples);
-		break;
-	case CHAIN_NONE:
-		break;
-	default:
-		pr_err("Bad callchain mode\n");
-	}
-
-	return 0;
-}
-
-static size_t hist_entry__callchain_fprintf(struct hist_entry *he,
-					    struct hists *hists,
-					    FILE *fp)
-{
-	int left_margin = 0;
-	u64 total_period = hists->stats.total_period;
-
-	if (sort__first_dimension == SORT_COMM) {
-		struct sort_entry *se = list_first_entry(&hist_entry__sort_list,
-							 typeof(*se), list);
-		left_margin = hists__col_len(hists, se->se_width_idx);
-		left_margin -= thread__comm_len(he->thread);
-	}
-
-	return hist_entry_callchain__fprintf(he, total_period, left_margin, fp);
-}
-
-static inline void advance_hpp(struct perf_hpp *hpp, int inc)
-{
-	hpp->buf  += inc;
-	hpp->size -= inc;
-}
-
-static int hist_entry__period_snprintf(struct perf_hpp *hpp,
-				       struct hist_entry *he)
-{
-	const char *sep = symbol_conf.field_sep;
-	struct perf_hpp_fmt *fmt;
-	char *start = hpp->buf;
-	int ret;
-	bool first = true;
-
-	if (symbol_conf.exclude_other && !he->parent)
-		return 0;
-
-	perf_hpp__for_each_format(fmt) {
-		/*
-		 * If there's no field_sep, we still need
-		 * to display initial '  '.
-		 */
-		if (!sep || !first) {
-			ret = scnprintf(hpp->buf, hpp->size, "%s", sep ?: "  ");
-			advance_hpp(hpp, ret);
-		} else
-			first = false;
-
-		if (perf_hpp__use_color() && fmt->color)
-			ret = fmt->color(fmt, hpp, he);
-		else
-			ret = fmt->entry(fmt, hpp, he);
-
-		advance_hpp(hpp, ret);
-	}
-
-	return hpp->buf - start;
-}
-
-static int hist_entry__fprintf(struct hist_entry *he, size_t size,
-			       struct hists *hists,
-			       char *bf, size_t bfsz, FILE *fp)
-{
-	int ret;
-	struct perf_hpp hpp = {
-		.buf		= bf,
-		.size		= size,
-	};
-
-	if (size == 0 || size > bfsz)
-		size = hpp.size = bfsz;
-
-	ret = hist_entry__period_snprintf(&hpp, he);
-	hist_entry__sort_snprintf(he, bf + ret, size - ret, hists);
-
-	ret = fprintf(fp, "%s\n", bf);
-
-	if (symbol_conf.use_callchain)
-		ret += hist_entry__callchain_fprintf(he, hists, fp);
-
-	return ret;
-}
-
-size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows,
-		      int max_cols, float min_pcnt, FILE *fp)
-{
-	struct perf_hpp_fmt *fmt;
-	struct sort_entry *se;
-	struct rb_node *nd;
-	size_t ret = 0;
-	unsigned int width;
-	const char *sep = symbol_conf.field_sep;
-	const char *col_width = symbol_conf.col_width_list_str;
-	int nr_rows = 0;
-	char bf[96];
-	struct perf_hpp dummy_hpp = {
-		.buf	= bf,
-		.size	= sizeof(bf),
-		.ptr	= hists_to_evsel(hists),
-	};
-	bool first = true;
-	size_t linesz;
-	char *line = NULL;
-
-	init_rem_hits();
-
-	if (!show_header)
-		goto print_entries;
-
-	fprintf(fp, "# ");
-
-	perf_hpp__for_each_format(fmt) {
-		if (!first)
-			fprintf(fp, "%s", sep ?: "  ");
-		else
-			first = false;
-
-		fmt->header(fmt, &dummy_hpp);
-		fprintf(fp, "%s", bf);
-	}
-
-	list_for_each_entry(se, &hist_entry__sort_list, list) {
-		if (se->elide)
-			continue;
-		if (sep) {
-			fprintf(fp, "%c%s", *sep, se->se_header);
-			continue;
-		}
-		width = strlen(se->se_header);
-		if (symbol_conf.col_width_list_str) {
-			if (col_width) {
-				hists__set_col_len(hists, se->se_width_idx,
-						   atoi(col_width));
-				col_width = strchr(col_width, ',');
-				if (col_width)
-					++col_width;
-			}
-		}
-		if (!hists__new_col_len(hists, se->se_width_idx, width))
-			width = hists__col_len(hists, se->se_width_idx);
-		fprintf(fp, "  %*s", width, se->se_header);
-	}
-
-	fprintf(fp, "\n");
-	if (max_rows && ++nr_rows >= max_rows)
-		goto out;
-
-	if (sep)
-		goto print_entries;
-
-	first = true;
-
-	fprintf(fp, "# ");
-
-	perf_hpp__for_each_format(fmt) {
-		unsigned int i;
-
-		if (!first)
-			fprintf(fp, "%s", sep ?: "  ");
-		else
-			first = false;
-
-		width = fmt->width(fmt, &dummy_hpp);
-		for (i = 0; i < width; i++)
-			fprintf(fp, ".");
-	}
-
-	list_for_each_entry(se, &hist_entry__sort_list, list) {
-		unsigned int i;
-
-		if (se->elide)
-			continue;
-
-		fprintf(fp, "  ");
-		width = hists__col_len(hists, se->se_width_idx);
-		if (width == 0)
-			width = strlen(se->se_header);
-		for (i = 0; i < width; i++)
-			fprintf(fp, ".");
-	}
-
-	fprintf(fp, "\n");
-	if (max_rows && ++nr_rows >= max_rows)
-		goto out;
-
-	fprintf(fp, "#\n");
-	if (max_rows && ++nr_rows >= max_rows)
-		goto out;
-
-print_entries:
-	linesz = hists__sort_list_width(hists) + 3 + 1;
-	linesz += perf_hpp__color_overhead();
-	line = malloc(linesz);
-	if (line == NULL) {
-		ret = -1;
-		goto out;
-	}
-
-	for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) {
-		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
-		float percent = h->stat.period * 100.0 /
-					hists->stats.total_period;
-
-		if (h->filtered)
-			continue;
-
-		if (percent < min_pcnt)
-			continue;
-
-		ret += hist_entry__fprintf(h, max_cols, hists, line, linesz, fp);
-
-		if (max_rows && ++nr_rows >= max_rows)
-			break;
-
-		if (h->ms.map == NULL && verbose > 1) {
-			__map_groups__fprintf_maps(&h->thread->mg,
-						   MAP__FUNCTION, verbose, fp);
-			fprintf(fp, "%.10s end\n", graph_dotted_line);
-		}
-	}
-
-	free(line);
-out:
-	free(rem_sq_bracket);
-
-	return ret;
-}
-
-size_t events_stats__fprintf(struct events_stats *stats, FILE *fp)
-{
-	int i;
-	size_t ret = 0;
-
-	for (i = 0; i < PERF_RECORD_HEADER_MAX; ++i) {
-		const char *name;
-
-		if (stats->nr_events[i] == 0)
-			continue;
-
-		name = perf_event__name(i);
-		if (!strcmp(name, "UNKNOWN"))
-			continue;
-
-		ret += fprintf(fp, "%16s events: %10d\n", name,
-			       stats->nr_events[i]);
-	}
-
-	return ret;
-}
diff --git a/src/tools/perf/ui/tui/helpline.c b/src/tools/perf/ui/tui/helpline.c
deleted file mode 100644
index 1c8b9af..0000000
--- a/src/tools/perf/ui/tui/helpline.c
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <pthread.h>
-
-#include "../../util/debug.h"
-#include "../helpline.h"
-#include "../ui.h"
-#include "../libslang.h"
-
-char ui_helpline__last_msg[1024];
-
-static void tui_helpline__pop(void)
-{
-}
-
-static void tui_helpline__push(const char *msg)
-{
-	const size_t sz = sizeof(ui_helpline__current);
-
-	SLsmg_gotorc(SLtt_Screen_Rows - 1, 0);
-	SLsmg_set_color(0);
-	SLsmg_write_nstring((char *)msg, SLtt_Screen_Cols);
-	SLsmg_refresh();
-	strncpy(ui_helpline__current, msg, sz)[sz - 1] = '\0';
-}
-
-static int tui_helpline__show(const char *format, va_list ap)
-{
-	int ret;
-	static int backlog;
-
-	pthread_mutex_lock(&ui__lock);
-	ret = vscnprintf(ui_helpline__last_msg + backlog,
-			sizeof(ui_helpline__last_msg) - backlog, format, ap);
-	backlog += ret;
-
-	if (ui_helpline__last_msg[backlog - 1] == '\n') {
-		ui_helpline__puts(ui_helpline__last_msg);
-		SLsmg_refresh();
-		backlog = 0;
-	}
-	pthread_mutex_unlock(&ui__lock);
-
-	return ret;
-}
-
-struct ui_helpline tui_helpline_fns = {
-	.pop	= tui_helpline__pop,
-	.push	= tui_helpline__push,
-	.show	= tui_helpline__show,
-};
-
-void ui_helpline__init(void)
-{
-	helpline_fns = &tui_helpline_fns;
-	ui_helpline__puts(" ");
-}
diff --git a/src/tools/perf/ui/tui/progress.c b/src/tools/perf/ui/tui/progress.c
deleted file mode 100644
index 6c2184d..0000000
--- a/src/tools/perf/ui/tui/progress.c
+++ /dev/null
@@ -1,42 +0,0 @@
-#include "../cache.h"
-#include "../progress.h"
-#include "../libslang.h"
-#include "../ui.h"
-#include "../browser.h"
-
-static void tui_progress__update(u64 curr, u64 total, const char *title)
-{
-	int bar, y;
-	/*
-	 * FIXME: We should have a per UI backend way of showing progress,
-	 * stdio will just show a percentage as NN%, etc.
-	 */
-	if (use_browser <= 0)
-		return;
-
-	if (total == 0)
-		return;
-
-	ui__refresh_dimensions(true);
-	pthread_mutex_lock(&ui__lock);
-	y = SLtt_Screen_Rows / 2 - 2;
-	SLsmg_set_color(0);
-	SLsmg_draw_box(y, 0, 3, SLtt_Screen_Cols);
-	SLsmg_gotorc(y++, 1);
-	SLsmg_write_string((char *)title);
-	SLsmg_set_color(HE_COLORSET_SELECTED);
-	bar = ((SLtt_Screen_Cols - 2) * curr) / total;
-	SLsmg_fill_region(y, 1, 1, bar, ' ');
-	SLsmg_refresh();
-	pthread_mutex_unlock(&ui__lock);
-}
-
-static struct ui_progress tui_progress_fns =
-{
-	.update		= tui_progress__update,
-};
-
-void ui_progress__init(void)
-{
-	progress_fns = &tui_progress_fns;
-}
diff --git a/src/tools/perf/ui/tui/setup.c b/src/tools/perf/ui/tui/setup.c
deleted file mode 100644
index b940148..0000000
--- a/src/tools/perf/ui/tui/setup.c
+++ /dev/null
@@ -1,150 +0,0 @@
-#include <signal.h>
-#include <stdbool.h>
-
-#include "../../util/cache.h"
-#include "../../util/debug.h"
-#include "../browser.h"
-#include "../helpline.h"
-#include "../ui.h"
-#include "../util.h"
-#include "../libslang.h"
-#include "../keysyms.h"
-
-static volatile int ui__need_resize;
-
-extern struct perf_error_ops perf_tui_eops;
-
-extern void hist_browser__init_hpp(void);
-
-void ui__refresh_dimensions(bool force)
-{
-	if (force || ui__need_resize) {
-		ui__need_resize = 0;
-		pthread_mutex_lock(&ui__lock);
-		SLtt_get_screen_size();
-		SLsmg_reinit_smg();
-		pthread_mutex_unlock(&ui__lock);
-	}
-}
-
-static void ui__sigwinch(int sig __maybe_unused)
-{
-	ui__need_resize = 1;
-}
-
-static void ui__setup_sigwinch(void)
-{
-	static bool done;
-
-	if (done)
-		return;
-
-	done = true;
-	pthread__unblock_sigwinch();
-	signal(SIGWINCH, ui__sigwinch);
-}
-
-int ui__getch(int delay_secs)
-{
-	struct timeval timeout, *ptimeout = delay_secs ? &timeout : NULL;
-	fd_set read_set;
-	int err, key;
-
-	ui__setup_sigwinch();
-
-	FD_ZERO(&read_set);
-	FD_SET(0, &read_set);
-
-	if (delay_secs) {
-		timeout.tv_sec = delay_secs;
-		timeout.tv_usec = 0;
-	}
-
-        err = select(1, &read_set, NULL, NULL, ptimeout);
-
-	if (err == 0)
-		return K_TIMER;
-
-	if (err == -1) {
-		if (errno == EINTR)
-			return K_RESIZE;
-		return K_ERROR;
-	}
-
-	key = SLang_getkey();
-	if (key != K_ESC)
-		return key;
-
-	FD_ZERO(&read_set);
-	FD_SET(0, &read_set);
-	timeout.tv_sec = 0;
-	timeout.tv_usec = 20;
-        err = select(1, &read_set, NULL, NULL, &timeout);
-	if (err == 0)
-		return K_ESC;
-
-	SLang_ungetkey(key);
-	return SLkp_getkey();
-}
-
-static void ui__signal(int sig)
-{
-	ui__exit(false);
-	psignal(sig, "perf");
-	exit(0);
-}
-
-int ui__init(void)
-{
-	int err;
-
-	SLutf8_enable(-1);
-	SLtt_get_terminfo();
-	SLtt_get_screen_size();
-
-	err = SLsmg_init_smg();
-	if (err < 0)
-		goto out;
-	err = SLang_init_tty(0, 0, 0);
-	if (err < 0)
-		goto out;
-
-	err = SLkp_init();
-	if (err < 0) {
-		pr_err("TUI initialization failed.\n");
-		goto out;
-	}
-
-	SLkp_define_keysym((char *)"^(kB)", SL_KEY_UNTAB);
-
-	ui_helpline__init();
-	ui_browser__init();
-	ui_progress__init();
-
-	signal(SIGSEGV, ui__signal);
-	signal(SIGFPE, ui__signal);
-	signal(SIGINT, ui__signal);
-	signal(SIGQUIT, ui__signal);
-	signal(SIGTERM, ui__signal);
-
-	perf_error__register(&perf_tui_eops);
-
-	hist_browser__init_hpp();
-out:
-	return err;
-}
-
-void ui__exit(bool wait_for_ok)
-{
-	if (wait_for_ok)
-		ui__question_window("Fatal Error",
-				    ui_helpline__last_msg,
-				    "Press any key...", 0);
-
-	SLtt_set_cursor_visibility(1);
-	SLsmg_refresh();
-	SLsmg_reset_smg();
-	SLang_reset_tty();
-
-	perf_error__unregister(&perf_tui_eops);
-}
diff --git a/src/tools/perf/ui/tui/util.c b/src/tools/perf/ui/tui/util.c
deleted file mode 100644
index 092902e..0000000
--- a/src/tools/perf/ui/tui/util.c
+++ /dev/null
@@ -1,243 +0,0 @@
-#include "../../util/util.h"
-#include <signal.h>
-#include <stdbool.h>
-#include <string.h>
-#include <sys/ttydefaults.h>
-
-#include "../../util/cache.h"
-#include "../../util/debug.h"
-#include "../browser.h"
-#include "../keysyms.h"
-#include "../helpline.h"
-#include "../ui.h"
-#include "../util.h"
-#include "../libslang.h"
-
-static void ui_browser__argv_write(struct ui_browser *browser,
-				   void *entry, int row)
-{
-	char **arg = entry;
-	bool current_entry = ui_browser__is_current_entry(browser, row);
-
-	ui_browser__set_color(browser, current_entry ? HE_COLORSET_SELECTED :
-						       HE_COLORSET_NORMAL);
-	slsmg_write_nstring(*arg, browser->width);
-}
-
-static int popup_menu__run(struct ui_browser *menu)
-{
-	int key;
-
-	if (ui_browser__show(menu, " ", "ESC: exit, ENTER|->: Select option") < 0)
-		return -1;
-
-	while (1) {
-		key = ui_browser__run(menu, 0);
-
-		switch (key) {
-		case K_RIGHT:
-		case K_ENTER:
-			key = menu->index;
-			break;
-		case K_LEFT:
-		case K_ESC:
-		case 'q':
-		case CTRL('c'):
-			key = -1;
-			break;
-		default:
-			continue;
-		}
-
-		break;
-	}
-
-	ui_browser__hide(menu);
-	return key;
-}
-
-int ui__popup_menu(int argc, char * const argv[])
-{
-	struct ui_browser menu = {
-		.entries    = (void *)argv,
-		.refresh    = ui_browser__argv_refresh,
-		.seek	    = ui_browser__argv_seek,
-		.write	    = ui_browser__argv_write,
-		.nr_entries = argc,
-	};
-
-	return popup_menu__run(&menu);
-}
-
-int ui_browser__input_window(const char *title, const char *text, char *input,
-			     const char *exit_msg, int delay_secs)
-{
-	int x, y, len, key;
-	int max_len = 60, nr_lines = 0;
-	static char buf[50];
-	const char *t;
-
-	t = text;
-	while (1) {
-		const char *sep = strchr(t, '\n');
-
-		if (sep == NULL)
-			sep = strchr(t, '\0');
-		len = sep - t;
-		if (max_len < len)
-			max_len = len;
-		++nr_lines;
-		if (*sep == '\0')
-			break;
-		t = sep + 1;
-	}
-
-	max_len += 2;
-	nr_lines += 8;
-	y = SLtt_Screen_Rows / 2 - nr_lines / 2;
-	x = SLtt_Screen_Cols / 2 - max_len / 2;
-
-	SLsmg_set_color(0);
-	SLsmg_draw_box(y, x++, nr_lines, max_len);
-	if (title) {
-		SLsmg_gotorc(y, x + 1);
-		SLsmg_write_string((char *)title);
-	}
-	SLsmg_gotorc(++y, x);
-	nr_lines -= 7;
-	max_len -= 2;
-	SLsmg_write_wrapped_string((unsigned char *)text, y, x,
-				   nr_lines, max_len, 1);
-	y += nr_lines;
-	len = 5;
-	while (len--) {
-		SLsmg_gotorc(y + len - 1, x);
-		SLsmg_write_nstring((char *)" ", max_len);
-	}
-	SLsmg_draw_box(y++, x + 1, 3, max_len - 2);
-
-	SLsmg_gotorc(y + 3, x);
-	SLsmg_write_nstring((char *)exit_msg, max_len);
-	SLsmg_refresh();
-
-	x += 2;
-	len = 0;
-	key = ui__getch(delay_secs);
-	while (key != K_TIMER && key != K_ENTER && key != K_ESC) {
-		if (key == K_BKSPC) {
-			if (len == 0)
-				goto next_key;
-			SLsmg_gotorc(y, x + --len);
-			SLsmg_write_char(' ');
-		} else {
-			buf[len] = key;
-			SLsmg_gotorc(y, x + len++);
-			SLsmg_write_char(key);
-		}
-		SLsmg_refresh();
-
-		/* XXX more graceful overflow handling needed */
-		if (len == sizeof(buf) - 1) {
-			ui_helpline__push("maximum size of symbol name reached!");
-			key = K_ENTER;
-			break;
-		}
-next_key:
-		key = ui__getch(delay_secs);
-	}
-
-	buf[len] = '\0';
-	strncpy(input, buf, len+1);
-	return key;
-}
-
-int ui__question_window(const char *title, const char *text,
-			const char *exit_msg, int delay_secs)
-{
-	int x, y;
-	int max_len = 0, nr_lines = 0;
-	const char *t;
-
-	t = text;
-	while (1) {
-		const char *sep = strchr(t, '\n');
-		int len;
-
-		if (sep == NULL)
-			sep = strchr(t, '\0');
-		len = sep - t;
-		if (max_len < len)
-			max_len = len;
-		++nr_lines;
-		if (*sep == '\0')
-			break;
-		t = sep + 1;
-	}
-
-	max_len += 2;
-	nr_lines += 4;
-	y = SLtt_Screen_Rows / 2 - nr_lines / 2,
-	x = SLtt_Screen_Cols / 2 - max_len / 2;
-
-	SLsmg_set_color(0);
-	SLsmg_draw_box(y, x++, nr_lines, max_len);
-	if (title) {
-		SLsmg_gotorc(y, x + 1);
-		SLsmg_write_string((char *)title);
-	}
-	SLsmg_gotorc(++y, x);
-	nr_lines -= 2;
-	max_len -= 2;
-	SLsmg_write_wrapped_string((unsigned char *)text, y, x,
-				   nr_lines, max_len, 1);
-	SLsmg_gotorc(y + nr_lines - 2, x);
-	SLsmg_write_nstring((char *)" ", max_len);
-	SLsmg_gotorc(y + nr_lines - 1, x);
-	SLsmg_write_nstring((char *)exit_msg, max_len);
-	SLsmg_refresh();
-	return ui__getch(delay_secs);
-}
-
-int ui__help_window(const char *text)
-{
-	return ui__question_window("Help", text, "Press any key...", 0);
-}
-
-int ui__dialog_yesno(const char *msg)
-{
-	return ui__question_window(NULL, msg, "Enter: Yes, ESC: No", 0);
-}
-
-static int __ui__warning(const char *title, const char *format, va_list args)
-{
-	char *s;
-
-	if (vasprintf(&s, format, args) > 0) {
-		int key;
-
-		pthread_mutex_lock(&ui__lock);
-		key = ui__question_window(title, s, "Press any key...", 0);
-		pthread_mutex_unlock(&ui__lock);
-		free(s);
-		return key;
-	}
-
-	fprintf(stderr, "%s\n", title);
-	vfprintf(stderr, format, args);
-	return K_ESC;
-}
-
-static int perf_tui__error(const char *format, va_list args)
-{
-	return __ui__warning("Error:", format, args);
-}
-
-static int perf_tui__warning(const char *format, va_list args)
-{
-	return __ui__warning("Warning:", format, args);
-}
-
-struct perf_error_ops perf_tui_eops = {
-	.error		= perf_tui__error,
-	.warning	= perf_tui__warning,
-};
diff --git a/src/tools/perf/ui/ui.h b/src/tools/perf/ui/ui.h
deleted file mode 100644
index 70cb0d4..0000000
--- a/src/tools/perf/ui/ui.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef _PERF_UI_H_
-#define _PERF_UI_H_ 1
-
-#include <pthread.h>
-#include <stdbool.h>
-#include <linux/compiler.h>
-
-extern pthread_mutex_t ui__lock;
-
-extern int use_browser;
-
-void setup_browser(bool fallback_to_pager);
-void exit_browser(bool wait_for_ok);
-
-#ifdef SLANG_SUPPORT
-int ui__init(void);
-void ui__exit(bool wait_for_ok);
-#else
-static inline int ui__init(void)
-{
-	return -1;
-}
-static inline void ui__exit(bool wait_for_ok __maybe_unused) {}
-#endif
-
-#ifdef GTK2_SUPPORT
-int perf_gtk__init(void);
-void perf_gtk__exit(bool wait_for_ok);
-#else
-static inline int perf_gtk__init(void)
-{
-	return -1;
-}
-static inline void perf_gtk__exit(bool wait_for_ok __maybe_unused) {}
-#endif
-
-void ui__refresh_dimensions(bool force);
-
-#endif /* _PERF_UI_H_ */
diff --git a/src/tools/perf/ui/util.c b/src/tools/perf/ui/util.c
deleted file mode 100644
index e3e0a96..0000000
--- a/src/tools/perf/ui/util.c
+++ /dev/null
@@ -1,84 +0,0 @@
-#include "util.h"
-#include "../debug.h"
-
-
-/*
- * Default error logging functions
- */
-static int perf_stdio__error(const char *format, va_list args)
-{
-	fprintf(stderr, "Error:\n");
-	vfprintf(stderr, format, args);
-	return 0;
-}
-
-static int perf_stdio__warning(const char *format, va_list args)
-{
-	fprintf(stderr, "Warning:\n");
-	vfprintf(stderr, format, args);
-	return 0;
-}
-
-static struct perf_error_ops default_eops =
-{
-	.error		= perf_stdio__error,
-	.warning	= perf_stdio__warning,
-};
-
-static struct perf_error_ops *perf_eops = &default_eops;
-
-
-int ui__error(const char *format, ...)
-{
-	int ret;
-	va_list args;
-
-	va_start(args, format);
-	ret = perf_eops->error(format, args);
-	va_end(args);
-
-	return ret;
-}
-
-int ui__warning(const char *format, ...)
-{
-	int ret;
-	va_list args;
-
-	va_start(args, format);
-	ret = perf_eops->warning(format, args);
-	va_end(args);
-
-	return ret;
-}
-
-/**
- * perf_error__register - Register error logging functions
- * @eops: The pointer to error logging function struct
- *
- * Register UI-specific error logging functions. Before calling this,
- * other logging functions should be unregistered, if any.
- */
-int perf_error__register(struct perf_error_ops *eops)
-{
-	if (perf_eops != &default_eops)
-		return -1;
-
-	perf_eops = eops;
-	return 0;
-}
-
-/**
- * perf_error__unregister - Unregister error logging functions
- * @eops: The pointer to error logging function struct
- *
- * Unregister already registered error logging functions.
- */
-int perf_error__unregister(struct perf_error_ops *eops)
-{
-	if (perf_eops != eops)
-		return -1;
-
-	perf_eops = &default_eops;
-	return 0;
-}
diff --git a/src/tools/perf/ui/util.h b/src/tools/perf/ui/util.h
deleted file mode 100644
index 361f08c..0000000
--- a/src/tools/perf/ui/util.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef _PERF_UI_UTIL_H_
-#define _PERF_UI_UTIL_H_ 1
-
-#include <stdarg.h>
-
-int ui__getch(int delay_secs);
-int ui__popup_menu(int argc, char * const argv[]);
-int ui__help_window(const char *text);
-int ui__dialog_yesno(const char *msg);
-int ui__question_window(const char *title, const char *text,
-			const char *exit_msg, int delay_secs);
-
-struct perf_error_ops {
-	int (*error)(const char *format, va_list args);
-	int (*warning)(const char *format, va_list args);
-};
-
-int perf_error__register(struct perf_error_ops *eops);
-int perf_error__unregister(struct perf_error_ops *eops);
-
-#endif /* _PERF_UI_UTIL_H_ */
diff --git a/src/tools/perf/util/PERF-VERSION-GEN b/src/tools/perf/util/PERF-VERSION-GEN
deleted file mode 100755
index 15a77b7..0000000
--- a/src/tools/perf/util/PERF-VERSION-GEN
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/sh
-
-if [ $# -eq 1 ]  ; then
-	OUTPUT=$1
-fi
-
-GVF=${OUTPUT}PERF-VERSION-FILE
-
-LF='
-'
-
-#
-# First check if there is a .git to get the version from git describe
-# otherwise try to get the version from the kernel Makefile
-#
-CID=
-TAG=
-if test -d ../../.git -o -f ../../.git
-then
-	TAG=$(git describe --abbrev=0 --match "v[0-9].[0-9]*" 2>/dev/null )
-	CID=$(git log -1 --abbrev=4 --pretty=format:"%h" 2>/dev/null) && CID="-g$CID"
-fi
-if test -z "$TAG"
-then
-	TAG=$(MAKEFLAGS= make -sC ../.. kernelversion)
-fi
-VN="$TAG$CID"
-if test -n "$CID"
-then
-	# format version string, strip trailing zero of sublevel:
-	VN=$(echo "$VN" | sed -e 's/-/./g;s/\([0-9]*[.][0-9]*\)[.]0/\1/')
-fi
-
-VN=$(expr "$VN" : v*'\(.*\)')
-
-if test -r $GVF
-then
-	VC=$(sed -e 's/^#define PERF_VERSION "\(.*\)"/\1/' <$GVF)
-else
-	VC=unset
-fi
-test "$VN" = "$VC" || {
-	echo >&2 "PERF_VERSION = $VN"
-	echo "#define PERF_VERSION \"$VN\"" >$GVF
-}
-
-
diff --git a/src/tools/perf/util/abspath.c b/src/tools/perf/util/abspath.c
deleted file mode 100644
index 0e76aff..0000000
--- a/src/tools/perf/util/abspath.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#include "cache.h"
-
-static const char *get_pwd_cwd(void)
-{
-	static char cwd[PATH_MAX + 1];
-	char *pwd;
-	struct stat cwd_stat, pwd_stat;
-	if (getcwd(cwd, PATH_MAX) == NULL)
-		return NULL;
-	pwd = getenv("PWD");
-	if (pwd && strcmp(pwd, cwd)) {
-		stat(cwd, &cwd_stat);
-		if (!stat(pwd, &pwd_stat) &&
-		    pwd_stat.st_dev == cwd_stat.st_dev &&
-		    pwd_stat.st_ino == cwd_stat.st_ino) {
-			strlcpy(cwd, pwd, PATH_MAX);
-		}
-	}
-	return cwd;
-}
-
-const char *make_nonrelative_path(const char *path)
-{
-	static char buf[PATH_MAX + 1];
-
-	if (is_absolute_path(path)) {
-		if (strlcpy(buf, path, PATH_MAX) >= PATH_MAX)
-			die("Too long path: %.*s", 60, path);
-	} else {
-		const char *cwd = get_pwd_cwd();
-		if (!cwd)
-			die("Cannot determine the current working directory");
-		if (snprintf(buf, PATH_MAX, "%s/%s", cwd, path) >= PATH_MAX)
-			die("Too long path: %.*s", 60, path);
-	}
-	return buf;
-}
diff --git a/src/tools/perf/util/alias.c b/src/tools/perf/util/alias.c
deleted file mode 100644
index e6d1347..0000000
--- a/src/tools/perf/util/alias.c
+++ /dev/null
@@ -1,78 +0,0 @@
-#include "cache.h"
-
-static const char *alias_key;
-static char *alias_val;
-
-static int alias_lookup_cb(const char *k, const char *v,
-			   void *cb __maybe_unused)
-{
-	if (!prefixcmp(k, "alias.") && !strcmp(k+6, alias_key)) {
-		if (!v)
-			return config_error_nonbool(k);
-		alias_val = strdup(v);
-		return 0;
-	}
-	return 0;
-}
-
-char *alias_lookup(const char *alias)
-{
-	alias_key = alias;
-	alias_val = NULL;
-	perf_config(alias_lookup_cb, NULL);
-	return alias_val;
-}
-
-int split_cmdline(char *cmdline, const char ***argv)
-{
-	int src, dst, count = 0, size = 16;
-	char quoted = 0;
-
-	*argv = malloc(sizeof(char*) * size);
-
-	/* split alias_string */
-	(*argv)[count++] = cmdline;
-	for (src = dst = 0; cmdline[src];) {
-		char c = cmdline[src];
-		if (!quoted && isspace(c)) {
-			cmdline[dst++] = 0;
-			while (cmdline[++src]
-					&& isspace(cmdline[src]))
-				; /* skip */
-			if (count >= size) {
-				size += 16;
-				*argv = realloc(*argv, sizeof(char*) * size);
-			}
-			(*argv)[count++] = cmdline + dst;
-		} else if (!quoted && (c == '\'' || c == '"')) {
-			quoted = c;
-			src++;
-		} else if (c == quoted) {
-			quoted = 0;
-			src++;
-		} else {
-			if (c == '\\' && quoted != '\'') {
-				src++;
-				c = cmdline[src];
-				if (!c) {
-					free(*argv);
-					*argv = NULL;
-					return error("cmdline ends with \\");
-				}
-			}
-			cmdline[dst++] = c;
-			src++;
-		}
-	}
-
-	cmdline[dst] = 0;
-
-	if (quoted) {
-		free(*argv);
-		*argv = NULL;
-		return error("unclosed quote");
-	}
-
-	return count;
-}
-
diff --git a/src/tools/perf/util/annotate.c b/src/tools/perf/util/annotate.c
deleted file mode 100644
index 7eae548..0000000
--- a/src/tools/perf/util/annotate.c
+++ /dev/null
@@ -1,1382 +0,0 @@
-/*
- * Copyright (C) 2011, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
- *
- * Parts came from builtin-annotate.c, see those files for further
- * copyright notes.
- *
- * Released under the GPL v2. (and only v2, not any later version)
- */
-
-#include "util.h"
-#include "build-id.h"
-#include "color.h"
-#include "cache.h"
-#include "symbol.h"
-#include "debug.h"
-#include "annotate.h"
-#include "evsel.h"
-#include <pthread.h>
-#include <linux/bitops.h>
-
-const char 	*disassembler_style;
-const char	*objdump_path;
-
-static struct ins *ins__find(const char *name);
-static int disasm_line__parse(char *line, char **namep, char **rawp);
-
-static void ins__delete(struct ins_operands *ops)
-{
-	free(ops->source.raw);
-	free(ops->source.name);
-	free(ops->target.raw);
-	free(ops->target.name);
-}
-
-static int ins__raw_scnprintf(struct ins *ins, char *bf, size_t size,
-			      struct ins_operands *ops)
-{
-	return scnprintf(bf, size, "%-6.6s %s", ins->name, ops->raw);
-}
-
-int ins__scnprintf(struct ins *ins, char *bf, size_t size,
-		  struct ins_operands *ops)
-{
-	if (ins->ops->scnprintf)
-		return ins->ops->scnprintf(ins, bf, size, ops);
-
-	return ins__raw_scnprintf(ins, bf, size, ops);
-}
-
-static int call__parse(struct ins_operands *ops)
-{
-	char *endptr, *tok, *name;
-
-	ops->target.addr = strtoull(ops->raw, &endptr, 16);
-
-	name = strchr(endptr, '<');
-	if (name == NULL)
-		goto indirect_call;
-
-	name++;
-
-	tok = strchr(name, '>');
-	if (tok == NULL)
-		return -1;
-
-	*tok = '\0';
-	ops->target.name = strdup(name);
-	*tok = '>';
-
-	return ops->target.name == NULL ? -1 : 0;
-
-indirect_call:
-	tok = strchr(endptr, '(');
-	if (tok != NULL) {
-		ops->target.addr = 0;
-		return 0;
-	}
-
-	tok = strchr(endptr, '*');
-	if (tok == NULL)
-		return -1;
-
-	ops->target.addr = strtoull(tok + 1, NULL, 16);
-	return 0;
-}
-
-static int call__scnprintf(struct ins *ins, char *bf, size_t size,
-			   struct ins_operands *ops)
-{
-	if (ops->target.name)
-		return scnprintf(bf, size, "%-6.6s %s", ins->name, ops->target.name);
-
-	if (ops->target.addr == 0)
-		return ins__raw_scnprintf(ins, bf, size, ops);
-
-	return scnprintf(bf, size, "%-6.6s *%" PRIx64, ins->name, ops->target.addr);
-}
-
-static struct ins_ops call_ops = {
-	.parse	   = call__parse,
-	.scnprintf = call__scnprintf,
-};
-
-bool ins__is_call(const struct ins *ins)
-{
-	return ins->ops == &call_ops;
-}
-
-static int jump__parse(struct ins_operands *ops)
-{
-	const char *s = strchr(ops->raw, '+');
-
-	ops->target.addr = strtoull(ops->raw, NULL, 16);
-
-	if (s++ != NULL)
-		ops->target.offset = strtoull(s, NULL, 16);
-	else
-		ops->target.offset = UINT64_MAX;
-
-	return 0;
-}
-
-static int jump__scnprintf(struct ins *ins, char *bf, size_t size,
-			   struct ins_operands *ops)
-{
-	return scnprintf(bf, size, "%-6.6s %" PRIx64, ins->name, ops->target.offset);
-}
-
-static struct ins_ops jump_ops = {
-	.parse	   = jump__parse,
-	.scnprintf = jump__scnprintf,
-};
-
-bool ins__is_jump(const struct ins *ins)
-{
-	return ins->ops == &jump_ops;
-}
-
-static int comment__symbol(char *raw, char *comment, u64 *addrp, char **namep)
-{
-	char *endptr, *name, *t;
-
-	if (strstr(raw, "(%rip)") == NULL)
-		return 0;
-
-	*addrp = strtoull(comment, &endptr, 16);
-	name = strchr(endptr, '<');
-	if (name == NULL)
-		return -1;
-
-	name++;
-
-	t = strchr(name, '>');
-	if (t == NULL)
-		return 0;
-
-	*t = '\0';
-	*namep = strdup(name);
-	*t = '>';
-
-	return 0;
-}
-
-static int lock__parse(struct ins_operands *ops)
-{
-	char *name;
-
-	ops->locked.ops = zalloc(sizeof(*ops->locked.ops));
-	if (ops->locked.ops == NULL)
-		return 0;
-
-	if (disasm_line__parse(ops->raw, &name, &ops->locked.ops->raw) < 0)
-		goto out_free_ops;
-
-	ops->locked.ins = ins__find(name);
-	if (ops->locked.ins == NULL)
-		goto out_free_ops;
-
-	if (!ops->locked.ins->ops)
-		return 0;
-
-	if (ops->locked.ins->ops->parse)
-		ops->locked.ins->ops->parse(ops->locked.ops);
-
-	return 0;
-
-out_free_ops:
-	free(ops->locked.ops);
-	ops->locked.ops = NULL;
-	return 0;
-}
-
-static int lock__scnprintf(struct ins *ins, char *bf, size_t size,
-			   struct ins_operands *ops)
-{
-	int printed;
-
-	if (ops->locked.ins == NULL)
-		return ins__raw_scnprintf(ins, bf, size, ops);
-
-	printed = scnprintf(bf, size, "%-6.6s ", ins->name);
-	return printed + ins__scnprintf(ops->locked.ins, bf + printed,
-					size - printed, ops->locked.ops);
-}
-
-static void lock__delete(struct ins_operands *ops)
-{
-	free(ops->locked.ops);
-	free(ops->target.raw);
-	free(ops->target.name);
-}
-
-static struct ins_ops lock_ops = {
-	.free	   = lock__delete,
-	.parse	   = lock__parse,
-	.scnprintf = lock__scnprintf,
-};
-
-static int mov__parse(struct ins_operands *ops)
-{
-	char *s = strchr(ops->raw, ','), *target, *comment, prev;
-
-	if (s == NULL)
-		return -1;
-
-	*s = '\0';
-	ops->source.raw = strdup(ops->raw);
-	*s = ',';
-	
-	if (ops->source.raw == NULL)
-		return -1;
-
-	target = ++s;
-
-	while (s[0] != '\0' && !isspace(s[0]))
-		++s;
-	prev = *s;
-	*s = '\0';
-
-	ops->target.raw = strdup(target);
-	*s = prev;
-
-	if (ops->target.raw == NULL)
-		goto out_free_source;
-
-	comment = strchr(s, '#');
-	if (comment == NULL)
-		return 0;
-
-	while (comment[0] != '\0' && isspace(comment[0]))
-		++comment;
-
-	comment__symbol(ops->source.raw, comment, &ops->source.addr, &ops->source.name);
-	comment__symbol(ops->target.raw, comment, &ops->target.addr, &ops->target.name);
-
-	return 0;
-
-out_free_source:
-	free(ops->source.raw);
-	ops->source.raw = NULL;
-	return -1;
-}
-
-static int mov__scnprintf(struct ins *ins, char *bf, size_t size,
-			   struct ins_operands *ops)
-{
-	return scnprintf(bf, size, "%-6.6s %s,%s", ins->name,
-			 ops->source.name ?: ops->source.raw,
-			 ops->target.name ?: ops->target.raw);
-}
-
-static struct ins_ops mov_ops = {
-	.parse	   = mov__parse,
-	.scnprintf = mov__scnprintf,
-};
-
-static int dec__parse(struct ins_operands *ops)
-{
-	char *target, *comment, *s, prev;
-
-	target = s = ops->raw;
-
-	while (s[0] != '\0' && !isspace(s[0]))
-		++s;
-	prev = *s;
-	*s = '\0';
-
-	ops->target.raw = strdup(target);
-	*s = prev;
-
-	if (ops->target.raw == NULL)
-		return -1;
-
-	comment = strchr(s, '#');
-	if (comment == NULL)
-		return 0;
-
-	while (comment[0] != '\0' && isspace(comment[0]))
-		++comment;
-
-	comment__symbol(ops->target.raw, comment, &ops->target.addr, &ops->target.name);
-
-	return 0;
-}
-
-static int dec__scnprintf(struct ins *ins, char *bf, size_t size,
-			   struct ins_operands *ops)
-{
-	return scnprintf(bf, size, "%-6.6s %s", ins->name,
-			 ops->target.name ?: ops->target.raw);
-}
-
-static struct ins_ops dec_ops = {
-	.parse	   = dec__parse,
-	.scnprintf = dec__scnprintf,
-};
-
-static int nop__scnprintf(struct ins *ins __maybe_unused, char *bf, size_t size,
-			  struct ins_operands *ops __maybe_unused)
-{
-	return scnprintf(bf, size, "%-6.6s", "nop");
-}
-
-static struct ins_ops nop_ops = {
-	.scnprintf = nop__scnprintf,
-};
-
-/*
- * Must be sorted by name!
- */
-static struct ins instructions[] = {
-	{ .name = "add",   .ops  = &mov_ops, },
-	{ .name = "addl",  .ops  = &mov_ops, },
-	{ .name = "addq",  .ops  = &mov_ops, },
-	{ .name = "addw",  .ops  = &mov_ops, },
-	{ .name = "and",   .ops  = &mov_ops, },
-	{ .name = "bts",   .ops  = &mov_ops, },
-	{ .name = "call",  .ops  = &call_ops, },
-	{ .name = "callq", .ops  = &call_ops, },
-	{ .name = "cmp",   .ops  = &mov_ops, },
-	{ .name = "cmpb",  .ops  = &mov_ops, },
-	{ .name = "cmpl",  .ops  = &mov_ops, },
-	{ .name = "cmpq",  .ops  = &mov_ops, },
-	{ .name = "cmpw",  .ops  = &mov_ops, },
-	{ .name = "cmpxch", .ops  = &mov_ops, },
-	{ .name = "dec",   .ops  = &dec_ops, },
-	{ .name = "decl",  .ops  = &dec_ops, },
-	{ .name = "imul",  .ops  = &mov_ops, },
-	{ .name = "inc",   .ops  = &dec_ops, },
-	{ .name = "incl",  .ops  = &dec_ops, },
-	{ .name = "ja",	   .ops  = &jump_ops, },
-	{ .name = "jae",   .ops  = &jump_ops, },
-	{ .name = "jb",	   .ops  = &jump_ops, },
-	{ .name = "jbe",   .ops  = &jump_ops, },
-	{ .name = "jc",	   .ops  = &jump_ops, },
-	{ .name = "jcxz",  .ops  = &jump_ops, },
-	{ .name = "je",	   .ops  = &jump_ops, },
-	{ .name = "jecxz", .ops  = &jump_ops, },
-	{ .name = "jg",	   .ops  = &jump_ops, },
-	{ .name = "jge",   .ops  = &jump_ops, },
-	{ .name = "jl",    .ops  = &jump_ops, },
-	{ .name = "jle",   .ops  = &jump_ops, },
-	{ .name = "jmp",   .ops  = &jump_ops, },
-	{ .name = "jmpq",  .ops  = &jump_ops, },
-	{ .name = "jna",   .ops  = &jump_ops, },
-	{ .name = "jnae",  .ops  = &jump_ops, },
-	{ .name = "jnb",   .ops  = &jump_ops, },
-	{ .name = "jnbe",  .ops  = &jump_ops, },
-	{ .name = "jnc",   .ops  = &jump_ops, },
-	{ .name = "jne",   .ops  = &jump_ops, },
-	{ .name = "jng",   .ops  = &jump_ops, },
-	{ .name = "jnge",  .ops  = &jump_ops, },
-	{ .name = "jnl",   .ops  = &jump_ops, },
-	{ .name = "jnle",  .ops  = &jump_ops, },
-	{ .name = "jno",   .ops  = &jump_ops, },
-	{ .name = "jnp",   .ops  = &jump_ops, },
-	{ .name = "jns",   .ops  = &jump_ops, },
-	{ .name = "jnz",   .ops  = &jump_ops, },
-	{ .name = "jo",	   .ops  = &jump_ops, },
-	{ .name = "jp",	   .ops  = &jump_ops, },
-	{ .name = "jpe",   .ops  = &jump_ops, },
-	{ .name = "jpo",   .ops  = &jump_ops, },
-	{ .name = "jrcxz", .ops  = &jump_ops, },
-	{ .name = "js",	   .ops  = &jump_ops, },
-	{ .name = "jz",	   .ops  = &jump_ops, },
-	{ .name = "lea",   .ops  = &mov_ops, },
-	{ .name = "lock",  .ops  = &lock_ops, },
-	{ .name = "mov",   .ops  = &mov_ops, },
-	{ .name = "movb",  .ops  = &mov_ops, },
-	{ .name = "movdqa",.ops  = &mov_ops, },
-	{ .name = "movl",  .ops  = &mov_ops, },
-	{ .name = "movq",  .ops  = &mov_ops, },
-	{ .name = "movslq", .ops  = &mov_ops, },
-	{ .name = "movzbl", .ops  = &mov_ops, },
-	{ .name = "movzwl", .ops  = &mov_ops, },
-	{ .name = "nop",   .ops  = &nop_ops, },
-	{ .name = "nopl",  .ops  = &nop_ops, },
-	{ .name = "nopw",  .ops  = &nop_ops, },
-	{ .name = "or",    .ops  = &mov_ops, },
-	{ .name = "orl",   .ops  = &mov_ops, },
-	{ .name = "test",  .ops  = &mov_ops, },
-	{ .name = "testb", .ops  = &mov_ops, },
-	{ .name = "testl", .ops  = &mov_ops, },
-	{ .name = "xadd",  .ops  = &mov_ops, },
-	{ .name = "xbeginl", .ops  = &jump_ops, },
-	{ .name = "xbeginq", .ops  = &jump_ops, },
-};
-
-static int ins__cmp(const void *name, const void *insp)
-{
-	const struct ins *ins = insp;
-
-	return strcmp(name, ins->name);
-}
-
-static struct ins *ins__find(const char *name)
-{
-	const int nmemb = ARRAY_SIZE(instructions);
-
-	return bsearch(name, instructions, nmemb, sizeof(struct ins), ins__cmp);
-}
-
-int symbol__annotate_init(struct map *map __maybe_unused, struct symbol *sym)
-{
-	struct annotation *notes = symbol__annotation(sym);
-	pthread_mutex_init(&notes->lock, NULL);
-	return 0;
-}
-
-int symbol__alloc_hist(struct symbol *sym)
-{
-	struct annotation *notes = symbol__annotation(sym);
-	const size_t size = symbol__size(sym);
-	size_t sizeof_sym_hist;
-
-	/* Check for overflow when calculating sizeof_sym_hist */
-	if (size > (SIZE_MAX - sizeof(struct sym_hist)) / sizeof(u64))
-		return -1;
-
-	sizeof_sym_hist = (sizeof(struct sym_hist) + size * sizeof(u64));
-
-	/* Check for overflow in zalloc argument */
-	if (sizeof_sym_hist > (SIZE_MAX - sizeof(*notes->src))
-				/ symbol_conf.nr_events)
-		return -1;
-
-	notes->src = zalloc(sizeof(*notes->src) + symbol_conf.nr_events * sizeof_sym_hist);
-	if (notes->src == NULL)
-		return -1;
-	notes->src->sizeof_sym_hist = sizeof_sym_hist;
-	notes->src->nr_histograms   = symbol_conf.nr_events;
-	INIT_LIST_HEAD(&notes->src->source);
-	return 0;
-}
-
-void symbol__annotate_zero_histograms(struct symbol *sym)
-{
-	struct annotation *notes = symbol__annotation(sym);
-
-	pthread_mutex_lock(&notes->lock);
-	if (notes->src != NULL)
-		memset(notes->src->histograms, 0,
-		       notes->src->nr_histograms * notes->src->sizeof_sym_hist);
-	pthread_mutex_unlock(&notes->lock);
-}
-
-int symbol__inc_addr_samples(struct symbol *sym, struct map *map,
-			     int evidx, u64 addr)
-{
-	unsigned offset;
-	struct annotation *notes;
-	struct sym_hist *h;
-
-	notes = symbol__annotation(sym);
-	if (notes->src == NULL)
-		return -ENOMEM;
-
-	pr_debug3("%s: addr=%#" PRIx64 "\n", __func__, map->unmap_ip(map, addr));
-
-	if (addr < sym->start || addr > sym->end)
-		return -ERANGE;
-
-	offset = addr - sym->start;
-	h = annotation__histogram(notes, evidx);
-	h->sum++;
-	h->addr[offset]++;
-
-	pr_debug3("%#" PRIx64 " %s: period++ [addr: %#" PRIx64 ", %#" PRIx64
-		  ", evidx=%d] => %" PRIu64 "\n", sym->start, sym->name,
-		  addr, addr - sym->start, evidx, h->addr[offset]);
-	return 0;
-}
-
-static void disasm_line__init_ins(struct disasm_line *dl)
-{
-	dl->ins = ins__find(dl->name);
-
-	if (dl->ins == NULL)
-		return;
-
-	if (!dl->ins->ops)
-		return;
-
-	if (dl->ins->ops->parse)
-		dl->ins->ops->parse(&dl->ops);
-}
-
-static int disasm_line__parse(char *line, char **namep, char **rawp)
-{
-	char *name = line, tmp;
-
-	while (isspace(name[0]))
-		++name;
-
-	if (name[0] == '\0')
-		return -1;
-
-	*rawp = name + 1;
-
-	while ((*rawp)[0] != '\0' && !isspace((*rawp)[0]))
-		++*rawp;
-
-	tmp = (*rawp)[0];
-	(*rawp)[0] = '\0';
-	*namep = strdup(name);
-
-	if (*namep == NULL)
-		goto out_free_name;
-
-	(*rawp)[0] = tmp;
-
-	if ((*rawp)[0] != '\0') {
-		(*rawp)++;
-		while (isspace((*rawp)[0]))
-			++(*rawp);
-	}
-
-	return 0;
-
-out_free_name:
-	free(*namep);
-	*namep = NULL;
-	return -1;
-}
-
-static struct disasm_line *disasm_line__new(s64 offset, char *line, size_t privsize)
-{
-	struct disasm_line *dl = zalloc(sizeof(*dl) + privsize);
-
-	if (dl != NULL) {
-		dl->offset = offset;
-		dl->line = strdup(line);
-		if (dl->line == NULL)
-			goto out_delete;
-
-		if (offset != -1) {
-			if (disasm_line__parse(dl->line, &dl->name, &dl->ops.raw) < 0)
-				goto out_free_line;
-
-			disasm_line__init_ins(dl);
-		}
-	}
-
-	return dl;
-
-out_free_line:
-	free(dl->line);
-out_delete:
-	free(dl);
-	return NULL;
-}
-
-void disasm_line__free(struct disasm_line *dl)
-{
-	free(dl->line);
-	free(dl->name);
-	if (dl->ins && dl->ins->ops->free)
-		dl->ins->ops->free(&dl->ops);
-	else
-		ins__delete(&dl->ops);
-	free(dl);
-}
-
-int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool raw)
-{
-	if (raw || !dl->ins)
-		return scnprintf(bf, size, "%-6.6s %s", dl->name, dl->ops.raw);
-
-	return ins__scnprintf(dl->ins, bf, size, &dl->ops);
-}
-
-static void disasm__add(struct list_head *head, struct disasm_line *line)
-{
-	list_add_tail(&line->node, head);
-}
-
-struct disasm_line *disasm__get_next_ip_line(struct list_head *head, struct disasm_line *pos)
-{
-	list_for_each_entry_continue(pos, head, node)
-		if (pos->offset >= 0)
-			return pos;
-
-	return NULL;
-}
-
-double disasm__calc_percent(struct annotation *notes, int evidx, s64 offset,
-			    s64 end, const char **path)
-{
-	struct source_line *src_line = notes->src->lines;
-	double percent = 0.0;
-
-	if (src_line) {
-		size_t sizeof_src_line = sizeof(*src_line) +
-				sizeof(src_line->p) * (src_line->nr_pcnt - 1);
-
-		while (offset < end) {
-			src_line = (void *)notes->src->lines +
-					(sizeof_src_line * offset);
-
-			if (*path == NULL)
-				*path = src_line->path;
-
-			percent += src_line->p[evidx].percent;
-			offset++;
-		}
-	} else {
-		struct sym_hist *h = annotation__histogram(notes, evidx);
-		unsigned int hits = 0;
-
-		while (offset < end)
-			hits += h->addr[offset++];
-
-		if (h->sum)
-			percent = 100.0 * hits / h->sum;
-	}
-
-	return percent;
-}
-
-static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 start,
-		      struct perf_evsel *evsel, u64 len, int min_pcnt, int printed,
-		      int max_lines, struct disasm_line *queue)
-{
-	static const char *prev_line;
-	static const char *prev_color;
-
-	if (dl->offset != -1) {
-		const char *path = NULL;
-		double percent, max_percent = 0.0;
-		double *ppercents = &percent;
-		int i, nr_percent = 1;
-		const char *color;
-		struct annotation *notes = symbol__annotation(sym);
-		s64 offset = dl->offset;
-		const u64 addr = start + offset;
-		struct disasm_line *next;
-
-		next = disasm__get_next_ip_line(&notes->src->source, dl);
-
-		if (perf_evsel__is_group_event(evsel)) {
-			nr_percent = evsel->nr_members;
-			ppercents = calloc(nr_percent, sizeof(double));
-			if (ppercents == NULL)
-				return -1;
-		}
-
-		for (i = 0; i < nr_percent; i++) {
-			percent = disasm__calc_percent(notes,
-					notes->src->lines ? i : evsel->idx + i,
-					offset,
-					next ? next->offset : (s64) len,
-					&path);
-
-			ppercents[i] = percent;
-			if (percent > max_percent)
-				max_percent = percent;
-		}
-
-		if (max_percent < min_pcnt)
-			return -1;
-
-		if (max_lines && printed >= max_lines)
-			return 1;
-
-		if (queue != NULL) {
-			list_for_each_entry_from(queue, &notes->src->source, node) {
-				if (queue == dl)
-					break;
-				disasm_line__print(queue, sym, start, evsel, len,
-						    0, 0, 1, NULL);
-			}
-		}
-
-		color = get_percent_color(max_percent);
-
-		/*
-		 * Also color the filename and line if needed, with
-		 * the same color than the percentage. Don't print it
-		 * twice for close colored addr with the same filename:line
-		 */
-		if (path) {
-			if (!prev_line || strcmp(prev_line, path)
-				       || color != prev_color) {
-				color_fprintf(stdout, color, " %s", path);
-				prev_line = path;
-				prev_color = color;
-			}
-		}
-
-		for (i = 0; i < nr_percent; i++) {
-			percent = ppercents[i];
-			color = get_percent_color(percent);
-			color_fprintf(stdout, color, " %7.2f", percent);
-		}
-
-		printf(" :	");
-		color_fprintf(stdout, PERF_COLOR_MAGENTA, "  %" PRIx64 ":", addr);
-		color_fprintf(stdout, PERF_COLOR_BLUE, "%s\n", dl->line);
-
-		if (ppercents != &percent)
-			free(ppercents);
-
-	} else if (max_lines && printed >= max_lines)
-		return 1;
-	else {
-		int width = 8;
-
-		if (queue)
-			return -1;
-
-		if (perf_evsel__is_group_event(evsel))
-			width *= evsel->nr_members;
-
-		if (!*dl->line)
-			printf(" %*s:\n", width, " ");
-		else
-			printf(" %*s:	%s\n", width, " ", dl->line);
-	}
-
-	return 0;
-}
-
-/*
- * symbol__parse_objdump_line() parses objdump output (with -d --no-show-raw)
- * which looks like following
- *
- *  0000000000415500 <_init>:
- *    415500:       sub    $0x8,%rsp
- *    415504:       mov    0x2f5ad5(%rip),%rax        # 70afe0 <_DYNAMIC+0x2f8>
- *    41550b:       test   %rax,%rax
- *    41550e:       je     415515 <_init+0x15>
- *    415510:       callq  416e70 <__gmon_start__@plt>
- *    415515:       add    $0x8,%rsp
- *    415519:       retq
- *
- * it will be parsed and saved into struct disasm_line as
- *  <offset>       <name>  <ops.raw>
- *
- * The offset will be a relative offset from the start of the symbol and -1
- * means that it's not a disassembly line so should be treated differently.
- * The ops.raw part will be parsed further according to type of the instruction.
- */
-static int symbol__parse_objdump_line(struct symbol *sym, struct map *map,
-				      FILE *file, size_t privsize)
-{
-	struct annotation *notes = symbol__annotation(sym);
-	struct disasm_line *dl;
-	char *line = NULL, *parsed_line, *tmp, *tmp2, *c;
-	size_t line_len;
-	s64 line_ip, offset = -1;
-
-	if (getline(&line, &line_len, file) < 0)
-		return -1;
-
-	if (!line)
-		return -1;
-
-	while (line_len != 0 && isspace(line[line_len - 1]))
-		line[--line_len] = '\0';
-
-	c = strchr(line, '\n');
-	if (c)
-		*c = 0;
-
-	line_ip = -1;
-	parsed_line = line;
-
-	/*
-	 * Strip leading spaces:
-	 */
-	tmp = line;
-	while (*tmp) {
-		if (*tmp != ' ')
-			break;
-		tmp++;
-	}
-
-	if (*tmp) {
-		/*
-		 * Parse hexa addresses followed by ':'
-		 */
-		line_ip = strtoull(tmp, &tmp2, 16);
-		if (*tmp2 != ':' || tmp == tmp2 || tmp2[1] == '\0')
-			line_ip = -1;
-	}
-
-	if (line_ip != -1) {
-		u64 start = map__rip_2objdump(map, sym->start),
-		    end = map__rip_2objdump(map, sym->end);
-
-		offset = line_ip - start;
-		if ((u64)line_ip < start || (u64)line_ip > end)
-			offset = -1;
-		else
-			parsed_line = tmp2 + 1;
-	}
-
-	dl = disasm_line__new(offset, parsed_line, privsize);
-	free(line);
-
-	if (dl == NULL)
-		return -1;
-
-	if (dl->ops.target.offset == UINT64_MAX)
-		dl->ops.target.offset = dl->ops.target.addr -
-					map__rip_2objdump(map, sym->start);
-
-	/*
-	 * kcore has no symbols, so add the call target name if it is on the
-	 * same map.
-	 */
-	if (dl->ins && ins__is_call(dl->ins) && !dl->ops.target.name) {
-		struct symbol *s;
-		u64 ip = dl->ops.target.addr;
-
-		if (ip >= map->start && ip <= map->end) {
-			ip = map->map_ip(map, ip);
-			s = map__find_symbol(map, ip, NULL);
-			if (s && s->start == ip)
-				dl->ops.target.name = strdup(s->name);
-		}
-	}
-
-	disasm__add(&notes->src->source, dl);
-
-	return 0;
-}
-
-static void delete_last_nop(struct symbol *sym)
-{
-	struct annotation *notes = symbol__annotation(sym);
-	struct list_head *list = &notes->src->source;
-	struct disasm_line *dl;
-
-	while (!list_empty(list)) {
-		dl = list_entry(list->prev, struct disasm_line, node);
-
-		if (dl->ins && dl->ins->ops) {
-			if (dl->ins->ops != &nop_ops)
-				return;
-		} else {
-			if (!strstr(dl->line, " nop ") &&
-			    !strstr(dl->line, " nopl ") &&
-			    !strstr(dl->line, " nopw "))
-				return;
-		}
-
-		list_del(&dl->node);
-		disasm_line__free(dl);
-	}
-}
-
-int symbol__annotate(struct symbol *sym, struct map *map, size_t privsize)
-{
-	struct dso *dso = map->dso;
-	char *filename = dso__build_id_filename(dso, NULL, 0);
-	bool free_filename = true;
-	char command[PATH_MAX * 2];
-	FILE *file;
-	int err = 0;
-	char symfs_filename[PATH_MAX];
-
-	if (filename) {
-		snprintf(symfs_filename, sizeof(symfs_filename), "%s%s",
-			 symbol_conf.symfs, filename);
-	}
-
-	if (filename == NULL) {
-		if (dso->has_build_id) {
-			pr_err("Can't annotate %s: not enough memory\n",
-			       sym->name);
-			return -ENOMEM;
-		}
-		goto fallback;
-	} else if (readlink(symfs_filename, command, sizeof(command)) < 0 ||
-		   strstr(command, "[kernel.kallsyms]") ||
-		   access(symfs_filename, R_OK)) {
-		free(filename);
-fallback:
-		/*
-		 * If we don't have build-ids or the build-id file isn't in the
-		 * cache, or is just a kallsyms file, well, lets hope that this
-		 * DSO is the same as when 'perf record' ran.
-		 */
-		filename = dso->long_name;
-		snprintf(symfs_filename, sizeof(symfs_filename), "%s%s",
-			 symbol_conf.symfs, filename);
-		free_filename = false;
-	}
-
-	if (dso->symtab_type == DSO_BINARY_TYPE__KALLSYMS &&
-	    !dso__is_kcore(dso)) {
-		char bf[BUILD_ID_SIZE * 2 + 16] = " with build id ";
-		char *build_id_msg = NULL;
-
-		if (dso->annotate_warned)
-			goto out_free_filename;
-
-		if (dso->has_build_id) {
-			build_id__sprintf(dso->build_id,
-					  sizeof(dso->build_id), bf + 15);
-			build_id_msg = bf;
-		}
-		err = -ENOENT;
-		dso->annotate_warned = 1;
-		pr_err("Can't annotate %s:\n\n"
-		       "No vmlinux file%s\nwas found in the path.\n\n"
-		       "Please use:\n\n"
-		       "  perf buildid-cache -vu vmlinux\n\n"
-		       "or:\n\n"
-		       "  --vmlinux vmlinux\n",
-		       sym->name, build_id_msg ?: "");
-		goto out_free_filename;
-	}
-
-	pr_debug("%s: filename=%s, sym=%s, start=%#" PRIx64 ", end=%#" PRIx64 "\n", __func__,
-		 filename, sym->name, map->unmap_ip(map, sym->start),
-		 map->unmap_ip(map, sym->end));
-
-	pr_debug("annotating [%p] %30s : [%p] %30s\n",
-		 dso, dso->long_name, sym, sym->name);
-
-	snprintf(command, sizeof(command),
-		 "%s %s%s --start-address=0x%016" PRIx64
-		 " --stop-address=0x%016" PRIx64
-		 " -d %s %s -C %s 2>/dev/null|grep -v %s|expand",
-		 objdump_path ? objdump_path : "objdump",
-		 disassembler_style ? "-M " : "",
-		 disassembler_style ? disassembler_style : "",
-		 map__rip_2objdump(map, sym->start),
-		 map__rip_2objdump(map, sym->end+1),
-		 symbol_conf.annotate_asm_raw ? "" : "--no-show-raw",
-		 symbol_conf.annotate_src ? "-S" : "",
-		 symfs_filename, filename);
-
-	pr_debug("Executing: %s\n", command);
-
-	file = popen(command, "r");
-	if (!file)
-		goto out_free_filename;
-
-	while (!feof(file))
-		if (symbol__parse_objdump_line(sym, map, file, privsize) < 0)
-			break;
-
-	/*
-	 * kallsyms does not have symbol sizes so there may a nop at the end.
-	 * Remove it.
-	 */
-	if (dso__is_kcore(dso))
-		delete_last_nop(sym);
-
-	pclose(file);
-out_free_filename:
-	if (free_filename)
-		free(filename);
-	return err;
-}
-
-static void insert_source_line(struct rb_root *root, struct source_line *src_line)
-{
-	struct source_line *iter;
-	struct rb_node **p = &root->rb_node;
-	struct rb_node *parent = NULL;
-	int i, ret;
-
-	while (*p != NULL) {
-		parent = *p;
-		iter = rb_entry(parent, struct source_line, node);
-
-		ret = strcmp(iter->path, src_line->path);
-		if (ret == 0) {
-			for (i = 0; i < src_line->nr_pcnt; i++)
-				iter->p[i].percent_sum += src_line->p[i].percent;
-			return;
-		}
-
-		if (ret < 0)
-			p = &(*p)->rb_left;
-		else
-			p = &(*p)->rb_right;
-	}
-
-	for (i = 0; i < src_line->nr_pcnt; i++)
-		src_line->p[i].percent_sum = src_line->p[i].percent;
-
-	rb_link_node(&src_line->node, parent, p);
-	rb_insert_color(&src_line->node, root);
-}
-
-static int cmp_source_line(struct source_line *a, struct source_line *b)
-{
-	int i;
-
-	for (i = 0; i < a->nr_pcnt; i++) {
-		if (a->p[i].percent_sum == b->p[i].percent_sum)
-			continue;
-		return a->p[i].percent_sum > b->p[i].percent_sum;
-	}
-
-	return 0;
-}
-
-static void __resort_source_line(struct rb_root *root, struct source_line *src_line)
-{
-	struct source_line *iter;
-	struct rb_node **p = &root->rb_node;
-	struct rb_node *parent = NULL;
-
-	while (*p != NULL) {
-		parent = *p;
-		iter = rb_entry(parent, struct source_line, node);
-
-		if (cmp_source_line(src_line, iter))
-			p = &(*p)->rb_left;
-		else
-			p = &(*p)->rb_right;
-	}
-
-	rb_link_node(&src_line->node, parent, p);
-	rb_insert_color(&src_line->node, root);
-}
-
-static void resort_source_line(struct rb_root *dest_root, struct rb_root *src_root)
-{
-	struct source_line *src_line;
-	struct rb_node *node;
-
-	node = rb_first(src_root);
-	while (node) {
-		struct rb_node *next;
-
-		src_line = rb_entry(node, struct source_line, node);
-		next = rb_next(node);
-		rb_erase(node, src_root);
-
-		__resort_source_line(dest_root, src_line);
-		node = next;
-	}
-}
-
-static void symbol__free_source_line(struct symbol *sym, int len)
-{
-	struct annotation *notes = symbol__annotation(sym);
-	struct source_line *src_line = notes->src->lines;
-	size_t sizeof_src_line;
-	int i;
-
-	sizeof_src_line = sizeof(*src_line) +
-			  (sizeof(src_line->p) * (src_line->nr_pcnt - 1));
-
-	for (i = 0; i < len; i++) {
-		free(src_line->path);
-		src_line = (void *)src_line + sizeof_src_line;
-	}
-
-	free(notes->src->lines);
-	notes->src->lines = NULL;
-}
-
-/* Get the filename:line for the colored entries */
-static int symbol__get_source_line(struct symbol *sym, struct map *map,
-				   struct perf_evsel *evsel,
-				   struct rb_root *root, int len,
-				   const char *filename)
-{
-	u64 start;
-	int i, k;
-	int evidx = evsel->idx;
-	char cmd[PATH_MAX * 2];
-	struct source_line *src_line;
-	struct annotation *notes = symbol__annotation(sym);
-	struct sym_hist *h = annotation__histogram(notes, evidx);
-	struct rb_root tmp_root = RB_ROOT;
-	int nr_pcnt = 1;
-	u64 h_sum = h->sum;
-	size_t sizeof_src_line = sizeof(struct source_line);
-
-	if (perf_evsel__is_group_event(evsel)) {
-		for (i = 1; i < evsel->nr_members; i++) {
-			h = annotation__histogram(notes, evidx + i);
-			h_sum += h->sum;
-		}
-		nr_pcnt = evsel->nr_members;
-		sizeof_src_line += (nr_pcnt - 1) * sizeof(src_line->p);
-	}
-
-	if (!h_sum)
-		return 0;
-
-	src_line = notes->src->lines = calloc(len, sizeof_src_line);
-	if (!notes->src->lines)
-		return -1;
-
-	start = map__rip_2objdump(map, sym->start);
-
-	for (i = 0; i < len; i++) {
-		char *path = NULL;
-		size_t line_len;
-		u64 offset;
-		FILE *fp;
-		double percent_max = 0.0;
-
-		src_line->nr_pcnt = nr_pcnt;
-
-		for (k = 0; k < nr_pcnt; k++) {
-			h = annotation__histogram(notes, evidx + k);
-			src_line->p[k].percent = 100.0 * h->addr[i] / h->sum;
-
-			if (src_line->p[k].percent > percent_max)
-				percent_max = src_line->p[k].percent;
-		}
-
-		if (percent_max <= 0.5)
-			goto next;
-
-		offset = start + i;
-		sprintf(cmd, "addr2line -e %s %016" PRIx64, filename, offset);
-		fp = popen(cmd, "r");
-		if (!fp)
-			goto next;
-
-		if (getline(&path, &line_len, fp) < 0 || !line_len)
-			goto next_close;
-
-		src_line->path = malloc(sizeof(char) * line_len + 1);
-		if (!src_line->path)
-			goto next_close;
-
-		strcpy(src_line->path, path);
-		insert_source_line(&tmp_root, src_line);
-
-	next_close:
-		pclose(fp);
-	next:
-		src_line = (void *)src_line + sizeof_src_line;
-	}
-
-	resort_source_line(root, &tmp_root);
-	return 0;
-}
-
-static void print_summary(struct rb_root *root, const char *filename)
-{
-	struct source_line *src_line;
-	struct rb_node *node;
-
-	printf("\nSorted summary for file %s\n", filename);
-	printf("----------------------------------------------\n\n");
-
-	if (RB_EMPTY_ROOT(root)) {
-		printf(" Nothing higher than %1.1f%%\n", MIN_GREEN);
-		return;
-	}
-
-	node = rb_first(root);
-	while (node) {
-		double percent, percent_max = 0.0;
-		const char *color;
-		char *path;
-		int i;
-
-		src_line = rb_entry(node, struct source_line, node);
-		for (i = 0; i < src_line->nr_pcnt; i++) {
-			percent = src_line->p[i].percent_sum;
-			color = get_percent_color(percent);
-			color_fprintf(stdout, color, " %7.2f", percent);
-
-			if (percent > percent_max)
-				percent_max = percent;
-		}
-
-		path = src_line->path;
-		color = get_percent_color(percent_max);
-		color_fprintf(stdout, color, " %s", path);
-
-		node = rb_next(node);
-	}
-}
-
-static void symbol__annotate_hits(struct symbol *sym, struct perf_evsel *evsel)
-{
-	struct annotation *notes = symbol__annotation(sym);
-	struct sym_hist *h = annotation__histogram(notes, evsel->idx);
-	u64 len = symbol__size(sym), offset;
-
-	for (offset = 0; offset < len; ++offset)
-		if (h->addr[offset] != 0)
-			printf("%*" PRIx64 ": %" PRIu64 "\n", BITS_PER_LONG / 2,
-			       sym->start + offset, h->addr[offset]);
-	printf("%*s: %" PRIu64 "\n", BITS_PER_LONG / 2, "h->sum", h->sum);
-}
-
-int symbol__annotate_printf(struct symbol *sym, struct map *map,
-			    struct perf_evsel *evsel, bool full_paths,
-			    int min_pcnt, int max_lines, int context)
-{
-	struct dso *dso = map->dso;
-	char *filename;
-	const char *d_filename;
-	struct annotation *notes = symbol__annotation(sym);
-	struct disasm_line *pos, *queue = NULL;
-	u64 start = map__rip_2objdump(map, sym->start);
-	int printed = 2, queue_len = 0;
-	int more = 0;
-	u64 len;
-	int width = 8;
-	int namelen;
-
-	filename = strdup(dso->long_name);
-	if (!filename)
-		return -ENOMEM;
-
-	if (full_paths)
-		d_filename = filename;
-	else
-		d_filename = basename(filename);
-
-	len = symbol__size(sym);
-	namelen = strlen(d_filename);
-
-	if (perf_evsel__is_group_event(evsel))
-		width *= evsel->nr_members;
-
-	printf(" %-*.*s|	Source code & Disassembly of %s\n",
-	       width, width, "Percent", d_filename);
-	printf("-%-*.*s-------------------------------------\n",
-	       width+namelen, width+namelen, graph_dotted_line);
-
-	if (verbose)
-		symbol__annotate_hits(sym, evsel);
-
-	list_for_each_entry(pos, &notes->src->source, node) {
-		if (context && queue == NULL) {
-			queue = pos;
-			queue_len = 0;
-		}
-
-		switch (disasm_line__print(pos, sym, start, evsel, len,
-					    min_pcnt, printed, max_lines,
-					    queue)) {
-		case 0:
-			++printed;
-			if (context) {
-				printed += queue_len;
-				queue = NULL;
-				queue_len = 0;
-			}
-			break;
-		case 1:
-			/* filtered by max_lines */
-			++more;
-			break;
-		case -1:
-		default:
-			/*
-			 * Filtered by min_pcnt or non IP lines when
-			 * context != 0
-			 */
-			if (!context)
-				break;
-			if (queue_len == context)
-				queue = list_entry(queue->node.next, typeof(*queue), node);
-			else
-				++queue_len;
-			break;
-		}
-	}
-
-	free(filename);
-
-	return more;
-}
-
-void symbol__annotate_zero_histogram(struct symbol *sym, int evidx)
-{
-	struct annotation *notes = symbol__annotation(sym);
-	struct sym_hist *h = annotation__histogram(notes, evidx);
-
-	memset(h, 0, notes->src->sizeof_sym_hist);
-}
-
-void symbol__annotate_decay_histogram(struct symbol *sym, int evidx)
-{
-	struct annotation *notes = symbol__annotation(sym);
-	struct sym_hist *h = annotation__histogram(notes, evidx);
-	int len = symbol__size(sym), offset;
-
-	h->sum = 0;
-	for (offset = 0; offset < len; ++offset) {
-		h->addr[offset] = h->addr[offset] * 7 / 8;
-		h->sum += h->addr[offset];
-	}
-}
-
-void disasm__purge(struct list_head *head)
-{
-	struct disasm_line *pos, *n;
-
-	list_for_each_entry_safe(pos, n, head, node) {
-		list_del(&pos->node);
-		disasm_line__free(pos);
-	}
-}
-
-static size_t disasm_line__fprintf(struct disasm_line *dl, FILE *fp)
-{
-	size_t printed;
-
-	if (dl->offset == -1)
-		return fprintf(fp, "%s\n", dl->line);
-
-	printed = fprintf(fp, "%#" PRIx64 " %s", dl->offset, dl->name);
-
-	if (dl->ops.raw[0] != '\0') {
-		printed += fprintf(fp, "%.*s %s\n", 6 - (int)printed, " ",
-				   dl->ops.raw);
-	}
-
-	return printed + fprintf(fp, "\n");
-}
-
-size_t disasm__fprintf(struct list_head *head, FILE *fp)
-{
-	struct disasm_line *pos;
-	size_t printed = 0;
-
-	list_for_each_entry(pos, head, node)
-		printed += disasm_line__fprintf(pos, fp);
-
-	return printed;
-}
-
-int symbol__tty_annotate(struct symbol *sym, struct map *map,
-			 struct perf_evsel *evsel, bool print_lines,
-			 bool full_paths, int min_pcnt, int max_lines)
-{
-	struct dso *dso = map->dso;
-	const char *filename = dso->long_name;
-	struct rb_root source_line = RB_ROOT;
-	u64 len;
-
-	if (symbol__annotate(sym, map, 0) < 0)
-		return -1;
-
-	len = symbol__size(sym);
-
-	if (print_lines) {
-		symbol__get_source_line(sym, map, evsel, &source_line,
-					len, filename);
-		print_summary(&source_line, filename);
-	}
-
-	symbol__annotate_printf(sym, map, evsel, full_paths,
-				min_pcnt, max_lines, 0);
-	if (print_lines)
-		symbol__free_source_line(sym, len);
-
-	disasm__purge(&symbol__annotation(sym)->src->source);
-
-	return 0;
-}
diff --git a/src/tools/perf/util/annotate.h b/src/tools/perf/util/annotate.h
deleted file mode 100644
index af75515..0000000
--- a/src/tools/perf/util/annotate.h
+++ /dev/null
@@ -1,194 +0,0 @@
-#ifndef __PERF_ANNOTATE_H
-#define __PERF_ANNOTATE_H
-
-#include <stdbool.h>
-#include <stdint.h>
-#include "types.h"
-#include "symbol.h"
-#include "hist.h"
-#include "sort.h"
-#include <linux/list.h>
-#include <linux/rbtree.h>
-#include <pthread.h>
-
-struct ins;
-
-struct ins_operands {
-	char	*raw;
-	struct {
-		char	*raw;
-		char	*name;
-		u64	addr;
-		u64	offset;
-	} target;
-	union {
-		struct {
-			char	*raw;
-			char	*name;
-			u64	addr;
-		} source;
-		struct {
-			struct ins *ins;
-			struct ins_operands *ops;
-		} locked;
-	};
-};
-
-struct ins_ops {
-	void (*free)(struct ins_operands *ops);
-	int (*parse)(struct ins_operands *ops);
-	int (*scnprintf)(struct ins *ins, char *bf, size_t size,
-			 struct ins_operands *ops);
-};
-
-struct ins {
-	const char     *name;
-	struct ins_ops *ops;
-};
-
-bool ins__is_jump(const struct ins *ins);
-bool ins__is_call(const struct ins *ins);
-int ins__scnprintf(struct ins *ins, char *bf, size_t size, struct ins_operands *ops);
-
-struct annotation;
-
-struct disasm_line {
-	struct list_head    node;
-	s64		    offset;
-	char		    *line;
-	char		    *name;
-	struct ins	    *ins;
-	struct ins_operands ops;
-};
-
-static inline bool disasm_line__has_offset(const struct disasm_line *dl)
-{
-	return dl->ops.target.offset != UINT64_MAX;
-}
-
-void disasm_line__free(struct disasm_line *dl);
-struct disasm_line *disasm__get_next_ip_line(struct list_head *head, struct disasm_line *pos);
-int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool raw);
-size_t disasm__fprintf(struct list_head *head, FILE *fp);
-double disasm__calc_percent(struct annotation *notes, int evidx, s64 offset,
-			    s64 end, const char **path);
-
-struct sym_hist {
-	u64		sum;
-	u64		addr[0];
-};
-
-struct source_line_percent {
-	double		percent;
-	double		percent_sum;
-};
-
-struct source_line {
-	struct rb_node	node;
-	char		*path;
-	int		nr_pcnt;
-	struct source_line_percent p[1];
-};
-
-/** struct annotated_source - symbols with hits have this attached as in sannotation
- *
- * @histogram: Array of addr hit histograms per event being monitored
- * @lines: If 'print_lines' is specified, per source code line percentages
- * @source: source parsed from a disassembler like objdump -dS
- *
- * lines is allocated, percentages calculated and all sorted by percentage
- * when the annotation is about to be presented, so the percentages are for
- * one of the entries in the histogram array, i.e. for the event/counter being
- * presented. It is deallocated right after symbol__{tui,tty,etc}_annotate
- * returns.
- */
-struct annotated_source {
-	struct list_head   source;
-	struct source_line *lines;
-	int    		   nr_histograms;
-	int    		   sizeof_sym_hist;
-	struct sym_hist	   histograms[0];
-};
-
-struct annotation {
-	pthread_mutex_t		lock;
-	struct annotated_source *src;
-};
-
-struct sannotation {
-	struct annotation annotation;
-	struct symbol	  symbol;
-};
-
-static inline struct sym_hist *annotation__histogram(struct annotation *notes, int idx)
-{
-	return (((void *)&notes->src->histograms) +
-	 	(notes->src->sizeof_sym_hist * idx));
-}
-
-static inline struct annotation *symbol__annotation(struct symbol *sym)
-{
-	struct sannotation *a = container_of(sym, struct sannotation, symbol);
-	return &a->annotation;
-}
-
-int symbol__inc_addr_samples(struct symbol *sym, struct map *map,
-			     int evidx, u64 addr);
-int symbol__alloc_hist(struct symbol *sym);
-void symbol__annotate_zero_histograms(struct symbol *sym);
-
-int symbol__annotate(struct symbol *sym, struct map *map, size_t privsize);
-int symbol__annotate_init(struct map *map __maybe_unused, struct symbol *sym);
-int symbol__annotate_printf(struct symbol *sym, struct map *map,
-			    struct perf_evsel *evsel, bool full_paths,
-			    int min_pcnt, int max_lines, int context);
-void symbol__annotate_zero_histogram(struct symbol *sym, int evidx);
-void symbol__annotate_decay_histogram(struct symbol *sym, int evidx);
-void disasm__purge(struct list_head *head);
-
-int symbol__tty_annotate(struct symbol *sym, struct map *map,
-			 struct perf_evsel *evsel, bool print_lines,
-			 bool full_paths, int min_pcnt, int max_lines);
-
-#ifdef SLANG_SUPPORT
-int symbol__tui_annotate(struct symbol *sym, struct map *map,
-			 struct perf_evsel *evsel,
-			 struct hist_browser_timer *hbt);
-#else
-static inline int symbol__tui_annotate(struct symbol *sym __maybe_unused,
-				struct map *map __maybe_unused,
-				struct perf_evsel *evsel  __maybe_unused,
-				struct hist_browser_timer *hbt
-				__maybe_unused)
-{
-	return 0;
-}
-#endif
-
-#ifdef GTK2_SUPPORT
-int symbol__gtk_annotate(struct symbol *sym, struct map *map,
-			 struct perf_evsel *evsel,
-			 struct hist_browser_timer *hbt);
-
-static inline int hist_entry__gtk_annotate(struct hist_entry *he,
-					   struct perf_evsel *evsel,
-					   struct hist_browser_timer *hbt)
-{
-	return symbol__gtk_annotate(he->ms.sym, he->ms.map, evsel, hbt);
-}
-
-void perf_gtk__show_annotations(void);
-#else
-static inline int hist_entry__gtk_annotate(struct hist_entry *he __maybe_unused,
-				struct perf_evsel *evsel __maybe_unused,
-				struct hist_browser_timer *hbt __maybe_unused)
-{
-	return 0;
-}
-
-static inline void perf_gtk__show_annotations(void) {}
-#endif
-
-extern const char	*disassembler_style;
-
-#endif	/* __PERF_ANNOTATE_H */
diff --git a/src/tools/perf/util/bitmap.c b/src/tools/perf/util/bitmap.c
deleted file mode 100644
index 0a1adc1..0000000
--- a/src/tools/perf/util/bitmap.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * From lib/bitmap.c
- * Helper functions for bitmap.h.
- *
- * This source code is licensed under the GNU General Public License,
- * Version 2.  See the file COPYING for more details.
- */
-#include <linux/bitmap.h>
-
-int __bitmap_weight(const unsigned long *bitmap, int bits)
-{
-	int k, w = 0, lim = bits/BITS_PER_LONG;
-
-	for (k = 0; k < lim; k++)
-		w += hweight_long(bitmap[k]);
-
-	if (bits % BITS_PER_LONG)
-		w += hweight_long(bitmap[k] & BITMAP_LAST_WORD_MASK(bits));
-
-	return w;
-}
-
-void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
-		 const unsigned long *bitmap2, int bits)
-{
-	int k;
-	int nr = BITS_TO_LONGS(bits);
-
-	for (k = 0; k < nr; k++)
-		dst[k] = bitmap1[k] | bitmap2[k];
-}
diff --git a/src/tools/perf/util/build-id.c b/src/tools/perf/util/build-id.c
deleted file mode 100644
index 7ded71d..0000000
--- a/src/tools/perf/util/build-id.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * build-id.c
- *
- * build-id support
- *
- * Copyright (C) 2009, 2010 Red Hat Inc.
- * Copyright (C) 2009, 2010 Arnaldo Carvalho de Melo <acme@redhat.com>
- */
-#include "util.h"
-#include <stdio.h>
-#include "build-id.h"
-#include "event.h"
-#include "symbol.h"
-#include <linux/kernel.h>
-#include "debug.h"
-#include "session.h"
-#include "tool.h"
-
-int build_id__mark_dso_hit(struct perf_tool *tool __maybe_unused,
-			   union perf_event *event,
-			   struct perf_sample *sample,
-			   struct perf_evsel *evsel __maybe_unused,
-			   struct machine *machine)
-{
-	struct addr_location al;
-	u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
-	struct thread *thread = machine__findnew_thread(machine, sample->pid,
-							sample->pid);
-
-	if (thread == NULL) {
-		pr_err("problem processing %d event, skipping it.\n",
-			event->header.type);
-		return -1;
-	}
-
-	thread__find_addr_map(thread, machine, cpumode, MAP__FUNCTION,
-			      sample->ip, &al);
-
-	if (al.map != NULL)
-		al.map->dso->hit = 1;
-
-	return 0;
-}
-
-static int perf_event__exit_del_thread(struct perf_tool *tool __maybe_unused,
-				       union perf_event *event,
-				       struct perf_sample *sample
-				       __maybe_unused,
-				       struct machine *machine)
-{
-	struct thread *thread = machine__findnew_thread(machine,
-							event->fork.pid,
-							event->fork.tid);
-
-	dump_printf("(%d:%d):(%d:%d)\n", event->fork.pid, event->fork.tid,
-		    event->fork.ppid, event->fork.ptid);
-
-	if (thread) {
-		rb_erase(&thread->rb_node, &machine->threads);
-		machine->last_match = NULL;
-		thread__delete(thread);
-	}
-
-	return 0;
-}
-
-struct perf_tool build_id__mark_dso_hit_ops = {
-	.sample	= build_id__mark_dso_hit,
-	.mmap	= perf_event__process_mmap,
-	.mmap2	= perf_event__process_mmap2,
-	.fork	= perf_event__process_fork,
-	.exit	= perf_event__exit_del_thread,
-	.attr		 = perf_event__process_attr,
-	.build_id	 = perf_event__process_build_id,
-};
-
-int build_id__sprintf(const u8 *build_id, int len, char *bf)
-{
-	char *bid = bf;
-	const u8 *raw = build_id;
-	int i;
-
-	for (i = 0; i < len; ++i) {
-		sprintf(bid, "%02x", *raw);
-		++raw;
-		bid += 2;
-	}
-
-	return raw - build_id;
-}
-
-char *dso__build_id_filename(struct dso *self, char *bf, size_t size)
-{
-	char build_id_hex[BUILD_ID_SIZE * 2 + 1];
-
-	if (!self->has_build_id)
-		return NULL;
-
-	build_id__sprintf(self->build_id, sizeof(self->build_id), build_id_hex);
-	if (bf == NULL) {
-		if (asprintf(&bf, "%s/.build-id/%.2s/%s", buildid_dir,
-			     build_id_hex, build_id_hex + 2) < 0)
-			return NULL;
-	} else
-		snprintf(bf, size, "%s/.build-id/%.2s/%s", buildid_dir,
-			 build_id_hex, build_id_hex + 2);
-	return bf;
-}
diff --git a/src/tools/perf/util/build-id.h b/src/tools/perf/util/build-id.h
deleted file mode 100644
index a811f5c..0000000
--- a/src/tools/perf/util/build-id.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef PERF_BUILD_ID_H_
-#define PERF_BUILD_ID_H_ 1
-
-#define BUILD_ID_SIZE 20
-
-#include "tool.h"
-#include "types.h"
-
-extern struct perf_tool build_id__mark_dso_hit_ops;
-struct dso;
-
-int build_id__sprintf(const u8 *build_id, int len, char *bf);
-char *dso__build_id_filename(struct dso *self, char *bf, size_t size);
-
-int build_id__mark_dso_hit(struct perf_tool *tool, union perf_event *event,
-			   struct perf_sample *sample, struct perf_evsel *evsel,
-			   struct machine *machine);
-
-#endif
diff --git a/src/tools/perf/util/cache.h b/src/tools/perf/util/cache.h
deleted file mode 100644
index 26e3672..0000000
--- a/src/tools/perf/util/cache.h
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef __PERF_CACHE_H
-#define __PERF_CACHE_H
-
-#include <stdbool.h>
-#include "util.h"
-#include "strbuf.h"
-#include "../perf.h"
-#include "../ui/ui.h"
-
-#define CMD_EXEC_PATH "--exec-path"
-#define CMD_PERF_DIR "--perf-dir="
-#define CMD_WORK_TREE "--work-tree="
-#define CMD_DEBUGFS_DIR "--debugfs-dir="
-
-#define PERF_DIR_ENVIRONMENT "PERF_DIR"
-#define PERF_WORK_TREE_ENVIRONMENT "PERF_WORK_TREE"
-#define EXEC_PATH_ENVIRONMENT "PERF_EXEC_PATH"
-#define DEFAULT_PERF_DIR_ENVIRONMENT ".perf"
-#define PERF_DEBUGFS_ENVIRONMENT "PERF_DEBUGFS_DIR"
-
-typedef int (*config_fn_t)(const char *, const char *, void *);
-extern int perf_default_config(const char *, const char *, void *);
-extern int perf_config(config_fn_t fn, void *);
-extern int perf_config_int(const char *, const char *);
-extern int perf_config_bool(const char *, const char *);
-extern int config_error_nonbool(const char *);
-extern const char *perf_config_dirname(const char *, const char *);
-
-/* pager.c */
-extern void setup_pager(void);
-extern const char *pager_program;
-extern int pager_in_use(void);
-extern int pager_use_color;
-
-char *alias_lookup(const char *alias);
-int split_cmdline(char *cmdline, const char ***argv);
-
-#define alloc_nr(x) (((x)+16)*3/2)
-
-/*
- * Realloc the buffer pointed at by variable 'x' so that it can hold
- * at least 'nr' entries; the number of entries currently allocated
- * is 'alloc', using the standard growing factor alloc_nr() macro.
- *
- * DO NOT USE any expression with side-effect for 'x' or 'alloc'.
- */
-#define ALLOC_GROW(x, nr, alloc) \
-	do { \
-		if ((nr) > alloc) { \
-			if (alloc_nr(alloc) < (nr)) \
-				alloc = (nr); \
-			else \
-				alloc = alloc_nr(alloc); \
-			x = xrealloc((x), alloc * sizeof(*(x))); \
-		} \
-	} while(0)
-
-
-static inline int is_absolute_path(const char *path)
-{
-	return path[0] == '/';
-}
-
-const char *make_nonrelative_path(const char *path);
-char *strip_path_suffix(const char *path, const char *suffix);
-
-extern char *mkpath(const char *fmt, ...) __attribute__((format (printf, 1, 2)));
-extern char *perf_path(const char *fmt, ...) __attribute__((format (printf, 1, 2)));
-
-extern char *perf_pathdup(const char *fmt, ...)
-	__attribute__((format (printf, 1, 2)));
-
-#ifndef HAVE_STRLCPY
-extern size_t strlcpy(char *dest, const char *src, size_t size);
-#endif
-
-#endif /* __PERF_CACHE_H */
diff --git a/src/tools/perf/util/callchain.c b/src/tools/perf/util/callchain.c
deleted file mode 100644
index 482f680..0000000
--- a/src/tools/perf/util/callchain.c
+++ /dev/null
@@ -1,458 +0,0 @@
-/*
- * Copyright (C) 2009-2011, Frederic Weisbecker <fweisbec@gmail.com>
- *
- * Handle the callchains from the stream in an ad-hoc radix tree and then
- * sort them in an rbtree.
- *
- * Using a radix for code path provides a fast retrieval and factorizes
- * memory use. Also that lets us use the paths in a hierarchical graph view.
- *
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdbool.h>
-#include <errno.h>
-#include <math.h>
-
-#include "hist.h"
-#include "util.h"
-#include "callchain.h"
-
-__thread struct callchain_cursor callchain_cursor;
-
-#define chain_for_each_child(child, parent)	\
-	list_for_each_entry(child, &parent->children, siblings)
-
-#define chain_for_each_child_safe(child, next, parent)	\
-	list_for_each_entry_safe(child, next, &parent->children, siblings)
-
-static void
-rb_insert_callchain(struct rb_root *root, struct callchain_node *chain,
-		    enum chain_mode mode)
-{
-	struct rb_node **p = &root->rb_node;
-	struct rb_node *parent = NULL;
-	struct callchain_node *rnode;
-	u64 chain_cumul = callchain_cumul_hits(chain);
-
-	while (*p) {
-		u64 rnode_cumul;
-
-		parent = *p;
-		rnode = rb_entry(parent, struct callchain_node, rb_node);
-		rnode_cumul = callchain_cumul_hits(rnode);
-
-		switch (mode) {
-		case CHAIN_FLAT:
-			if (rnode->hit < chain->hit)
-				p = &(*p)->rb_left;
-			else
-				p = &(*p)->rb_right;
-			break;
-		case CHAIN_GRAPH_ABS: /* Falldown */
-		case CHAIN_GRAPH_REL:
-			if (rnode_cumul < chain_cumul)
-				p = &(*p)->rb_left;
-			else
-				p = &(*p)->rb_right;
-			break;
-		case CHAIN_NONE:
-		default:
-			break;
-		}
-	}
-
-	rb_link_node(&chain->rb_node, parent, p);
-	rb_insert_color(&chain->rb_node, root);
-}
-
-static void
-__sort_chain_flat(struct rb_root *rb_root, struct callchain_node *node,
-		  u64 min_hit)
-{
-	struct callchain_node *child;
-
-	chain_for_each_child(child, node)
-		__sort_chain_flat(rb_root, child, min_hit);
-
-	if (node->hit && node->hit >= min_hit)
-		rb_insert_callchain(rb_root, node, CHAIN_FLAT);
-}
-
-/*
- * Once we get every callchains from the stream, we can now
- * sort them by hit
- */
-static void
-sort_chain_flat(struct rb_root *rb_root, struct callchain_root *root,
-		u64 min_hit, struct callchain_param *param __maybe_unused)
-{
-	__sort_chain_flat(rb_root, &root->node, min_hit);
-}
-
-static void __sort_chain_graph_abs(struct callchain_node *node,
-				   u64 min_hit)
-{
-	struct callchain_node *child;
-
-	node->rb_root = RB_ROOT;
-
-	chain_for_each_child(child, node) {
-		__sort_chain_graph_abs(child, min_hit);
-		if (callchain_cumul_hits(child) >= min_hit)
-			rb_insert_callchain(&node->rb_root, child,
-					    CHAIN_GRAPH_ABS);
-	}
-}
-
-static void
-sort_chain_graph_abs(struct rb_root *rb_root, struct callchain_root *chain_root,
-		     u64 min_hit, struct callchain_param *param __maybe_unused)
-{
-	__sort_chain_graph_abs(&chain_root->node, min_hit);
-	rb_root->rb_node = chain_root->node.rb_root.rb_node;
-}
-
-static void __sort_chain_graph_rel(struct callchain_node *node,
-				   double min_percent)
-{
-	struct callchain_node *child;
-	u64 min_hit;
-
-	node->rb_root = RB_ROOT;
-	min_hit = ceil(node->children_hit * min_percent);
-
-	chain_for_each_child(child, node) {
-		__sort_chain_graph_rel(child, min_percent);
-		if (callchain_cumul_hits(child) >= min_hit)
-			rb_insert_callchain(&node->rb_root, child,
-					    CHAIN_GRAPH_REL);
-	}
-}
-
-static void
-sort_chain_graph_rel(struct rb_root *rb_root, struct callchain_root *chain_root,
-		     u64 min_hit __maybe_unused, struct callchain_param *param)
-{
-	__sort_chain_graph_rel(&chain_root->node, param->min_percent / 100.0);
-	rb_root->rb_node = chain_root->node.rb_root.rb_node;
-}
-
-int callchain_register_param(struct callchain_param *param)
-{
-	switch (param->mode) {
-	case CHAIN_GRAPH_ABS:
-		param->sort = sort_chain_graph_abs;
-		break;
-	case CHAIN_GRAPH_REL:
-		param->sort = sort_chain_graph_rel;
-		break;
-	case CHAIN_FLAT:
-		param->sort = sort_chain_flat;
-		break;
-	case CHAIN_NONE:
-	default:
-		return -1;
-	}
-	return 0;
-}
-
-/*
- * Create a child for a parent. If inherit_children, then the new child
- * will become the new parent of it's parent children
- */
-static struct callchain_node *
-create_child(struct callchain_node *parent, bool inherit_children)
-{
-	struct callchain_node *new;
-
-	new = zalloc(sizeof(*new));
-	if (!new) {
-		perror("not enough memory to create child for code path tree");
-		return NULL;
-	}
-	new->parent = parent;
-	INIT_LIST_HEAD(&new->children);
-	INIT_LIST_HEAD(&new->val);
-
-	if (inherit_children) {
-		struct callchain_node *next;
-
-		list_splice(&parent->children, &new->children);
-		INIT_LIST_HEAD(&parent->children);
-
-		chain_for_each_child(next, new)
-			next->parent = new;
-	}
-	list_add_tail(&new->siblings, &parent->children);
-
-	return new;
-}
-
-
-/*
- * Fill the node with callchain values
- */
-static void
-fill_node(struct callchain_node *node, struct callchain_cursor *cursor)
-{
-	struct callchain_cursor_node *cursor_node;
-
-	node->val_nr = cursor->nr - cursor->pos;
-	if (!node->val_nr)
-		pr_warning("Warning: empty node in callchain tree\n");
-
-	cursor_node = callchain_cursor_current(cursor);
-
-	while (cursor_node) {
-		struct callchain_list *call;
-
-		call = zalloc(sizeof(*call));
-		if (!call) {
-			perror("not enough memory for the code path tree");
-			return;
-		}
-		call->ip = cursor_node->ip;
-		call->ms.sym = cursor_node->sym;
-		call->ms.map = cursor_node->map;
-		list_add_tail(&call->list, &node->val);
-
-		callchain_cursor_advance(cursor);
-		cursor_node = callchain_cursor_current(cursor);
-	}
-}
-
-static void
-add_child(struct callchain_node *parent,
-	  struct callchain_cursor *cursor,
-	  u64 period)
-{
-	struct callchain_node *new;
-
-	new = create_child(parent, false);
-	fill_node(new, cursor);
-
-	new->children_hit = 0;
-	new->hit = period;
-}
-
-/*
- * Split the parent in two parts (a new child is created) and
- * give a part of its callchain to the created child.
- * Then create another child to host the given callchain of new branch
- */
-static void
-split_add_child(struct callchain_node *parent,
-		struct callchain_cursor *cursor,
-		struct callchain_list *to_split,
-		u64 idx_parents, u64 idx_local, u64 period)
-{
-	struct callchain_node *new;
-	struct list_head *old_tail;
-	unsigned int idx_total = idx_parents + idx_local;
-
-	/* split */
-	new = create_child(parent, true);
-
-	/* split the callchain and move a part to the new child */
-	old_tail = parent->val.prev;
-	list_del_range(&to_split->list, old_tail);
-	new->val.next = &to_split->list;
-	new->val.prev = old_tail;
-	to_split->list.prev = &new->val;
-	old_tail->next = &new->val;
-
-	/* split the hits */
-	new->hit = parent->hit;
-	new->children_hit = parent->children_hit;
-	parent->children_hit = callchain_cumul_hits(new);
-	new->val_nr = parent->val_nr - idx_local;
-	parent->val_nr = idx_local;
-
-	/* create a new child for the new branch if any */
-	if (idx_total < cursor->nr) {
-		parent->hit = 0;
-		add_child(parent, cursor, period);
-		parent->children_hit += period;
-	} else {
-		parent->hit = period;
-	}
-}
-
-static int
-append_chain(struct callchain_node *root,
-	     struct callchain_cursor *cursor,
-	     u64 period);
-
-static void
-append_chain_children(struct callchain_node *root,
-		      struct callchain_cursor *cursor,
-		      u64 period)
-{
-	struct callchain_node *rnode;
-
-	/* lookup in childrens */
-	chain_for_each_child(rnode, root) {
-		unsigned int ret = append_chain(rnode, cursor, period);
-
-		if (!ret)
-			goto inc_children_hit;
-	}
-	/* nothing in children, add to the current node */
-	add_child(root, cursor, period);
-
-inc_children_hit:
-	root->children_hit += period;
-}
-
-static int
-append_chain(struct callchain_node *root,
-	     struct callchain_cursor *cursor,
-	     u64 period)
-{
-	struct callchain_cursor_node *curr_snap = cursor->curr;
-	struct callchain_list *cnode;
-	u64 start = cursor->pos;
-	bool found = false;
-	u64 matches;
-
-	/*
-	 * Lookup in the current node
-	 * If we have a symbol, then compare the start to match
-	 * anywhere inside a function, unless function
-	 * mode is disabled.
-	 */
-	list_for_each_entry(cnode, &root->val, list) {
-		struct callchain_cursor_node *node;
-		struct symbol *sym;
-
-		node = callchain_cursor_current(cursor);
-		if (!node)
-			break;
-
-		sym = node->sym;
-
-		if (cnode->ms.sym && sym &&
-		    callchain_param.key == CCKEY_FUNCTION) {
-			if (cnode->ms.sym->start != sym->start)
-				break;
-		} else if (cnode->ip != node->ip)
-			break;
-
-		if (!found)
-			found = true;
-
-		callchain_cursor_advance(cursor);
-	}
-
-	/* matches not, relay on the parent */
-	if (!found) {
-		cursor->curr = curr_snap;
-		cursor->pos = start;
-		return -1;
-	}
-
-	matches = cursor->pos - start;
-
-	/* we match only a part of the node. Split it and add the new chain */
-	if (matches < root->val_nr) {
-		split_add_child(root, cursor, cnode, start, matches, period);
-		return 0;
-	}
-
-	/* we match 100% of the path, increment the hit */
-	if (matches == root->val_nr && cursor->pos == cursor->nr) {
-		root->hit += period;
-		return 0;
-	}
-
-	/* We match the node and still have a part remaining */
-	append_chain_children(root, cursor, period);
-
-	return 0;
-}
-
-int callchain_append(struct callchain_root *root,
-		     struct callchain_cursor *cursor,
-		     u64 period)
-{
-	if (!cursor->nr)
-		return 0;
-
-	callchain_cursor_commit(cursor);
-
-	append_chain_children(&root->node, cursor, period);
-
-	if (cursor->nr > root->max_depth)
-		root->max_depth = cursor->nr;
-
-	return 0;
-}
-
-static int
-merge_chain_branch(struct callchain_cursor *cursor,
-		   struct callchain_node *dst, struct callchain_node *src)
-{
-	struct callchain_cursor_node **old_last = cursor->last;
-	struct callchain_node *child, *next_child;
-	struct callchain_list *list, *next_list;
-	int old_pos = cursor->nr;
-	int err = 0;
-
-	list_for_each_entry_safe(list, next_list, &src->val, list) {
-		callchain_cursor_append(cursor, list->ip,
-					list->ms.map, list->ms.sym);
-		list_del(&list->list);
-		free(list);
-	}
-
-	if (src->hit) {
-		callchain_cursor_commit(cursor);
-		append_chain_children(dst, cursor, src->hit);
-	}
-
-	chain_for_each_child_safe(child, next_child, src) {
-		err = merge_chain_branch(cursor, dst, child);
-		if (err)
-			break;
-
-		list_del(&child->siblings);
-		free(child);
-	}
-
-	cursor->nr = old_pos;
-	cursor->last = old_last;
-
-	return err;
-}
-
-int callchain_merge(struct callchain_cursor *cursor,
-		    struct callchain_root *dst, struct callchain_root *src)
-{
-	return merge_chain_branch(cursor, &dst->node, &src->node);
-}
-
-int callchain_cursor_append(struct callchain_cursor *cursor,
-			    u64 ip, struct map *map, struct symbol *sym)
-{
-	struct callchain_cursor_node *node = *cursor->last;
-
-	if (!node) {
-		node = calloc(1, sizeof(*node));
-		if (!node)
-			return -ENOMEM;
-
-		*cursor->last = node;
-	}
-
-	node->ip = ip;
-	node->map = map;
-	node->sym = sym;
-
-	cursor->nr++;
-
-	cursor->last = &node->next;
-
-	return 0;
-}
diff --git a/src/tools/perf/util/callchain.h b/src/tools/perf/util/callchain.h
deleted file mode 100644
index 9e99060..0000000
--- a/src/tools/perf/util/callchain.h
+++ /dev/null
@@ -1,155 +0,0 @@
-#ifndef __PERF_CALLCHAIN_H
-#define __PERF_CALLCHAIN_H
-
-#include "../perf.h"
-#include <linux/list.h>
-#include <linux/rbtree.h>
-#include "event.h"
-#include "symbol.h"
-
-enum chain_mode {
-	CHAIN_NONE,
-	CHAIN_FLAT,
-	CHAIN_GRAPH_ABS,
-	CHAIN_GRAPH_REL
-};
-
-enum chain_order {
-	ORDER_CALLER,
-	ORDER_CALLEE
-};
-
-struct callchain_node {
-	struct callchain_node	*parent;
-	struct list_head	siblings;
-	struct list_head	children;
-	struct list_head	val;
-	struct rb_node		rb_node; /* to sort nodes in an rbtree */
-	struct rb_root		rb_root; /* sorted tree of children */
-	unsigned int		val_nr;
-	u64			hit;
-	u64			children_hit;
-};
-
-struct callchain_root {
-	u64			max_depth;
-	struct callchain_node	node;
-};
-
-struct callchain_param;
-
-typedef void (*sort_chain_func_t)(struct rb_root *, struct callchain_root *,
-				 u64, struct callchain_param *);
-
-enum chain_key {
-	CCKEY_FUNCTION,
-	CCKEY_ADDRESS
-};
-
-struct callchain_param {
-	enum chain_mode 	mode;
-	u32			print_limit;
-	double			min_percent;
-	sort_chain_func_t	sort;
-	enum chain_order	order;
-	enum chain_key		key;
-};
-
-struct callchain_list {
-	u64			ip;
-	struct map_symbol	ms;
-	struct list_head	list;
-};
-
-/*
- * A callchain cursor is a single linked list that
- * let one feed a callchain progressively.
- * It keeps persistent allocated entries to minimize
- * allocations.
- */
-struct callchain_cursor_node {
-	u64				ip;
-	struct map			*map;
-	struct symbol			*sym;
-	struct callchain_cursor_node	*next;
-};
-
-struct callchain_cursor {
-	u64				nr;
-	struct callchain_cursor_node	*first;
-	struct callchain_cursor_node	**last;
-	u64				pos;
-	struct callchain_cursor_node	*curr;
-};
-
-extern __thread struct callchain_cursor callchain_cursor;
-
-static inline void callchain_init(struct callchain_root *root)
-{
-	INIT_LIST_HEAD(&root->node.siblings);
-	INIT_LIST_HEAD(&root->node.children);
-	INIT_LIST_HEAD(&root->node.val);
-
-	root->node.parent = NULL;
-	root->node.hit = 0;
-	root->node.children_hit = 0;
-	root->max_depth = 0;
-}
-
-static inline u64 callchain_cumul_hits(struct callchain_node *node)
-{
-	return node->hit + node->children_hit;
-}
-
-int callchain_register_param(struct callchain_param *param);
-int callchain_append(struct callchain_root *root,
-		     struct callchain_cursor *cursor,
-		     u64 period);
-
-int callchain_merge(struct callchain_cursor *cursor,
-		    struct callchain_root *dst, struct callchain_root *src);
-
-/*
- * Initialize a cursor before adding entries inside, but keep
- * the previously allocated entries as a cache.
- */
-static inline void callchain_cursor_reset(struct callchain_cursor *cursor)
-{
-	cursor->nr = 0;
-	cursor->last = &cursor->first;
-}
-
-int callchain_cursor_append(struct callchain_cursor *cursor, u64 ip,
-			    struct map *map, struct symbol *sym);
-
-/* Close a cursor writing session. Initialize for the reader */
-static inline void callchain_cursor_commit(struct callchain_cursor *cursor)
-{
-	cursor->curr = cursor->first;
-	cursor->pos = 0;
-}
-
-/* Cursor reading iteration helpers */
-static inline struct callchain_cursor_node *
-callchain_cursor_current(struct callchain_cursor *cursor)
-{
-	if (cursor->pos == cursor->nr)
-		return NULL;
-
-	return cursor->curr;
-}
-
-static inline void callchain_cursor_advance(struct callchain_cursor *cursor)
-{
-	cursor->curr = cursor->curr->next;
-	cursor->pos++;
-}
-
-struct option;
-
-int record_parse_callchain(const char *arg, struct perf_record_opts *opts);
-int record_parse_callchain_opt(const struct option *opt, const char *arg, int unset);
-int record_callchain_opt(const struct option *opt, const char *arg, int unset);
-
-extern const char record_callchain_help[];
-#endif	/* __PERF_CALLCHAIN_H */
diff --git a/src/tools/perf/util/cgroup.c b/src/tools/perf/util/cgroup.c
deleted file mode 100644
index 96bbda1..0000000
--- a/src/tools/perf/util/cgroup.c
+++ /dev/null
@@ -1,177 +0,0 @@
-#include "util.h"
-#include "../perf.h"
-#include "parse-options.h"
-#include "evsel.h"
-#include "cgroup.h"
-#include "evlist.h"
-
-int nr_cgroups;
-
-static int
-cgroupfs_find_mountpoint(char *buf, size_t maxlen)
-{
-	FILE *fp;
-	char mountpoint[PATH_MAX + 1], tokens[PATH_MAX + 1], type[PATH_MAX + 1];
-	char *token, *saved_ptr = NULL;
-	int found = 0;
-
-	fp = fopen("/proc/mounts", "r");
-	if (!fp)
-		return -1;
-
-	/*
-	 * in order to handle split hierarchy, we need to scan /proc/mounts
-	 * and inspect every cgroupfs mount point to find one that has
-	 * perf_event subsystem
-	 */
-	while (fscanf(fp, "%*s %"STR(PATH_MAX)"s %"STR(PATH_MAX)"s %"
-				STR(PATH_MAX)"s %*d %*d\n",
-				mountpoint, type, tokens) == 3) {
-
-		if (!strcmp(type, "cgroup")) {
-
-			token = strtok_r(tokens, ",", &saved_ptr);
-
-			while (token != NULL) {
-				if (!strcmp(token, "perf_event")) {
-					found = 1;
-					break;
-				}
-				token = strtok_r(NULL, ",", &saved_ptr);
-			}
-		}
-		if (found)
-			break;
-	}
-	fclose(fp);
-	if (!found)
-		return -1;
-
-	if (strlen(mountpoint) < maxlen) {
-		strcpy(buf, mountpoint);
-		return 0;
-	}
-	return -1;
-}
-
-static int open_cgroup(char *name)
-{
-	char path[PATH_MAX + 1];
-	char mnt[PATH_MAX + 1];
-	int fd;
-
-
-	if (cgroupfs_find_mountpoint(mnt, PATH_MAX + 1))
-		return -1;
-
-	snprintf(path, PATH_MAX, "%s/%s", mnt, name);
-
-	fd = open(path, O_RDONLY);
-	if (fd == -1)
-		fprintf(stderr, "no access to cgroup %s\n", path);
-
-	return fd;
-}
-
-static int add_cgroup(struct perf_evlist *evlist, char *str)
-{
-	struct perf_evsel *counter;
-	struct cgroup_sel *cgrp = NULL;
-	int n;
-	/*
-	 * check if cgrp is already defined, if so we reuse it
-	 */
-	list_for_each_entry(counter, &evlist->entries, node) {
-		cgrp = counter->cgrp;
-		if (!cgrp)
-			continue;
-		if (!strcmp(cgrp->name, str))
-			break;
-
-		cgrp = NULL;
-	}
-
-	if (!cgrp) {
-		cgrp = zalloc(sizeof(*cgrp));
-		if (!cgrp)
-			return -1;
-
-		cgrp->name = str;
-
-		cgrp->fd = open_cgroup(str);
-		if (cgrp->fd == -1) {
-			free(cgrp);
-			return -1;
-		}
-	}
-
-	/*
-	 * find corresponding event
-	 * if add cgroup N, then need to find event N
-	 */
-	n = 0;
-	list_for_each_entry(counter, &evlist->entries, node) {
-		if (n == nr_cgroups)
-			goto found;
-		n++;
-	}
-	if (cgrp->refcnt == 0)
-		free(cgrp);
-
-	return -1;
-found:
-	cgrp->refcnt++;
-	counter->cgrp = cgrp;
-	return 0;
-}
-
-void close_cgroup(struct cgroup_sel *cgrp)
-{
-	if (!cgrp)
-		return;
-
-	/* XXX: not reentrant */
-	if (--cgrp->refcnt == 0) {
-		close(cgrp->fd);
-		free(cgrp->name);
-		free(cgrp);
-	}
-}
-
-int parse_cgroups(const struct option *opt __maybe_unused, const char *str,
-		  int unset __maybe_unused)
-{
-	struct perf_evlist *evlist = *(struct perf_evlist **)opt->value;
-	const char *p, *e, *eos = str + strlen(str);
-	char *s;
-	int ret;
-
-	if (list_empty(&evlist->entries)) {
-		fprintf(stderr, "must define events before cgroups\n");
-		return -1;
-	}
-
-	for (;;) {
-		p = strchr(str, ',');
-		e = p ? p : eos;
-
-		/* allow empty cgroups, i.e., skip */
-		if (e - str) {
-			/* termination added */
-			s = strndup(str, e - str);
-			if (!s)
-				return -1;
-			ret = add_cgroup(evlist, s);
-			if (ret) {
-				free(s);
-				return -1;
-			}
-		}
-		/* nr_cgroups is increased een for empty cgroups */
-		nr_cgroups++;
-		if (!p)
-			break;
-		str = p+1;
-	}
-	return 0;
-}
diff --git a/src/tools/perf/util/cgroup.h b/src/tools/perf/util/cgroup.h
deleted file mode 100644
index 89acd6d..0000000
--- a/src/tools/perf/util/cgroup.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef __CGROUP_H__
-#define __CGROUP_H__
-
-struct option;
-
-struct cgroup_sel {
-	char *name;
-	int fd;
-	int refcnt;
-};
-
-
-extern int nr_cgroups; /* number of explicit cgroups defined */
-extern void close_cgroup(struct cgroup_sel *cgrp);
-extern int parse_cgroups(const struct option *opt, const char *str, int unset);
-
-#endif /* __CGROUP_H__ */
diff --git a/src/tools/perf/util/color.c b/src/tools/perf/util/color.c
deleted file mode 100644
index 66e44a5..0000000
--- a/src/tools/perf/util/color.c
+++ /dev/null
@@ -1,332 +0,0 @@
-#include <linux/kernel.h>
-#include "cache.h"
-#include "color.h"
-
-int perf_use_color_default = -1;
-
-static int parse_color(const char *name, int len)
-{
-	static const char * const color_names[] = {
-		"normal", "black", "red", "green", "yellow",
-		"blue", "magenta", "cyan", "white"
-	};
-	char *end;
-	int i;
-
-	for (i = 0; i < (int)ARRAY_SIZE(color_names); i++) {
-		const char *str = color_names[i];
-		if (!strncasecmp(name, str, len) && !str[len])
-			return i - 1;
-	}
-	i = strtol(name, &end, 10);
-	if (end - name == len && i >= -1 && i <= 255)
-		return i;
-	return -2;
-}
-
-static int parse_attr(const char *name, int len)
-{
-	static const int attr_values[] = { 1, 2, 4, 5, 7 };
-	static const char * const attr_names[] = {
-		"bold", "dim", "ul", "blink", "reverse"
-	};
-	unsigned int i;
-
-	for (i = 0; i < ARRAY_SIZE(attr_names); i++) {
-		const char *str = attr_names[i];
-		if (!strncasecmp(name, str, len) && !str[len])
-			return attr_values[i];
-	}
-	return -1;
-}
-
-void color_parse(const char *value, const char *var, char *dst)
-{
-	color_parse_mem(value, strlen(value), var, dst);
-}
-
-void color_parse_mem(const char *value, int value_len, const char *var,
-		char *dst)
-{
-	const char *ptr = value;
-	int len = value_len;
-	int attr = -1;
-	int fg = -2;
-	int bg = -2;
-
-	if (!strncasecmp(value, "reset", len)) {
-		strcpy(dst, PERF_COLOR_RESET);
-		return;
-	}
-
-	/* [fg [bg]] [attr] */
-	while (len > 0) {
-		const char *word = ptr;
-		int val, wordlen = 0;
-
-		while (len > 0 && !isspace(word[wordlen])) {
-			wordlen++;
-			len--;
-		}
-
-		ptr = word + wordlen;
-		while (len > 0 && isspace(*ptr)) {
-			ptr++;
-			len--;
-		}
-
-		val = parse_color(word, wordlen);
-		if (val >= -1) {
-			if (fg == -2) {
-				fg = val;
-				continue;
-			}
-			if (bg == -2) {
-				bg = val;
-				continue;
-			}
-			goto bad;
-		}
-		val = parse_attr(word, wordlen);
-		if (val < 0 || attr != -1)
-			goto bad;
-		attr = val;
-	}
-
-	if (attr >= 0 || fg >= 0 || bg >= 0) {
-		int sep = 0;
-
-		*dst++ = '\033';
-		*dst++ = '[';
-		if (attr >= 0) {
-			*dst++ = '0' + attr;
-			sep++;
-		}
-		if (fg >= 0) {
-			if (sep++)
-				*dst++ = ';';
-			if (fg < 8) {
-				*dst++ = '3';
-				*dst++ = '0' + fg;
-			} else {
-				dst += sprintf(dst, "38;5;%d", fg);
-			}
-		}
-		if (bg >= 0) {
-			if (sep++)
-				*dst++ = ';';
-			if (bg < 8) {
-				*dst++ = '4';
-				*dst++ = '0' + bg;
-			} else {
-				dst += sprintf(dst, "48;5;%d", bg);
-			}
-		}
-		*dst++ = 'm';
-	}
-	*dst = 0;
-	return;
-bad:
-	die("bad color value '%.*s' for variable '%s'", value_len, value, var);
-}
-
-int perf_config_colorbool(const char *var, const char *value, int stdout_is_tty)
-{
-	if (value) {
-		if (!strcasecmp(value, "never"))
-			return 0;
-		if (!strcasecmp(value, "always"))
-			return 1;
-		if (!strcasecmp(value, "auto"))
-			goto auto_color;
-	}
-
-	/* Missing or explicit false to turn off colorization */
-	if (!perf_config_bool(var, value))
-		return 0;
-
-	/* any normal truth value defaults to 'auto' */
- auto_color:
-	if (stdout_is_tty < 0)
-		stdout_is_tty = isatty(1);
-	if (stdout_is_tty || (pager_in_use() && pager_use_color)) {
-		char *term = getenv("TERM");
-		if (term && strcmp(term, "dumb"))
-			return 1;
-	}
-	return 0;
-}
-
-int perf_color_default_config(const char *var, const char *value, void *cb)
-{
-	if (!strcmp(var, "color.ui")) {
-		perf_use_color_default = perf_config_colorbool(var, value, -1);
-		return 0;
-	}
-
-	return perf_default_config(var, value, cb);
-}
-
-static int __color_vsnprintf(char *bf, size_t size, const char *color,
-			     const char *fmt, va_list args, const char *trail)
-{
-	int r = 0;
-
-	/*
-	 * Auto-detect:
-	 */
-	if (perf_use_color_default < 0) {
-		if (isatty(1) || pager_in_use())
-			perf_use_color_default = 1;
-		else
-			perf_use_color_default = 0;
-	}
-
-	if (perf_use_color_default && *color)
-		r += scnprintf(bf, size, "%s", color);
-	r += vscnprintf(bf + r, size - r, fmt, args);
-	if (perf_use_color_default && *color)
-		r += scnprintf(bf + r, size - r, "%s", PERF_COLOR_RESET);
-	if (trail)
-		r += scnprintf(bf + r, size - r, "%s", trail);
-	return r;
-}
-
-static int __color_vfprintf(FILE *fp, const char *color, const char *fmt,
-		va_list args, const char *trail)
-{
-	int r = 0;
-
-	/*
-	 * Auto-detect:
-	 */
-	if (perf_use_color_default < 0) {
-		if (isatty(fileno(fp)) || pager_in_use())
-			perf_use_color_default = 1;
-		else
-			perf_use_color_default = 0;
-	}
-
-	if (perf_use_color_default && *color)
-		r += fprintf(fp, "%s", color);
-	r += vfprintf(fp, fmt, args);
-	if (perf_use_color_default && *color)
-		r += fprintf(fp, "%s", PERF_COLOR_RESET);
-	if (trail)
-		r += fprintf(fp, "%s", trail);
-	return r;
-}
-
-int color_vsnprintf(char *bf, size_t size, const char *color,
-		    const char *fmt, va_list args)
-{
-	return __color_vsnprintf(bf, size, color, fmt, args, NULL);
-}
-
-int color_vfprintf(FILE *fp, const char *color, const char *fmt, va_list args)
-{
-	return __color_vfprintf(fp, color, fmt, args, NULL);
-}
-
-int color_snprintf(char *bf, size_t size, const char *color,
-		   const char *fmt, ...)
-{
-	va_list args;
-	int r;
-
-	va_start(args, fmt);
-	r = color_vsnprintf(bf, size, color, fmt, args);
-	va_end(args);
-	return r;
-}
-
-int color_fprintf(FILE *fp, const char *color, const char *fmt, ...)
-{
-	va_list args;
-	int r;
-
-	va_start(args, fmt);
-	r = color_vfprintf(fp, color, fmt, args);
-	va_end(args);
-	return r;
-}
-
-int color_fprintf_ln(FILE *fp, const char *color, const char *fmt, ...)
-{
-	va_list args;
-	int r;
-	va_start(args, fmt);
-	r = __color_vfprintf(fp, color, fmt, args, "\n");
-	va_end(args);
-	return r;
-}
-
-/*
- * This function splits the buffer by newlines and colors the lines individually.
- *
- * Returns 0 on success.
- */
-int color_fwrite_lines(FILE *fp, const char *color,
-		size_t count, const char *buf)
-{
-	if (!*color)
-		return fwrite(buf, count, 1, fp) != 1;
-
-	while (count) {
-		char *p = memchr(buf, '\n', count);
-
-		if (p != buf && (fputs(color, fp) < 0 ||
-				fwrite(buf, p ? (size_t)(p - buf) : count, 1, fp) != 1 ||
-				fputs(PERF_COLOR_RESET, fp) < 0))
-			return -1;
-		if (!p)
-			return 0;
-		if (fputc('\n', fp) < 0)
-			return -1;
-		count -= p + 1 - buf;
-		buf = p + 1;
-	}
-	return 0;
-}
-
-const char *get_percent_color(double percent)
-{
-	const char *color = PERF_COLOR_NORMAL;
-
-	/*
-	 * We color high-overhead entries in red, mid-overhead
-	 * entries in green - and keep the low overhead places
-	 * normal:
-	 */
-	if (percent >= MIN_RED)
-		color = PERF_COLOR_RED;
-	else {
-		if (percent > MIN_GREEN)
-			color = PERF_COLOR_GREEN;
-	}
-	return color;
-}
-
-int percent_color_fprintf(FILE *fp, const char *fmt, double percent)
-{
-	int r;
-	const char *color;
-
-	color = get_percent_color(percent);
-	r = color_fprintf(fp, color, fmt, percent);
-
-	return r;
-}
-
-int percent_color_snprintf(char *bf, size_t size, const char *fmt, ...)
-{
-	va_list args;
-	double percent;
-	const char *color;
-
-	va_start(args, fmt);
-	percent = va_arg(args, double);
-	va_end(args);
-	color = get_percent_color(percent);
-	return color_snprintf(bf, size, color, fmt, percent);
-}
diff --git a/src/tools/perf/util/color.h b/src/tools/perf/util/color.h
deleted file mode 100644
index fced384..0000000
--- a/src/tools/perf/util/color.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef __PERF_COLOR_H
-#define __PERF_COLOR_H
-
-/* "\033[1;38;5;2xx;48;5;2xxm\0" is 23 bytes */
-#define COLOR_MAXLEN 24
-
-#define PERF_COLOR_NORMAL	""
-#define PERF_COLOR_RESET	"\033[m"
-#define PERF_COLOR_BOLD		"\033[1m"
-#define PERF_COLOR_RED		"\033[31m"
-#define PERF_COLOR_GREEN	"\033[32m"
-#define PERF_COLOR_YELLOW	"\033[33m"
-#define PERF_COLOR_BLUE		"\033[34m"
-#define PERF_COLOR_MAGENTA	"\033[35m"
-#define PERF_COLOR_CYAN		"\033[36m"
-#define PERF_COLOR_BG_RED	"\033[41m"
-
-#define MIN_GREEN	0.5
-#define MIN_RED		5.0
-
-/*
- * This variable stores the value of color.ui
- */
-extern int perf_use_color_default;
-
-
-/*
- * Use this instead of perf_default_config if you need the value of color.ui.
- */
-int perf_color_default_config(const char *var, const char *value, void *cb);
-
-int perf_config_colorbool(const char *var, const char *value, int stdout_is_tty);
-void color_parse(const char *value, const char *var, char *dst);
-void color_parse_mem(const char *value, int len, const char *var, char *dst);
-int color_vsnprintf(char *bf, size_t size, const char *color,
-		    const char *fmt, va_list args);
-int color_vfprintf(FILE *fp, const char *color, const char *fmt, va_list args);
-int color_fprintf(FILE *fp, const char *color, const char *fmt, ...);
-int color_snprintf(char *bf, size_t size, const char *color, const char *fmt, ...);
-int color_fprintf_ln(FILE *fp, const char *color, const char *fmt, ...);
-int color_fwrite_lines(FILE *fp, const char *color, size_t count, const char *buf);
-int percent_color_snprintf(char *bf, size_t size, const char *fmt, ...);
-int percent_color_fprintf(FILE *fp, const char *fmt, double percent);
-const char *get_percent_color(double percent);
-
-#endif /* __PERF_COLOR_H */
diff --git a/src/tools/perf/util/config.c b/src/tools/perf/util/config.c
deleted file mode 100644
index 3e0fdd3..0000000
--- a/src/tools/perf/util/config.c
+++ /dev/null
@@ -1,509 +0,0 @@
-/*
- * config.c
- *
- * Helper functions for parsing config items.
- * Originally copied from GIT source.
- *
- * Copyright (C) Linus Torvalds, 2005
- * Copyright (C) Johannes Schindelin, 2005
- *
- */
-#include "util.h"
-#include "cache.h"
-#include "exec_cmd.h"
-
-#define MAXNAME (256)
-
-#define DEBUG_CACHE_DIR ".debug"
-
-
-char buildid_dir[MAXPATHLEN]; /* root dir for buildid, binary cache */
-
-static FILE *config_file;
-static const char *config_file_name;
-static int config_linenr;
-static int config_file_eof;
-
-static const char *config_exclusive_filename;
-
-static int get_next_char(void)
-{
-	int c;
-	FILE *f;
-
-	c = '\n';
-	if ((f = config_file) != NULL) {
-		c = fgetc(f);
-		if (c == '\r') {
-			/* DOS like systems */
-			c = fgetc(f);
-			if (c != '\n') {
-				ungetc(c, f);
-				c = '\r';
-			}
-		}
-		if (c == '\n')
-			config_linenr++;
-		if (c == EOF) {
-			config_file_eof = 1;
-			c = '\n';
-		}
-	}
-	return c;
-}
-
-static char *parse_value(void)
-{
-	static char value[1024];
-	int quote = 0, comment = 0, space = 0;
-	size_t len = 0;
-
-	for (;;) {
-		int c = get_next_char();
-
-		if (len >= sizeof(value) - 1)
-			return NULL;
-		if (c == '\n') {
-			if (quote)
-				return NULL;
-			value[len] = 0;
-			return value;
-		}
-		if (comment)
-			continue;
-		if (isspace(c) && !quote) {
-			space = 1;
-			continue;
-		}
-		if (!quote) {
-			if (c == ';' || c == '#') {
-				comment = 1;
-				continue;
-			}
-		}
-		if (space) {
-			if (len)
-				value[len++] = ' ';
-			space = 0;
-		}
-		if (c == '\\') {
-			c = get_next_char();
-			switch (c) {
-			case '\n':
-				continue;
-			case 't':
-				c = '\t';
-				break;
-			case 'b':
-				c = '\b';
-				break;
-			case 'n':
-				c = '\n';
-				break;
-			/* Some characters escape as themselves */
-			case '\\': case '"':
-				break;
-			/* Reject unknown escape sequences */
-			default:
-				return NULL;
-			}
-			value[len++] = c;
-			continue;
-		}
-		if (c == '"') {
-			quote = 1-quote;
-			continue;
-		}
-		value[len++] = c;
-	}
-}
-
-static inline int iskeychar(int c)
-{
-	return isalnum(c) || c == '-' || c == '_';
-}
-
-static int get_value(config_fn_t fn, void *data, char *name, unsigned int len)
-{
-	int c;
-	char *value;
-
-	/* Get the full name */
-	for (;;) {
-		c = get_next_char();
-		if (config_file_eof)
-			break;
-		if (!iskeychar(c))
-			break;
-		name[len++] = c;
-		if (len >= MAXNAME)
-			return -1;
-	}
-	name[len] = 0;
-	while (c == ' ' || c == '\t')
-		c = get_next_char();
-
-	value = NULL;
-	if (c != '\n') {
-		if (c != '=')
-			return -1;
-		value = parse_value();
-		if (!value)
-			return -1;
-	}
-	return fn(name, value, data);
-}
-
-static int get_extended_base_var(char *name, int baselen, int c)
-{
-	do {
-		if (c == '\n')
-			return -1;
-		c = get_next_char();
-	} while (isspace(c));
-
-	/* We require the format to be '[base "extension"]' */
-	if (c != '"')
-		return -1;
-	name[baselen++] = '.';
-
-	for (;;) {
-		int ch = get_next_char();
-
-		if (ch == '\n')
-			return -1;
-		if (ch == '"')
-			break;
-		if (ch == '\\') {
-			ch = get_next_char();
-			if (ch == '\n')
-				return -1;
-		}
-		name[baselen++] = ch;
-		if (baselen > MAXNAME / 2)
-			return -1;
-	}
-
-	/* Final ']' */
-	if (get_next_char() != ']')
-		return -1;
-	return baselen;
-}
-
-static int get_base_var(char *name)
-{
-	int baselen = 0;
-
-	for (;;) {
-		int c = get_next_char();
-		if (config_file_eof)
-			return -1;
-		if (c == ']')
-			return baselen;
-		if (isspace(c))
-			return get_extended_base_var(name, baselen, c);
-		if (!iskeychar(c) && c != '.')
-			return -1;
-		if (baselen > MAXNAME / 2)
-			return -1;
-		name[baselen++] = tolower(c);
-	}
-}
-
-static int perf_parse_file(config_fn_t fn, void *data)
-{
-	int comment = 0;
-	int baselen = 0;
-	static char var[MAXNAME];
-
-	/* U+FEFF Byte Order Mark in UTF8 */
-	static const unsigned char *utf8_bom = (unsigned char *) "\xef\xbb\xbf";
-	const unsigned char *bomptr = utf8_bom;
-
-	for (;;) {
-		int c = get_next_char();
-		if (bomptr && *bomptr) {
-			/* We are at the file beginning; skip UTF8-encoded BOM
-			 * if present. Sane editors won't put this in on their
-			 * own, but e.g. Windows Notepad will do it happily. */
-			if ((unsigned char) c == *bomptr) {
-				bomptr++;
-				continue;
-			} else {
-				/* Do not tolerate partial BOM. */
-				if (bomptr != utf8_bom)
-					break;
-				/* No BOM at file beginning. Cool. */
-				bomptr = NULL;
-			}
-		}
-		if (c == '\n') {
-			if (config_file_eof)
-				return 0;
-			comment = 0;
-			continue;
-		}
-		if (comment || isspace(c))
-			continue;
-		if (c == '#' || c == ';') {
-			comment = 1;
-			continue;
-		}
-		if (c == '[') {
-			baselen = get_base_var(var);
-			if (baselen <= 0)
-				break;
-			var[baselen++] = '.';
-			var[baselen] = 0;
-			continue;
-		}
-		if (!isalpha(c))
-			break;
-		var[baselen] = tolower(c);
-		if (get_value(fn, data, var, baselen+1) < 0)
-			break;
-	}
-	die("bad config file line %d in %s", config_linenr, config_file_name);
-}
-
-static int parse_unit_factor(const char *end, unsigned long *val)
-{
-	if (!*end)
-		return 1;
-	else if (!strcasecmp(end, "k")) {
-		*val *= 1024;
-		return 1;
-	}
-	else if (!strcasecmp(end, "m")) {
-		*val *= 1024 * 1024;
-		return 1;
-	}
-	else if (!strcasecmp(end, "g")) {
-		*val *= 1024 * 1024 * 1024;
-		return 1;
-	}
-	return 0;
-}
-
-static int perf_parse_long(const char *value, long *ret)
-{
-	if (value && *value) {
-		char *end;
-		long val = strtol(value, &end, 0);
-		unsigned long factor = 1;
-		if (!parse_unit_factor(end, &factor))
-			return 0;
-		*ret = val * factor;
-		return 1;
-	}
-	return 0;
-}
-
-static void die_bad_config(const char *name)
-{
-	if (config_file_name)
-		die("bad config value for '%s' in %s", name, config_file_name);
-	die("bad config value for '%s'", name);
-}
-
-int perf_config_int(const char *name, const char *value)
-{
-	long ret = 0;
-	if (!perf_parse_long(value, &ret))
-		die_bad_config(name);
-	return ret;
-}
-
-static int perf_config_bool_or_int(const char *name, const char *value, int *is_bool)
-{
-	*is_bool = 1;
-	if (!value)
-		return 1;
-	if (!*value)
-		return 0;
-	if (!strcasecmp(value, "true") || !strcasecmp(value, "yes") || !strcasecmp(value, "on"))
-		return 1;
-	if (!strcasecmp(value, "false") || !strcasecmp(value, "no") || !strcasecmp(value, "off"))
-		return 0;
-	*is_bool = 0;
-	return perf_config_int(name, value);
-}
-
-int perf_config_bool(const char *name, const char *value)
-{
-	int discard;
-	return !!perf_config_bool_or_int(name, value, &discard);
-}
-
-const char *perf_config_dirname(const char *name, const char *value)
-{
-	if (!name)
-		return NULL;
-	return value;
-}
-
-static int perf_default_core_config(const char *var __maybe_unused,
-				    const char *value __maybe_unused)
-{
-	/* Add other config variables here. */
-	return 0;
-}
-
-int perf_default_config(const char *var, const char *value,
-			void *dummy __maybe_unused)
-{
-	if (!prefixcmp(var, "core."))
-		return perf_default_core_config(var, value);
-
-	/* Add other config variables here. */
-	return 0;
-}
-
-static int perf_config_from_file(config_fn_t fn, const char *filename, void *data)
-{
-	int ret;
-	FILE *f = fopen(filename, "r");
-
-	ret = -1;
-	if (f) {
-		config_file = f;
-		config_file_name = filename;
-		config_linenr = 1;
-		config_file_eof = 0;
-		ret = perf_parse_file(fn, data);
-		fclose(f);
-		config_file_name = NULL;
-	}
-	return ret;
-}
-
-static const char *perf_etc_perfconfig(void)
-{
-	static const char *system_wide;
-	if (!system_wide)
-		system_wide = system_path(ETC_PERFCONFIG);
-	return system_wide;
-}
-
-static int perf_env_bool(const char *k, int def)
-{
-	const char *v = getenv(k);
-	return v ? perf_config_bool(k, v) : def;
-}
-
-static int perf_config_system(void)
-{
-	return !perf_env_bool("PERF_CONFIG_NOSYSTEM", 0);
-}
-
-static int perf_config_global(void)
-{
-	return !perf_env_bool("PERF_CONFIG_NOGLOBAL", 0);
-}
-
-int perf_config(config_fn_t fn, void *data)
-{
-	int ret = 0, found = 0;
-	const char *home = NULL;
-
-	/* Setting $PERF_CONFIG makes perf read _only_ the given config file. */
-	if (config_exclusive_filename)
-		return perf_config_from_file(fn, config_exclusive_filename, data);
-	if (perf_config_system() && !access(perf_etc_perfconfig(), R_OK)) {
-		ret += perf_config_from_file(fn, perf_etc_perfconfig(),
-					    data);
-		found += 1;
-	}
-
-	home = getenv("HOME");
-	if (perf_config_global() && home) {
-		char *user_config = strdup(mkpath("%s/.perfconfig", home));
-		struct stat st;
-
-		if (user_config == NULL) {
-			warning("Not enough memory to process %s/.perfconfig, "
-				"ignoring it.", home);
-			goto out;
-		}
-
-		if (stat(user_config, &st) < 0)
-			goto out_free;
-
-		if (st.st_uid && (st.st_uid != geteuid())) {
-			warning("File %s not owned by current user or root, "
-				"ignoring it.", user_config);
-			goto out_free;
-		}
-
-		if (!st.st_size)
-			goto out_free;
-
-		ret += perf_config_from_file(fn, user_config, data);
-		found += 1;
-out_free:
-		free(user_config);
-	}
-out:
-	if (found == 0)
-		return -1;
-	return ret;
-}
-
-/*
- * Call this to report error for your variable that should not
- * get a boolean value (i.e. "[my] var" means "true").
- */
-int config_error_nonbool(const char *var)
-{
-	return error("Missing value for '%s'", var);
-}
-
-struct buildid_dir_config {
-	char *dir;
-};
-
-static int buildid_dir_command_config(const char *var, const char *value,
-				      void *data)
-{
-	struct buildid_dir_config *c = data;
-	const char *v;
-
-	/* same dir for all commands */
-	if (!prefixcmp(var, "buildid.") && !strcmp(var + 8, "dir")) {
-		v = perf_config_dirname(var, value);
-		if (!v)
-			return -1;
-		strncpy(c->dir, v, MAXPATHLEN-1);
-		c->dir[MAXPATHLEN-1] = '\0';
-	}
-	return 0;
-}
-
-static void check_buildid_dir_config(void)
-{
-	struct buildid_dir_config c;
-	c.dir = buildid_dir;
-	perf_config(buildid_dir_command_config, &c);
-}
-
-void set_buildid_dir(void)
-{
-	buildid_dir[0] = '\0';
-
-	/* try config file */
-	check_buildid_dir_config();
-
-	/* default to $HOME/.debug */
-	if (buildid_dir[0] == '\0') {
-		char *v = getenv("HOME");
-		if (v) {
-			snprintf(buildid_dir, MAXPATHLEN-1, "%s/%s",
-				 v, DEBUG_CACHE_DIR);
-		} else {
-			strncpy(buildid_dir, DEBUG_CACHE_DIR, MAXPATHLEN-1);
-		}
-		buildid_dir[MAXPATHLEN-1] = '\0';
-	}
-	/* for communicating with external commands */
-	setenv("PERF_BUILDID_DIR", buildid_dir, 1);
-}
diff --git a/src/tools/perf/util/cpumap.c b/src/tools/perf/util/cpumap.c
deleted file mode 100644
index beb8cf9..0000000
--- a/src/tools/perf/util/cpumap.c
+++ /dev/null
@@ -1,319 +0,0 @@
-#include "util.h"
-#include "sysfs.h"
-#include "../perf.h"
-#include "cpumap.h"
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-static struct cpu_map *cpu_map__default_new(void)
-{
-	struct cpu_map *cpus;
-	int nr_cpus;
-
-	nr_cpus = sysconf(_SC_NPROCESSORS_ONLN);
-	if (nr_cpus < 0)
-		return NULL;
-
-	cpus = malloc(sizeof(*cpus) + nr_cpus * sizeof(int));
-	if (cpus != NULL) {
-		int i;
-		for (i = 0; i < nr_cpus; ++i)
-			cpus->map[i] = i;
-
-		cpus->nr = nr_cpus;
-	}
-
-	return cpus;
-}
-
-static struct cpu_map *cpu_map__trim_new(int nr_cpus, int *tmp_cpus)
-{
-	size_t payload_size = nr_cpus * sizeof(int);
-	struct cpu_map *cpus = malloc(sizeof(*cpus) + payload_size);
-
-	if (cpus != NULL) {
-		cpus->nr = nr_cpus;
-		memcpy(cpus->map, tmp_cpus, payload_size);
-	}
-
-	return cpus;
-}
-
-struct cpu_map *cpu_map__read(FILE *file)
-{
-	struct cpu_map *cpus = NULL;
-	int nr_cpus = 0;
-	int *tmp_cpus = NULL, *tmp;
-	int max_entries = 0;
-	int n, cpu, prev;
-	char sep;
-
-	sep = 0;
-	prev = -1;
-	for (;;) {
-		n = fscanf(file, "%u%c", &cpu, &sep);
-		if (n <= 0)
-			break;
-		if (prev >= 0) {
-			int new_max = nr_cpus + cpu - prev - 1;
-
-			if (new_max >= max_entries) {
-				max_entries = new_max + MAX_NR_CPUS / 2;
-				tmp = realloc(tmp_cpus, max_entries * sizeof(int));
-				if (tmp == NULL)
-					goto out_free_tmp;
-				tmp_cpus = tmp;
-			}
-
-			while (++prev < cpu)
-				tmp_cpus[nr_cpus++] = prev;
-		}
-		if (nr_cpus == max_entries) {
-			max_entries += MAX_NR_CPUS;
-			tmp = realloc(tmp_cpus, max_entries * sizeof(int));
-			if (tmp == NULL)
-				goto out_free_tmp;
-			tmp_cpus = tmp;
-		}
-
-		tmp_cpus[nr_cpus++] = cpu;
-		if (n == 2 && sep == '-')
-			prev = cpu;
-		else
-			prev = -1;
-		if (n == 1 || sep == '\n')
-			break;
-	}
-
-	if (nr_cpus > 0)
-		cpus = cpu_map__trim_new(nr_cpus, tmp_cpus);
-	else
-		cpus = cpu_map__default_new();
-out_free_tmp:
-	free(tmp_cpus);
-	return cpus;
-}
-
-static struct cpu_map *cpu_map__read_all_cpu_map(void)
-{
-	struct cpu_map *cpus = NULL;
-	FILE *onlnf;
-
-	onlnf = fopen("/sys/devices/system/cpu/online", "r");
-	if (!onlnf)
-		return cpu_map__default_new();
-
-	cpus = cpu_map__read(onlnf);
-	fclose(onlnf);
-	return cpus;
-}
-
-struct cpu_map *cpu_map__new(const char *cpu_list)
-{
-	struct cpu_map *cpus = NULL;
-	unsigned long start_cpu, end_cpu = 0;
-	char *p = NULL;
-	int i, nr_cpus = 0;
-	int *tmp_cpus = NULL, *tmp;
-	int max_entries = 0;
-
-	if (!cpu_list)
-		return cpu_map__read_all_cpu_map();
-
-	if (!isdigit(*cpu_list))
-		goto out;
-
-	while (isdigit(*cpu_list)) {
-		p = NULL;
-		start_cpu = strtoul(cpu_list, &p, 0);
-		if (start_cpu >= INT_MAX
-		    || (*p != '\0' && *p != ',' && *p != '-'))
-			goto invalid;
-
-		if (*p == '-') {
-			cpu_list = ++p;
-			p = NULL;
-			end_cpu = strtoul(cpu_list, &p, 0);
-
-			if (end_cpu >= INT_MAX || (*p != '\0' && *p != ','))
-				goto invalid;
-
-			if (end_cpu < start_cpu)
-				goto invalid;
-		} else {
-			end_cpu = start_cpu;
-		}
-
-		for (; start_cpu <= end_cpu; start_cpu++) {
-			/* check for duplicates */
-			for (i = 0; i < nr_cpus; i++)
-				if (tmp_cpus[i] == (int)start_cpu)
-					goto invalid;
-
-			if (nr_cpus == max_entries) {
-				max_entries += MAX_NR_CPUS;
-				tmp = realloc(tmp_cpus, max_entries * sizeof(int));
-				if (tmp == NULL)
-					goto invalid;
-				tmp_cpus = tmp;
-			}
-			tmp_cpus[nr_cpus++] = (int)start_cpu;
-		}
-		if (*p)
-			++p;
-
-		cpu_list = p;
-	}
-
-	if (nr_cpus > 0)
-		cpus = cpu_map__trim_new(nr_cpus, tmp_cpus);
-	else
-		cpus = cpu_map__default_new();
-invalid:
-	free(tmp_cpus);
-out:
-	return cpus;
-}
-
-size_t cpu_map__fprintf(struct cpu_map *map, FILE *fp)
-{
-	int i;
-	size_t printed = fprintf(fp, "%d cpu%s: ",
-				 map->nr, map->nr > 1 ? "s" : "");
-	for (i = 0; i < map->nr; ++i)
-		printed += fprintf(fp, "%s%d", i ? ", " : "", map->map[i]);
-
-	return printed + fprintf(fp, "\n");
-}
-
-struct cpu_map *cpu_map__dummy_new(void)
-{
-	struct cpu_map *cpus = malloc(sizeof(*cpus) + sizeof(int));
-
-	if (cpus != NULL) {
-		cpus->nr = 1;
-		cpus->map[0] = -1;
-	}
-
-	return cpus;
-}
-
-void cpu_map__delete(struct cpu_map *map)
-{
-	free(map);
-}
-
-int cpu_map__get_socket(struct cpu_map *map, int idx)
-{
-	FILE *fp;
-	const char *mnt;
-	char path[PATH_MAX];
-	int cpu, ret;
-
-	if (idx > map->nr)
-		return -1;
-
-	cpu = map->map[idx];
-
-	mnt = sysfs_find_mountpoint();
-	if (!mnt)
-		return -1;
-
-	snprintf(path, PATH_MAX,
-		"%s/devices/system/cpu/cpu%d/topology/physical_package_id",
-		mnt, cpu);
-
-	fp = fopen(path, "r");
-	if (!fp)
-		return -1;
-	ret = fscanf(fp, "%d", &cpu);
-	fclose(fp);
-	return ret == 1 ? cpu : -1;
-}
-
-static int cmp_ids(const void *a, const void *b)
-{
-	return *(int *)a - *(int *)b;
-}
-
-static int cpu_map__build_map(struct cpu_map *cpus, struct cpu_map **res,
-			      int (*f)(struct cpu_map *map, int cpu))
-{
-	struct cpu_map *c;
-	int nr = cpus->nr;
-	int cpu, s1, s2;
-
-	/* allocate as much as possible */
-	c = calloc(1, sizeof(*c) + nr * sizeof(int));
-	if (!c)
-		return -1;
-
-	for (cpu = 0; cpu < nr; cpu++) {
-		s1 = f(cpus, cpu);
-		for (s2 = 0; s2 < c->nr; s2++) {
-			if (s1 == c->map[s2])
-				break;
-		}
-		if (s2 == c->nr) {
-			c->map[c->nr] = s1;
-			c->nr++;
-		}
-	}
-	/* ensure we process id in increasing order */
-	qsort(c->map, c->nr, sizeof(int), cmp_ids);
-
-	*res = c;
-	return 0;
-}
-
-int cpu_map__get_core(struct cpu_map *map, int idx)
-{
-	FILE *fp;
-	const char *mnt;
-	char path[PATH_MAX];
-	int cpu, ret, s;
-
-	if (idx > map->nr)
-		return -1;
-
-	cpu = map->map[idx];
-
-	mnt = sysfs_find_mountpoint();
-	if (!mnt)
-		return -1;
-
-	snprintf(path, PATH_MAX,
-		"%s/devices/system/cpu/cpu%d/topology/core_id",
-		mnt, cpu);
-
-	fp = fopen(path, "r");
-	if (!fp)
-		return -1;
-	ret = fscanf(fp, "%d", &cpu);
-	fclose(fp);
-	if (ret != 1)
-		return -1;
-
-	s = cpu_map__get_socket(map, idx);
-	if (s == -1)
-		return -1;
-
-	/*
-	 * encode socket in upper 16 bits
-	 * core_id is relative to socket, and
-	 * we need a global id. So we combine
-	 * socket+ core id
-	 */
-	return (s << 16) | (cpu & 0xffff);
-}
-
-int cpu_map__build_socket_map(struct cpu_map *cpus, struct cpu_map **sockp)
-{
-	return cpu_map__build_map(cpus, sockp, cpu_map__get_socket);
-}
-
-int cpu_map__build_core_map(struct cpu_map *cpus, struct cpu_map **corep)
-{
-	return cpu_map__build_map(cpus, corep, cpu_map__get_core);
-}
diff --git a/src/tools/perf/util/cpumap.h b/src/tools/perf/util/cpumap.h
deleted file mode 100644
index b123bb9..0000000
--- a/src/tools/perf/util/cpumap.h
+++ /dev/null
@@ -1,49 +0,0 @@
-#ifndef __PERF_CPUMAP_H
-#define __PERF_CPUMAP_H
-
-#include <stdio.h>
-#include <stdbool.h>
-
-struct cpu_map {
-	int nr;
-	int map[];
-};
-
-struct cpu_map *cpu_map__new(const char *cpu_list);
-struct cpu_map *cpu_map__dummy_new(void);
-void cpu_map__delete(struct cpu_map *map);
-struct cpu_map *cpu_map__read(FILE *file);
-size_t cpu_map__fprintf(struct cpu_map *map, FILE *fp);
-int cpu_map__get_socket(struct cpu_map *map, int idx);
-int cpu_map__get_core(struct cpu_map *map, int idx);
-int cpu_map__build_socket_map(struct cpu_map *cpus, struct cpu_map **sockp);
-int cpu_map__build_core_map(struct cpu_map *cpus, struct cpu_map **corep);
-
-static inline int cpu_map__socket(struct cpu_map *sock, int s)
-{
-	if (!sock || s > sock->nr || s < 0)
-		return 0;
-	return sock->map[s];
-}
-
-static inline int cpu_map__id_to_socket(int id)
-{
-	return id >> 16;
-}
-
-static inline int cpu_map__id_to_cpu(int id)
-{
-	return id & 0xffff;
-}
-
-static inline int cpu_map__nr(const struct cpu_map *map)
-{
-	return map ? map->nr : 1;
-}
-
-static inline bool cpu_map__empty(const struct cpu_map *map)
-{
-	return map ? map->map[0] == -1 : true;
-}
-
-#endif /* __PERF_CPUMAP_H */
diff --git a/src/tools/perf/util/ctype.c b/src/tools/perf/util/ctype.c
deleted file mode 100644
index aada3ac..0000000
--- a/src/tools/perf/util/ctype.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Sane locale-independent, ASCII ctype.
- *
- * No surprises, and works with signed and unsigned chars.
- */
-#include "util.h"
-
-enum {
-	S = GIT_SPACE,
-	A = GIT_ALPHA,
-	D = GIT_DIGIT,
-	G = GIT_GLOB_SPECIAL,	/* *, ?, [, \\ */
-	R = GIT_REGEX_SPECIAL,	/* $, (, ), +, ., ^, {, | * */
-	P = GIT_PRINT_EXTRA,	/* printable - alpha - digit - glob - regex */
-
-	PS = GIT_SPACE | GIT_PRINT_EXTRA,
-};
-
-unsigned char sane_ctype[256] = {
-/*	0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F			    */
-
-	0, 0, 0, 0, 0, 0, 0, 0, 0, S, S, 0, 0, S, 0, 0,		/*   0.. 15 */
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,		/*  16.. 31 */
-	PS,P, P, P, R, P, P, P, R, R, G, R, P, P, R, P,		/*  32.. 47 */
-	D, D, D, D, D, D, D, D, D, D, P, P, P, P, P, G,		/*  48.. 63 */
-	P, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A,		/*  64.. 79 */
-	A, A, A, A, A, A, A, A, A, A, A, G, G, P, R, P,		/*  80.. 95 */
-	P, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A,		/*  96..111 */
-	A, A, A, A, A, A, A, A, A, A, A, R, R, P, P, 0,		/* 112..127 */
-	/* Nothing in the 128.. range */
-};
-
-const char *graph_line =
-	"_____________________________________________________________________"
-	"_____________________________________________________________________";
-const char *graph_dotted_line =
-	"---------------------------------------------------------------------"
-	"---------------------------------------------------------------------"
-	"---------------------------------------------------------------------";
diff --git a/src/tools/perf/util/debug.c b/src/tools/perf/util/debug.c
deleted file mode 100644
index 399e74c..0000000
--- a/src/tools/perf/util/debug.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/* For general debugging purposes */
-
-#include "../perf.h"
-
-#include <string.h>
-#include <stdarg.h>
-#include <stdio.h>
-
-#include "cache.h"
-#include "color.h"
-#include "event.h"
-#include "debug.h"
-#include "util.h"
-#include "target.h"
-
-int verbose;
-bool dump_trace = false, quiet = false;
-
-int eprintf(int level, const char *fmt, ...)
-{
-	va_list args;
-	int ret = 0;
-
-	if (verbose >= level) {
-		va_start(args, fmt);
-		if (use_browser >= 1)
-			ui_helpline__vshow(fmt, args);
-		else
-			ret = vfprintf(stderr, fmt, args);
-		va_end(args);
-	}
-
-	return ret;
-}
-
-int dump_printf(const char *fmt, ...)
-{
-	va_list args;
-	int ret = 0;
-
-	if (dump_trace) {
-		va_start(args, fmt);
-		ret = vprintf(fmt, args);
-		va_end(args);
-	}
-
-	return ret;
-}
-
-void trace_event(union perf_event *event)
-{
-	unsigned char *raw_event = (void *)event;
-	const char *color = PERF_COLOR_BLUE;
-	int i, j;
-
-	if (!dump_trace)
-		return;
-
-	printf(".");
-	color_fprintf(stdout, color, "\n. ... raw event: size %d bytes\n",
-		      event->header.size);
-
-	for (i = 0; i < event->header.size; i++) {
-		if ((i & 15) == 0) {
-			printf(".");
-			color_fprintf(stdout, color, "  %04x: ", i);
-		}
-
-		color_fprintf(stdout, color, " %02x", raw_event[i]);
-
-		if (((i & 15) == 15) || i == event->header.size-1) {
-			color_fprintf(stdout, color, "  ");
-			for (j = 0; j < 15-(i & 15); j++)
-				color_fprintf(stdout, color, "   ");
-			for (j = i & ~15; j <= i; j++) {
-				color_fprintf(stdout, color, "%c",
-					      isprint(raw_event[j]) ?
-					      raw_event[j] : '.');
-			}
-			color_fprintf(stdout, color, "\n");
-		}
-	}
-	printf(".\n");
-}
diff --git a/src/tools/perf/util/debug.h b/src/tools/perf/util/debug.h
deleted file mode 100644
index efbd988..0000000
--- a/src/tools/perf/util/debug.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* For debugging general purposes */
-#ifndef __PERF_DEBUG_H
-#define __PERF_DEBUG_H
-
-#include <stdbool.h>
-#include "event.h"
-#include "../ui/helpline.h"
-#include "../ui/progress.h"
-#include "../ui/util.h"
-
-extern int verbose;
-extern bool quiet, dump_trace;
-
-int dump_printf(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
-void trace_event(union perf_event *event);
-
-int ui__error(const char *format, ...) __attribute__((format(printf, 1, 2)));
-int ui__warning(const char *format, ...) __attribute__((format(printf, 1, 2)));
-
-#endif	/* __PERF_DEBUG_H */
diff --git a/src/tools/perf/util/dso.c b/src/tools/perf/util/dso.c
deleted file mode 100644
index e3c1ff8..0000000
--- a/src/tools/perf/util/dso.c
+++ /dev/null
@@ -1,607 +0,0 @@
-#include "symbol.h"
-#include "dso.h"
-#include "machine.h"
-#include "util.h"
-#include "debug.h"
-
-char dso__symtab_origin(const struct dso *dso)
-{
-	static const char origin[] = {
-		[DSO_BINARY_TYPE__KALLSYMS]		= 'k',
-		[DSO_BINARY_TYPE__VMLINUX]		= 'v',
-		[DSO_BINARY_TYPE__JAVA_JIT]		= 'j',
-		[DSO_BINARY_TYPE__DEBUGLINK]		= 'l',
-		[DSO_BINARY_TYPE__BUILD_ID_CACHE]	= 'B',
-		[DSO_BINARY_TYPE__FEDORA_DEBUGINFO]	= 'f',
-		[DSO_BINARY_TYPE__UBUNTU_DEBUGINFO]	= 'u',
-		[DSO_BINARY_TYPE__BUILDID_DEBUGINFO]	= 'b',
-		[DSO_BINARY_TYPE__SYSTEM_PATH_DSO]	= 'd',
-		[DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE]	= 'K',
-		[DSO_BINARY_TYPE__GUEST_KALLSYMS]	= 'g',
-		[DSO_BINARY_TYPE__GUEST_KMODULE]	= 'G',
-		[DSO_BINARY_TYPE__GUEST_VMLINUX]	= 'V',
-	};
-
-	if (dso == NULL || dso->symtab_type == DSO_BINARY_TYPE__NOT_FOUND)
-		return '!';
-	return origin[dso->symtab_type];
-}
-
-int dso__binary_type_file(struct dso *dso, enum dso_binary_type type,
-			  char *root_dir, char *file, size_t size)
-{
-	char build_id_hex[BUILD_ID_SIZE * 2 + 1];
-	int ret = 0;
-
-	switch (type) {
-	case DSO_BINARY_TYPE__DEBUGLINK: {
-		char *debuglink;
-
-		strncpy(file, dso->long_name, size);
-		debuglink = file + dso->long_name_len;
-		while (debuglink != file && *debuglink != '/')
-			debuglink--;
-		if (*debuglink == '/')
-			debuglink++;
-		filename__read_debuglink(dso->long_name, debuglink,
-					 size - (debuglink - file));
-		}
-		break;
-	case DSO_BINARY_TYPE__BUILD_ID_CACHE:
-		/* skip the locally configured cache if a symfs is given */
-		if (symbol_conf.symfs[0] ||
-		    (dso__build_id_filename(dso, file, size) == NULL))
-			ret = -1;
-		break;
-
-	case DSO_BINARY_TYPE__FEDORA_DEBUGINFO:
-		snprintf(file, size, "%s/usr/lib/debug%s.debug",
-			 symbol_conf.symfs, dso->long_name);
-		break;
-
-	case DSO_BINARY_TYPE__UBUNTU_DEBUGINFO:
-		snprintf(file, size, "%s/usr/lib/debug%s",
-			 symbol_conf.symfs, dso->long_name);
-		break;
-
-	case DSO_BINARY_TYPE__BUILDID_DEBUGINFO:
-		if (!dso->has_build_id) {
-			ret = -1;
-			break;
-		}
-
-		build_id__sprintf(dso->build_id,
-				  sizeof(dso->build_id),
-				  build_id_hex);
-		snprintf(file, size,
-			 "%s/usr/lib/debug/.build-id/%.2s/%s.debug",
-			 symbol_conf.symfs, build_id_hex, build_id_hex + 2);
-		break;
-
-	case DSO_BINARY_TYPE__VMLINUX:
-	case DSO_BINARY_TYPE__GUEST_VMLINUX:
-	case DSO_BINARY_TYPE__SYSTEM_PATH_DSO:
-		snprintf(file, size, "%s%s",
-			 symbol_conf.symfs, dso->long_name);
-		break;
-
-	case DSO_BINARY_TYPE__GUEST_KMODULE:
-		snprintf(file, size, "%s%s%s", symbol_conf.symfs,
-			 root_dir, dso->long_name);
-		break;
-
-	case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE:
-		snprintf(file, size, "%s%s", symbol_conf.symfs,
-			 dso->long_name);
-		break;
-
-	case DSO_BINARY_TYPE__KCORE:
-	case DSO_BINARY_TYPE__GUEST_KCORE:
-		snprintf(file, size, "%s", dso->long_name);
-		break;
-
-	default:
-	case DSO_BINARY_TYPE__KALLSYMS:
-	case DSO_BINARY_TYPE__GUEST_KALLSYMS:
-	case DSO_BINARY_TYPE__JAVA_JIT:
-	case DSO_BINARY_TYPE__NOT_FOUND:
-		ret = -1;
-		break;
-	}
-
-	return ret;
-}
-
-static int open_dso(struct dso *dso, struct machine *machine)
-{
-	char *root_dir = (char *) "";
-	char *name;
-	int fd;
-
-	name = malloc(PATH_MAX);
-	if (!name)
-		return -ENOMEM;
-
-	if (machine)
-		root_dir = machine->root_dir;
-
-	if (dso__binary_type_file(dso, dso->data_type,
-				  root_dir, name, PATH_MAX)) {
-		free(name);
-		return -EINVAL;
-	}
-
-	fd = open(name, O_RDONLY);
-	free(name);
-	return fd;
-}
-
-int dso__data_fd(struct dso *dso, struct machine *machine)
-{
-	static enum dso_binary_type binary_type_data[] = {
-		DSO_BINARY_TYPE__BUILD_ID_CACHE,
-		DSO_BINARY_TYPE__SYSTEM_PATH_DSO,
-		DSO_BINARY_TYPE__NOT_FOUND,
-	};
-	int i = 0;
-
-	if (dso->data_type != DSO_BINARY_TYPE__NOT_FOUND)
-		return open_dso(dso, machine);
-
-	do {
-		int fd;
-
-		dso->data_type = binary_type_data[i++];
-
-		fd = open_dso(dso, machine);
-		if (fd >= 0)
-			return fd;
-
-	} while (dso->data_type != DSO_BINARY_TYPE__NOT_FOUND);
-
-	return -EINVAL;
-}
-
-static void
-dso_cache__free(struct rb_root *root)
-{
-	struct rb_node *next = rb_first(root);
-
-	while (next) {
-		struct dso_cache *cache;
-
-		cache = rb_entry(next, struct dso_cache, rb_node);
-		next = rb_next(&cache->rb_node);
-		rb_erase(&cache->rb_node, root);
-		free(cache);
-	}
-}
-
-static struct dso_cache*
-dso_cache__find(struct rb_root *root, u64 offset)
-{
-	struct rb_node **p = &root->rb_node;
-	struct rb_node *parent = NULL;
-	struct dso_cache *cache;
-
-	while (*p != NULL) {
-		u64 end;
-
-		parent = *p;
-		cache = rb_entry(parent, struct dso_cache, rb_node);
-		end = cache->offset + DSO__DATA_CACHE_SIZE;
-
-		if (offset < cache->offset)
-			p = &(*p)->rb_left;
-		else if (offset >= end)
-			p = &(*p)->rb_right;
-		else
-			return cache;
-	}
-	return NULL;
-}
-
-static void
-dso_cache__insert(struct rb_root *root, struct dso_cache *new)
-{
-	struct rb_node **p = &root->rb_node;
-	struct rb_node *parent = NULL;
-	struct dso_cache *cache;
-	u64 offset = new->offset;
-
-	while (*p != NULL) {
-		u64 end;
-
-		parent = *p;
-		cache = rb_entry(parent, struct dso_cache, rb_node);
-		end = cache->offset + DSO__DATA_CACHE_SIZE;
-
-		if (offset < cache->offset)
-			p = &(*p)->rb_left;
-		else if (offset >= end)
-			p = &(*p)->rb_right;
-	}
-
-	rb_link_node(&new->rb_node, parent, p);
-	rb_insert_color(&new->rb_node, root);
-}
-
-static ssize_t
-dso_cache__memcpy(struct dso_cache *cache, u64 offset,
-		  u8 *data, u64 size)
-{
-	u64 cache_offset = offset - cache->offset;
-	u64 cache_size   = min(cache->size - cache_offset, size);
-
-	memcpy(data, cache->data + cache_offset, cache_size);
-	return cache_size;
-}
-
-static ssize_t
-dso_cache__read(struct dso *dso, struct machine *machine,
-		 u64 offset, u8 *data, ssize_t size)
-{
-	struct dso_cache *cache;
-	ssize_t ret;
-	int fd;
-
-	fd = dso__data_fd(dso, machine);
-	if (fd < 0)
-		return -1;
-
-	do {
-		u64 cache_offset;
-
-		ret = -ENOMEM;
-
-		cache = zalloc(sizeof(*cache) + DSO__DATA_CACHE_SIZE);
-		if (!cache)
-			break;
-
-		cache_offset = offset & DSO__DATA_CACHE_MASK;
-		ret = -EINVAL;
-
-		if (-1 == lseek(fd, cache_offset, SEEK_SET))
-			break;
-
-		ret = read(fd, cache->data, DSO__DATA_CACHE_SIZE);
-		if (ret <= 0)
-			break;
-
-		cache->offset = cache_offset;
-		cache->size   = ret;
-		dso_cache__insert(&dso->cache, cache);
-
-		ret = dso_cache__memcpy(cache, offset, data, size);
-
-	} while (0);
-
-	if (ret <= 0)
-		free(cache);
-
-	close(fd);
-	return ret;
-}
-
-static ssize_t dso_cache_read(struct dso *dso, struct machine *machine,
-			      u64 offset, u8 *data, ssize_t size)
-{
-	struct dso_cache *cache;
-
-	cache = dso_cache__find(&dso->cache, offset);
-	if (cache)
-		return dso_cache__memcpy(cache, offset, data, size);
-	else
-		return dso_cache__read(dso, machine, offset, data, size);
-}
-
-ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
-			      u64 offset, u8 *data, ssize_t size)
-{
-	ssize_t r = 0;
-	u8 *p = data;
-
-	do {
-		ssize_t ret;
-
-		ret = dso_cache_read(dso, machine, offset, p, size);
-		if (ret < 0)
-			return ret;
-
-		/* Reached EOF, return what we have. */
-		if (!ret)
-			break;
-
-		BUG_ON(ret > size);
-
-		r      += ret;
-		p      += ret;
-		offset += ret;
-		size   -= ret;
-
-	} while (size);
-
-	return r;
-}
-
-ssize_t dso__data_read_addr(struct dso *dso, struct map *map,
-			    struct machine *machine, u64 addr,
-			    u8 *data, ssize_t size)
-{
-	u64 offset = map->map_ip(map, addr);
-	return dso__data_read_offset(dso, machine, offset, data, size);
-}
-
-struct map *dso__new_map(const char *name)
-{
-	struct map *map = NULL;
-	struct dso *dso = dso__new(name);
-
-	if (dso)
-		map = map__new2(0, dso, MAP__FUNCTION);
-
-	return map;
-}
-
-struct dso *dso__kernel_findnew(struct machine *machine, const char *name,
-		    const char *short_name, int dso_type)
-{
-	/*
-	 * The kernel dso could be created by build_id processing.
-	 */
-	struct dso *dso = __dsos__findnew(&machine->kernel_dsos, name);
-
-	/*
-	 * We need to run this in all cases, since during the build_id
-	 * processing we had no idea this was the kernel dso.
-	 */
-	if (dso != NULL) {
-		dso__set_short_name(dso, short_name);
-		dso->kernel = dso_type;
-	}
-
-	return dso;
-}
-
-void dso__set_long_name(struct dso *dso, char *name)
-{
-	if (name == NULL)
-		return;
-	dso->long_name = name;
-	dso->long_name_len = strlen(name);
-}
-
-void dso__set_short_name(struct dso *dso, const char *name)
-{
-	if (name == NULL)
-		return;
-	dso->short_name = name;
-	dso->short_name_len = strlen(name);
-}
-
-static void dso__set_basename(struct dso *dso)
-{
-	dso__set_short_name(dso, basename(dso->long_name));
-}
-
-int dso__name_len(const struct dso *dso)
-{
-	if (!dso)
-		return strlen("[unknown]");
-	if (verbose)
-		return dso->long_name_len;
-
-	return dso->short_name_len;
-}
-
-bool dso__loaded(const struct dso *dso, enum map_type type)
-{
-	return dso->loaded & (1 << type);
-}
-
-bool dso__sorted_by_name(const struct dso *dso, enum map_type type)
-{
-	return dso->sorted_by_name & (1 << type);
-}
-
-void dso__set_sorted_by_name(struct dso *dso, enum map_type type)
-{
-	dso->sorted_by_name |= (1 << type);
-}
-
-struct dso *dso__new(const char *name)
-{
-	struct dso *dso = calloc(1, sizeof(*dso) + strlen(name) + 1);
-
-	if (dso != NULL) {
-		int i;
-		strcpy(dso->name, name);
-		dso__set_long_name(dso, dso->name);
-		dso__set_short_name(dso, dso->name);
-		for (i = 0; i < MAP__NR_TYPES; ++i)
-			dso->symbols[i] = dso->symbol_names[i] = RB_ROOT;
-		dso->cache = RB_ROOT;
-		dso->symtab_type = DSO_BINARY_TYPE__NOT_FOUND;
-		dso->data_type   = DSO_BINARY_TYPE__NOT_FOUND;
-		dso->loaded = 0;
-		dso->rel = 0;
-		dso->sorted_by_name = 0;
-		dso->has_build_id = 0;
-		dso->kernel = DSO_TYPE_USER;
-		dso->needs_swap = DSO_SWAP__UNSET;
-		INIT_LIST_HEAD(&dso->node);
-	}
-
-	return dso;
-}
-
-void dso__delete(struct dso *dso)
-{
-	int i;
-	for (i = 0; i < MAP__NR_TYPES; ++i)
-		symbols__delete(&dso->symbols[i]);
-	if (dso->sname_alloc)
-		free((char *)dso->short_name);
-	if (dso->lname_alloc)
-		free(dso->long_name);
-	dso_cache__free(&dso->cache);
-	free(dso);
-}
-
-void dso__set_build_id(struct dso *dso, void *build_id)
-{
-	memcpy(dso->build_id, build_id, sizeof(dso->build_id));
-	dso->has_build_id = 1;
-}
-
-bool dso__build_id_equal(const struct dso *dso, u8 *build_id)
-{
-	return memcmp(dso->build_id, build_id, sizeof(dso->build_id)) == 0;
-}
-
-void dso__read_running_kernel_build_id(struct dso *dso, struct machine *machine)
-{
-	char path[PATH_MAX];
-
-	if (machine__is_default_guest(machine))
-		return;
-	sprintf(path, "%s/sys/kernel/notes", machine->root_dir);
-	if (sysfs__read_build_id(path, dso->build_id,
-				 sizeof(dso->build_id)) == 0)
-		dso->has_build_id = true;
-}
-
-int dso__kernel_module_get_build_id(struct dso *dso,
-				    const char *root_dir)
-{
-	char filename[PATH_MAX];
-	/*
-	 * kernel module short names are of the form "[module]" and
-	 * we need just "module" here.
-	 */
-	const char *name = dso->short_name + 1;
-
-	snprintf(filename, sizeof(filename),
-		 "%s/sys/module/%.*s/notes/.note.gnu.build-id",
-		 root_dir, (int)strlen(name) - 1, name);
-
-	if (sysfs__read_build_id(filename, dso->build_id,
-				 sizeof(dso->build_id)) == 0)
-		dso->has_build_id = true;
-
-	return 0;
-}
-
-bool __dsos__read_build_ids(struct list_head *head, bool with_hits)
-{
-	bool have_build_id = false;
-	struct dso *pos;
-
-	list_for_each_entry(pos, head, node) {
-		if (with_hits && !pos->hit)
-			continue;
-		if (pos->has_build_id) {
-			have_build_id = true;
-			continue;
-		}
-		if (filename__read_build_id(pos->long_name, pos->build_id,
-					    sizeof(pos->build_id)) > 0) {
-			have_build_id	  = true;
-			pos->has_build_id = true;
-		}
-	}
-
-	return have_build_id;
-}
-
-void dsos__add(struct list_head *head, struct dso *dso)
-{
-	list_add_tail(&dso->node, head);
-}
-
-struct dso *dsos__find(struct list_head *head, const char *name, bool cmp_short)
-{
-	struct dso *pos;
-
-	if (cmp_short) {
-		list_for_each_entry(pos, head, node)
-			if (strcmp(pos->short_name, name) == 0)
-				return pos;
-		return NULL;
-	}
-	list_for_each_entry(pos, head, node)
-		if (strcmp(pos->long_name, name) == 0)
-			return pos;
-	return NULL;
-}
-
-struct dso *__dsos__findnew(struct list_head *head, const char *name)
-{
-	struct dso *dso = dsos__find(head, name, false);
-
-	if (!dso) {
-		dso = dso__new(name);
-		if (dso != NULL) {
-			dsos__add(head, dso);
-			dso__set_basename(dso);
-		}
-	}
-
-	return dso;
-}
-
-size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp,
-			       bool (skip)(struct dso *dso, int parm), int parm)
-{
-	struct dso *pos;
-	size_t ret = 0;
-
-	list_for_each_entry(pos, head, node) {
-		if (skip && skip(pos, parm))
-			continue;
-		ret += dso__fprintf_buildid(pos, fp);
-		ret += fprintf(fp, " %s\n", pos->long_name);
-	}
-	return ret;
-}
-
-size_t __dsos__fprintf(struct list_head *head, FILE *fp)
-{
-	struct dso *pos;
-	size_t ret = 0;
-
-	list_for_each_entry(pos, head, node) {
-		int i;
-		for (i = 0; i < MAP__NR_TYPES; ++i)
-			ret += dso__fprintf(pos, i, fp);
-	}
-
-	return ret;
-}
-
-size_t dso__fprintf_buildid(struct dso *dso, FILE *fp)
-{
-	char sbuild_id[BUILD_ID_SIZE * 2 + 1];
-
-	build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id);
-	return fprintf(fp, "%s", sbuild_id);
-}
-
-size_t dso__fprintf(struct dso *dso, enum map_type type, FILE *fp)
-{
-	struct rb_node *nd;
-	size_t ret = fprintf(fp, "dso: %s (", dso->short_name);
-
-	if (dso->short_name != dso->long_name)
-		ret += fprintf(fp, "%s, ", dso->long_name);
-	ret += fprintf(fp, "%s, %sloaded, ", map_type__name[type],
-		       dso__loaded(dso, type) ? "" : "NOT ");
-	ret += dso__fprintf_buildid(dso, fp);
-	ret += fprintf(fp, ")\n");
-	for (nd = rb_first(&dso->symbols[type]); nd; nd = rb_next(nd)) {
-		struct symbol *pos = rb_entry(nd, struct symbol, rb_node);
-		ret += symbol__fprintf(pos, fp);
-	}
-
-	return ret;
-}
diff --git a/src/tools/perf/util/dso.h b/src/tools/perf/util/dso.h
deleted file mode 100644
index b793053..0000000
--- a/src/tools/perf/util/dso.h
+++ /dev/null
@@ -1,166 +0,0 @@
-#ifndef __PERF_DSO
-#define __PERF_DSO
-
-#include <linux/types.h>
-#include <linux/rbtree.h>
-#include <stdbool.h>
-#include "types.h"
-#include "map.h"
-
-enum dso_binary_type {
-	DSO_BINARY_TYPE__KALLSYMS = 0,
-	DSO_BINARY_TYPE__GUEST_KALLSYMS,
-	DSO_BINARY_TYPE__VMLINUX,
-	DSO_BINARY_TYPE__GUEST_VMLINUX,
-	DSO_BINARY_TYPE__JAVA_JIT,
-	DSO_BINARY_TYPE__DEBUGLINK,
-	DSO_BINARY_TYPE__BUILD_ID_CACHE,
-	DSO_BINARY_TYPE__FEDORA_DEBUGINFO,
-	DSO_BINARY_TYPE__UBUNTU_DEBUGINFO,
-	DSO_BINARY_TYPE__BUILDID_DEBUGINFO,
-	DSO_BINARY_TYPE__SYSTEM_PATH_DSO,
-	DSO_BINARY_TYPE__GUEST_KMODULE,
-	DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE,
-	DSO_BINARY_TYPE__KCORE,
-	DSO_BINARY_TYPE__GUEST_KCORE,
-	DSO_BINARY_TYPE__NOT_FOUND,
-};
-
-enum dso_kernel_type {
-	DSO_TYPE_USER = 0,
-	DSO_TYPE_KERNEL,
-	DSO_TYPE_GUEST_KERNEL
-};
-
-enum dso_swap_type {
-	DSO_SWAP__UNSET,
-	DSO_SWAP__NO,
-	DSO_SWAP__YES,
-};
-
-#define DSO__SWAP(dso, type, val)			\
-({							\
-	type ____r = val;				\
-	BUG_ON(dso->needs_swap == DSO_SWAP__UNSET);	\
-	if (dso->needs_swap == DSO_SWAP__YES) {		\
-		switch (sizeof(____r)) {		\
-		case 2:					\
-			____r = bswap_16(val);		\
-			break;				\
-		case 4:					\
-			____r = bswap_32(val);		\
-			break;				\
-		case 8:					\
-			____r = bswap_64(val);		\
-			break;				\
-		default:				\
-			BUG_ON(1);			\
-		}					\
-	}						\
-	____r;						\
-})
-
-#define DSO__DATA_CACHE_SIZE 4096
-#define DSO__DATA_CACHE_MASK ~(DSO__DATA_CACHE_SIZE - 1)
-
-struct dso_cache {
-	struct rb_node	rb_node;
-	u64 offset;
-	u64 size;
-	char data[0];
-};
-
-struct dso {
-	struct list_head node;
-	struct rb_root	 symbols[MAP__NR_TYPES];
-	struct rb_root	 symbol_names[MAP__NR_TYPES];
-	struct rb_root	 cache;
-	enum dso_kernel_type	kernel;
-	enum dso_swap_type	needs_swap;
-	enum dso_binary_type	symtab_type;
-	enum dso_binary_type	data_type;
-	u8		 adjust_symbols:1;
-	u8		 has_build_id:1;
-	u8		 hit:1;
-	u8		 annotate_warned:1;
-	u8		 sname_alloc:1;
-	u8		 lname_alloc:1;
-	u8		 sorted_by_name;
-	u8		 loaded;
-	u8		 rel;
-	u8		 build_id[BUILD_ID_SIZE];
-	const char	 *short_name;
-	char		 *long_name;
-	u16		 long_name_len;
-	u16		 short_name_len;
-	char		 name[0];
-};
-
-static inline void dso__set_loaded(struct dso *dso, enum map_type type)
-{
-	dso->loaded |= (1 << type);
-}
-
-struct dso *dso__new(const char *name);
-void dso__delete(struct dso *dso);
-
-void dso__set_short_name(struct dso *dso, const char *name);
-void dso__set_long_name(struct dso *dso, char *name);
-
-int dso__name_len(const struct dso *dso);
-
-bool dso__loaded(const struct dso *dso, enum map_type type);
-
-bool dso__sorted_by_name(const struct dso *dso, enum map_type type);
-void dso__set_sorted_by_name(struct dso *dso, enum map_type type);
-void dso__sort_by_name(struct dso *dso, enum map_type type);
-
-void dso__set_build_id(struct dso *dso, void *build_id);
-bool dso__build_id_equal(const struct dso *dso, u8 *build_id);
-void dso__read_running_kernel_build_id(struct dso *dso,
-				       struct machine *machine);
-int dso__kernel_module_get_build_id(struct dso *dso, const char *root_dir);
-
-char dso__symtab_origin(const struct dso *dso);
-int dso__binary_type_file(struct dso *dso, enum dso_binary_type type,
-			  char *root_dir, char *file, size_t size);
-
-int dso__data_fd(struct dso *dso, struct machine *machine);
-ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
-			      u64 offset, u8 *data, ssize_t size);
-ssize_t dso__data_read_addr(struct dso *dso, struct map *map,
-			    struct machine *machine, u64 addr,
-			    u8 *data, ssize_t size);
-
-struct map *dso__new_map(const char *name);
-struct dso *dso__kernel_findnew(struct machine *machine, const char *name,
-				const char *short_name, int dso_type);
-
-void dsos__add(struct list_head *head, struct dso *dso);
-struct dso *dsos__find(struct list_head *head, const char *name,
-		       bool cmp_short);
-struct dso *__dsos__findnew(struct list_head *head, const char *name);
-bool __dsos__read_build_ids(struct list_head *head, bool with_hits);
-
-size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp,
-			       bool (skip)(struct dso *dso, int parm), int parm);
-size_t __dsos__fprintf(struct list_head *head, FILE *fp);
-
-size_t dso__fprintf_buildid(struct dso *dso, FILE *fp);
-size_t dso__fprintf_symbols_by_name(struct dso *dso,
-				    enum map_type type, FILE *fp);
-size_t dso__fprintf(struct dso *dso, enum map_type type, FILE *fp);
-
-static inline bool dso__is_vmlinux(struct dso *dso)
-{
-	return dso->data_type == DSO_BINARY_TYPE__VMLINUX ||
-	       dso->data_type == DSO_BINARY_TYPE__GUEST_VMLINUX;
-}
-
-static inline bool dso__is_kcore(struct dso *dso)
-{
-	return dso->data_type == DSO_BINARY_TYPE__KCORE ||
-	       dso->data_type == DSO_BINARY_TYPE__GUEST_KCORE;
-}
-
-#endif /* __PERF_DSO */
diff --git a/src/tools/perf/util/dwarf-aux.c b/src/tools/perf/util/dwarf-aux.c
deleted file mode 100644
index 7defd77..0000000
--- a/src/tools/perf/util/dwarf-aux.c
+++ /dev/null
@@ -1,881 +0,0 @@
-/*
- * dwarf-aux.c : libdw auxiliary interfaces
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#include <stdbool.h>
-#include "util.h"
-#include "debug.h"
-#include "dwarf-aux.h"
-
-/**
- * cu_find_realpath - Find the realpath of the target file
- * @cu_die: A DIE(dwarf information entry) of CU(compilation Unit)
- * @fname:  The tail filename of the target file
- *
- * Find the real(long) path of @fname in @cu_die.
- */
-const char *cu_find_realpath(Dwarf_Die *cu_die, const char *fname)
-{
-	Dwarf_Files *files;
-	size_t nfiles, i;
-	const char *src = NULL;
-	int ret;
-
-	if (!fname)
-		return NULL;
-
-	ret = dwarf_getsrcfiles(cu_die, &files, &nfiles);
-	if (ret != 0)
-		return NULL;
-
-	for (i = 0; i < nfiles; i++) {
-		src = dwarf_filesrc(files, i, NULL, NULL);
-		if (strtailcmp(src, fname) == 0)
-			break;
-	}
-	if (i == nfiles)
-		return NULL;
-	return src;
-}
-
-/**
- * cu_get_comp_dir - Get the path of compilation directory
- * @cu_die: a CU DIE
- *
- * Get the path of compilation directory of given @cu_die.
- * Since this depends on DW_AT_comp_dir, older gcc will not
- * embedded it. In that case, this returns NULL.
- */
-const char *cu_get_comp_dir(Dwarf_Die *cu_die)
-{
-	Dwarf_Attribute attr;
-	if (dwarf_attr(cu_die, DW_AT_comp_dir, &attr) == NULL)
-		return NULL;
-	return dwarf_formstring(&attr);
-}
-
-/**
- * cu_find_lineinfo - Get a line number and file name for given address
- * @cu_die: a CU DIE
- * @addr: An address
- * @fname: a pointer which returns the file name string
- * @lineno: a pointer which returns the line number
- *
- * Find a line number and file name for @addr in @cu_die.
- */
-int cu_find_lineinfo(Dwarf_Die *cu_die, unsigned long addr,
-		    const char **fname, int *lineno)
-{
-	Dwarf_Line *line;
-	Dwarf_Addr laddr;
-
-	line = dwarf_getsrc_die(cu_die, (Dwarf_Addr)addr);
-	if (line && dwarf_lineaddr(line, &laddr) == 0 &&
-	    addr == (unsigned long)laddr && dwarf_lineno(line, lineno) == 0) {
-		*fname = dwarf_linesrc(line, NULL, NULL);
-		if (!*fname)
-			/* line number is useless without filename */
-			*lineno = 0;
-	}
-
-	return *lineno ?: -ENOENT;
-}
-
-static int __die_find_inline_cb(Dwarf_Die *die_mem, void *data);
-
-/**
- * cu_walk_functions_at - Walk on function DIEs at given address
- * @cu_die: A CU DIE
- * @addr: An address
- * @callback: A callback which called with found DIEs
- * @data: A user data
- *
- * Walk on function DIEs at given @addr in @cu_die. Passed DIEs
- * should be subprogram or inlined-subroutines.
- */
-int cu_walk_functions_at(Dwarf_Die *cu_die, Dwarf_Addr addr,
-		    int (*callback)(Dwarf_Die *, void *), void *data)
-{
-	Dwarf_Die die_mem;
-	Dwarf_Die *sc_die;
-	int ret = -ENOENT;
-
-	/* Inlined function could be recursive. Trace it until fail */
-	for (sc_die = die_find_realfunc(cu_die, addr, &die_mem);
-	     sc_die != NULL;
-	     sc_die = die_find_child(sc_die, __die_find_inline_cb, &addr,
-				     &die_mem)) {
-		ret = callback(sc_die, data);
-		if (ret)
-			break;
-	}
-
-	return ret;
-
-}
-
-/**
- * die_compare_name - Compare diename and tname
- * @dw_die: a DIE
- * @tname: a string of target name
- *
- * Compare the name of @dw_die and @tname. Return false if @dw_die has no name.
- */
-bool die_compare_name(Dwarf_Die *dw_die, const char *tname)
-{
-	const char *name;
-	name = dwarf_diename(dw_die);
-	return name ? (strcmp(tname, name) == 0) : false;
-}
-
-/**
- * die_get_call_lineno - Get callsite line number of inline-function instance
- * @in_die: a DIE of an inlined function instance
- *
- * Get call-site line number of @in_die. This means from where the inline
- * function is called.
- */
-int die_get_call_lineno(Dwarf_Die *in_die)
-{
-	Dwarf_Attribute attr;
-	Dwarf_Word ret;
-
-	if (!dwarf_attr(in_die, DW_AT_call_line, &attr))
-		return -ENOENT;
-
-	dwarf_formudata(&attr, &ret);
-	return (int)ret;
-}
-
-/**
- * die_get_type - Get type DIE
- * @vr_die: a DIE of a variable
- * @die_mem: where to store a type DIE
- *
- * Get a DIE of the type of given variable (@vr_die), and store
- * it to die_mem. Return NULL if fails to get a type DIE.
- */
-Dwarf_Die *die_get_type(Dwarf_Die *vr_die, Dwarf_Die *die_mem)
-{
-	Dwarf_Attribute attr;
-
-	if (dwarf_attr_integrate(vr_die, DW_AT_type, &attr) &&
-	    dwarf_formref_die(&attr, die_mem))
-		return die_mem;
-	else
-		return NULL;
-}
-
-/* Get a type die, but skip qualifiers */
-static Dwarf_Die *__die_get_real_type(Dwarf_Die *vr_die, Dwarf_Die *die_mem)
-{
-	int tag;
-
-	do {
-		vr_die = die_get_type(vr_die, die_mem);
-		if (!vr_die)
-			break;
-		tag = dwarf_tag(vr_die);
-	} while (tag == DW_TAG_const_type ||
-		 tag == DW_TAG_restrict_type ||
-		 tag == DW_TAG_volatile_type ||
-		 tag == DW_TAG_shared_type);
-
-	return vr_die;
-}
-
-/**
- * die_get_real_type - Get a type die, but skip qualifiers and typedef
- * @vr_die: a DIE of a variable
- * @die_mem: where to store a type DIE
- *
- * Get a DIE of the type of given variable (@vr_die), and store
- * it to die_mem. Return NULL if fails to get a type DIE.
- * If the type is qualifiers (e.g. const) or typedef, this skips it
- * and tries to find real type (structure or basic types, e.g. int).
- */
-Dwarf_Die *die_get_real_type(Dwarf_Die *vr_die, Dwarf_Die *die_mem)
-{
-	do {
-		vr_die = __die_get_real_type(vr_die, die_mem);
-	} while (vr_die && dwarf_tag(vr_die) == DW_TAG_typedef);
-
-	return vr_die;
-}
-
-/* Get attribute and translate it as a udata */
-static int die_get_attr_udata(Dwarf_Die *tp_die, unsigned int attr_name,
-			      Dwarf_Word *result)
-{
-	Dwarf_Attribute attr;
-
-	if (dwarf_attr(tp_die, attr_name, &attr) == NULL ||
-	    dwarf_formudata(&attr, result) != 0)
-		return -ENOENT;
-
-	return 0;
-}
-
-/* Get attribute and translate it as a sdata */
-static int die_get_attr_sdata(Dwarf_Die *tp_die, unsigned int attr_name,
-			      Dwarf_Sword *result)
-{
-	Dwarf_Attribute attr;
-
-	if (dwarf_attr(tp_die, attr_name, &attr) == NULL ||
-	    dwarf_formsdata(&attr, result) != 0)
-		return -ENOENT;
-
-	return 0;
-}
-
-/**
- * die_is_signed_type - Check whether a type DIE is signed or not
- * @tp_die: a DIE of a type
- *
- * Get the encoding of @tp_die and return true if the encoding
- * is signed.
- */
-bool die_is_signed_type(Dwarf_Die *tp_die)
-{
-	Dwarf_Word ret;
-
-	if (die_get_attr_udata(tp_die, DW_AT_encoding, &ret))
-		return false;
-
-	return (ret == DW_ATE_signed_char || ret == DW_ATE_signed ||
-		ret == DW_ATE_signed_fixed);
-}
-
-/**
- * die_is_func_def - Ensure that this DIE is a subprogram and definition
- * @dw_die: a DIE
- *
- * Ensure that this DIE is a subprogram and NOT a declaration. This
- * returns true if @dw_die is a function definition.
- **/
-bool die_is_func_def(Dwarf_Die *dw_die)
-{
-	Dwarf_Attribute attr;
-
-	return (dwarf_tag(dw_die) == DW_TAG_subprogram &&
-		dwarf_attr(dw_die, DW_AT_declaration, &attr) == NULL);
-}
-
-/**
- * die_get_data_member_location - Get the data-member offset
- * @mb_die: a DIE of a member of a data structure
- * @offs: The offset of the member in the data structure
- *
- * Get the offset of @mb_die in the data structure including @mb_die, and
- * stores result offset to @offs. If any error occurs this returns errno.
- */
-int die_get_data_member_location(Dwarf_Die *mb_die, Dwarf_Word *offs)
-{
-	Dwarf_Attribute attr;
-	Dwarf_Op *expr;
-	size_t nexpr;
-	int ret;
-
-	if (dwarf_attr(mb_die, DW_AT_data_member_location, &attr) == NULL)
-		return -ENOENT;
-
-	if (dwarf_formudata(&attr, offs) != 0) {
-		/* DW_AT_data_member_location should be DW_OP_plus_uconst */
-		ret = dwarf_getlocation(&attr, &expr, &nexpr);
-		if (ret < 0 || nexpr == 0)
-			return -ENOENT;
-
-		if (expr[0].atom != DW_OP_plus_uconst || nexpr != 1) {
-			pr_debug("Unable to get offset:Unexpected OP %x (%zd)\n",
-				 expr[0].atom, nexpr);
-			return -ENOTSUP;
-		}
-		*offs = (Dwarf_Word)expr[0].number;
-	}
-	return 0;
-}
-
-/* Get the call file index number in CU DIE */
-static int die_get_call_fileno(Dwarf_Die *in_die)
-{
-	Dwarf_Sword idx;
-
-	if (die_get_attr_sdata(in_die, DW_AT_call_file, &idx) == 0)
-		return (int)idx;
-	else
-		return -ENOENT;
-}
-
-/* Get the declared file index number in CU DIE */
-static int die_get_decl_fileno(Dwarf_Die *pdie)
-{
-	Dwarf_Sword idx;
-
-	if (die_get_attr_sdata(pdie, DW_AT_decl_file, &idx) == 0)
-		return (int)idx;
-	else
-		return -ENOENT;
-}
-
-/**
- * die_get_call_file - Get callsite file name of inlined function instance
- * @in_die: a DIE of an inlined function instance
- *
- * Get call-site file name of @in_die. This means from which file the inline
- * function is called.
- */
-const char *die_get_call_file(Dwarf_Die *in_die)
-{
-	Dwarf_Die cu_die;
-	Dwarf_Files *files;
-	int idx;
-
-	idx = die_get_call_fileno(in_die);
-	if (idx < 0 || !dwarf_diecu(in_die, &cu_die, NULL, NULL) ||
-	    dwarf_getsrcfiles(&cu_die, &files, NULL) != 0)
-		return NULL;
-
-	return dwarf_filesrc(files, idx, NULL, NULL);
-}
-
-
-/**
- * die_find_child - Generic DIE search function in DIE tree
- * @rt_die: a root DIE
- * @callback: a callback function
- * @data: a user data passed to the callback function
- * @die_mem: a buffer for result DIE
- *
- * Trace DIE tree from @rt_die and call @callback for each child DIE.
- * If @callback returns DIE_FIND_CB_END, this stores the DIE into
- * @die_mem and returns it. If @callback returns DIE_FIND_CB_CONTINUE,
- * this continues to trace the tree. Optionally, @callback can return
- * DIE_FIND_CB_CHILD and DIE_FIND_CB_SIBLING, those means trace only
- * the children and trace only the siblings respectively.
- * Returns NULL if @callback can't find any appropriate DIE.
- */
-Dwarf_Die *die_find_child(Dwarf_Die *rt_die,
-			  int (*callback)(Dwarf_Die *, void *),
-			  void *data, Dwarf_Die *die_mem)
-{
-	Dwarf_Die child_die;
-	int ret;
-
-	ret = dwarf_child(rt_die, die_mem);
-	if (ret != 0)
-		return NULL;
-
-	do {
-		ret = callback(die_mem, data);
-		if (ret == DIE_FIND_CB_END)
-			return die_mem;
-
-		if ((ret & DIE_FIND_CB_CHILD) &&
-		    die_find_child(die_mem, callback, data, &child_die)) {
-			memcpy(die_mem, &child_die, sizeof(Dwarf_Die));
-			return die_mem;
-		}
-	} while ((ret & DIE_FIND_CB_SIBLING) &&
-		 dwarf_siblingof(die_mem, die_mem) == 0);
-
-	return NULL;
-}
-
-struct __addr_die_search_param {
-	Dwarf_Addr	addr;
-	Dwarf_Die	*die_mem;
-};
-
-/* die_find callback for non-inlined function search */
-static int __die_search_func_cb(Dwarf_Die *fn_die, void *data)
-{
-	struct __addr_die_search_param *ad = data;
-
-	/*
-	 * Since a declaration entry doesn't has given pc, this always returns
-	 * function definition entry.
-	 */
-	if (dwarf_tag(fn_die) == DW_TAG_subprogram &&
-	    dwarf_haspc(fn_die, ad->addr)) {
-		memcpy(ad->die_mem, fn_die, sizeof(Dwarf_Die));
-		return DWARF_CB_ABORT;
-	}
-	return DWARF_CB_OK;
-}
-
-/**
- * die_find_realfunc - Search a non-inlined function at given address
- * @cu_die: a CU DIE which including @addr
- * @addr: target address
- * @die_mem: a buffer for result DIE
- *
- * Search a non-inlined function DIE which includes @addr. Stores the
- * DIE to @die_mem and returns it if found. Returns NULL if failed.
- */
-Dwarf_Die *die_find_realfunc(Dwarf_Die *cu_die, Dwarf_Addr addr,
-				    Dwarf_Die *die_mem)
-{
-	struct __addr_die_search_param ad;
-	ad.addr = addr;
-	ad.die_mem = die_mem;
-	/* dwarf_getscopes can't find subprogram. */
-	if (!dwarf_getfuncs(cu_die, __die_search_func_cb, &ad, 0))
-		return NULL;
-	else
-		return die_mem;
-}
-
-/* die_find callback for inline function search */
-static int __die_find_inline_cb(Dwarf_Die *die_mem, void *data)
-{
-	Dwarf_Addr *addr = data;
-
-	if (dwarf_tag(die_mem) == DW_TAG_inlined_subroutine &&
-	    dwarf_haspc(die_mem, *addr))
-		return DIE_FIND_CB_END;
-
-	return DIE_FIND_CB_CONTINUE;
-}
-
-/**
- * die_find_top_inlinefunc - Search the top inlined function at given address
- * @sp_die: a subprogram DIE which including @addr
- * @addr: target address
- * @die_mem: a buffer for result DIE
- *
- * Search an inlined function DIE which includes @addr. Stores the
- * DIE to @die_mem and returns it if found. Returns NULL if failed.
- * Even if several inlined functions are expanded recursively, this
- * doesn't trace it down, and returns the topmost one.
- */
-Dwarf_Die *die_find_top_inlinefunc(Dwarf_Die *sp_die, Dwarf_Addr addr,
-				   Dwarf_Die *die_mem)
-{
-	return die_find_child(sp_die, __die_find_inline_cb, &addr, die_mem);
-}
-
-/**
- * die_find_inlinefunc - Search an inlined function at given address
- * @sp_die: a subprogram DIE which including @addr
- * @addr: target address
- * @die_mem: a buffer for result DIE
- *
- * Search an inlined function DIE which includes @addr. Stores the
- * DIE to @die_mem and returns it if found. Returns NULL if failed.
- * If several inlined functions are expanded recursively, this trace
- * it down and returns deepest one.
- */
-Dwarf_Die *die_find_inlinefunc(Dwarf_Die *sp_die, Dwarf_Addr addr,
-			       Dwarf_Die *die_mem)
-{
-	Dwarf_Die tmp_die;
-
-	sp_die = die_find_child(sp_die, __die_find_inline_cb, &addr, &tmp_die);
-	if (!sp_die)
-		return NULL;
-
-	/* Inlined function could be recursive. Trace it until fail */
-	while (sp_die) {
-		memcpy(die_mem, sp_die, sizeof(Dwarf_Die));
-		sp_die = die_find_child(sp_die, __die_find_inline_cb, &addr,
-					&tmp_die);
-	}
-
-	return die_mem;
-}
-
-struct __instance_walk_param {
-	void    *addr;
-	int	(*callback)(Dwarf_Die *, void *);
-	void    *data;
-	int	retval;
-};
-
-static int __die_walk_instances_cb(Dwarf_Die *inst, void *data)
-{
-	struct __instance_walk_param *iwp = data;
-	Dwarf_Attribute attr_mem;
-	Dwarf_Die origin_mem;
-	Dwarf_Attribute *attr;
-	Dwarf_Die *origin;
-	int tmp;
-
-	attr = dwarf_attr(inst, DW_AT_abstract_origin, &attr_mem);
-	if (attr == NULL)
-		return DIE_FIND_CB_CONTINUE;
-
-	origin = dwarf_formref_die(attr, &origin_mem);
-	if (origin == NULL || origin->addr != iwp->addr)
-		return DIE_FIND_CB_CONTINUE;
-
-	/* Ignore redundant instances */
-	if (dwarf_tag(inst) == DW_TAG_inlined_subroutine) {
-		dwarf_decl_line(origin, &tmp);
-		if (die_get_call_lineno(inst) == tmp) {
-			tmp = die_get_decl_fileno(origin);
-			if (die_get_call_fileno(inst) == tmp)
-				return DIE_FIND_CB_CONTINUE;
-		}
-	}
-
-	iwp->retval = iwp->callback(inst, iwp->data);
-
-	return (iwp->retval) ? DIE_FIND_CB_END : DIE_FIND_CB_CONTINUE;
-}
-
-/**
- * die_walk_instances - Walk on instances of given DIE
- * @or_die: an abstract original DIE
- * @callback: a callback function which is called with instance DIE
- * @data: user data
- *
- * Walk on the instances of give @in_die. @in_die must be an inlined function
- * declartion. This returns the return value of @callback if it returns
- * non-zero value, or -ENOENT if there is no instance.
- */
-int die_walk_instances(Dwarf_Die *or_die, int (*callback)(Dwarf_Die *, void *),
-		       void *data)
-{
-	Dwarf_Die cu_die;
-	Dwarf_Die die_mem;
-	struct __instance_walk_param iwp = {
-		.addr = or_die->addr,
-		.callback = callback,
-		.data = data,
-		.retval = -ENOENT,
-	};
-
-	if (dwarf_diecu(or_die, &cu_die, NULL, NULL) == NULL)
-		return -ENOENT;
-
-	die_find_child(&cu_die, __die_walk_instances_cb, &iwp, &die_mem);
-
-	return iwp.retval;
-}
-
-/* Line walker internal parameters */
-struct __line_walk_param {
-	bool recursive;
-	line_walk_callback_t callback;
-	void *data;
-	int retval;
-};
-
-static int __die_walk_funclines_cb(Dwarf_Die *in_die, void *data)
-{
-	struct __line_walk_param *lw = data;
-	Dwarf_Addr addr = 0;
-	const char *fname;
-	int lineno;
-
-	if (dwarf_tag(in_die) == DW_TAG_inlined_subroutine) {
-		fname = die_get_call_file(in_die);
-		lineno = die_get_call_lineno(in_die);
-		if (fname && lineno > 0 && dwarf_entrypc(in_die, &addr) == 0) {
-			lw->retval = lw->callback(fname, lineno, addr, lw->data);
-			if (lw->retval != 0)
-				return DIE_FIND_CB_END;
-		}
-	}
-	if (!lw->recursive)
-		/* Don't need to search recursively */
-		return DIE_FIND_CB_SIBLING;
-
-	if (addr) {
-		fname = dwarf_decl_file(in_die);
-		if (fname && dwarf_decl_line(in_die, &lineno) == 0) {
-			lw->retval = lw->callback(fname, lineno, addr, lw->data);
-			if (lw->retval != 0)
-				return DIE_FIND_CB_END;
-		}
-	}
-
-	/* Continue to search nested inlined function call-sites */
-	return DIE_FIND_CB_CONTINUE;
-}
-
-/* Walk on lines of blocks included in given DIE */
-static int __die_walk_funclines(Dwarf_Die *sp_die, bool recursive,
-				line_walk_callback_t callback, void *data)
-{
-	struct __line_walk_param lw = {
-		.recursive = recursive,
-		.callback = callback,
-		.data = data,
-		.retval = 0,
-	};
-	Dwarf_Die die_mem;
-	Dwarf_Addr addr;
-	const char *fname;
-	int lineno;
-
-	/* Handle function declaration line */
-	fname = dwarf_decl_file(sp_die);
-	if (fname && dwarf_decl_line(sp_die, &lineno) == 0 &&
-	    dwarf_entrypc(sp_die, &addr) == 0) {
-		lw.retval = callback(fname, lineno, addr, data);
-		if (lw.retval != 0)
-			goto done;
-	}
-	die_find_child(sp_die, __die_walk_funclines_cb, &lw, &die_mem);
-done:
-	return lw.retval;
-}
-
-static int __die_walk_culines_cb(Dwarf_Die *sp_die, void *data)
-{
-	struct __line_walk_param *lw = data;
-
-	lw->retval = __die_walk_funclines(sp_die, true, lw->callback, lw->data);
-	if (lw->retval != 0)
-		return DWARF_CB_ABORT;
-
-	return DWARF_CB_OK;
-}
-
-/**
- * die_walk_lines - Walk on lines inside given DIE
- * @rt_die: a root DIE (CU, subprogram or inlined_subroutine)
- * @callback: callback routine
- * @data: user data
- *
- * Walk on all lines inside given @rt_die and call @callback on each line.
- * If the @rt_die is a function, walk only on the lines inside the function,
- * otherwise @rt_die must be a CU DIE.
- * Note that this walks not only dwarf line list, but also function entries
- * and inline call-site.
- */
-int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data)
-{
-	Dwarf_Lines *lines;
-	Dwarf_Line *line;
-	Dwarf_Addr addr;
-	const char *fname;
-	int lineno, ret = 0;
-	Dwarf_Die die_mem, *cu_die;
-	size_t nlines, i;
-
-	/* Get the CU die */
-	if (dwarf_tag(rt_die) != DW_TAG_compile_unit)
-		cu_die = dwarf_diecu(rt_die, &die_mem, NULL, NULL);
-	else
-		cu_die = rt_die;
-	if (!cu_die) {
-		pr_debug2("Failed to get CU from given DIE.\n");
-		return -EINVAL;
-	}
-
-	/* Get lines list in the CU */
-	if (dwarf_getsrclines(cu_die, &lines, &nlines) != 0) {
-		pr_debug2("Failed to get source lines on this CU.\n");
-		return -ENOENT;
-	}
-	pr_debug2("Get %zd lines from this CU\n", nlines);
-
-	/* Walk on the lines on lines list */
-	for (i = 0; i < nlines; i++) {
-		line = dwarf_onesrcline(lines, i);
-		if (line == NULL ||
-		    dwarf_lineno(line, &lineno) != 0 ||
-		    dwarf_lineaddr(line, &addr) != 0) {
-			pr_debug2("Failed to get line info. "
-				  "Possible error in debuginfo.\n");
-			continue;
-		}
-		/* Filter lines based on address */
-		if (rt_die != cu_die)
-			/*
-			 * Address filtering
-			 * The line is included in given function, and
-			 * no inline block includes it.
-			 */
-			if (!dwarf_haspc(rt_die, addr) ||
-			    die_find_inlinefunc(rt_die, addr, &die_mem))
-				continue;
-		/* Get source line */
-		fname = dwarf_linesrc(line, NULL, NULL);
-
-		ret = callback(fname, lineno, addr, data);
-		if (ret != 0)
-			return ret;
-	}
-
-	/*
-	 * Dwarf lines doesn't include function declarations and inlined
-	 * subroutines. We have to check functions list or given function.
-	 */
-	if (rt_die != cu_die)
-		/*
-		 * Don't need walk functions recursively, because nested
-		 * inlined functions don't have lines of the specified DIE.
-		 */
-		ret = __die_walk_funclines(rt_die, false, callback, data);
-	else {
-		struct __line_walk_param param = {
-			.callback = callback,
-			.data = data,
-			.retval = 0,
-		};
-		dwarf_getfuncs(cu_die, __die_walk_culines_cb, &param, 0);
-		ret = param.retval;
-	}
-
-	return ret;
-}
-
-struct __find_variable_param {
-	const char *name;
-	Dwarf_Addr addr;
-};
-
-static int __die_find_variable_cb(Dwarf_Die *die_mem, void *data)
-{
-	struct __find_variable_param *fvp = data;
-	int tag;
-
-	tag = dwarf_tag(die_mem);
-	if ((tag == DW_TAG_formal_parameter ||
-	     tag == DW_TAG_variable) &&
-	    die_compare_name(die_mem, fvp->name))
-		return DIE_FIND_CB_END;
-
-	if (dwarf_haspc(die_mem, fvp->addr))
-		return DIE_FIND_CB_CONTINUE;
-	else
-		return DIE_FIND_CB_SIBLING;
-}
-
-/**
- * die_find_variable_at - Find a given name variable at given address
- * @sp_die: a function DIE
- * @name: variable name
- * @addr: address
- * @die_mem: a buffer for result DIE
- *
- * Find a variable DIE called @name at @addr in @sp_die.
- */
-Dwarf_Die *die_find_variable_at(Dwarf_Die *sp_die, const char *name,
-				Dwarf_Addr addr, Dwarf_Die *die_mem)
-{
-	struct __find_variable_param fvp = { .name = name, .addr = addr};
-
-	return die_find_child(sp_die, __die_find_variable_cb, (void *)&fvp,
-			      die_mem);
-}
-
-static int __die_find_member_cb(Dwarf_Die *die_mem, void *data)
-{
-	const char *name = data;
-
-	if ((dwarf_tag(die_mem) == DW_TAG_member) &&
-	    die_compare_name(die_mem, name))
-		return DIE_FIND_CB_END;
-
-	return DIE_FIND_CB_SIBLING;
-}
-
-/**
- * die_find_member - Find a given name member in a data structure
- * @st_die: a data structure type DIE
- * @name: member name
- * @die_mem: a buffer for result DIE
- *
- * Find a member DIE called @name in @st_die.
- */
-Dwarf_Die *die_find_member(Dwarf_Die *st_die, const char *name,
-			   Dwarf_Die *die_mem)
-{
-	return die_find_child(st_die, __die_find_member_cb, (void *)name,
-			      die_mem);
-}
-
-/**
- * die_get_typename - Get the name of given variable DIE
- * @vr_die: a variable DIE
- * @buf: a buffer for result type name
- * @len: a max-length of @buf
- *
- * Get the name of @vr_die and stores it to @buf. Return the actual length
- * of type name if succeeded. Return -E2BIG if @len is not enough long, and
- * Return -ENOENT if failed to find type name.
- * Note that the result will stores typedef name if possible, and stores
- * "*(function_type)" if the type is a function pointer.
- */
-int die_get_typename(Dwarf_Die *vr_die, char *buf, int len)
-{
-	Dwarf_Die type;
-	int tag, ret, ret2;
-	const char *tmp = "";
-
-	if (__die_get_real_type(vr_die, &type) == NULL)
-		return -ENOENT;
-
-	tag = dwarf_tag(&type);
-	if (tag == DW_TAG_array_type || tag == DW_TAG_pointer_type)
-		tmp = "*";
-	else if (tag == DW_TAG_subroutine_type) {
-		/* Function pointer */
-		ret = snprintf(buf, len, "(function_type)");
-		return (ret >= len) ? -E2BIG : ret;
-	} else {
-		if (!dwarf_diename(&type))
-			return -ENOENT;
-		if (tag == DW_TAG_union_type)
-			tmp = "union ";
-		else if (tag == DW_TAG_structure_type)
-			tmp = "struct ";
-		else if (tag == DW_TAG_enumeration_type)
-			tmp = "enum ";
-		/* Write a base name */
-		ret = snprintf(buf, len, "%s%s", tmp, dwarf_diename(&type));
-		return (ret >= len) ? -E2BIG : ret;
-	}
-	ret = die_get_typename(&type, buf, len);
-	if (ret > 0) {
-		ret2 = snprintf(buf + ret, len - ret, "%s", tmp);
-		ret = (ret2 >= len - ret) ? -E2BIG : ret2 + ret;
-	}
-	return ret;
-}
-
-/**
- * die_get_varname - Get the name and type of given variable DIE
- * @vr_die: a variable DIE
- * @buf: a buffer for type and variable name
- * @len: the max-length of @buf
- *
- * Get the name and type of @vr_die and stores it in @buf as "type\tname".
- */
-int die_get_varname(Dwarf_Die *vr_die, char *buf, int len)
-{
-	int ret, ret2;
-
-	ret = die_get_typename(vr_die, buf, len);
-	if (ret < 0) {
-		pr_debug("Failed to get type, make it unknown.\n");
-		ret = snprintf(buf, len, "(unknown_type)");
-	}
-	if (ret > 0) {
-		ret2 = snprintf(buf + ret, len - ret, "\t%s",
-				dwarf_diename(vr_die));
-		ret = (ret2 >= len - ret) ? -E2BIG : ret2 + ret;
-	}
-	return ret;
-}
-
diff --git a/src/tools/perf/util/dwarf-aux.h b/src/tools/perf/util/dwarf-aux.h
deleted file mode 100644
index b4fe90c..0000000
--- a/src/tools/perf/util/dwarf-aux.h
+++ /dev/null
@@ -1,118 +0,0 @@
-#ifndef _DWARF_AUX_H
-#define _DWARF_AUX_H
-/*
- * dwarf-aux.h : libdw auxiliary interfaces
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#include <dwarf.h>
-#include <elfutils/libdw.h>
-#include <elfutils/libdwfl.h>
-#include <elfutils/version.h>
-
-/* Find the realpath of the target file */
-extern const char *cu_find_realpath(Dwarf_Die *cu_die, const char *fname);
-
-/* Get DW_AT_comp_dir (should be NULL with older gcc) */
-extern const char *cu_get_comp_dir(Dwarf_Die *cu_die);
-
-/* Get a line number and file name for given address */
-extern int cu_find_lineinfo(Dwarf_Die *cudie, unsigned long addr,
-			    const char **fname, int *lineno);
-
-/* Walk on funcitons at given address */
-extern int cu_walk_functions_at(Dwarf_Die *cu_die, Dwarf_Addr addr,
-			int (*callback)(Dwarf_Die *, void *), void *data);
-
-/* Ensure that this DIE is a subprogram and definition (not declaration) */
-extern bool die_is_func_def(Dwarf_Die *dw_die);
-
-/* Compare diename and tname */
-extern bool die_compare_name(Dwarf_Die *dw_die, const char *tname);
-
-/* Get callsite line number of inline-function instance */
-extern int die_get_call_lineno(Dwarf_Die *in_die);
-
-/* Get callsite file name of inlined function instance */
-extern const char *die_get_call_file(Dwarf_Die *in_die);
-
-/* Get type die */
-extern Dwarf_Die *die_get_type(Dwarf_Die *vr_die, Dwarf_Die *die_mem);
-
-/* Get a type die, but skip qualifiers and typedef */
-extern Dwarf_Die *die_get_real_type(Dwarf_Die *vr_die, Dwarf_Die *die_mem);
-
-/* Check whether the DIE is signed or not */
-extern bool die_is_signed_type(Dwarf_Die *tp_die);
-
-/* Get data_member_location offset */
-extern int die_get_data_member_location(Dwarf_Die *mb_die, Dwarf_Word *offs);
-
-/* Return values for die_find_child() callbacks */
-enum {
-	DIE_FIND_CB_END = 0,		/* End of Search */
-	DIE_FIND_CB_CHILD = 1,		/* Search only children */
-	DIE_FIND_CB_SIBLING = 2,	/* Search only siblings */
-	DIE_FIND_CB_CONTINUE = 3,	/* Search children and siblings */
-};
-
-/* Search child DIEs */
-extern Dwarf_Die *die_find_child(Dwarf_Die *rt_die,
-				 int (*callback)(Dwarf_Die *, void *),
-				 void *data, Dwarf_Die *die_mem);
-
-/* Search a non-inlined function including given address */
-extern Dwarf_Die *die_find_realfunc(Dwarf_Die *cu_die, Dwarf_Addr addr,
-				    Dwarf_Die *die_mem);
-
-/* Search the top inlined function including given address */
-extern Dwarf_Die *die_find_top_inlinefunc(Dwarf_Die *sp_die, Dwarf_Addr addr,
-					  Dwarf_Die *die_mem);
-
-/* Search the deepest inlined function including given address */
-extern Dwarf_Die *die_find_inlinefunc(Dwarf_Die *sp_die, Dwarf_Addr addr,
-				      Dwarf_Die *die_mem);
-
-/* Walk on the instances of given DIE */
-extern int die_walk_instances(Dwarf_Die *in_die,
-			      int (*callback)(Dwarf_Die *, void *), void *data);
-
-/* Walker on lines (Note: line number will not be sorted) */
-typedef int (* line_walk_callback_t) (const char *fname, int lineno,
-				      Dwarf_Addr addr, void *data);
-
-/*
- * Walk on lines inside given DIE. If the DIE is a subprogram, walk only on
- * the lines inside the subprogram, otherwise the DIE must be a CU DIE.
- */
-extern int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback,
-			  void *data);
-
-/* Find a variable called 'name' at given address */
-extern Dwarf_Die *die_find_variable_at(Dwarf_Die *sp_die, const char *name,
-				       Dwarf_Addr addr, Dwarf_Die *die_mem);
-
-/* Find a member called 'name' */
-extern Dwarf_Die *die_find_member(Dwarf_Die *st_die, const char *name,
-				  Dwarf_Die *die_mem);
-
-/* Get the name of given variable DIE */
-extern int die_get_typename(Dwarf_Die *vr_die, char *buf, int len);
-
-/* Get the name and type of given variable DIE, stored as "type\tname" */
-extern int die_get_varname(Dwarf_Die *vr_die, char *buf, int len);
-#endif
diff --git a/src/tools/perf/util/environment.c b/src/tools/perf/util/environment.c
deleted file mode 100644
index 275b0ee..0000000
--- a/src/tools/perf/util/environment.c
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * We put all the perf config variables in this same object
- * file, so that programs can link against the config parser
- * without having to link against all the rest of perf.
- */
-#include "cache.h"
-
-const char *pager_program;
-int pager_use_color = 1;
diff --git a/src/tools/perf/util/event.c b/src/tools/perf/util/event.c
deleted file mode 100644
index 1ae1b08..0000000
--- a/src/tools/perf/util/event.c
+++ /dev/null
@@ -1,774 +0,0 @@
-#include <linux/types.h>
-#include "event.h"
-#include "debug.h"
-#include "machine.h"
-#include "sort.h"
-#include "string.h"
-#include "strlist.h"
-#include "thread.h"
-#include "thread_map.h"
-
-static const char *perf_event__names[] = {
-	[0]					= "TOTAL",
-	[PERF_RECORD_MMAP]			= "MMAP",
-	[PERF_RECORD_MMAP2]			= "MMAP2",
-	[PERF_RECORD_LOST]			= "LOST",
-	[PERF_RECORD_COMM]			= "COMM",
-	[PERF_RECORD_EXIT]			= "EXIT",
-	[PERF_RECORD_THROTTLE]			= "THROTTLE",
-	[PERF_RECORD_UNTHROTTLE]		= "UNTHROTTLE",
-	[PERF_RECORD_FORK]			= "FORK",
-	[PERF_RECORD_READ]			= "READ",
-	[PERF_RECORD_SAMPLE]			= "SAMPLE",
-	[PERF_RECORD_HEADER_ATTR]		= "ATTR",
-	[PERF_RECORD_HEADER_EVENT_TYPE]		= "EVENT_TYPE",
-	[PERF_RECORD_HEADER_TRACING_DATA]	= "TRACING_DATA",
-	[PERF_RECORD_HEADER_BUILD_ID]		= "BUILD_ID",
-	[PERF_RECORD_FINISHED_ROUND]		= "FINISHED_ROUND",
-};
-
-const char *perf_event__name(unsigned int id)
-{
-	if (id >= ARRAY_SIZE(perf_event__names))
-		return "INVALID";
-	if (!perf_event__names[id])
-		return "UNKNOWN";
-	return perf_event__names[id];
-}
-
-static struct perf_sample synth_sample = {
-	.pid	   = -1,
-	.tid	   = -1,
-	.time	   = -1,
-	.stream_id = -1,
-	.cpu	   = -1,
-	.period	   = 1,
-};
-
-static pid_t perf_event__get_comm_tgid(pid_t pid, char *comm, size_t len)
-{
-	char filename[PATH_MAX];
-	char bf[BUFSIZ];
-	FILE *fp;
-	size_t size = 0;
-	pid_t tgid = -1;
-
-	snprintf(filename, sizeof(filename), "/proc/%d/status", pid);
-
-	fp = fopen(filename, "r");
-	if (fp == NULL) {
-		pr_debug("couldn't open %s\n", filename);
-		return 0;
-	}
-
-	while (!comm[0] || (tgid < 0)) {
-		if (fgets(bf, sizeof(bf), fp) == NULL) {
-			pr_warning("couldn't get COMM and pgid, malformed %s\n",
-				   filename);
-			break;
-		}
-
-		if (memcmp(bf, "Name:", 5) == 0) {
-			char *name = bf + 5;
-			while (*name && isspace(*name))
-				++name;
-			size = strlen(name) - 1;
-			if (size >= len)
-				size = len - 1;
-			memcpy(comm, name, size);
-			comm[size] = '\0';
-
-		} else if (memcmp(bf, "Tgid:", 5) == 0) {
-			char *tgids = bf + 5;
-			while (*tgids && isspace(*tgids))
-				++tgids;
-			tgid = atoi(tgids);
-		}
-	}
-
-	fclose(fp);
-
-	return tgid;
-}
-
-static pid_t perf_event__synthesize_comm(struct perf_tool *tool,
-					 union perf_event *event, pid_t pid,
-					 int full,
-					 perf_event__handler_t process,
-					 struct machine *machine)
-{
-	char filename[PATH_MAX];
-	size_t size;
-	DIR *tasks;
-	struct dirent dirent, *next;
-	pid_t tgid;
-
-	memset(&event->comm, 0, sizeof(event->comm));
-
-	tgid = perf_event__get_comm_tgid(pid, event->comm.comm,
-					 sizeof(event->comm.comm));
-	if (tgid < 0)
-		goto out;
-
-	event->comm.pid = tgid;
-	event->comm.header.type = PERF_RECORD_COMM;
-
-	size = strlen(event->comm.comm) + 1;
-	size = PERF_ALIGN(size, sizeof(u64));
-	memset(event->comm.comm + size, 0, machine->id_hdr_size);
-	event->comm.header.size = (sizeof(event->comm) -
-				(sizeof(event->comm.comm) - size) +
-				machine->id_hdr_size);
-	if (!full) {
-		event->comm.tid = pid;
-
-		if (process(tool, event, &synth_sample, machine) != 0)
-			return -1;
-
-		goto out;
-	}
-
-	snprintf(filename, sizeof(filename), "/proc/%d/task", pid);
-
-	tasks = opendir(filename);
-	if (tasks == NULL) {
-		pr_debug("couldn't open %s\n", filename);
-		return 0;
-	}
-
-	while (!readdir_r(tasks, &dirent, &next) && next) {
-		char *end;
-		pid = strtol(dirent.d_name, &end, 10);
-		if (*end)
-			continue;
-
-		/* already have tgid; jut want to update the comm */
-		(void) perf_event__get_comm_tgid(pid, event->comm.comm,
-					 sizeof(event->comm.comm));
-
-		size = strlen(event->comm.comm) + 1;
-		size = PERF_ALIGN(size, sizeof(u64));
-		memset(event->comm.comm + size, 0, machine->id_hdr_size);
-		event->comm.header.size = (sizeof(event->comm) -
-					  (sizeof(event->comm.comm) - size) +
-					  machine->id_hdr_size);
-
-		event->comm.tid = pid;
-
-		if (process(tool, event, &synth_sample, machine) != 0) {
-			tgid = -1;
-			break;
-		}
-	}
-
-	closedir(tasks);
-out:
-	return tgid;
-}
-
-static int perf_event__synthesize_mmap_events(struct perf_tool *tool,
-					      union perf_event *event,
-					      pid_t pid, pid_t tgid,
-					      perf_event__handler_t process,
-					      struct machine *machine)
-{
-	char filename[PATH_MAX];
-	FILE *fp;
-	int rc = 0;
-
-	snprintf(filename, sizeof(filename), "/proc/%d/maps", pid);
-
-	fp = fopen(filename, "r");
-	if (fp == NULL) {
-		/*
-		 * We raced with a task exiting - just return:
-		 */
-		pr_debug("couldn't open %s\n", filename);
-		return -1;
-	}
-
-	event->header.type = PERF_RECORD_MMAP;
-	/*
-	 * Just like the kernel, see __perf_event_mmap in kernel/perf_event.c
-	 */
-	event->header.misc = PERF_RECORD_MISC_USER;
-
-	while (1) {
-		char bf[BUFSIZ];
-		char prot[5];
-		char execname[PATH_MAX];
-		char anonstr[] = "//anon";
-		size_t size;
-		ssize_t n;
-
-		if (fgets(bf, sizeof(bf), fp) == NULL)
-			break;
-
-		/* ensure null termination since stack will be reused. */
-		strcpy(execname, "");
-
-		/* 00400000-0040c000 r-xp 00000000 fd:01 41038  /bin/cat */
-		n = sscanf(bf, "%"PRIx64"-%"PRIx64" %s %"PRIx64" %*x:%*x %*u %s\n",
-		       &event->mmap.start, &event->mmap.len, prot,
-		       &event->mmap.pgoff,
-		       execname);
-		/*
- 		 * Anon maps don't have the execname.
- 		 */
-		if (n < 4)
-			continue;
-
-		if (prot[2] != 'x')
-			continue;
-
-		if (!strcmp(execname, ""))
-			strcpy(execname, anonstr);
-
-		size = strlen(execname) + 1;
-		memcpy(event->mmap.filename, execname, size);
-		size = PERF_ALIGN(size, sizeof(u64));
-		event->mmap.len -= event->mmap.start;
-		event->mmap.header.size = (sizeof(event->mmap) -
-					(sizeof(event->mmap.filename) - size));
-		memset(event->mmap.filename + size, 0, machine->id_hdr_size);
-		event->mmap.header.size += machine->id_hdr_size;
-		event->mmap.pid = tgid;
-		event->mmap.tid = pid;
-
-		if (process(tool, event, &synth_sample, machine) != 0) {
-			rc = -1;
-			break;
-		}
-	}
-
-	fclose(fp);
-	return rc;
-}
-
-int perf_event__synthesize_modules(struct perf_tool *tool,
-				   perf_event__handler_t process,
-				   struct machine *machine)
-{
-	int rc = 0;
-	struct rb_node *nd;
-	struct map_groups *kmaps = &machine->kmaps;
-	union perf_event *event = zalloc((sizeof(event->mmap) +
-					  machine->id_hdr_size));
-	if (event == NULL) {
-		pr_debug("Not enough memory synthesizing mmap event "
-			 "for kernel modules\n");
-		return -1;
-	}
-
-	event->header.type = PERF_RECORD_MMAP;
-
-	/*
-	 * kernel uses 0 for user space maps, see kernel/perf_event.c
-	 * __perf_event_mmap
-	 */
-	if (machine__is_host(machine))
-		event->header.misc = PERF_RECORD_MISC_KERNEL;
-	else
-		event->header.misc = PERF_RECORD_MISC_GUEST_KERNEL;
-
-	for (nd = rb_first(&kmaps->maps[MAP__FUNCTION]);
-	     nd; nd = rb_next(nd)) {
-		size_t size;
-		struct map *pos = rb_entry(nd, struct map, rb_node);
-
-		if (pos->dso->kernel)
-			continue;
-
-		size = PERF_ALIGN(pos->dso->long_name_len + 1, sizeof(u64));
-		event->mmap.header.type = PERF_RECORD_MMAP;
-		event->mmap.header.size = (sizeof(event->mmap) -
-				        (sizeof(event->mmap.filename) - size));
-		memset(event->mmap.filename + size, 0, machine->id_hdr_size);
-		event->mmap.header.size += machine->id_hdr_size;
-		event->mmap.start = pos->start;
-		event->mmap.len   = pos->end - pos->start;
-		event->mmap.pid   = machine->pid;
-
-		memcpy(event->mmap.filename, pos->dso->long_name,
-		       pos->dso->long_name_len + 1);
-		if (process(tool, event, &synth_sample, machine) != 0) {
-			rc = -1;
-			break;
-		}
-	}
-
-	free(event);
-	return rc;
-}
-
-static int __event__synthesize_thread(union perf_event *comm_event,
-				      union perf_event *mmap_event,
-				      pid_t pid, int full,
-					  perf_event__handler_t process,
-				      struct perf_tool *tool,
-				      struct machine *machine)
-{
-	pid_t tgid = perf_event__synthesize_comm(tool, comm_event, pid, full,
-						 process, machine);
-	if (tgid == -1)
-		return -1;
-	return perf_event__synthesize_mmap_events(tool, mmap_event, pid, tgid,
-						  process, machine);
-}
-
-int perf_event__synthesize_thread_map(struct perf_tool *tool,
-				      struct thread_map *threads,
-				      perf_event__handler_t process,
-				      struct machine *machine)
-{
-	union perf_event *comm_event, *mmap_event;
-	int err = -1, thread, j;
-
-	comm_event = malloc(sizeof(comm_event->comm) + machine->id_hdr_size);
-	if (comm_event == NULL)
-		goto out;
-
-	mmap_event = malloc(sizeof(mmap_event->mmap) + machine->id_hdr_size);
-	if (mmap_event == NULL)
-		goto out_free_comm;
-
-	err = 0;
-	for (thread = 0; thread < threads->nr; ++thread) {
-		if (__event__synthesize_thread(comm_event, mmap_event,
-					       threads->map[thread], 0,
-					       process, tool, machine)) {
-			err = -1;
-			break;
-		}
-
-		/*
-		 * comm.pid is set to thread group id by
-		 * perf_event__synthesize_comm
-		 */
-		if ((int) comm_event->comm.pid != threads->map[thread]) {
-			bool need_leader = true;
-
-			/* is thread group leader in thread_map? */
-			for (j = 0; j < threads->nr; ++j) {
-				if ((int) comm_event->comm.pid == threads->map[j]) {
-					need_leader = false;
-					break;
-				}
-			}
-
-			/* if not, generate events for it */
-			if (need_leader &&
-			    __event__synthesize_thread(comm_event,
-						      mmap_event,
-						      comm_event->comm.pid, 0,
-						      process, tool, machine)) {
-				err = -1;
-				break;
-			}
-		}
-	}
-	free(mmap_event);
-out_free_comm:
-	free(comm_event);
-out:
-	return err;
-}
-
-int perf_event__synthesize_threads(struct perf_tool *tool,
-				   perf_event__handler_t process,
-				   struct machine *machine)
-{
-	DIR *proc;
-	struct dirent dirent, *next;
-	union perf_event *comm_event, *mmap_event;
-	int err = -1;
-
-	comm_event = malloc(sizeof(comm_event->comm) + machine->id_hdr_size);
-	if (comm_event == NULL)
-		goto out;
-
-	mmap_event = malloc(sizeof(mmap_event->mmap) + machine->id_hdr_size);
-	if (mmap_event == NULL)
-		goto out_free_comm;
-
-	proc = opendir("/proc");
-	if (proc == NULL)
-		goto out_free_mmap;
-
-	while (!readdir_r(proc, &dirent, &next) && next) {
-		char *end;
-		pid_t pid = strtol(dirent.d_name, &end, 10);
-
-		if (*end) /* only interested in proper numerical dirents */
-			continue;
-		/*
- 		 * We may race with exiting thread, so don't stop just because
- 		 * one thread couldn't be synthesized.
- 		 */
-		__event__synthesize_thread(comm_event, mmap_event, pid, 1,
-					   process, tool, machine);
-	}
-
-	err = 0;
-	closedir(proc);
-out_free_mmap:
-	free(mmap_event);
-out_free_comm:
-	free(comm_event);
-out:
-	return err;
-}
-
-struct process_symbol_args {
-	const char *name;
-	u64	   start;
-};
-
-static int find_symbol_cb(void *arg, const char *name, char type,
-			  u64 start)
-{
-	struct process_symbol_args *args = arg;
-
-	/*
-	 * Must be a function or at least an alias, as in PARISC64, where "_text" is
-	 * an 'A' to the same address as "_stext".
-	 */
-	if (!(symbol_type__is_a(type, MAP__FUNCTION) ||
-	      type == 'A') || strcmp(name, args->name))
-		return 0;
-
-	args->start = start;
-	return 1;
-}
-
-int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
-				       perf_event__handler_t process,
-				       struct machine *machine,
-				       const char *symbol_name)
-{
-	size_t size;
-	const char *filename, *mmap_name;
-	char path[PATH_MAX];
-	char name_buff[PATH_MAX];
-	struct map *map;
-	int err;
-	/*
-	 * We should get this from /sys/kernel/sections/.text, but till that is
-	 * available use this, and after it is use this as a fallback for older
-	 * kernels.
-	 */
-	struct process_symbol_args args = { .name = symbol_name, };
-	union perf_event *event = zalloc((sizeof(event->mmap) +
-					  machine->id_hdr_size));
-	if (event == NULL) {
-		pr_debug("Not enough memory synthesizing mmap event "
-			 "for kernel modules\n");
-		return -1;
-	}
-
-	mmap_name = machine__mmap_name(machine, name_buff, sizeof(name_buff));
-	if (machine__is_host(machine)) {
-		/*
-		 * kernel uses PERF_RECORD_MISC_USER for user space maps,
-		 * see kernel/perf_event.c __perf_event_mmap
-		 */
-		event->header.misc = PERF_RECORD_MISC_KERNEL;
-		filename = "/proc/kallsyms";
-	} else {
-		event->header.misc = PERF_RECORD_MISC_GUEST_KERNEL;
-		if (machine__is_default_guest(machine))
-			filename = (char *) symbol_conf.default_guest_kallsyms;
-		else {
-			sprintf(path, "%s/proc/kallsyms", machine->root_dir);
-			filename = path;
-		}
-	}
-
-	if (kallsyms__parse(filename, &args, find_symbol_cb) <= 0) {
-		free(event);
-		return -ENOENT;
-	}
-
-	map = machine->vmlinux_maps[MAP__FUNCTION];
-	size = snprintf(event->mmap.filename, sizeof(event->mmap.filename),
-			"%s%s", mmap_name, symbol_name) + 1;
-	size = PERF_ALIGN(size, sizeof(u64));
-	event->mmap.header.type = PERF_RECORD_MMAP;
-	event->mmap.header.size = (sizeof(event->mmap) -
-			(sizeof(event->mmap.filename) - size) + machine->id_hdr_size);
-	event->mmap.pgoff = args.start;
-	event->mmap.start = map->start;
-	event->mmap.len   = map->end - event->mmap.start;
-	event->mmap.pid   = machine->pid;
-
-	err = process(tool, event, &synth_sample, machine);
-	free(event);
-
-	return err;
-}
-
-size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp)
-{
-	return fprintf(fp, ": %s:%d\n", event->comm.comm, event->comm.tid);
-}
-
-int perf_event__process_comm(struct perf_tool *tool __maybe_unused,
-			     union perf_event *event,
-			     struct perf_sample *sample __maybe_unused,
-			     struct machine *machine)
-{
-	return machine__process_comm_event(machine, event);
-}
-
-int perf_event__process_lost(struct perf_tool *tool __maybe_unused,
-			     union perf_event *event,
-			     struct perf_sample *sample __maybe_unused,
-			     struct machine *machine)
-{
-	return machine__process_lost_event(machine, event);
-}
-
-size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp)
-{
-	return fprintf(fp, " %d/%d: [%#" PRIx64 "(%#" PRIx64 ") @ %#" PRIx64 "]: %s\n",
-		       event->mmap.pid, event->mmap.tid, event->mmap.start,
-		       event->mmap.len, event->mmap.pgoff, event->mmap.filename);
-}
-
-size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp)
-{
-	return fprintf(fp, " %d/%d: [%#" PRIx64 "(%#" PRIx64 ") @ %#" PRIx64
-			   " %02x:%02x %"PRIu64" %"PRIu64"]: %s\n",
-		       event->mmap2.pid, event->mmap2.tid, event->mmap2.start,
-		       event->mmap2.len, event->mmap2.pgoff, event->mmap2.maj,
-		       event->mmap2.min, event->mmap2.ino,
-		       event->mmap2.ino_generation,
-		       event->mmap2.filename);
-}
-
-int perf_event__process_mmap(struct perf_tool *tool __maybe_unused,
-			     union perf_event *event,
-			     struct perf_sample *sample __maybe_unused,
-			     struct machine *machine)
-{
-	return machine__process_mmap_event(machine, event);
-}
-
-int perf_event__process_mmap2(struct perf_tool *tool __maybe_unused,
-			     union perf_event *event,
-			     struct perf_sample *sample __maybe_unused,
-			     struct machine *machine)
-{
-	return machine__process_mmap2_event(machine, event);
-}
-
-size_t perf_event__fprintf_task(union perf_event *event, FILE *fp)
-{
-	return fprintf(fp, "(%d:%d):(%d:%d)\n",
-		       event->fork.pid, event->fork.tid,
-		       event->fork.ppid, event->fork.ptid);
-}
-
-int perf_event__process_fork(struct perf_tool *tool __maybe_unused,
-			     union perf_event *event,
-			     struct perf_sample *sample __maybe_unused,
-			     struct machine *machine)
-{
-	return machine__process_fork_event(machine, event);
-}
-
-int perf_event__process_exit(struct perf_tool *tool __maybe_unused,
-			     union perf_event *event,
-			     struct perf_sample *sample __maybe_unused,
-			     struct machine *machine)
-{
-	return machine__process_exit_event(machine, event);
-}
-
-size_t perf_event__fprintf(union perf_event *event, FILE *fp)
-{
-	size_t ret = fprintf(fp, "PERF_RECORD_%s",
-			     perf_event__name(event->header.type));
-
-	switch (event->header.type) {
-	case PERF_RECORD_COMM:
-		ret += perf_event__fprintf_comm(event, fp);
-		break;
-	case PERF_RECORD_FORK:
-	case PERF_RECORD_EXIT:
-		ret += perf_event__fprintf_task(event, fp);
-		break;
-	case PERF_RECORD_MMAP:
-		ret += perf_event__fprintf_mmap(event, fp);
-		break;
-	case PERF_RECORD_MMAP2:
-		ret += perf_event__fprintf_mmap2(event, fp);
-		break;
-	default:
-		ret += fprintf(fp, "\n");
-	}
-
-	return ret;
-}
-
-int perf_event__process(struct perf_tool *tool __maybe_unused,
-			union perf_event *event,
-			struct perf_sample *sample __maybe_unused,
-			struct machine *machine)
-{
-	return machine__process_event(machine, event);
-}
-
-void thread__find_addr_map(struct thread *self,
-			   struct machine *machine, u8 cpumode,
-			   enum map_type type, u64 addr,
-			   struct addr_location *al)
-{
-	struct map_groups *mg = &self->mg;
-	bool load_map = false;
-
-	al->thread = self;
-	al->addr = addr;
-	al->cpumode = cpumode;
-	al->filtered = false;
-
-	if (machine == NULL) {
-		al->map = NULL;
-		return;
-	}
-
-	if (cpumode == PERF_RECORD_MISC_KERNEL && perf_host) {
-		al->level = 'k';
-		mg = &machine->kmaps;
-		load_map = true;
-	} else if (cpumode == PERF_RECORD_MISC_USER && perf_host) {
-		al->level = '.';
-	} else if (cpumode == PERF_RECORD_MISC_GUEST_KERNEL && perf_guest) {
-		al->level = 'g';
-		mg = &machine->kmaps;
-		load_map = true;
-	} else {
-		/*
-		 * 'u' means guest os user space.
-		 * TODO: We don't support guest user space. Might support late.
-		 */
-		if (cpumode == PERF_RECORD_MISC_GUEST_USER && perf_guest)
-			al->level = 'u';
-		else
-			al->level = 'H';
-		al->map = NULL;
-
-		if ((cpumode == PERF_RECORD_MISC_GUEST_USER ||
-			cpumode == PERF_RECORD_MISC_GUEST_KERNEL) &&
-			!perf_guest)
-			al->filtered = true;
-		if ((cpumode == PERF_RECORD_MISC_USER ||
-			cpumode == PERF_RECORD_MISC_KERNEL) &&
-			!perf_host)
-			al->filtered = true;
-
-		return;
-	}
-try_again:
-	al->map = map_groups__find(mg, type, al->addr);
-	if (al->map == NULL) {
-		/*
-		 * If this is outside of all known maps, and is a negative
-		 * address, try to look it up in the kernel dso, as it might be
-		 * a vsyscall or vdso (which executes in user-mode).
-		 *
-		 * XXX This is nasty, we should have a symbol list in the
-		 * "[vdso]" dso, but for now lets use the old trick of looking
-		 * in the whole kernel symbol list.
-		 */
-		if ((long long)al->addr < 0 &&
-		    cpumode == PERF_RECORD_MISC_USER &&
-		    machine && mg != &machine->kmaps) {
-			mg = &machine->kmaps;
-			goto try_again;
-		}
-	} else {
-		/*
-		 * Kernel maps might be changed when loading symbols so loading
-		 * must be done prior to using kernel maps.
-		 */
-		if (load_map)
-			map__load(al->map, machine->symbol_filter);
-		al->addr = al->map->map_ip(al->map, al->addr);
-	}
-}
-
-void thread__find_addr_location(struct thread *thread, struct machine *machine,
-				u8 cpumode, enum map_type type, u64 addr,
-				struct addr_location *al)
-{
-	thread__find_addr_map(thread, machine, cpumode, type, addr, al);
-	if (al->map != NULL)
-		al->sym = map__find_symbol(al->map, al->addr,
-					   machine->symbol_filter);
-	else
-		al->sym = NULL;
-}
-
-int perf_event__preprocess_sample(const union perf_event *event,
-				  struct machine *machine,
-				  struct addr_location *al,
-				  struct perf_sample *sample)
-{
-	u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
-	struct thread *thread = machine__findnew_thread(machine, sample->pid,
-							sample->pid);
-
-	if (thread == NULL)
-		return -1;
-
-	if (symbol_conf.comm_list &&
-	    !strlist__has_entry(symbol_conf.comm_list, thread->comm))
-		goto out_filtered;
-
-	dump_printf(" ... thread: %s:%d\n", thread->comm, thread->tid);
-	/*
-	 * Have we already created the kernel maps for this machine?
-	 *
-	 * This should have happened earlier, when we processed the kernel MMAP
-	 * events, but for older perf.data files there was no such thing, so do
-	 * it now.
-	 */
-	if (cpumode == PERF_RECORD_MISC_KERNEL &&
-	    machine->vmlinux_maps[MAP__FUNCTION] == NULL)
-		machine__create_kernel_maps(machine);
-
-	thread__find_addr_map(thread, machine, cpumode, MAP__FUNCTION,
-			      sample->ip, al);
-	dump_printf(" ...... dso: %s\n",
-		    al->map ? al->map->dso->long_name :
-			al->level == 'H' ? "[hypervisor]" : "<not found>");
-	al->sym = NULL;
-	al->cpu = sample->cpu;
-
-	if (al->map) {
-		struct dso *dso = al->map->dso;
-
-		if (symbol_conf.dso_list &&
-		    (!dso || !(strlist__has_entry(symbol_conf.dso_list,
-						  dso->short_name) ||
-			       (dso->short_name != dso->long_name &&
-				strlist__has_entry(symbol_conf.dso_list,
-						   dso->long_name)))))
-			goto out_filtered;
-
-		al->sym = map__find_symbol(al->map, al->addr,
-					   machine->symbol_filter);
-	}
-
-	if (symbol_conf.sym_list &&
-		(!al->sym || !strlist__has_entry(symbol_conf.sym_list,
-						al->sym->name)))
-		goto out_filtered;
-
-	return 0;
-
-out_filtered:
-	al->filtered = true;
-	return 0;
-}
diff --git a/src/tools/perf/util/event.h b/src/tools/perf/util/event.h
deleted file mode 100644
index c67ecc4..0000000
--- a/src/tools/perf/util/event.h
+++ /dev/null
@@ -1,263 +0,0 @@
-#ifndef __PERF_RECORD_H
-#define __PERF_RECORD_H
-
-#include <limits.h>
-#include <stdio.h>
-
-#include "../perf.h"
-#include "map.h"
-#include "build-id.h"
-
-struct mmap_event {
-	struct perf_event_header header;
-	u32 pid, tid;
-	u64 start;
-	u64 len;
-	u64 pgoff;
-	char filename[PATH_MAX];
-};
-
-struct mmap2_event {
-	struct perf_event_header header;
-	u32 pid, tid;
-	u64 start;
-	u64 len;
-	u64 pgoff;
-	u32 maj;
-	u32 min;
-	u64 ino;
-	u64 ino_generation;
-	char filename[PATH_MAX];
-};
-
-struct comm_event {
-	struct perf_event_header header;
-	u32 pid, tid;
-	char comm[16];
-};
-
-struct fork_event {
-	struct perf_event_header header;
-	u32 pid, ppid;
-	u32 tid, ptid;
-	u64 time;
-};
-
-struct lost_event {
-	struct perf_event_header header;
-	u64 id;
-	u64 lost;
-};
-
-/*
- * PERF_FORMAT_ENABLED | PERF_FORMAT_RUNNING | PERF_FORMAT_ID
- */
-struct read_event {
-	struct perf_event_header header;
-	u32 pid, tid;
-	u64 value;
-	u64 time_enabled;
-	u64 time_running;
-	u64 id;
-};
-
-
-#define PERF_SAMPLE_MASK				\
-	(PERF_SAMPLE_IP | PERF_SAMPLE_TID |		\
-	 PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR |		\
-	PERF_SAMPLE_ID | PERF_SAMPLE_STREAM_ID |	\
-	 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD |		\
-	 PERF_SAMPLE_IDENTIFIER)
-
-struct sample_event {
-	struct perf_event_header        header;
-	u64 array[];
-};
-
-struct regs_dump {
-	u64 abi;
-	u64 *regs;
-};
-
-struct stack_dump {
-	u16 offset;
-	u64 size;
-	char *data;
-};
-
-struct sample_read_value {
-	u64 value;
-	u64 id;
-};
-
-struct sample_read {
-	u64 time_enabled;
-	u64 time_running;
-	union {
-		struct {
-			u64 nr;
-			struct sample_read_value *values;
-		} group;
-		struct sample_read_value one;
-	};
-};
-
-struct perf_sample {
-	u64 ip;
-	u32 pid, tid;
-	u64 time;
-	u64 addr;
-	u64 id;
-	u64 stream_id;
-	u64 period;
-	u64 weight;
-	u32 cpu;
-	u32 raw_size;
-	u64 data_src;
-	void *raw_data;
-	struct ip_callchain *callchain;
-	struct branch_stack *branch_stack;
-	struct regs_dump  user_regs;
-	struct stack_dump user_stack;
-	struct sample_read read;
-};
-
-#define PERF_MEM_DATA_SRC_NONE \
-	(PERF_MEM_S(OP, NA) |\
-	 PERF_MEM_S(LVL, NA) |\
-	 PERF_MEM_S(SNOOP, NA) |\
-	 PERF_MEM_S(LOCK, NA) |\
-	 PERF_MEM_S(TLB, NA))
-
-struct build_id_event {
-	struct perf_event_header header;
-	pid_t			 pid;
-	u8			 build_id[PERF_ALIGN(BUILD_ID_SIZE, sizeof(u64))];
-	char			 filename[];
-};
-
-enum perf_user_event_type { /* above any possible kernel type */
-	PERF_RECORD_USER_TYPE_START		= 64,
-	PERF_RECORD_HEADER_ATTR			= 64,
-	PERF_RECORD_HEADER_EVENT_TYPE		= 65, /* depreceated */
-	PERF_RECORD_HEADER_TRACING_DATA		= 66,
-	PERF_RECORD_HEADER_BUILD_ID		= 67,
-	PERF_RECORD_FINISHED_ROUND		= 68,
-	PERF_RECORD_HEADER_MAX
-};
-
-struct attr_event {
-	struct perf_event_header header;
-	struct perf_event_attr attr;
-	u64 id[];
-};
-
-#define MAX_EVENT_NAME 64
-
-struct perf_trace_event_type {
-	u64	event_id;
-	char	name[MAX_EVENT_NAME];
-};
-
-struct event_type_event {
-	struct perf_event_header header;
-	struct perf_trace_event_type event_type;
-};
-
-struct tracing_data_event {
-	struct perf_event_header header;
-	u32 size;
-};
-
-union perf_event {
-	struct perf_event_header	header;
-	struct mmap_event		mmap;
-	struct mmap2_event		mmap2;
-	struct comm_event		comm;
-	struct fork_event		fork;
-	struct lost_event		lost;
-	struct read_event		read;
-	struct sample_event		sample;
-	struct attr_event		attr;
-	struct event_type_event		event_type;
-	struct tracing_data_event	tracing_data;
-	struct build_id_event		build_id;
-};
-
-void perf_event__print_totals(void);
-
-struct perf_tool;
-struct thread_map;
-
-typedef int (*perf_event__handler_t)(struct perf_tool *tool,
-				     union perf_event *event,
-				     struct perf_sample *sample,
-				     struct machine *machine);
-
-int perf_event__synthesize_thread_map(struct perf_tool *tool,
-				      struct thread_map *threads,
-				      perf_event__handler_t process,
-				      struct machine *machine);
-int perf_event__synthesize_threads(struct perf_tool *tool,
-				   perf_event__handler_t process,
-				   struct machine *machine);
-int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
-				       perf_event__handler_t process,
-				       struct machine *machine,
-				       const char *symbol_name);
-
-int perf_event__synthesize_modules(struct perf_tool *tool,
-				   perf_event__handler_t process,
-				   struct machine *machine);
-
-int perf_event__process_comm(struct perf_tool *tool,
-			     union perf_event *event,
-			     struct perf_sample *sample,
-			     struct machine *machine);
-int perf_event__process_lost(struct perf_tool *tool,
-			     union perf_event *event,
-			     struct perf_sample *sample,
-			     struct machine *machine);
-int perf_event__process_mmap(struct perf_tool *tool,
-			     union perf_event *event,
-			     struct perf_sample *sample,
-			     struct machine *machine);
-int perf_event__process_mmap2(struct perf_tool *tool,
-			     union perf_event *event,
-			     struct perf_sample *sample,
-			     struct machine *machine);
-int perf_event__process_fork(struct perf_tool *tool,
-			     union perf_event *event,
-			     struct perf_sample *sample,
-			     struct machine *machine);
-int perf_event__process_exit(struct perf_tool *tool,
-			     union perf_event *event,
-			     struct perf_sample *sample,
-			     struct machine *machine);
-int perf_event__process(struct perf_tool *tool,
-			union perf_event *event,
-			struct perf_sample *sample,
-			struct machine *machine);
-
-struct addr_location;
-int perf_event__preprocess_sample(const union perf_event *self,
-				  struct machine *machine,
-				  struct addr_location *al,
-				  struct perf_sample *sample);
-
-const char *perf_event__name(unsigned int id);
-
-size_t perf_event__sample_event_size(const struct perf_sample *sample, u64 type,
-				     u64 sample_regs_user, u64 read_format);
-int perf_event__synthesize_sample(union perf_event *event, u64 type,
-				  u64 sample_regs_user, u64 read_format,
-				  const struct perf_sample *sample,
-				  bool swapped);
-
-size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp);
-size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp);
-size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp);
-size_t perf_event__fprintf_task(union perf_event *event, FILE *fp);
-size_t perf_event__fprintf(union perf_event *event, FILE *fp);
-
-#endif /* __PERF_RECORD_H */
diff --git a/src/tools/perf/util/evlist.c b/src/tools/perf/util/evlist.c
deleted file mode 100644
index e584cd3..0000000
--- a/src/tools/perf/util/evlist.c
+++ /dev/null
@@ -1,1075 +0,0 @@
-/*
- * Copyright (C) 2011, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
- *
- * Parts came from builtin-{top,stat,record}.c, see those files for further
- * copyright notes.
- *
- * Released under the GPL v2. (and only v2, not any later version)
- */
-#include "util.h"
-#include <lk/debugfs.h>
-#include <poll.h>
-#include "cpumap.h"
-#include "thread_map.h"
-#include "target.h"
-#include "evlist.h"
-#include "evsel.h"
-#include "debug.h"
-#include <unistd.h>
-
-#include "parse-events.h"
-
-#include <sys/mman.h>
-
-#include <linux/bitops.h>
-#include <linux/hash.h>
-
-#define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y))
-#define SID(e, x, y) xyarray__entry(e->sample_id, x, y)
-
-void perf_evlist__init(struct perf_evlist *evlist, struct cpu_map *cpus,
-		       struct thread_map *threads)
-{
-	int i;
-
-	for (i = 0; i < PERF_EVLIST__HLIST_SIZE; ++i)
-		INIT_HLIST_HEAD(&evlist->heads[i]);
-	INIT_LIST_HEAD(&evlist->entries);
-	perf_evlist__set_maps(evlist, cpus, threads);
-	evlist->workload.pid = -1;
-}
-
-struct perf_evlist *perf_evlist__new(void)
-{
-	struct perf_evlist *evlist = zalloc(sizeof(*evlist));
-
-	if (evlist != NULL)
-		perf_evlist__init(evlist, NULL, NULL);
-
-	return evlist;
-}
-
-/**
- * perf_evlist__set_id_pos - set the positions of event ids.
- * @evlist: selected event list
- *
- * Events with compatible sample types all have the same id_pos
- * and is_pos.  For convenience, put a copy on evlist.
- */
-void perf_evlist__set_id_pos(struct perf_evlist *evlist)
-{
-	struct perf_evsel *first = perf_evlist__first(evlist);
-
-	evlist->id_pos = first->id_pos;
-	evlist->is_pos = first->is_pos;
-}
-
-static void perf_evlist__update_id_pos(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel;
-
-	list_for_each_entry(evsel, &evlist->entries, node)
-		perf_evsel__calc_id_pos(evsel);
-
-	perf_evlist__set_id_pos(evlist);
-}
-
-static void perf_evlist__purge(struct perf_evlist *evlist)
-{
-	struct perf_evsel *pos, *n;
-
-	list_for_each_entry_safe(pos, n, &evlist->entries, node) {
-		list_del_init(&pos->node);
-		perf_evsel__delete(pos);
-	}
-
-	evlist->nr_entries = 0;
-}
-
-void perf_evlist__exit(struct perf_evlist *evlist)
-{
-	free(evlist->mmap);
-	free(evlist->pollfd);
-	evlist->mmap = NULL;
-	evlist->pollfd = NULL;
-}
-
-void perf_evlist__delete(struct perf_evlist *evlist)
-{
-	perf_evlist__purge(evlist);
-	perf_evlist__exit(evlist);
-	free(evlist);
-}
-
-void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry)
-{
-	list_add_tail(&entry->node, &evlist->entries);
-	if (!evlist->nr_entries++)
-		perf_evlist__set_id_pos(evlist);
-}
-
-void perf_evlist__splice_list_tail(struct perf_evlist *evlist,
-				   struct list_head *list,
-				   int nr_entries)
-{
-	bool set_id_pos = !evlist->nr_entries;
-
-	list_splice_tail(list, &evlist->entries);
-	evlist->nr_entries += nr_entries;
-	if (set_id_pos)
-		perf_evlist__set_id_pos(evlist);
-}
-
-void __perf_evlist__set_leader(struct list_head *list)
-{
-	struct perf_evsel *evsel, *leader;
-
-	leader = list_entry(list->next, struct perf_evsel, node);
-	evsel = list_entry(list->prev, struct perf_evsel, node);
-
-	leader->nr_members = evsel->idx - leader->idx + 1;
-
-	list_for_each_entry(evsel, list, node) {
-		evsel->leader = leader;
-	}
-}
-
-void perf_evlist__set_leader(struct perf_evlist *evlist)
-{
-	if (evlist->nr_entries) {
-		evlist->nr_groups = evlist->nr_entries > 1 ? 1 : 0;
-		__perf_evlist__set_leader(&evlist->entries);
-	}
-}
-
-int perf_evlist__add_default(struct perf_evlist *evlist)
-{
-	struct perf_event_attr attr = {
-		.type = PERF_TYPE_HARDWARE,
-		.config = PERF_COUNT_HW_CPU_CYCLES,
-	};
-	struct perf_evsel *evsel;
-
-	event_attr_init(&attr);
-
-	evsel = perf_evsel__new(&attr, 0);
-	if (evsel == NULL)
-		goto error;
-
-	/* use strdup() because free(evsel) assumes name is allocated */
-	evsel->name = strdup("cycles");
-	if (!evsel->name)
-		goto error_free;
-
-	perf_evlist__add(evlist, evsel);
-	return 0;
-error_free:
-	perf_evsel__delete(evsel);
-error:
-	return -ENOMEM;
-}
-
-static int perf_evlist__add_attrs(struct perf_evlist *evlist,
-				  struct perf_event_attr *attrs, size_t nr_attrs)
-{
-	struct perf_evsel *evsel, *n;
-	LIST_HEAD(head);
-	size_t i;
-
-	for (i = 0; i < nr_attrs; i++) {
-		evsel = perf_evsel__new(attrs + i, evlist->nr_entries + i);
-		if (evsel == NULL)
-			goto out_delete_partial_list;
-		list_add_tail(&evsel->node, &head);
-	}
-
-	perf_evlist__splice_list_tail(evlist, &head, nr_attrs);
-
-	return 0;
-
-out_delete_partial_list:
-	list_for_each_entry_safe(evsel, n, &head, node)
-		perf_evsel__delete(evsel);
-	return -1;
-}
-
-int __perf_evlist__add_default_attrs(struct perf_evlist *evlist,
-				     struct perf_event_attr *attrs, size_t nr_attrs)
-{
-	size_t i;
-
-	for (i = 0; i < nr_attrs; i++)
-		event_attr_init(attrs + i);
-
-	return perf_evlist__add_attrs(evlist, attrs, nr_attrs);
-}
-
-struct perf_evsel *
-perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id)
-{
-	struct perf_evsel *evsel;
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		if (evsel->attr.type   == PERF_TYPE_TRACEPOINT &&
-		    (int)evsel->attr.config == id)
-			return evsel;
-	}
-
-	return NULL;
-}
-
-struct perf_evsel *
-perf_evlist__find_tracepoint_by_name(struct perf_evlist *evlist,
-				     const char *name)
-{
-	struct perf_evsel *evsel;
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		if ((evsel->attr.type == PERF_TYPE_TRACEPOINT) &&
-		    (strcmp(evsel->name, name) == 0))
-			return evsel;
-	}
-
-	return NULL;
-}
-
-int perf_evlist__add_newtp(struct perf_evlist *evlist,
-			   const char *sys, const char *name, void *handler)
-{
-	struct perf_evsel *evsel;
-
-	evsel = perf_evsel__newtp(sys, name, evlist->nr_entries);
-	if (evsel == NULL)
-		return -1;
-
-	evsel->handler.func = handler;
-	perf_evlist__add(evlist, evsel);
-	return 0;
-}
-
-void perf_evlist__disable(struct perf_evlist *evlist)
-{
-	int cpu, thread;
-	struct perf_evsel *pos;
-	int nr_cpus = cpu_map__nr(evlist->cpus);
-	int nr_threads = thread_map__nr(evlist->threads);
-
-	for (cpu = 0; cpu < nr_cpus; cpu++) {
-		list_for_each_entry(pos, &evlist->entries, node) {
-			if (!perf_evsel__is_group_leader(pos) || !pos->fd)
-				continue;
-			for (thread = 0; thread < nr_threads; thread++)
-				ioctl(FD(pos, cpu, thread),
-				      PERF_EVENT_IOC_DISABLE, 0);
-		}
-	}
-}
-
-void perf_evlist__enable(struct perf_evlist *evlist)
-{
-	int cpu, thread;
-	struct perf_evsel *pos;
-	int nr_cpus = cpu_map__nr(evlist->cpus);
-	int nr_threads = thread_map__nr(evlist->threads);
-
-	for (cpu = 0; cpu < nr_cpus; cpu++) {
-		list_for_each_entry(pos, &evlist->entries, node) {
-			if (!perf_evsel__is_group_leader(pos) || !pos->fd)
-				continue;
-			for (thread = 0; thread < nr_threads; thread++)
-				ioctl(FD(pos, cpu, thread),
-				      PERF_EVENT_IOC_ENABLE, 0);
-		}
-	}
-}
-
-int perf_evlist__disable_event(struct perf_evlist *evlist,
-			       struct perf_evsel *evsel)
-{
-	int cpu, thread, err;
-
-	if (!evsel->fd)
-		return 0;
-
-	for (cpu = 0; cpu < evlist->cpus->nr; cpu++) {
-		for (thread = 0; thread < evlist->threads->nr; thread++) {
-			err = ioctl(FD(evsel, cpu, thread),
-				    PERF_EVENT_IOC_DISABLE, 0);
-			if (err)
-				return err;
-		}
-	}
-	return 0;
-}
-
-int perf_evlist__enable_event(struct perf_evlist *evlist,
-			      struct perf_evsel *evsel)
-{
-	int cpu, thread, err;
-
-	if (!evsel->fd)
-		return -EINVAL;
-
-	for (cpu = 0; cpu < evlist->cpus->nr; cpu++) {
-		for (thread = 0; thread < evlist->threads->nr; thread++) {
-			err = ioctl(FD(evsel, cpu, thread),
-				    PERF_EVENT_IOC_ENABLE, 0);
-			if (err)
-				return err;
-		}
-	}
-	return 0;
-}
-
-static int perf_evlist__alloc_pollfd(struct perf_evlist *evlist)
-{
-	int nr_cpus = cpu_map__nr(evlist->cpus);
-	int nr_threads = thread_map__nr(evlist->threads);
-	int nfds = nr_cpus * nr_threads * evlist->nr_entries;
-	evlist->pollfd = malloc(sizeof(struct pollfd) * nfds);
-	return evlist->pollfd != NULL ? 0 : -ENOMEM;
-}
-
-void perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd)
-{
-	fcntl(fd, F_SETFL, O_NONBLOCK);
-	evlist->pollfd[evlist->nr_fds].fd = fd;
-	evlist->pollfd[evlist->nr_fds].events = POLLIN;
-	evlist->nr_fds++;
-}
-
-static void perf_evlist__id_hash(struct perf_evlist *evlist,
-				 struct perf_evsel *evsel,
-				 int cpu, int thread, u64 id)
-{
-	int hash;
-	struct perf_sample_id *sid = SID(evsel, cpu, thread);
-
-	sid->id = id;
-	sid->evsel = evsel;
-	hash = hash_64(sid->id, PERF_EVLIST__HLIST_BITS);
-	hlist_add_head(&sid->node, &evlist->heads[hash]);
-}
-
-void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel,
-			 int cpu, int thread, u64 id)
-{
-	perf_evlist__id_hash(evlist, evsel, cpu, thread, id);
-	evsel->id[evsel->ids++] = id;
-}
-
-static int perf_evlist__id_add_fd(struct perf_evlist *evlist,
-				  struct perf_evsel *evsel,
-				  int cpu, int thread, int fd)
-{
-	u64 read_data[4] = { 0, };
-	int id_idx = 1; /* The first entry is the counter value */
-	u64 id;
-	int ret;
-
-	ret = ioctl(fd, PERF_EVENT_IOC_ID, &id);
-	if (!ret)
-		goto add;
-
-	if (errno != ENOTTY)
-		return -1;
-
-	/* Legacy way to get event id.. All hail to old kernels! */
-
-	/*
-	 * This way does not work with group format read, so bail
-	 * out in that case.
-	 */
-	if (perf_evlist__read_format(evlist) & PERF_FORMAT_GROUP)
-		return -1;
-
-	if (!(evsel->attr.read_format & PERF_FORMAT_ID) ||
-	    read(fd, &read_data, sizeof(read_data)) == -1)
-		return -1;
-
-	if (evsel->attr.read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
-		++id_idx;
-	if (evsel->attr.read_format & PERF_FORMAT_TOTAL_TIME_RUNNING)
-		++id_idx;
-
-	id = read_data[id_idx];
-
- add:
-	perf_evlist__id_add(evlist, evsel, cpu, thread, id);
-	return 0;
-}
-
-struct perf_sample_id *perf_evlist__id2sid(struct perf_evlist *evlist, u64 id)
-{
-	struct hlist_head *head;
-	struct perf_sample_id *sid;
-	int hash;
-
-	hash = hash_64(id, PERF_EVLIST__HLIST_BITS);
-	head = &evlist->heads[hash];
-
-	hlist_for_each_entry(sid, head, node)
-		if (sid->id == id)
-			return sid;
-
-	return NULL;
-}
-
-struct perf_evsel *perf_evlist__id2evsel(struct perf_evlist *evlist, u64 id)
-{
-	struct perf_sample_id *sid;
-
-	if (evlist->nr_entries == 1)
-		return perf_evlist__first(evlist);
-
-	sid = perf_evlist__id2sid(evlist, id);
-	if (sid)
-		return sid->evsel;
-
-	if (!perf_evlist__sample_id_all(evlist))
-		return perf_evlist__first(evlist);
-
-	return NULL;
-}
-
-static int perf_evlist__event2id(struct perf_evlist *evlist,
-				 union perf_event *event, u64 *id)
-{
-	const u64 *array = event->sample.array;
-	ssize_t n;
-
-	n = (event->header.size - sizeof(event->header)) >> 3;
-
-	if (event->header.type == PERF_RECORD_SAMPLE) {
-		if (evlist->id_pos >= n)
-			return -1;
-		*id = array[evlist->id_pos];
-	} else {
-		if (evlist->is_pos > n)
-			return -1;
-		n -= evlist->is_pos;
-		*id = array[n];
-	}
-	return 0;
-}
-
-static struct perf_evsel *perf_evlist__event2evsel(struct perf_evlist *evlist,
-						   union perf_event *event)
-{
-	struct perf_evsel *first = perf_evlist__first(evlist);
-	struct hlist_head *head;
-	struct perf_sample_id *sid;
-	int hash;
-	u64 id;
-
-	if (evlist->nr_entries == 1)
-		return first;
-
-	if (!first->attr.sample_id_all &&
-	    event->header.type != PERF_RECORD_SAMPLE)
-		return first;
-
-	if (perf_evlist__event2id(evlist, event, &id))
-		return NULL;
-
-	/* Synthesized events have an id of zero */
-	if (!id)
-		return first;
-
-	hash = hash_64(id, PERF_EVLIST__HLIST_BITS);
-	head = &evlist->heads[hash];
-
-	hlist_for_each_entry(sid, head, node) {
-		if (sid->id == id)
-			return sid->evsel;
-	}
-	return NULL;
-}
-
-union perf_event *perf_evlist__mmap_read(struct perf_evlist *evlist, int idx)
-{
-	struct perf_mmap *md = &evlist->mmap[idx];
-	unsigned int head = perf_mmap__read_head(md);
-	unsigned int old = md->prev;
-	unsigned char *data = md->base + page_size;
-	union perf_event *event = NULL;
-
-	if (evlist->overwrite) {
-		/*
-		 * If we're further behind than half the buffer, there's a chance
-		 * the writer will bite our tail and mess up the samples under us.
-		 *
-		 * If we somehow ended up ahead of the head, we got messed up.
-		 *
-		 * In either case, truncate and restart at head.
-		 */
-		int diff = head - old;
-		if (diff > md->mask / 2 || diff < 0) {
-			fprintf(stderr, "WARNING: failed to keep up with mmap data.\n");
-
-			/*
-			 * head points to a known good entry, start there.
-			 */
-			old = head;
-		}
-	}
-
-	if (old != head) {
-		size_t size;
-
-		event = (union perf_event *)&data[old & md->mask];
-		size = event->header.size;
-
-		/*
-		 * Event straddles the mmap boundary -- header should always
-		 * be inside due to u64 alignment of output.
-		 */
-		if ((old & md->mask) + size != ((old + size) & md->mask)) {
-			unsigned int offset = old;
-			unsigned int len = min(sizeof(*event), size), cpy;
-			void *dst = &md->event_copy;
-
-			do {
-				cpy = min(md->mask + 1 - (offset & md->mask), len);
-				memcpy(dst, &data[offset & md->mask], cpy);
-				offset += cpy;
-				dst += cpy;
-				len -= cpy;
-			} while (len);
-
-			event = &md->event_copy;
-		}
-
-		old += size;
-	}
-
-	md->prev = old;
-
-	return event;
-}
-
-void perf_evlist__mmap_consume(struct perf_evlist *evlist, int idx)
-{
-	if (!evlist->overwrite) {
-		struct perf_mmap *md = &evlist->mmap[idx];
-		unsigned int old = md->prev;
-
-		perf_mmap__write_tail(md, old);
-	}
-}
-
-static void __perf_evlist__munmap(struct perf_evlist *evlist, int idx)
-{
-	if (evlist->mmap[idx].base != NULL) {
-		munmap(evlist->mmap[idx].base, evlist->mmap_len);
-		evlist->mmap[idx].base = NULL;
-	}
-}
-
-void perf_evlist__munmap(struct perf_evlist *evlist)
-{
-	int i;
-
-	for (i = 0; i < evlist->nr_mmaps; i++)
-		__perf_evlist__munmap(evlist, i);
-
-	free(evlist->mmap);
-	evlist->mmap = NULL;
-}
-
-static int perf_evlist__alloc_mmap(struct perf_evlist *evlist)
-{
-	evlist->nr_mmaps = cpu_map__nr(evlist->cpus);
-	if (cpu_map__empty(evlist->cpus))
-		evlist->nr_mmaps = thread_map__nr(evlist->threads);
-	evlist->mmap = zalloc(evlist->nr_mmaps * sizeof(struct perf_mmap));
-	return evlist->mmap != NULL ? 0 : -ENOMEM;
-}
-
-static int __perf_evlist__mmap(struct perf_evlist *evlist,
-			       int idx, int prot, int mask, int fd)
-{
-	evlist->mmap[idx].prev = 0;
-	evlist->mmap[idx].mask = mask;
-	evlist->mmap[idx].base = mmap(NULL, evlist->mmap_len, prot,
-				      MAP_SHARED, fd, 0);
-	if (evlist->mmap[idx].base == MAP_FAILED) {
-		evlist->mmap[idx].base = NULL;
-		return -1;
-	}
-
-	perf_evlist__add_pollfd(evlist, fd);
-	return 0;
-}
-
-static int perf_evlist__mmap_per_cpu(struct perf_evlist *evlist, int prot, int mask)
-{
-	struct perf_evsel *evsel;
-	int cpu, thread;
-	int nr_cpus = cpu_map__nr(evlist->cpus);
-	int nr_threads = thread_map__nr(evlist->threads);
-
-	pr_debug2("perf event ring buffer mmapped per cpu\n");
-	for (cpu = 0; cpu < nr_cpus; cpu++) {
-		int output = -1;
-
-		for (thread = 0; thread < nr_threads; thread++) {
-			list_for_each_entry(evsel, &evlist->entries, node) {
-				int fd = FD(evsel, cpu, thread);
-
-				if (output == -1) {
-					output = fd;
-					if (__perf_evlist__mmap(evlist, cpu,
-								prot, mask, output) < 0)
-						goto out_unmap;
-				} else {
-					if (ioctl(fd, PERF_EVENT_IOC_SET_OUTPUT, output) != 0)
-						goto out_unmap;
-				}
-
-				if ((evsel->attr.read_format & PERF_FORMAT_ID) &&
-				    perf_evlist__id_add_fd(evlist, evsel, cpu, thread, fd) < 0)
-					goto out_unmap;
-			}
-		}
-	}
-
-	return 0;
-
-out_unmap:
-	for (cpu = 0; cpu < nr_cpus; cpu++)
-		__perf_evlist__munmap(evlist, cpu);
-	return -1;
-}
-
-static int perf_evlist__mmap_per_thread(struct perf_evlist *evlist, int prot, int mask)
-{
-	struct perf_evsel *evsel;
-	int thread;
-	int nr_threads = thread_map__nr(evlist->threads);
-
-	pr_debug2("perf event ring buffer mmapped per thread\n");
-	for (thread = 0; thread < nr_threads; thread++) {
-		int output = -1;
-
-		list_for_each_entry(evsel, &evlist->entries, node) {
-			int fd = FD(evsel, 0, thread);
-
-			if (output == -1) {
-				output = fd;
-				if (__perf_evlist__mmap(evlist, thread,
-							prot, mask, output) < 0)
-					goto out_unmap;
-			} else {
-				if (ioctl(fd, PERF_EVENT_IOC_SET_OUTPUT, output) != 0)
-					goto out_unmap;
-			}
-
-			if ((evsel->attr.read_format & PERF_FORMAT_ID) &&
-			    perf_evlist__id_add_fd(evlist, evsel, 0, thread, fd) < 0)
-				goto out_unmap;
-		}
-	}
-
-	return 0;
-
-out_unmap:
-	for (thread = 0; thread < nr_threads; thread++)
-		__perf_evlist__munmap(evlist, thread);
-	return -1;
-}
-
-/** perf_evlist__mmap - Create per cpu maps to receive events
- *
- * @evlist - list of events
- * @pages - map length in pages
- * @overwrite - overwrite older events?
- *
- * If overwrite is false the user needs to signal event consuption using:
- *
- *	struct perf_mmap *m = &evlist->mmap[cpu];
- *	unsigned int head = perf_mmap__read_head(m);
- *
- *	perf_mmap__write_tail(m, head)
- *
- * Using perf_evlist__read_on_cpu does this automatically.
- */
-int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages,
-		      bool overwrite)
-{
-	struct perf_evsel *evsel;
-	const struct cpu_map *cpus = evlist->cpus;
-	const struct thread_map *threads = evlist->threads;
-	int prot = PROT_READ | (overwrite ? 0 : PROT_WRITE), mask;
-
-        /* 512 kiB: default amount of unprivileged mlocked memory */
-        if (pages == UINT_MAX)
-                pages = (512 * 1024) / page_size;
-	else if (!is_power_of_2(pages))
-		return -EINVAL;
-
-	mask = pages * page_size - 1;
-
-	if (evlist->mmap == NULL && perf_evlist__alloc_mmap(evlist) < 0)
-		return -ENOMEM;
-
-	if (evlist->pollfd == NULL && perf_evlist__alloc_pollfd(evlist) < 0)
-		return -ENOMEM;
-
-	evlist->overwrite = overwrite;
-	evlist->mmap_len = (pages + 1) * page_size;
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		if ((evsel->attr.read_format & PERF_FORMAT_ID) &&
-		    evsel->sample_id == NULL &&
-		    perf_evsel__alloc_id(evsel, cpu_map__nr(cpus), threads->nr) < 0)
-			return -ENOMEM;
-	}
-
-	if (cpu_map__empty(cpus))
-		return perf_evlist__mmap_per_thread(evlist, prot, mask);
-
-	return perf_evlist__mmap_per_cpu(evlist, prot, mask);
-}
-
-int perf_evlist__create_maps(struct perf_evlist *evlist,
-			     struct perf_target *target)
-{
-	evlist->threads = thread_map__new_str(target->pid, target->tid,
-					      target->uid);
-
-	if (evlist->threads == NULL)
-		return -1;
-
-	if (perf_target__has_task(target))
-		evlist->cpus = cpu_map__dummy_new();
-	else if (!perf_target__has_cpu(target) && !target->uses_mmap)
-		evlist->cpus = cpu_map__dummy_new();
-	else
-		evlist->cpus = cpu_map__new(target->cpu_list);
-
-	if (evlist->cpus == NULL)
-		goto out_delete_threads;
-
-	return 0;
-
-out_delete_threads:
-	thread_map__delete(evlist->threads);
-	return -1;
-}
-
-void perf_evlist__delete_maps(struct perf_evlist *evlist)
-{
-	cpu_map__delete(evlist->cpus);
-	thread_map__delete(evlist->threads);
-	evlist->cpus	= NULL;
-	evlist->threads = NULL;
-}
-
-int perf_evlist__apply_filters(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel;
-	int err = 0;
-	const int ncpus = cpu_map__nr(evlist->cpus),
-		  nthreads = thread_map__nr(evlist->threads);
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		if (evsel->filter == NULL)
-			continue;
-
-		err = perf_evsel__set_filter(evsel, ncpus, nthreads, evsel->filter);
-		if (err)
-			break;
-	}
-
-	return err;
-}
-
-int perf_evlist__set_filter(struct perf_evlist *evlist, const char *filter)
-{
-	struct perf_evsel *evsel;
-	int err = 0;
-	const int ncpus = cpu_map__nr(evlist->cpus),
-		  nthreads = thread_map__nr(evlist->threads);
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		err = perf_evsel__set_filter(evsel, ncpus, nthreads, filter);
-		if (err)
-			break;
-	}
-
-	return err;
-}
-
-bool perf_evlist__valid_sample_type(struct perf_evlist *evlist)
-{
-	struct perf_evsel *pos;
-
-	if (evlist->nr_entries == 1)
-		return true;
-
-	if (evlist->id_pos < 0 || evlist->is_pos < 0)
-		return false;
-
-	list_for_each_entry(pos, &evlist->entries, node) {
-		if (pos->id_pos != evlist->id_pos ||
-		    pos->is_pos != evlist->is_pos)
-			return false;
-	}
-
-	return true;
-}
-
-u64 __perf_evlist__combined_sample_type(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel;
-
-	if (evlist->combined_sample_type)
-		return evlist->combined_sample_type;
-
-	list_for_each_entry(evsel, &evlist->entries, node)
-		evlist->combined_sample_type |= evsel->attr.sample_type;
-
-	return evlist->combined_sample_type;
-}
-
-u64 perf_evlist__combined_sample_type(struct perf_evlist *evlist)
-{
-	evlist->combined_sample_type = 0;
-	return __perf_evlist__combined_sample_type(evlist);
-}
-
-bool perf_evlist__valid_read_format(struct perf_evlist *evlist)
-{
-	struct perf_evsel *first = perf_evlist__first(evlist), *pos = first;
-	u64 read_format = first->attr.read_format;
-	u64 sample_type = first->attr.sample_type;
-
-	list_for_each_entry_continue(pos, &evlist->entries, node) {
-		if (read_format != pos->attr.read_format)
-			return false;
-	}
-
-	/* PERF_SAMPLE_READ imples PERF_FORMAT_ID. */
-	if ((sample_type & PERF_SAMPLE_READ) &&
-	    !(read_format & PERF_FORMAT_ID)) {
-		return false;
-	}
-
-	return true;
-}
-
-u64 perf_evlist__read_format(struct perf_evlist *evlist)
-{
-	struct perf_evsel *first = perf_evlist__first(evlist);
-	return first->attr.read_format;
-}
-
-u16 perf_evlist__id_hdr_size(struct perf_evlist *evlist)
-{
-	struct perf_evsel *first = perf_evlist__first(evlist);
-	struct perf_sample *data;
-	u64 sample_type;
-	u16 size = 0;
-
-	if (!first->attr.sample_id_all)
-		goto out;
-
-	sample_type = first->attr.sample_type;
-
-	if (sample_type & PERF_SAMPLE_TID)
-		size += sizeof(data->tid) * 2;
-
-       if (sample_type & PERF_SAMPLE_TIME)
-		size += sizeof(data->time);
-
-	if (sample_type & PERF_SAMPLE_ID)
-		size += sizeof(data->id);
-
-	if (sample_type & PERF_SAMPLE_STREAM_ID)
-		size += sizeof(data->stream_id);
-
-	if (sample_type & PERF_SAMPLE_CPU)
-		size += sizeof(data->cpu) * 2;
-
-	if (sample_type & PERF_SAMPLE_IDENTIFIER)
-		size += sizeof(data->id);
-out:
-	return size;
-}
-
-bool perf_evlist__valid_sample_id_all(struct perf_evlist *evlist)
-{
-	struct perf_evsel *first = perf_evlist__first(evlist), *pos = first;
-
-	list_for_each_entry_continue(pos, &evlist->entries, node) {
-		if (first->attr.sample_id_all != pos->attr.sample_id_all)
-			return false;
-	}
-
-	return true;
-}
-
-bool perf_evlist__sample_id_all(struct perf_evlist *evlist)
-{
-	struct perf_evsel *first = perf_evlist__first(evlist);
-	return first->attr.sample_id_all;
-}
-
-void perf_evlist__set_selected(struct perf_evlist *evlist,
-			       struct perf_evsel *evsel)
-{
-	evlist->selected = evsel;
-}
-
-void perf_evlist__close(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel;
-	int ncpus = cpu_map__nr(evlist->cpus);
-	int nthreads = thread_map__nr(evlist->threads);
-
-	list_for_each_entry_reverse(evsel, &evlist->entries, node)
-		perf_evsel__close(evsel, ncpus, nthreads);
-}
-
-int perf_evlist__open(struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel;
-	int err;
-
-	perf_evlist__update_id_pos(evlist);
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		err = perf_evsel__open(evsel, evlist->cpus, evlist->threads);
-		if (err < 0)
-			goto out_err;
-	}
-
-	return 0;
-out_err:
-	perf_evlist__close(evlist);
-	errno = -err;
-	return err;
-}
-
-int perf_evlist__prepare_workload(struct perf_evlist *evlist,
-				  struct perf_target *target,
-				  const char *argv[], bool pipe_output,
-				  bool want_signal)
-{
-	int child_ready_pipe[2], go_pipe[2];
-	char bf;
-
-	if (pipe(child_ready_pipe) < 0) {
-		perror("failed to create 'ready' pipe");
-		return -1;
-	}
-
-	if (pipe(go_pipe) < 0) {
-		perror("failed to create 'go' pipe");
-		goto out_close_ready_pipe;
-	}
-
-	evlist->workload.pid = fork();
-	if (evlist->workload.pid < 0) {
-		perror("failed to fork");
-		goto out_close_pipes;
-	}
-
-	if (!evlist->workload.pid) {
-		if (pipe_output)
-			dup2(2, 1);
-
-		signal(SIGTERM, SIG_DFL);
-
-		close(child_ready_pipe[0]);
-		close(go_pipe[1]);
-		fcntl(go_pipe[0], F_SETFD, FD_CLOEXEC);
-
-		/*
-		 * Tell the parent we're ready to go
-		 */
-		close(child_ready_pipe[1]);
-
-		/*
-		 * Wait until the parent tells us to go.
-		 */
-		if (read(go_pipe[0], &bf, 1) == -1)
-			perror("unable to read pipe");
-
-		execvp(argv[0], (char **)argv);
-
-		perror(argv[0]);
-		if (want_signal)
-			kill(getppid(), SIGUSR1);
-		exit(-1);
-	}
-
-	if (perf_target__none(target))
-		evlist->threads->map[0] = evlist->workload.pid;
-
-	close(child_ready_pipe[1]);
-	close(go_pipe[0]);
-	/*
-	 * wait for child to settle
-	 */
-	if (read(child_ready_pipe[0], &bf, 1) == -1) {
-		perror("unable to read pipe");
-		goto out_close_pipes;
-	}
-
-	fcntl(go_pipe[1], F_SETFD, FD_CLOEXEC);
-	evlist->workload.cork_fd = go_pipe[1];
-	close(child_ready_pipe[0]);
-	return 0;
-
-out_close_pipes:
-	close(go_pipe[0]);
-	close(go_pipe[1]);
-out_close_ready_pipe:
-	close(child_ready_pipe[0]);
-	close(child_ready_pipe[1]);
-	return -1;
-}
-
-int perf_evlist__start_workload(struct perf_evlist *evlist)
-{
-	if (evlist->workload.cork_fd > 0) {
-		char bf = 0;
-		int ret;
-		/*
-		 * Remove the cork, let it rip!
-		 */
-		ret = write(evlist->workload.cork_fd, &bf, 1);
-		if (ret < 0)
-			perror("enable to write to pipe");
-
-		close(evlist->workload.cork_fd);
-		return ret;
-	}
-
-	return 0;
-}
-
-int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event,
-			      struct perf_sample *sample)
-{
-	struct perf_evsel *evsel = perf_evlist__event2evsel(evlist, event);
-
-	if (!evsel)
-		return -EFAULT;
-	return perf_evsel__parse_sample(evsel, event, sample);
-}
-
-size_t perf_evlist__fprintf(struct perf_evlist *evlist, FILE *fp)
-{
-	struct perf_evsel *evsel;
-	size_t printed = 0;
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		printed += fprintf(fp, "%s%s", evsel->idx ? ", " : "",
-				   perf_evsel__name(evsel));
-	}
-
-	return printed + fprintf(fp, "\n");;
-}
diff --git a/src/tools/perf/util/evlist.h b/src/tools/perf/util/evlist.h
deleted file mode 100644
index 206d093..0000000
--- a/src/tools/perf/util/evlist.h
+++ /dev/null
@@ -1,188 +0,0 @@
-#ifndef __PERF_EVLIST_H
-#define __PERF_EVLIST_H 1
-
-#include <linux/list.h>
-#include <stdio.h>
-#include "../perf.h"
-#include "event.h"
-#include "evsel.h"
-#include "util.h"
-#include <unistd.h>
-
-struct pollfd;
-struct thread_map;
-struct cpu_map;
-struct perf_record_opts;
-
-#define PERF_EVLIST__HLIST_BITS 8
-#define PERF_EVLIST__HLIST_SIZE (1 << PERF_EVLIST__HLIST_BITS)
-
-struct perf_mmap {
-	void		 *base;
-	int		 mask;
-	unsigned int	 prev;
-	union perf_event event_copy;
-};
-
-struct perf_evlist {
-	struct list_head entries;
-	struct hlist_head heads[PERF_EVLIST__HLIST_SIZE];
-	int		 nr_entries;
-	int		 nr_groups;
-	int		 nr_fds;
-	int		 nr_mmaps;
-	int		 mmap_len;
-	int		 id_pos;
-	int		 is_pos;
-	u64		 combined_sample_type;
-	struct {
-		int	cork_fd;
-		pid_t	pid;
-	} workload;
-	bool		 overwrite;
-	struct perf_mmap *mmap;
-	struct pollfd	 *pollfd;
-	struct thread_map *threads;
-	struct cpu_map	  *cpus;
-	struct perf_evsel *selected;
-};
-
-struct perf_evsel_str_handler {
-	const char *name;
-	void	   *handler;
-};
-
-struct perf_evlist *perf_evlist__new(void);
-void perf_evlist__init(struct perf_evlist *evlist, struct cpu_map *cpus,
-		       struct thread_map *threads);
-void perf_evlist__exit(struct perf_evlist *evlist);
-void perf_evlist__delete(struct perf_evlist *evlist);
-
-void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *entry);
-int perf_evlist__add_default(struct perf_evlist *evlist);
-int __perf_evlist__add_default_attrs(struct perf_evlist *evlist,
-				     struct perf_event_attr *attrs, size_t nr_attrs);
-
-#define perf_evlist__add_default_attrs(evlist, array) \
-	__perf_evlist__add_default_attrs(evlist, array, ARRAY_SIZE(array))
-
-int perf_evlist__add_newtp(struct perf_evlist *evlist,
-			   const char *sys, const char *name, void *handler);
-
-int perf_evlist__set_filter(struct perf_evlist *evlist, const char *filter);
-
-struct perf_evsel *
-perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id);
-
-struct perf_evsel *
-perf_evlist__find_tracepoint_by_name(struct perf_evlist *evlist,
-				     const char *name);
-
-void perf_evlist__id_add(struct perf_evlist *evlist, struct perf_evsel *evsel,
-			 int cpu, int thread, u64 id);
-
-void perf_evlist__add_pollfd(struct perf_evlist *evlist, int fd);
-
-struct perf_evsel *perf_evlist__id2evsel(struct perf_evlist *evlist, u64 id);
-
-struct perf_sample_id *perf_evlist__id2sid(struct perf_evlist *evlist, u64 id);
-
-union perf_event *perf_evlist__mmap_read(struct perf_evlist *self, int idx);
-
-void perf_evlist__mmap_consume(struct perf_evlist *evlist, int idx);
-
-int perf_evlist__open(struct perf_evlist *evlist);
-void perf_evlist__close(struct perf_evlist *evlist);
-
-void perf_evlist__set_id_pos(struct perf_evlist *evlist);
-bool perf_can_sample_identifier(void);
-void perf_evlist__config(struct perf_evlist *evlist,
-			 struct perf_record_opts *opts);
-
-int perf_evlist__prepare_workload(struct perf_evlist *evlist,
-				  struct perf_target *target,
-				  const char *argv[], bool pipe_output,
-				  bool want_signal);
-int perf_evlist__start_workload(struct perf_evlist *evlist);
-
-int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages,
-		      bool overwrite);
-void perf_evlist__munmap(struct perf_evlist *evlist);
-
-void perf_evlist__disable(struct perf_evlist *evlist);
-void perf_evlist__enable(struct perf_evlist *evlist);
-
-int perf_evlist__disable_event(struct perf_evlist *evlist,
-			       struct perf_evsel *evsel);
-int perf_evlist__enable_event(struct perf_evlist *evlist,
-			      struct perf_evsel *evsel);
-
-void perf_evlist__set_selected(struct perf_evlist *evlist,
-			       struct perf_evsel *evsel);
-
-static inline void perf_evlist__set_maps(struct perf_evlist *evlist,
-					 struct cpu_map *cpus,
-					 struct thread_map *threads)
-{
-	evlist->cpus	= cpus;
-	evlist->threads	= threads;
-}
-
-int perf_evlist__create_maps(struct perf_evlist *evlist,
-			     struct perf_target *target);
-void perf_evlist__delete_maps(struct perf_evlist *evlist);
-int perf_evlist__apply_filters(struct perf_evlist *evlist);
-
-void __perf_evlist__set_leader(struct list_head *list);
-void perf_evlist__set_leader(struct perf_evlist *evlist);
-
-u64 perf_evlist__read_format(struct perf_evlist *evlist);
-u64 __perf_evlist__combined_sample_type(struct perf_evlist *evlist);
-u64 perf_evlist__combined_sample_type(struct perf_evlist *evlist);
-bool perf_evlist__sample_id_all(struct perf_evlist *evlist);
-u16 perf_evlist__id_hdr_size(struct perf_evlist *evlist);
-
-int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event,
-			      struct perf_sample *sample);
-
-bool perf_evlist__valid_sample_type(struct perf_evlist *evlist);
-bool perf_evlist__valid_sample_id_all(struct perf_evlist *evlist);
-bool perf_evlist__valid_read_format(struct perf_evlist *evlist);
-
-void perf_evlist__splice_list_tail(struct perf_evlist *evlist,
-				   struct list_head *list,
-				   int nr_entries);
-
-static inline struct perf_evsel *perf_evlist__first(struct perf_evlist *evlist)
-{
-	return list_entry(evlist->entries.next, struct perf_evsel, node);
-}
-
-static inline struct perf_evsel *perf_evlist__last(struct perf_evlist *evlist)
-{
-	return list_entry(evlist->entries.prev, struct perf_evsel, node);
-}
-
-size_t perf_evlist__fprintf(struct perf_evlist *evlist, FILE *fp);
-
-static inline unsigned int perf_mmap__read_head(struct perf_mmap *mm)
-{
-	struct perf_event_mmap_page *pc = mm->base;
-	int head = pc->data_head;
-	rmb();
-	return head;
-}
-
-static inline void perf_mmap__write_tail(struct perf_mmap *md,
-					 unsigned long tail)
-{
-	struct perf_event_mmap_page *pc = md->base;
-
-	/*
-	 * ensure all reads are done before we write the tail out.
-	 */
-	/* mb(); */
-	pc->data_tail = tail;
-}
-
-#endif /* __PERF_EVLIST_H */
diff --git a/src/tools/perf/util/evsel.c b/src/tools/perf/util/evsel.c
deleted file mode 100644
index 9f1ef9b..0000000
--- a/src/tools/perf/util/evsel.c
+++ /dev/null
@@ -1,2031 +0,0 @@
-/*
- * Copyright (C) 2011, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
- *
- * Parts came from builtin-{top,stat,record}.c, see those files for further
- * copyright notes.
- *
- * Released under the GPL v2. (and only v2, not any later version)
- */
-
-#include <byteswap.h>
-#include <linux/bitops.h>
-#include <lk/debugfs.h>
-#include <traceevent/event-parse.h>
-#include <linux/hw_breakpoint.h>
-#include <linux/perf_event.h>
-#include <sys/resource.h>
-#include "asm/bug.h"
-#include "evsel.h"
-#include "evlist.h"
-#include "util.h"
-#include "cpumap.h"
-#include "thread_map.h"
-#include "target.h"
-#include "perf_regs.h"
-#include "debug.h"
-
-static struct {
-	bool sample_id_all;
-	bool exclude_guest;
-	bool mmap2;
-} perf_missing_features;
-
-#define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y))
-
-int __perf_evsel__sample_size(u64 sample_type)
-{
-	u64 mask = sample_type & PERF_SAMPLE_MASK;
-	int size = 0;
-	int i;
-
-	for (i = 0; i < 64; i++) {
-		if (mask & (1ULL << i))
-			size++;
-	}
-
-	size *= sizeof(u64);
-
-	return size;
-}
-
-/**
- * __perf_evsel__calc_id_pos - calculate id_pos.
- * @sample_type: sample type
- *
- * This function returns the position of the event id (PERF_SAMPLE_ID or
- * PERF_SAMPLE_IDENTIFIER) in a sample event i.e. in the array of struct
- * sample_event.
- */
-static int __perf_evsel__calc_id_pos(u64 sample_type)
-{
-	int idx = 0;
-
-	if (sample_type & PERF_SAMPLE_IDENTIFIER)
-		return 0;
-
-	if (!(sample_type & PERF_SAMPLE_ID))
-		return -1;
-
-	if (sample_type & PERF_SAMPLE_IP)
-		idx += 1;
-
-	if (sample_type & PERF_SAMPLE_TID)
-		idx += 1;
-
-	if (sample_type & PERF_SAMPLE_TIME)
-		idx += 1;
-
-	if (sample_type & PERF_SAMPLE_ADDR)
-		idx += 1;
-
-	return idx;
-}
-
-/**
- * __perf_evsel__calc_is_pos - calculate is_pos.
- * @sample_type: sample type
- *
- * This function returns the position (counting backwards) of the event id
- * (PERF_SAMPLE_ID or PERF_SAMPLE_IDENTIFIER) in a non-sample event i.e. if
- * sample_id_all is used there is an id sample appended to non-sample events.
- */
-static int __perf_evsel__calc_is_pos(u64 sample_type)
-{
-	int idx = 1;
-
-	if (sample_type & PERF_SAMPLE_IDENTIFIER)
-		return 1;
-
-	if (!(sample_type & PERF_SAMPLE_ID))
-		return -1;
-
-	if (sample_type & PERF_SAMPLE_CPU)
-		idx += 1;
-
-	if (sample_type & PERF_SAMPLE_STREAM_ID)
-		idx += 1;
-
-	return idx;
-}
-
-void perf_evsel__calc_id_pos(struct perf_evsel *evsel)
-{
-	evsel->id_pos = __perf_evsel__calc_id_pos(evsel->attr.sample_type);
-	evsel->is_pos = __perf_evsel__calc_is_pos(evsel->attr.sample_type);
-}
-
-void hists__init(struct hists *hists)
-{
-	memset(hists, 0, sizeof(*hists));
-	hists->entries_in_array[0] = hists->entries_in_array[1] = RB_ROOT;
-	hists->entries_in = &hists->entries_in_array[0];
-	hists->entries_collapsed = RB_ROOT;
-	hists->entries = RB_ROOT;
-	pthread_mutex_init(&hists->lock, NULL);
-}
-
-void __perf_evsel__set_sample_bit(struct perf_evsel *evsel,
-				  enum perf_event_sample_format bit)
-{
-	if (!(evsel->attr.sample_type & bit)) {
-		evsel->attr.sample_type |= bit;
-		evsel->sample_size += sizeof(u64);
-		perf_evsel__calc_id_pos(evsel);
-	}
-}
-
-void __perf_evsel__reset_sample_bit(struct perf_evsel *evsel,
-				    enum perf_event_sample_format bit)
-{
-	if (evsel->attr.sample_type & bit) {
-		evsel->attr.sample_type &= ~bit;
-		evsel->sample_size -= sizeof(u64);
-		perf_evsel__calc_id_pos(evsel);
-	}
-}
-
-void perf_evsel__set_sample_id(struct perf_evsel *evsel,
-			       bool can_sample_identifier)
-{
-	if (can_sample_identifier) {
-		perf_evsel__reset_sample_bit(evsel, ID);
-		perf_evsel__set_sample_bit(evsel, IDENTIFIER);
-	} else {
-		perf_evsel__set_sample_bit(evsel, ID);
-	}
-	evsel->attr.read_format |= PERF_FORMAT_ID;
-}
-
-void perf_evsel__init(struct perf_evsel *evsel,
-		      struct perf_event_attr *attr, int idx)
-{
-	evsel->idx	   = idx;
-	evsel->attr	   = *attr;
-	evsel->leader	   = evsel;
-	INIT_LIST_HEAD(&evsel->node);
-	hists__init(&evsel->hists);
-	evsel->sample_size = __perf_evsel__sample_size(attr->sample_type);
-	perf_evsel__calc_id_pos(evsel);
-}
-
-struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr, int idx)
-{
-	struct perf_evsel *evsel = zalloc(sizeof(*evsel));
-
-	if (evsel != NULL)
-		perf_evsel__init(evsel, attr, idx);
-
-	return evsel;
-}
-
-struct event_format *event_format__new(const char *sys, const char *name)
-{
-	int fd, n;
-	char *filename;
-	void *bf = NULL, *nbf;
-	size_t size = 0, alloc_size = 0;
-	struct event_format *format = NULL;
-
-	if (asprintf(&filename, "%s/%s/%s/format", tracing_events_path, sys, name) < 0)
-		goto out;
-
-	fd = open(filename, O_RDONLY);
-	if (fd < 0)
-		goto out_free_filename;
-
-	do {
-		if (size == alloc_size) {
-			alloc_size += BUFSIZ;
-			nbf = realloc(bf, alloc_size);
-			if (nbf == NULL)
-				goto out_free_bf;
-			bf = nbf;
-		}
-
-		n = read(fd, bf + size, alloc_size - size);
-		if (n < 0)
-			goto out_free_bf;
-		size += n;
-	} while (n > 0);
-
-	pevent_parse_format(&format, bf, size, sys);
-
-out_free_bf:
-	free(bf);
-	close(fd);
-out_free_filename:
-	free(filename);
-out:
-	return format;
-}
-
-struct perf_evsel *perf_evsel__newtp(const char *sys, const char *name, int idx)
-{
-	struct perf_evsel *evsel = zalloc(sizeof(*evsel));
-
-	if (evsel != NULL) {
-		struct perf_event_attr attr = {
-			.type	       = PERF_TYPE_TRACEPOINT,
-			.sample_type   = (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME |
-					  PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD),
-		};
-
-		if (asprintf(&evsel->name, "%s:%s", sys, name) < 0)
-			goto out_free;
-
-		evsel->tp_format = event_format__new(sys, name);
-		if (evsel->tp_format == NULL)
-			goto out_free;
-
-		event_attr_init(&attr);
-		attr.config = evsel->tp_format->id;
-		attr.sample_period = 1;
-		perf_evsel__init(evsel, &attr, idx);
-	}
-
-	return evsel;
-
-out_free:
-	free(evsel->name);
-	free(evsel);
-	return NULL;
-}
-
-const char *perf_evsel__hw_names[PERF_COUNT_HW_MAX] = {
-	"cycles",
-	"instructions",
-	"cache-references",
-	"cache-misses",
-	"branches",
-	"branch-misses",
-	"bus-cycles",
-	"stalled-cycles-frontend",
-	"stalled-cycles-backend",
-	"ref-cycles",
-};
-
-static const char *__perf_evsel__hw_name(u64 config)
-{
-	if (config < PERF_COUNT_HW_MAX && perf_evsel__hw_names[config])
-		return perf_evsel__hw_names[config];
-
-	return "unknown-hardware";
-}
-
-static int perf_evsel__add_modifiers(struct perf_evsel *evsel, char *bf, size_t size)
-{
-	int colon = 0, r = 0;
-	struct perf_event_attr *attr = &evsel->attr;
-	bool exclude_guest_default = false;
-
-#define MOD_PRINT(context, mod)	do {					\
-		if (!attr->exclude_##context) {				\
-			if (!colon) colon = ++r;			\
-			r += scnprintf(bf + r, size - r, "%c", mod);	\
-		} } while(0)
-
-	if (attr->exclude_kernel || attr->exclude_user || attr->exclude_hv) {
-		MOD_PRINT(kernel, 'k');
-		MOD_PRINT(user, 'u');
-		MOD_PRINT(hv, 'h');
-		exclude_guest_default = true;
-	}
-
-	if (attr->precise_ip) {
-		if (!colon)
-			colon = ++r;
-		r += scnprintf(bf + r, size - r, "%.*s", attr->precise_ip, "ppp");
-		exclude_guest_default = true;
-	}
-
-	if (attr->exclude_host || attr->exclude_guest == exclude_guest_default) {
-		MOD_PRINT(host, 'H');
-		MOD_PRINT(guest, 'G');
-	}
-#undef MOD_PRINT
-	if (colon)
-		bf[colon - 1] = ':';
-	return r;
-}
-
-static int perf_evsel__hw_name(struct perf_evsel *evsel, char *bf, size_t size)
-{
-	int r = scnprintf(bf, size, "%s", __perf_evsel__hw_name(evsel->attr.config));
-	return r + perf_evsel__add_modifiers(evsel, bf + r, size - r);
-}
-
-const char *perf_evsel__sw_names[PERF_COUNT_SW_MAX] = {
-	"cpu-clock",
-	"task-clock",
-	"page-faults",
-	"context-switches",
-	"cpu-migrations",
-	"minor-faults",
-	"major-faults",
-	"alignment-faults",
-	"emulation-faults",
-	"dummy",
-};
-
-static const char *__perf_evsel__sw_name(u64 config)
-{
-	if (config < PERF_COUNT_SW_MAX && perf_evsel__sw_names[config])
-		return perf_evsel__sw_names[config];
-	return "unknown-software";
-}
-
-static int perf_evsel__sw_name(struct perf_evsel *evsel, char *bf, size_t size)
-{
-	int r = scnprintf(bf, size, "%s", __perf_evsel__sw_name(evsel->attr.config));
-	return r + perf_evsel__add_modifiers(evsel, bf + r, size - r);
-}
-
-static int __perf_evsel__bp_name(char *bf, size_t size, u64 addr, u64 type)
-{
-	int r;
-
-	r = scnprintf(bf, size, "mem:0x%" PRIx64 ":", addr);
-
-	if (type & HW_BREAKPOINT_R)
-		r += scnprintf(bf + r, size - r, "r");
-
-	if (type & HW_BREAKPOINT_W)
-		r += scnprintf(bf + r, size - r, "w");
-
-	if (type & HW_BREAKPOINT_X)
-		r += scnprintf(bf + r, size - r, "x");
-
-	return r;
-}
-
-static int perf_evsel__bp_name(struct perf_evsel *evsel, char *bf, size_t size)
-{
-	struct perf_event_attr *attr = &evsel->attr;
-	int r = __perf_evsel__bp_name(bf, size, attr->bp_addr, attr->bp_type);
-	return r + perf_evsel__add_modifiers(evsel, bf + r, size - r);
-}
-
-const char *perf_evsel__hw_cache[PERF_COUNT_HW_CACHE_MAX]
-				[PERF_EVSEL__MAX_ALIASES] = {
- { "L1-dcache",	"l1-d",		"l1d",		"L1-data",		},
- { "L1-icache",	"l1-i",		"l1i",		"L1-instruction",	},
- { "LLC",	"L2",							},
- { "dTLB",	"d-tlb",	"Data-TLB",				},
- { "iTLB",	"i-tlb",	"Instruction-TLB",			},
- { "branch",	"branches",	"bpu",		"btb",		"bpc",	},
- { "node",								},
-};
-
-const char *perf_evsel__hw_cache_op[PERF_COUNT_HW_CACHE_OP_MAX]
-				   [PERF_EVSEL__MAX_ALIASES] = {
- { "load",	"loads",	"read",					},
- { "store",	"stores",	"write",				},
- { "prefetch",	"prefetches",	"speculative-read", "speculative-load",	},
-};
-
-const char *perf_evsel__hw_cache_result[PERF_COUNT_HW_CACHE_RESULT_MAX]
-				       [PERF_EVSEL__MAX_ALIASES] = {
- { "refs",	"Reference",	"ops",		"access",		},
- { "misses",	"miss",							},
-};
-
-#define C(x)		PERF_COUNT_HW_CACHE_##x
-#define CACHE_READ	(1 << C(OP_READ))
-#define CACHE_WRITE	(1 << C(OP_WRITE))
-#define CACHE_PREFETCH	(1 << C(OP_PREFETCH))
-#define COP(x)		(1 << x)
-
-/*
- * cache operartion stat
- * L1I : Read and prefetch only
- * ITLB and BPU : Read-only
- */
-static unsigned long perf_evsel__hw_cache_stat[C(MAX)] = {
- [C(L1D)]	= (CACHE_READ | CACHE_WRITE | CACHE_PREFETCH),
- [C(L1I)]	= (CACHE_READ | CACHE_PREFETCH),
- [C(LL)]	= (CACHE_READ | CACHE_WRITE | CACHE_PREFETCH),
- [C(DTLB)]	= (CACHE_READ | CACHE_WRITE | CACHE_PREFETCH),
- [C(ITLB)]	= (CACHE_READ),
- [C(BPU)]	= (CACHE_READ),
- [C(NODE)]	= (CACHE_READ | CACHE_WRITE | CACHE_PREFETCH),
-};
-
-bool perf_evsel__is_cache_op_valid(u8 type, u8 op)
-{
-	if (perf_evsel__hw_cache_stat[type] & COP(op))
-		return true;	/* valid */
-	else
-		return false;	/* invalid */
-}
-
-int __perf_evsel__hw_cache_type_op_res_name(u8 type, u8 op, u8 result,
-					    char *bf, size_t size)
-{
-	if (result) {
-		return scnprintf(bf, size, "%s-%s-%s", perf_evsel__hw_cache[type][0],
-				 perf_evsel__hw_cache_op[op][0],
-				 perf_evsel__hw_cache_result[result][0]);
-	}
-
-	return scnprintf(bf, size, "%s-%s", perf_evsel__hw_cache[type][0],
-			 perf_evsel__hw_cache_op[op][1]);
-}
-
-static int __perf_evsel__hw_cache_name(u64 config, char *bf, size_t size)
-{
-	u8 op, result, type = (config >>  0) & 0xff;
-	const char *err = "unknown-ext-hardware-cache-type";
-
-	if (type > PERF_COUNT_HW_CACHE_MAX)
-		goto out_err;
-
-	op = (config >>  8) & 0xff;
-	err = "unknown-ext-hardware-cache-op";
-	if (op > PERF_COUNT_HW_CACHE_OP_MAX)
-		goto out_err;
-
-	result = (config >> 16) & 0xff;
-	err = "unknown-ext-hardware-cache-result";
-	if (result > PERF_COUNT_HW_CACHE_RESULT_MAX)
-		goto out_err;
-
-	err = "invalid-cache";
-	if (!perf_evsel__is_cache_op_valid(type, op))
-		goto out_err;
-
-	return __perf_evsel__hw_cache_type_op_res_name(type, op, result, bf, size);
-out_err:
-	return scnprintf(bf, size, "%s", err);
-}
-
-static int perf_evsel__hw_cache_name(struct perf_evsel *evsel, char *bf, size_t size)
-{
-	int ret = __perf_evsel__hw_cache_name(evsel->attr.config, bf, size);
-	return ret + perf_evsel__add_modifiers(evsel, bf + ret, size - ret);
-}
-
-static int perf_evsel__raw_name(struct perf_evsel *evsel, char *bf, size_t size)
-{
-	int ret = scnprintf(bf, size, "raw 0x%" PRIx64, evsel->attr.config);
-	return ret + perf_evsel__add_modifiers(evsel, bf + ret, size - ret);
-}
-
-const char *perf_evsel__name(struct perf_evsel *evsel)
-{
-	char bf[128];
-
-	if (evsel->name)
-		return evsel->name;
-
-	switch (evsel->attr.type) {
-	case PERF_TYPE_RAW:
-		perf_evsel__raw_name(evsel, bf, sizeof(bf));
-		break;
-
-	case PERF_TYPE_HARDWARE:
-		perf_evsel__hw_name(evsel, bf, sizeof(bf));
-		break;
-
-	case PERF_TYPE_HW_CACHE:
-		perf_evsel__hw_cache_name(evsel, bf, sizeof(bf));
-		break;
-
-	case PERF_TYPE_SOFTWARE:
-		perf_evsel__sw_name(evsel, bf, sizeof(bf));
-		break;
-
-	case PERF_TYPE_TRACEPOINT:
-		scnprintf(bf, sizeof(bf), "%s", "unknown tracepoint");
-		break;
-
-	case PERF_TYPE_BREAKPOINT:
-		perf_evsel__bp_name(evsel, bf, sizeof(bf));
-		break;
-
-	default:
-		scnprintf(bf, sizeof(bf), "unknown attr type: %d",
-			  evsel->attr.type);
-		break;
-	}
-
-	evsel->name = strdup(bf);
-
-	return evsel->name ?: "unknown";
-}
-
-const char *perf_evsel__group_name(struct perf_evsel *evsel)
-{
-	return evsel->group_name ?: "anon group";
-}
-
-int perf_evsel__group_desc(struct perf_evsel *evsel, char *buf, size_t size)
-{
-	int ret;
-	struct perf_evsel *pos;
-	const char *group_name = perf_evsel__group_name(evsel);
-
-	ret = scnprintf(buf, size, "%s", group_name);
-
-	ret += scnprintf(buf + ret, size - ret, " { %s",
-			 perf_evsel__name(evsel));
-
-	for_each_group_member(pos, evsel)
-		ret += scnprintf(buf + ret, size - ret, ", %s",
-				 perf_evsel__name(pos));
-
-	ret += scnprintf(buf + ret, size - ret, " }");
-
-	return ret;
-}
-
-/*
- * The enable_on_exec/disabled value strategy:
- *
- *  1) For any type of traced program:
- *    - all independent events and group leaders are disabled
- *    - all group members are enabled
- *
- *     Group members are ruled by group leaders. They need to
- *     be enabled, because the group scheduling relies on that.
- *
- *  2) For traced programs executed by perf:
- *     - all independent events and group leaders have
- *       enable_on_exec set
- *     - we don't specifically enable or disable any event during
- *       the record command
- *
- *     Independent events and group leaders are initially disabled
- *     and get enabled by exec. Group members are ruled by group
- *     leaders as stated in 1).
- *
- *  3) For traced programs attached by perf (pid/tid):
- *     - we specifically enable or disable all events during
- *       the record command
- *
- *     When attaching events to already running traced we
- *     enable/disable events specifically, as there's no
- *     initial traced exec call.
- */
-void perf_evsel__config(struct perf_evsel *evsel,
-			struct perf_record_opts *opts)
-{
-	struct perf_evsel *leader = evsel->leader;
-	struct perf_event_attr *attr = &evsel->attr;
-	int track = !evsel->idx; /* only the first counter needs these */
-
-	attr->sample_id_all = perf_missing_features.sample_id_all ? 0 : 1;
-	attr->inherit	    = !opts->no_inherit;
-
-	perf_evsel__set_sample_bit(evsel, IP);
-	perf_evsel__set_sample_bit(evsel, TID);
-
-	if (evsel->sample_read) {
-		perf_evsel__set_sample_bit(evsel, READ);
-
-		/*
-		 * We need ID even in case of single event, because
-		 * PERF_SAMPLE_READ process ID specific data.
-		 */
-		perf_evsel__set_sample_id(evsel, false);
-
-		/*
-		 * Apply group format only if we belong to group
-		 * with more than one members.
-		 */
-		if (leader->nr_members > 1) {
-			attr->read_format |= PERF_FORMAT_GROUP;
-			attr->inherit = 0;
-		}
-	}
-
-	/*
-	 * We default some events to a 1 default interval. But keep
-	 * it a weak assumption overridable by the user.
-	 */
-	if (!attr->sample_period || (opts->user_freq != UINT_MAX &&
-				     opts->user_interval != ULLONG_MAX)) {
-		if (opts->freq) {
-			perf_evsel__set_sample_bit(evsel, PERIOD);
-			attr->freq		= 1;
-			attr->sample_freq	= opts->freq;
-		} else {
-			attr->sample_period = opts->default_interval;
-		}
-	}
-
-	/*
-	 * Disable sampling for all group members other
-	 * than leader in case leader 'leads' the sampling.
-	 */
-	if ((leader != evsel) && leader->sample_read) {
-		attr->sample_freq   = 0;
-		attr->sample_period = 0;
-	}
-
-	if (opts->no_samples)
-		attr->sample_freq = 0;
-
-	if (opts->inherit_stat)
-		attr->inherit_stat = 1;
-
-	if (opts->sample_address) {
-		perf_evsel__set_sample_bit(evsel, ADDR);
-		attr->mmap_data = track;
-	}
-
-	if (opts->call_graph) {
-		perf_evsel__set_sample_bit(evsel, CALLCHAIN);
-
-		if (opts->call_graph == CALLCHAIN_DWARF) {
-			perf_evsel__set_sample_bit(evsel, REGS_USER);
-			perf_evsel__set_sample_bit(evsel, STACK_USER);
-			attr->sample_regs_user = PERF_REGS_MASK;
-			attr->sample_stack_user = opts->stack_dump_size;
-			attr->exclude_callchain_user = 1;
-		}
-	}
-
-	if (perf_target__has_cpu(&opts->target))
-		perf_evsel__set_sample_bit(evsel, CPU);
-
-	if (opts->period)
-		perf_evsel__set_sample_bit(evsel, PERIOD);
-
-	if (!perf_missing_features.sample_id_all &&
-	    (opts->sample_time || !opts->no_inherit ||
-	     perf_target__has_cpu(&opts->target)))
-		perf_evsel__set_sample_bit(evsel, TIME);
-
-	if (opts->raw_samples) {
-		perf_evsel__set_sample_bit(evsel, TIME);
-		perf_evsel__set_sample_bit(evsel, RAW);
-		perf_evsel__set_sample_bit(evsel, CPU);
-	}
-
-	if (opts->sample_address)
-		attr->sample_type	|= PERF_SAMPLE_DATA_SRC;
-
-	if (opts->no_delay) {
-		attr->watermark = 0;
-		attr->wakeup_events = 1;
-	}
-	if (opts->branch_stack) {
-		perf_evsel__set_sample_bit(evsel, BRANCH_STACK);
-		attr->branch_sample_type = opts->branch_stack;
-	}
-
-	if (opts->sample_weight)
-		attr->sample_type	|= PERF_SAMPLE_WEIGHT;
-
-	attr->mmap  = track;
-	attr->comm  = track;
-
-	/*
-	 * XXX see the function comment above
-	 *
-	 * Disabling only independent events or group leaders,
-	 * keeping group members enabled.
-	 */
-	if (perf_evsel__is_group_leader(evsel))
-		attr->disabled = 1;
-
-	/*
-	 * Setting enable_on_exec for independent events and
-	 * group leaders for traced executed by perf.
-	 */
-	if (perf_target__none(&opts->target) && perf_evsel__is_group_leader(evsel))
-		attr->enable_on_exec = 1;
-}
-
-int perf_evsel__alloc_fd(struct perf_evsel *evsel, int ncpus, int nthreads)
-{
-	int cpu, thread;
-	evsel->fd = xyarray__new(ncpus, nthreads, sizeof(int));
-
-	if (evsel->fd) {
-		for (cpu = 0; cpu < ncpus; cpu++) {
-			for (thread = 0; thread < nthreads; thread++) {
-				FD(evsel, cpu, thread) = -1;
-			}
-		}
-	}
-
-	return evsel->fd != NULL ? 0 : -ENOMEM;
-}
-
-static int perf_evsel__run_ioctl(struct perf_evsel *evsel, int ncpus, int nthreads,
-			  int ioc,  void *arg)
-{
-	int cpu, thread;
-
-	for (cpu = 0; cpu < ncpus; cpu++) {
-		for (thread = 0; thread < nthreads; thread++) {
-			int fd = FD(evsel, cpu, thread),
-			    err = ioctl(fd, ioc, arg);
-
-			if (err)
-				return err;
-		}
-	}
-
-	return 0;
-}
-
-int perf_evsel__set_filter(struct perf_evsel *evsel, int ncpus, int nthreads,
-			   const char *filter)
-{
-	return perf_evsel__run_ioctl(evsel, ncpus, nthreads,
-				     PERF_EVENT_IOC_SET_FILTER,
-				     (void *)filter);
-}
-
-int perf_evsel__enable(struct perf_evsel *evsel, int ncpus, int nthreads)
-{
-	return perf_evsel__run_ioctl(evsel, ncpus, nthreads,
-				     PERF_EVENT_IOC_ENABLE,
-				     0);
-}
-
-int perf_evsel__alloc_id(struct perf_evsel *evsel, int ncpus, int nthreads)
-{
-	evsel->sample_id = xyarray__new(ncpus, nthreads, sizeof(struct perf_sample_id));
-	if (evsel->sample_id == NULL)
-		return -ENOMEM;
-
-	evsel->id = zalloc(ncpus * nthreads * sizeof(u64));
-	if (evsel->id == NULL) {
-		xyarray__delete(evsel->sample_id);
-		evsel->sample_id = NULL;
-		return -ENOMEM;
-	}
-
-	return 0;
-}
-
-void perf_evsel__reset_counts(struct perf_evsel *evsel, int ncpus)
-{
-	memset(evsel->counts, 0, (sizeof(*evsel->counts) +
-				 (ncpus * sizeof(struct perf_counts_values))));
-}
-
-int perf_evsel__alloc_counts(struct perf_evsel *evsel, int ncpus)
-{
-	evsel->counts = zalloc((sizeof(*evsel->counts) +
-				(ncpus * sizeof(struct perf_counts_values))));
-	return evsel->counts != NULL ? 0 : -ENOMEM;
-}
-
-void perf_evsel__free_fd(struct perf_evsel *evsel)
-{
-	xyarray__delete(evsel->fd);
-	evsel->fd = NULL;
-}
-
-void perf_evsel__free_id(struct perf_evsel *evsel)
-{
-	xyarray__delete(evsel->sample_id);
-	evsel->sample_id = NULL;
-	free(evsel->id);
-	evsel->id = NULL;
-}
-
-void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads)
-{
-	int cpu, thread;
-
-	for (cpu = 0; cpu < ncpus; cpu++)
-		for (thread = 0; thread < nthreads; ++thread) {
-			close(FD(evsel, cpu, thread));
-			FD(evsel, cpu, thread) = -1;
-		}
-}
-
-void perf_evsel__free_counts(struct perf_evsel *evsel)
-{
-	free(evsel->counts);
-}
-
-void perf_evsel__exit(struct perf_evsel *evsel)
-{
-	assert(list_empty(&evsel->node));
-	perf_evsel__free_fd(evsel);
-	perf_evsel__free_id(evsel);
-}
-
-void perf_evsel__delete(struct perf_evsel *evsel)
-{
-	perf_evsel__exit(evsel);
-	close_cgroup(evsel->cgrp);
-	free(evsel->group_name);
-	if (evsel->tp_format)
-		pevent_free_format(evsel->tp_format);
-	free(evsel->name);
-	free(evsel);
-}
-
-static inline void compute_deltas(struct perf_evsel *evsel,
-				  int cpu,
-				  struct perf_counts_values *count)
-{
-	struct perf_counts_values tmp;
-
-	if (!evsel->prev_raw_counts)
-		return;
-
-	if (cpu == -1) {
-		tmp = evsel->prev_raw_counts->aggr;
-		evsel->prev_raw_counts->aggr = *count;
-	} else {
-		tmp = evsel->prev_raw_counts->cpu[cpu];
-		evsel->prev_raw_counts->cpu[cpu] = *count;
-	}
-
-	count->val = count->val - tmp.val;
-	count->ena = count->ena - tmp.ena;
-	count->run = count->run - tmp.run;
-}
-
-int __perf_evsel__read_on_cpu(struct perf_evsel *evsel,
-			      int cpu, int thread, bool scale)
-{
-	struct perf_counts_values count;
-	size_t nv = scale ? 3 : 1;
-
-	if (FD(evsel, cpu, thread) < 0)
-		return -EINVAL;
-
-	if (evsel->counts == NULL && perf_evsel__alloc_counts(evsel, cpu + 1) < 0)
-		return -ENOMEM;
-
-	if (readn(FD(evsel, cpu, thread), &count, nv * sizeof(u64)) < 0)
-		return -errno;
-
-	compute_deltas(evsel, cpu, &count);
-
-	if (scale) {
-		if (count.run == 0)
-			count.val = 0;
-		else if (count.run < count.ena)
-			count.val = (u64)((double)count.val * count.ena / count.run + 0.5);
-	} else
-		count.ena = count.run = 0;
-
-	evsel->counts->cpu[cpu] = count;
-	return 0;
-}
-
-int __perf_evsel__read(struct perf_evsel *evsel,
-		       int ncpus, int nthreads, bool scale)
-{
-	size_t nv = scale ? 3 : 1;
-	int cpu, thread;
-	struct perf_counts_values *aggr = &evsel->counts->aggr, count;
-
-	aggr->val = aggr->ena = aggr->run = 0;
-
-	for (cpu = 0; cpu < ncpus; cpu++) {
-		for (thread = 0; thread < nthreads; thread++) {
-			if (FD(evsel, cpu, thread) < 0)
-				continue;
-
-			if (readn(FD(evsel, cpu, thread),
-				  &count, nv * sizeof(u64)) < 0)
-				return -errno;
-
-			aggr->val += count.val;
-			if (scale) {
-				aggr->ena += count.ena;
-				aggr->run += count.run;
-			}
-		}
-	}
-
-	compute_deltas(evsel, -1, aggr);
-
-	evsel->counts->scaled = 0;
-	if (scale) {
-		if (aggr->run == 0) {
-			evsel->counts->scaled = -1;
-			aggr->val = 0;
-			return 0;
-		}
-
-		if (aggr->run < aggr->ena) {
-			evsel->counts->scaled = 1;
-			aggr->val = (u64)((double)aggr->val * aggr->ena / aggr->run + 0.5);
-		}
-	} else
-		aggr->ena = aggr->run = 0;
-
-	return 0;
-}
-
-static int get_group_fd(struct perf_evsel *evsel, int cpu, int thread)
-{
-	struct perf_evsel *leader = evsel->leader;
-	int fd;
-
-	if (perf_evsel__is_group_leader(evsel))
-		return -1;
-
-	/*
-	 * Leader must be already processed/open,
-	 * if not it's a bug.
-	 */
-	BUG_ON(!leader->fd);
-
-	fd = FD(leader, cpu, thread);
-	BUG_ON(fd == -1);
-
-	return fd;
-}
-
-#define __PRINT_ATTR(fmt, cast, field)  \
-	fprintf(fp, "  %-19s "fmt"\n", #field, cast attr->field)
-
-#define PRINT_ATTR_U32(field)  __PRINT_ATTR("%u" , , field)
-#define PRINT_ATTR_X32(field)  __PRINT_ATTR("%#x", , field)
-#define PRINT_ATTR_U64(field)  __PRINT_ATTR("%" PRIu64, (uint64_t), field)
-#define PRINT_ATTR_X64(field)  __PRINT_ATTR("%#"PRIx64, (uint64_t), field)
-
-#define PRINT_ATTR2N(name1, field1, name2, field2)	\
-	fprintf(fp, "  %-19s %u    %-19s %u\n",		\
-	name1, attr->field1, name2, attr->field2)
-
-#define PRINT_ATTR2(field1, field2) \
-	PRINT_ATTR2N(#field1, field1, #field2, field2)
-
-static size_t perf_event_attr__fprintf(struct perf_event_attr *attr, FILE *fp)
-{
-	size_t ret = 0;
-
-	ret += fprintf(fp, "%.60s\n", graph_dotted_line);
-	ret += fprintf(fp, "perf_event_attr:\n");
-
-	ret += PRINT_ATTR_U32(type);
-	ret += PRINT_ATTR_U32(size);
-	ret += PRINT_ATTR_X64(config);
-	ret += PRINT_ATTR_U64(sample_period);
-	ret += PRINT_ATTR_U64(sample_freq);
-	ret += PRINT_ATTR_X64(sample_type);
-	ret += PRINT_ATTR_X64(read_format);
-
-	ret += PRINT_ATTR2(disabled, inherit);
-	ret += PRINT_ATTR2(pinned, exclusive);
-	ret += PRINT_ATTR2(exclude_user, exclude_kernel);
-	ret += PRINT_ATTR2(exclude_hv, exclude_idle);
-	ret += PRINT_ATTR2(mmap, comm);
-	ret += PRINT_ATTR2(freq, inherit_stat);
-	ret += PRINT_ATTR2(enable_on_exec, task);
-	ret += PRINT_ATTR2(watermark, precise_ip);
-	ret += PRINT_ATTR2(mmap_data, sample_id_all);
-	ret += PRINT_ATTR2(exclude_host, exclude_guest);
-	ret += PRINT_ATTR2N("excl.callchain_kern", exclude_callchain_kernel,
-			    "excl.callchain_user", exclude_callchain_user);
-
-	ret += PRINT_ATTR_U32(wakeup_events);
-	ret += PRINT_ATTR_U32(wakeup_watermark);
-	ret += PRINT_ATTR_X32(bp_type);
-	ret += PRINT_ATTR_X64(bp_addr);
-	ret += PRINT_ATTR_X64(config1);
-	ret += PRINT_ATTR_U64(bp_len);
-	ret += PRINT_ATTR_X64(config2);
-	ret += PRINT_ATTR_X64(branch_sample_type);
-	ret += PRINT_ATTR_X64(sample_regs_user);
-	ret += PRINT_ATTR_U32(sample_stack_user);
-
-	ret += fprintf(fp, "%.60s\n", graph_dotted_line);
-
-	return ret;
-}
-
-static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
-			      struct thread_map *threads)
-{
-	int cpu, thread;
-	unsigned long flags = 0;
-	int pid = -1, err;
-	enum { NO_CHANGE, SET_TO_MAX, INCREASED_MAX } set_rlimit = NO_CHANGE;
-
-	if (evsel->fd == NULL &&
-	    perf_evsel__alloc_fd(evsel, cpus->nr, threads->nr) < 0)
-		return -ENOMEM;
-
-	if (evsel->cgrp) {
-		flags = PERF_FLAG_PID_CGROUP;
-		pid = evsel->cgrp->fd;
-	}
-
-fallback_missing_features:
-	if (perf_missing_features.mmap2)
-		evsel->attr.mmap2 = 0;
-	if (perf_missing_features.exclude_guest)
-		evsel->attr.exclude_guest = evsel->attr.exclude_host = 0;
-retry_sample_id:
-	if (perf_missing_features.sample_id_all)
-		evsel->attr.sample_id_all = 0;
-
-	if (verbose >= 2)
-		perf_event_attr__fprintf(&evsel->attr, stderr);
-
-	for (cpu = 0; cpu < cpus->nr; cpu++) {
-
-		for (thread = 0; thread < threads->nr; thread++) {
-			int group_fd;
-
-			if (!evsel->cgrp)
-				pid = threads->map[thread];
-
-			group_fd = get_group_fd(evsel, cpu, thread);
-retry_open:
-			pr_debug2("perf_event_open: pid %d  cpu %d  group_fd %d  flags %#lx\n",
-				  pid, cpus->map[cpu], group_fd, flags);
-
-			FD(evsel, cpu, thread) = sys_perf_event_open(&evsel->attr,
-								     pid,
-								     cpus->map[cpu],
-								     group_fd, flags);
-			if (FD(evsel, cpu, thread) < 0) {
-				err = -errno;
-				goto try_fallback;
-			}
-			set_rlimit = NO_CHANGE;
-		}
-	}
-
-	return 0;
-
-try_fallback:
-	/*
-	 * perf stat needs between 5 and 22 fds per CPU. When we run out
-	 * of them try to increase the limits.
-	 */
-	if (err == -EMFILE && set_rlimit < INCREASED_MAX) {
-		struct rlimit l;
-		int old_errno = errno;
-
-		if (getrlimit(RLIMIT_NOFILE, &l) == 0) {
-			if (set_rlimit == NO_CHANGE)
-				l.rlim_cur = l.rlim_max;
-			else {
-				l.rlim_cur = l.rlim_max + 1000;
-				l.rlim_max = l.rlim_cur;
-			}
-			if (setrlimit(RLIMIT_NOFILE, &l) == 0) {
-				set_rlimit++;
-				errno = old_errno;
-				goto retry_open;
-			}
-		}
-		errno = old_errno;
-	}
-
-	if (err != -EINVAL || cpu > 0 || thread > 0)
-		goto out_close;
-
-	if (!perf_missing_features.mmap2 && evsel->attr.mmap2) {
-		perf_missing_features.mmap2 = true;
-		goto fallback_missing_features;
-	} else if (!perf_missing_features.exclude_guest &&
-		   (evsel->attr.exclude_guest || evsel->attr.exclude_host)) {
-		perf_missing_features.exclude_guest = true;
-		goto fallback_missing_features;
-	} else if (!perf_missing_features.sample_id_all) {
-		perf_missing_features.sample_id_all = true;
-		goto retry_sample_id;
-	}
-
-out_close:
-	do {
-		while (--thread >= 0) {
-			close(FD(evsel, cpu, thread));
-			FD(evsel, cpu, thread) = -1;
-		}
-		thread = threads->nr;
-	} while (--cpu >= 0);
-	return err;
-}
-
-void perf_evsel__close(struct perf_evsel *evsel, int ncpus, int nthreads)
-{
-	if (evsel->fd == NULL)
-		return;
-
-	perf_evsel__close_fd(evsel, ncpus, nthreads);
-	perf_evsel__free_fd(evsel);
-	evsel->fd = NULL;
-}
-
-static struct {
-	struct cpu_map map;
-	int cpus[1];
-} empty_cpu_map = {
-	.map.nr	= 1,
-	.cpus	= { -1, },
-};
-
-static struct {
-	struct thread_map map;
-	int threads[1];
-} empty_thread_map = {
-	.map.nr	 = 1,
-	.threads = { -1, },
-};
-
-int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
-		     struct thread_map *threads)
-{
-	if (cpus == NULL) {
-		/* Work around old compiler warnings about strict aliasing */
-		cpus = &empty_cpu_map.map;
-	}
-
-	if (threads == NULL)
-		threads = &empty_thread_map.map;
-
-	return __perf_evsel__open(evsel, cpus, threads);
-}
-
-int perf_evsel__open_per_cpu(struct perf_evsel *evsel,
-			     struct cpu_map *cpus)
-{
-	return __perf_evsel__open(evsel, cpus, &empty_thread_map.map);
-}
-
-int perf_evsel__open_per_thread(struct perf_evsel *evsel,
-				struct thread_map *threads)
-{
-	return __perf_evsel__open(evsel, &empty_cpu_map.map, threads);
-}
-
-static int perf_evsel__parse_id_sample(const struct perf_evsel *evsel,
-				       const union perf_event *event,
-				       struct perf_sample *sample)
-{
-	u64 type = evsel->attr.sample_type;
-	const u64 *array = event->sample.array;
-	bool swapped = evsel->needs_swap;
-	union u64_swap u;
-
-	array += ((event->header.size -
-		   sizeof(event->header)) / sizeof(u64)) - 1;
-
-	if (type & PERF_SAMPLE_IDENTIFIER) {
-		sample->id = *array;
-		array--;
-	}
-
-	if (type & PERF_SAMPLE_CPU) {
-		u.val64 = *array;
-		if (swapped) {
-			/* undo swap of u64, then swap on individual u32s */
-			u.val64 = bswap_64(u.val64);
-			u.val32[0] = bswap_32(u.val32[0]);
-		}
-
-		sample->cpu = u.val32[0];
-		array--;
-	}
-
-	if (type & PERF_SAMPLE_STREAM_ID) {
-		sample->stream_id = *array;
-		array--;
-	}
-
-	if (type & PERF_SAMPLE_ID) {
-		sample->id = *array;
-		array--;
-	}
-
-	if (type & PERF_SAMPLE_TIME) {
-		sample->time = *array;
-		array--;
-	}
-
-	if (type & PERF_SAMPLE_TID) {
-		u.val64 = *array;
-		if (swapped) {
-			/* undo swap of u64, then swap on individual u32s */
-			u.val64 = bswap_64(u.val64);
-			u.val32[0] = bswap_32(u.val32[0]);
-			u.val32[1] = bswap_32(u.val32[1]);
-		}
-
-		sample->pid = u.val32[0];
-		sample->tid = u.val32[1];
-	}
-
-	return 0;
-}
-
-static inline bool overflow(const void *endp, u16 max_size, const void *offset,
-			    u64 size)
-{
-	return size > max_size || offset + size > endp;
-}
-
-#define OVERFLOW_CHECK(offset, size, max_size)				\
-	do {								\
-		if (overflow(endp, (max_size), (offset), (size)))	\
-			return -EFAULT;					\
-	} while (0)
-
-#define OVERFLOW_CHECK_u64(offset) \
-	OVERFLOW_CHECK(offset, sizeof(u64), sizeof(u64))
-
-int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
-			     struct perf_sample *data)
-{
-	u64 type = evsel->attr.sample_type;
-	bool swapped = evsel->needs_swap;
-	const u64 *array;
-	u16 max_size = event->header.size;
-	const void *endp = (void *)event + max_size;
-	u64 sz;
-
-	/*
-	 * used for cross-endian analysis. See git commit 65014ab3
-	 * for why this goofiness is needed.
-	 */
-	union u64_swap u;
-
-	memset(data, 0, sizeof(*data));
-	data->cpu = data->pid = data->tid = -1;
-	data->stream_id = data->id = data->time = -1ULL;
-	data->period = 1;
-	data->weight = 0;
-
-	if (event->header.type != PERF_RECORD_SAMPLE) {
-		if (!evsel->attr.sample_id_all)
-			return 0;
-		return perf_evsel__parse_id_sample(evsel, event, data);
-	}
-
-	array = event->sample.array;
-
-	/*
-	 * The evsel's sample_size is based on PERF_SAMPLE_MASK which includes
-	 * up to PERF_SAMPLE_PERIOD.  After that overflow() must be used to
-	 * check the format does not go past the end of the event.
-	 */
-	if (evsel->sample_size + sizeof(event->header) > event->header.size)
-		return -EFAULT;
-
-	data->id = -1ULL;
-	if (type & PERF_SAMPLE_IDENTIFIER) {
-		data->id = *array;
-		array++;
-	}
-
-	if (type & PERF_SAMPLE_IP) {
-		data->ip = *array;
-		array++;
-	}
-
-	if (type & PERF_SAMPLE_TID) {
-		u.val64 = *array;
-		if (swapped) {
-			/* undo swap of u64, then swap on individual u32s */
-			u.val64 = bswap_64(u.val64);
-			u.val32[0] = bswap_32(u.val32[0]);
-			u.val32[1] = bswap_32(u.val32[1]);
-		}
-
-		data->pid = u.val32[0];
-		data->tid = u.val32[1];
-		array++;
-	}
-
-	if (type & PERF_SAMPLE_TIME) {
-		data->time = *array;
-		array++;
-	}
-
-	data->addr = 0;
-	if (type & PERF_SAMPLE_ADDR) {
-		data->addr = *array;
-		array++;
-	}
-
-	if (type & PERF_SAMPLE_ID) {
-		data->id = *array;
-		array++;
-	}
-
-	if (type & PERF_SAMPLE_STREAM_ID) {
-		data->stream_id = *array;
-		array++;
-	}
-
-	if (type & PERF_SAMPLE_CPU) {
-
-		u.val64 = *array;
-		if (swapped) {
-			/* undo swap of u64, then swap on individual u32s */
-			u.val64 = bswap_64(u.val64);
-			u.val32[0] = bswap_32(u.val32[0]);
-		}
-
-		data->cpu = u.val32[0];
-		array++;
-	}
-
-	if (type & PERF_SAMPLE_PERIOD) {
-		data->period = *array;
-		array++;
-	}
-
-	if (type & PERF_SAMPLE_READ) {
-		u64 read_format = evsel->attr.read_format;
-
-		OVERFLOW_CHECK_u64(array);
-		if (read_format & PERF_FORMAT_GROUP)
-			data->read.group.nr = *array;
-		else
-			data->read.one.value = *array;
-
-		array++;
-
-		if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) {
-			OVERFLOW_CHECK_u64(array);
-			data->read.time_enabled = *array;
-			array++;
-		}
-
-		if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) {
-			OVERFLOW_CHECK_u64(array);
-			data->read.time_running = *array;
-			array++;
-		}
-
-		/* PERF_FORMAT_ID is forced for PERF_SAMPLE_READ */
-		if (read_format & PERF_FORMAT_GROUP) {
-			const u64 max_group_nr = UINT64_MAX /
-					sizeof(struct sample_read_value);
-
-			if (data->read.group.nr > max_group_nr)
-				return -EFAULT;
-			sz = data->read.group.nr *
-			     sizeof(struct sample_read_value);
-			OVERFLOW_CHECK(array, sz, max_size);
-			data->read.group.values =
-					(struct sample_read_value *)array;
-			array = (void *)array + sz;
-		} else {
-			OVERFLOW_CHECK_u64(array);
-			data->read.one.id = *array;
-			array++;
-		}
-	}
-
-	if (type & PERF_SAMPLE_CALLCHAIN) {
-		const u64 max_callchain_nr = UINT64_MAX / sizeof(u64);
-
-		OVERFLOW_CHECK_u64(array);
-		data->callchain = (struct ip_callchain *)array++;
-		if (data->callchain->nr > max_callchain_nr)
-			return -EFAULT;
-		sz = data->callchain->nr * sizeof(u64);
-		OVERFLOW_CHECK(array, sz, max_size);
-		array = (void *)array + sz;
-	}
-
-	if (type & PERF_SAMPLE_RAW) {
-		OVERFLOW_CHECK_u64(array);
-		u.val64 = *array;
-		if (WARN_ONCE(swapped,
-			      "Endianness of raw data not corrected!\n")) {
-			/* undo swap of u64, then swap on individual u32s */
-			u.val64 = bswap_64(u.val64);
-			u.val32[0] = bswap_32(u.val32[0]);
-			u.val32[1] = bswap_32(u.val32[1]);
-		}
-		data->raw_size = u.val32[0];
-		array = (void *)array + sizeof(u32);
-
-		OVERFLOW_CHECK(array, data->raw_size, max_size);
-		data->raw_data = (void *)array;
-		array = (void *)array + data->raw_size;
-	}
-
-	if (type & PERF_SAMPLE_BRANCH_STACK) {
-		const u64 max_branch_nr = UINT64_MAX /
-					  sizeof(struct branch_entry);
-
-		OVERFLOW_CHECK_u64(array);
-		data->branch_stack = (struct branch_stack *)array++;
-
-		if (data->branch_stack->nr > max_branch_nr)
-			return -EFAULT;
-		sz = data->branch_stack->nr * sizeof(struct branch_entry);
-		OVERFLOW_CHECK(array, sz, max_size);
-		array = (void *)array + sz;
-	}
-
-	if (type & PERF_SAMPLE_REGS_USER) {
-		OVERFLOW_CHECK_u64(array);
-		data->user_regs.abi = *array;
-		array++;
-
-		if (data->user_regs.abi) {
-			u64 regs_user = evsel->attr.sample_regs_user;
-
-			sz = hweight_long(regs_user) * sizeof(u64);
-			OVERFLOW_CHECK(array, sz, max_size);
-			data->user_regs.regs = (u64 *)array;
-			array = (void *)array + sz;
-		}
-	}
-
-	if (type & PERF_SAMPLE_STACK_USER) {
-		OVERFLOW_CHECK_u64(array);
-		sz = *array++;
-
-		data->user_stack.offset = ((char *)(array - 1)
-					  - (char *) event);
-
-		if (!sz) {
-			data->user_stack.size = 0;
-		} else {
-			OVERFLOW_CHECK(array, sz, max_size);
-			data->user_stack.data = (char *)array;
-			array = (void *)array + sz;
-			OVERFLOW_CHECK_u64(array);
-			data->user_stack.size = *array++;
-		}
-	}
-
-	data->weight = 0;
-	if (type & PERF_SAMPLE_WEIGHT) {
-		OVERFLOW_CHECK_u64(array);
-		data->weight = *array;
-		array++;
-	}
-
-	data->data_src = PERF_MEM_DATA_SRC_NONE;
-	if (type & PERF_SAMPLE_DATA_SRC) {
-		OVERFLOW_CHECK_u64(array);
-		data->data_src = *array;
-		array++;
-	}
-
-	return 0;
-}
-
-size_t perf_event__sample_event_size(const struct perf_sample *sample, u64 type,
-				     u64 sample_regs_user, u64 read_format)
-{
-	size_t sz, result = sizeof(struct sample_event);
-
-	if (type & PERF_SAMPLE_IDENTIFIER)
-		result += sizeof(u64);
-
-	if (type & PERF_SAMPLE_IP)
-		result += sizeof(u64);
-
-	if (type & PERF_SAMPLE_TID)
-		result += sizeof(u64);
-
-	if (type & PERF_SAMPLE_TIME)
-		result += sizeof(u64);
-
-	if (type & PERF_SAMPLE_ADDR)
-		result += sizeof(u64);
-
-	if (type & PERF_SAMPLE_ID)
-		result += sizeof(u64);
-
-	if (type & PERF_SAMPLE_STREAM_ID)
-		result += sizeof(u64);
-
-	if (type & PERF_SAMPLE_CPU)
-		result += sizeof(u64);
-
-	if (type & PERF_SAMPLE_PERIOD)
-		result += sizeof(u64);
-
-	if (type & PERF_SAMPLE_READ) {
-		result += sizeof(u64);
-		if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
-			result += sizeof(u64);
-		if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING)
-			result += sizeof(u64);
-		/* PERF_FORMAT_ID is forced for PERF_SAMPLE_READ */
-		if (read_format & PERF_FORMAT_GROUP) {
-			sz = sample->read.group.nr *
-			     sizeof(struct sample_read_value);
-			result += sz;
-		} else {
-			result += sizeof(u64);
-		}
-	}
-
-	if (type & PERF_SAMPLE_CALLCHAIN) {
-		sz = (sample->callchain->nr + 1) * sizeof(u64);
-		result += sz;
-	}
-
-	if (type & PERF_SAMPLE_RAW) {
-		result += sizeof(u32);
-		result += sample->raw_size;
-	}
-
-	if (type & PERF_SAMPLE_BRANCH_STACK) {
-		sz = sample->branch_stack->nr * sizeof(struct branch_entry);
-		sz += sizeof(u64);
-		result += sz;
-	}
-
-	if (type & PERF_SAMPLE_REGS_USER) {
-		if (sample->user_regs.abi) {
-			result += sizeof(u64);
-			sz = hweight_long(sample_regs_user) * sizeof(u64);
-			result += sz;
-		} else {
-			result += sizeof(u64);
-		}
-	}
-
-	if (type & PERF_SAMPLE_STACK_USER) {
-		sz = sample->user_stack.size;
-		result += sizeof(u64);
-		if (sz) {
-			result += sz;
-			result += sizeof(u64);
-		}
-	}
-
-	if (type & PERF_SAMPLE_WEIGHT)
-		result += sizeof(u64);
-
-	if (type & PERF_SAMPLE_DATA_SRC)
-		result += sizeof(u64);
-
-	return result;
-}
-
-int perf_event__synthesize_sample(union perf_event *event, u64 type,
-				  u64 sample_regs_user, u64 read_format,
-				  const struct perf_sample *sample,
-				  bool swapped)
-{
-	u64 *array;
-	size_t sz;
-	/*
-	 * used for cross-endian analysis. See git commit 65014ab3
-	 * for why this goofiness is needed.
-	 */
-	union u64_swap u;
-
-	array = event->sample.array;
-
-	if (type & PERF_SAMPLE_IDENTIFIER) {
-		*array = sample->id;
-		array++;
-	}
-
-	if (type & PERF_SAMPLE_IP) {
-		*array = sample->ip;
-		array++;
-	}
-
-	if (type & PERF_SAMPLE_TID) {
-		u.val32[0] = sample->pid;
-		u.val32[1] = sample->tid;
-		if (swapped) {
-			/*
-			 * Inverse of what is done in perf_evsel__parse_sample
-			 */
-			u.val32[0] = bswap_32(u.val32[0]);
-			u.val32[1] = bswap_32(u.val32[1]);
-			u.val64 = bswap_64(u.val64);
-		}
-
-		*array = u.val64;
-		array++;
-	}
-
-	if (type & PERF_SAMPLE_TIME) {
-		*array = sample->time;
-		array++;
-	}
-
-	if (type & PERF_SAMPLE_ADDR) {
-		*array = sample->addr;
-		array++;
-	}
-
-	if (type & PERF_SAMPLE_ID) {
-		*array = sample->id;
-		array++;
-	}
-
-	if (type & PERF_SAMPLE_STREAM_ID) {
-		*array = sample->stream_id;
-		array++;
-	}
-
-	if (type & PERF_SAMPLE_CPU) {
-		u.val32[0] = sample->cpu;
-		if (swapped) {
-			/*
-			 * Inverse of what is done in perf_evsel__parse_sample
-			 */
-			u.val32[0] = bswap_32(u.val32[0]);
-			u.val64 = bswap_64(u.val64);
-		}
-		*array = u.val64;
-		array++;
-	}
-
-	if (type & PERF_SAMPLE_PERIOD) {
-		*array = sample->period;
-		array++;
-	}
-
-	if (type & PERF_SAMPLE_READ) {
-		if (read_format & PERF_FORMAT_GROUP)
-			*array = sample->read.group.nr;
-		else
-			*array = sample->read.one.value;
-		array++;
-
-		if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) {
-			*array = sample->read.time_enabled;
-			array++;
-		}
-
-		if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) {
-			*array = sample->read.time_running;
-			array++;
-		}
-
-		/* PERF_FORMAT_ID is forced for PERF_SAMPLE_READ */
-		if (read_format & PERF_FORMAT_GROUP) {
-			sz = sample->read.group.nr *
-			     sizeof(struct sample_read_value);
-			memcpy(array, sample->read.group.values, sz);
-			array = (void *)array + sz;
-		} else {
-			*array = sample->read.one.id;
-			array++;
-		}
-	}
-
-	if (type & PERF_SAMPLE_CALLCHAIN) {
-		sz = (sample->callchain->nr + 1) * sizeof(u64);
-		memcpy(array, sample->callchain, sz);
-		array = (void *)array + sz;
-	}
-
-	if (type & PERF_SAMPLE_RAW) {
-		u.val32[0] = sample->raw_size;
-		if (WARN_ONCE(swapped,
-			      "Endianness of raw data not corrected!\n")) {
-			/*
-			 * Inverse of what is done in perf_evsel__parse_sample
-			 */
-			u.val32[0] = bswap_32(u.val32[0]);
-			u.val32[1] = bswap_32(u.val32[1]);
-			u.val64 = bswap_64(u.val64);
-		}
-		*array = u.val64;
-		array = (void *)array + sizeof(u32);
-
-		memcpy(array, sample->raw_data, sample->raw_size);
-		array = (void *)array + sample->raw_size;
-	}
-
-	if (type & PERF_SAMPLE_BRANCH_STACK) {
-		sz = sample->branch_stack->nr * sizeof(struct branch_entry);
-		sz += sizeof(u64);
-		memcpy(array, sample->branch_stack, sz);
-		array = (void *)array + sz;
-	}
-
-	if (type & PERF_SAMPLE_REGS_USER) {
-		if (sample->user_regs.abi) {
-			*array++ = sample->user_regs.abi;
-			sz = hweight_long(sample_regs_user) * sizeof(u64);
-			memcpy(array, sample->user_regs.regs, sz);
-			array = (void *)array + sz;
-		} else {
-			*array++ = 0;
-		}
-	}
-
-	if (type & PERF_SAMPLE_STACK_USER) {
-		sz = sample->user_stack.size;
-		*array++ = sz;
-		if (sz) {
-			memcpy(array, sample->user_stack.data, sz);
-			array = (void *)array + sz;
-			*array++ = sz;
-		}
-	}
-
-	if (type & PERF_SAMPLE_WEIGHT) {
-		*array = sample->weight;
-		array++;
-	}
-
-	if (type & PERF_SAMPLE_DATA_SRC) {
-		*array = sample->data_src;
-		array++;
-	}
-
-	return 0;
-}
-
-struct format_field *perf_evsel__field(struct perf_evsel *evsel, const char *name)
-{
-	return pevent_find_field(evsel->tp_format, name);
-}
-
-void *perf_evsel__rawptr(struct perf_evsel *evsel, struct perf_sample *sample,
-			 const char *name)
-{
-	struct format_field *field = perf_evsel__field(evsel, name);
-	int offset;
-
-	if (!field)
-		return NULL;
-
-	offset = field->offset;
-
-	if (field->flags & FIELD_IS_DYNAMIC) {
-		offset = *(int *)(sample->raw_data + field->offset);
-		offset &= 0xffff;
-	}
-
-	return sample->raw_data + offset;
-}
-
-u64 perf_evsel__intval(struct perf_evsel *evsel, struct perf_sample *sample,
-		       const char *name)
-{
-	struct format_field *field = perf_evsel__field(evsel, name);
-	void *ptr;
-	u64 value;
-
-	if (!field)
-		return 0;
-
-	ptr = sample->raw_data + field->offset;
-
-	switch (field->size) {
-	case 1:
-		return *(u8 *)ptr;
-	case 2:
-		value = *(u16 *)ptr;
-		break;
-	case 4:
-		value = *(u32 *)ptr;
-		break;
-	case 8:
-		value = *(u64 *)ptr;
-		break;
-	default:
-		return 0;
-	}
-
-	if (!evsel->needs_swap)
-		return value;
-
-	switch (field->size) {
-	case 2:
-		return bswap_16(value);
-	case 4:
-		return bswap_32(value);
-	case 8:
-		return bswap_64(value);
-	default:
-		return 0;
-	}
-
-	return 0;
-}
-
-static int comma_fprintf(FILE *fp, bool *first, const char *fmt, ...)
-{
-	va_list args;
-	int ret = 0;
-
-	if (!*first) {
-		ret += fprintf(fp, ",");
-	} else {
-		ret += fprintf(fp, ":");
-		*first = false;
-	}
-
-	va_start(args, fmt);
-	ret += vfprintf(fp, fmt, args);
-	va_end(args);
-	return ret;
-}
-
-static int __if_fprintf(FILE *fp, bool *first, const char *field, u64 value)
-{
-	if (value == 0)
-		return 0;
-
-	return comma_fprintf(fp, first, " %s: %" PRIu64, field, value);
-}
-
-#define if_print(field) printed += __if_fprintf(fp, &first, #field, evsel->attr.field)
-
-struct bit_names {
-	int bit;
-	const char *name;
-};
-
-static int bits__fprintf(FILE *fp, const char *field, u64 value,
-			 struct bit_names *bits, bool *first)
-{
-	int i = 0, printed = comma_fprintf(fp, first, " %s: ", field);
-	bool first_bit = true;
-
-	do {
-		if (value & bits[i].bit) {
-			printed += fprintf(fp, "%s%s", first_bit ? "" : "|", bits[i].name);
-			first_bit = false;
-		}
-	} while (bits[++i].name != NULL);
-
-	return printed;
-}
-
-static int sample_type__fprintf(FILE *fp, bool *first, u64 value)
-{
-#define bit_name(n) { PERF_SAMPLE_##n, #n }
-	struct bit_names bits[] = {
-		bit_name(IP), bit_name(TID), bit_name(TIME), bit_name(ADDR),
-		bit_name(READ), bit_name(CALLCHAIN), bit_name(ID), bit_name(CPU),
-		bit_name(PERIOD), bit_name(STREAM_ID), bit_name(RAW),
-		bit_name(BRANCH_STACK), bit_name(REGS_USER), bit_name(STACK_USER),
-		bit_name(IDENTIFIER),
-		{ .name = NULL, }
-	};
-#undef bit_name
-	return bits__fprintf(fp, "sample_type", value, bits, first);
-}
-
-static int read_format__fprintf(FILE *fp, bool *first, u64 value)
-{
-#define bit_name(n) { PERF_FORMAT_##n, #n }
-	struct bit_names bits[] = {
-		bit_name(TOTAL_TIME_ENABLED), bit_name(TOTAL_TIME_RUNNING),
-		bit_name(ID), bit_name(GROUP),
-		{ .name = NULL, }
-	};
-#undef bit_name
-	return bits__fprintf(fp, "read_format", value, bits, first);
-}
-
-int perf_evsel__fprintf(struct perf_evsel *evsel,
-			struct perf_attr_details *details, FILE *fp)
-{
-	bool first = true;
-	int printed = 0;
-
-	if (details->event_group) {
-		struct perf_evsel *pos;
-
-		if (!perf_evsel__is_group_leader(evsel))
-			return 0;
-
-		if (evsel->nr_members > 1)
-			printed += fprintf(fp, "%s{", evsel->group_name ?: "");
-
-		printed += fprintf(fp, "%s", perf_evsel__name(evsel));
-		for_each_group_member(pos, evsel)
-			printed += fprintf(fp, ",%s", perf_evsel__name(pos));
-
-		if (evsel->nr_members > 1)
-			printed += fprintf(fp, "}");
-		goto out;
-	}
-
-	printed += fprintf(fp, "%s", perf_evsel__name(evsel));
-
-	if (details->verbose || details->freq) {
-		printed += comma_fprintf(fp, &first, " sample_freq=%" PRIu64,
-					 (u64)evsel->attr.sample_freq);
-	}
-
-	if (details->verbose) {
-		if_print(type);
-		if_print(config);
-		if_print(config1);
-		if_print(config2);
-		if_print(size);
-		printed += sample_type__fprintf(fp, &first, evsel->attr.sample_type);
-		if (evsel->attr.read_format)
-			printed += read_format__fprintf(fp, &first, evsel->attr.read_format);
-		if_print(disabled);
-		if_print(inherit);
-		if_print(pinned);
-		if_print(exclusive);
-		if_print(exclude_user);
-		if_print(exclude_kernel);
-		if_print(exclude_hv);
-		if_print(exclude_idle);
-		if_print(mmap);
-		if_print(mmap2);
-		if_print(comm);
-		if_print(freq);
-		if_print(inherit_stat);
-		if_print(enable_on_exec);
-		if_print(task);
-		if_print(watermark);
-		if_print(precise_ip);
-		if_print(mmap_data);
-		if_print(sample_id_all);
-		if_print(exclude_host);
-		if_print(exclude_guest);
-		if_print(__reserved_1);
-		if_print(wakeup_events);
-		if_print(bp_type);
-		if_print(branch_sample_type);
-	}
-out:
-	fputc('\n', fp);
-	return ++printed;
-}
-
-bool perf_evsel__fallback(struct perf_evsel *evsel, int err,
-			  char *msg, size_t msgsize)
-{
-	if ((err == ENOENT || err == ENXIO || err == ENODEV) &&
-	    evsel->attr.type   == PERF_TYPE_HARDWARE &&
-	    evsel->attr.config == PERF_COUNT_HW_CPU_CYCLES) {
-		/*
-		 * If it's cycles then fall back to hrtimer based
-		 * cpu-clock-tick sw counter, which is always available even if
-		 * no PMU support.
-		 *
-		 * PPC returns ENXIO until 2.6.37 (behavior changed with commit
-		 * b0a873e).
-		 */
-		scnprintf(msg, msgsize, "%s",
-"The cycles event is not supported, trying to fall back to cpu-clock-ticks");
-
-		evsel->attr.type   = PERF_TYPE_SOFTWARE;
-		evsel->attr.config = PERF_COUNT_SW_CPU_CLOCK;
-
-		free(evsel->name);
-		evsel->name = NULL;
-		return true;
-	}
-
-	return false;
-}
-
-int perf_evsel__open_strerror(struct perf_evsel *evsel,
-			      struct perf_target *target,
-			      int err, char *msg, size_t size)
-{
-	switch (err) {
-	case EPERM:
-	case EACCES:
-		return scnprintf(msg, size,
-		 "You may not have permission to collect %sstats.\n"
-		 "Consider tweaking /proc/sys/kernel/perf_event_paranoid:\n"
-		 " -1 - Not paranoid at all\n"
-		 "  0 - Disallow raw tracepoint access for unpriv\n"
-		 "  1 - Disallow cpu events for unpriv\n"
-		 "  2 - Disallow kernel profiling for unpriv",
-				 target->system_wide ? "system-wide " : "");
-	case ENOENT:
-		return scnprintf(msg, size, "The %s event is not supported.",
-				 perf_evsel__name(evsel));
-	case EMFILE:
-		return scnprintf(msg, size, "%s",
-			 "Too many events are opened.\n"
-			 "Try again after reducing the number of events.");
-	case ENODEV:
-		if (target->cpu_list)
-			return scnprintf(msg, size, "%s",
-	 "No such device - did you specify an out-of-range profile CPU?\n");
-		break;
-	case EOPNOTSUPP:
-		if (evsel->attr.precise_ip)
-			return scnprintf(msg, size, "%s",
-	"\'precise\' request may not be supported. Try removing 'p' modifier.");
-#if defined(__i386__) || defined(__x86_64__)
-		if (evsel->attr.type == PERF_TYPE_HARDWARE)
-			return scnprintf(msg, size, "%s",
-	"No hardware sampling interrupt available.\n"
-	"No APIC? If so then you can boot the kernel with the \"lapic\" boot parameter to force-enable it.");
-#endif
-		break;
-	default:
-		break;
-	}
-
-	return scnprintf(msg, size,
-	"The sys_perf_event_open() syscall returned with %d (%s) for event (%s).  \n"
-	"/bin/dmesg may provide additional information.\n"
-	"No CONFIG_PERF_EVENTS=y kernel support configured?\n",
-			 err, strerror(err), perf_evsel__name(evsel));
-}
diff --git a/src/tools/perf/util/evsel.h b/src/tools/perf/util/evsel.h
deleted file mode 100644
index 4a7bdc7..0000000
--- a/src/tools/perf/util/evsel.h
+++ /dev/null
@@ -1,321 +0,0 @@
-#ifndef __PERF_EVSEL_H
-#define __PERF_EVSEL_H 1
-
-#include <linux/list.h>
-#include <stdbool.h>
-#include <stddef.h>
-#include <linux/perf_event.h>
-#include "types.h"
-#include "xyarray.h"
-#include "cgroup.h"
-#include "hist.h"
-#include "symbol.h"
- 
-struct perf_counts_values {
-	union {
-		struct {
-			u64 val;
-			u64 ena;
-			u64 run;
-		};
-		u64 values[3];
-	};
-};
-
-struct perf_counts {
-	s8		   	  scaled;
-	struct perf_counts_values aggr;
-	struct perf_counts_values cpu[];
-};
-
-struct perf_evsel;
-
-/*
- * Per fd, to map back from PERF_SAMPLE_ID to evsel, only used when there are
- * more than one entry in the evlist.
- */
-struct perf_sample_id {
-	struct hlist_node 	node;
-	u64		 	id;
-	struct perf_evsel	*evsel;
-
-	/* Holds total ID period value for PERF_SAMPLE_READ processing. */
-	u64			period;
-};
-
-/** struct perf_evsel - event selector
- *
- * @name - Can be set to retain the original event name passed by the user,
- *         so that when showing results in tools such as 'perf stat', we
- *         show the name used, not some alias.
- * @id_pos: the position of the event id (PERF_SAMPLE_ID or
- *          PERF_SAMPLE_IDENTIFIER) in a sample event i.e. in the array of
- *          struct sample_event
- * @is_pos: the position (counting backwards) of the event id (PERF_SAMPLE_ID or
- *          PERF_SAMPLE_IDENTIFIER) in a non-sample event i.e. if sample_id_all
- *          is used there is an id sample appended to non-sample events
- */
-struct perf_evsel {
-	struct list_head	node;
-	struct perf_event_attr	attr;
-	char			*filter;
-	struct xyarray		*fd;
-	struct xyarray		*sample_id;
-	u64			*id;
-	struct perf_counts	*counts;
-	struct perf_counts	*prev_raw_counts;
-	int			idx;
-	u32			ids;
-	struct hists		hists;
-	char			*name;
-	struct event_format	*tp_format;
-	union {
-		void		*priv;
-		off_t		id_offset;
-	};
-	struct cgroup_sel	*cgrp;
-	struct {
-		void		*func;
-		void		*data;
-	} handler;
-	struct cpu_map		*cpus;
-	unsigned int		sample_size;
-	int			id_pos;
-	int			is_pos;
-	bool 			supported;
-	bool 			needs_swap;
-	/* parse modifier helper */
-	int			exclude_GH;
-	int			nr_members;
-	int			sample_read;
-	struct perf_evsel	*leader;
-	char			*group_name;
-};
-
-#define hists_to_evsel(h) container_of(h, struct perf_evsel, hists)
-
-struct cpu_map;
-struct thread_map;
-struct perf_evlist;
-struct perf_record_opts;
-
-struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr, int idx);
-struct perf_evsel *perf_evsel__newtp(const char *sys, const char *name, int idx);
-
-struct event_format *event_format__new(const char *sys, const char *name);
-
-void perf_evsel__init(struct perf_evsel *evsel,
-		      struct perf_event_attr *attr, int idx);
-void perf_evsel__exit(struct perf_evsel *evsel);
-void perf_evsel__delete(struct perf_evsel *evsel);
-
-void perf_evsel__config(struct perf_evsel *evsel,
-			struct perf_record_opts *opts);
-
-int __perf_evsel__sample_size(u64 sample_type);
-void perf_evsel__calc_id_pos(struct perf_evsel *evsel);
-
-bool perf_evsel__is_cache_op_valid(u8 type, u8 op);
-
-#define PERF_EVSEL__MAX_ALIASES 8
-
-extern const char *perf_evsel__hw_cache[PERF_COUNT_HW_CACHE_MAX]
-				       [PERF_EVSEL__MAX_ALIASES];
-extern const char *perf_evsel__hw_cache_op[PERF_COUNT_HW_CACHE_OP_MAX]
-					  [PERF_EVSEL__MAX_ALIASES];
-extern const char *perf_evsel__hw_cache_result[PERF_COUNT_HW_CACHE_RESULT_MAX]
-					      [PERF_EVSEL__MAX_ALIASES];
-extern const char *perf_evsel__hw_names[PERF_COUNT_HW_MAX];
-extern const char *perf_evsel__sw_names[PERF_COUNT_SW_MAX];
-int __perf_evsel__hw_cache_type_op_res_name(u8 type, u8 op, u8 result,
-					    char *bf, size_t size);
-const char *perf_evsel__name(struct perf_evsel *evsel);
-const char *perf_evsel__group_name(struct perf_evsel *evsel);
-int perf_evsel__group_desc(struct perf_evsel *evsel, char *buf, size_t size);
-
-int perf_evsel__alloc_fd(struct perf_evsel *evsel, int ncpus, int nthreads);
-int perf_evsel__alloc_id(struct perf_evsel *evsel, int ncpus, int nthreads);
-int perf_evsel__alloc_counts(struct perf_evsel *evsel, int ncpus);
-void perf_evsel__reset_counts(struct perf_evsel *evsel, int ncpus);
-void perf_evsel__free_fd(struct perf_evsel *evsel);
-void perf_evsel__free_id(struct perf_evsel *evsel);
-void perf_evsel__free_counts(struct perf_evsel *evsel);
-void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads);
-
-void __perf_evsel__set_sample_bit(struct perf_evsel *evsel,
-				  enum perf_event_sample_format bit);
-void __perf_evsel__reset_sample_bit(struct perf_evsel *evsel,
-				    enum perf_event_sample_format bit);
-
-#define perf_evsel__set_sample_bit(evsel, bit) \
-	__perf_evsel__set_sample_bit(evsel, PERF_SAMPLE_##bit)
-
-#define perf_evsel__reset_sample_bit(evsel, bit) \
-	__perf_evsel__reset_sample_bit(evsel, PERF_SAMPLE_##bit)
-
-void perf_evsel__set_sample_id(struct perf_evsel *evsel,
-			       bool use_sample_identifier);
-
-int perf_evsel__set_filter(struct perf_evsel *evsel, int ncpus, int nthreads,
-			   const char *filter);
-int perf_evsel__enable(struct perf_evsel *evsel, int ncpus, int nthreads);
-
-int perf_evsel__open_per_cpu(struct perf_evsel *evsel,
-			     struct cpu_map *cpus);
-int perf_evsel__open_per_thread(struct perf_evsel *evsel,
-				struct thread_map *threads);
-int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
-		     struct thread_map *threads);
-void perf_evsel__close(struct perf_evsel *evsel, int ncpus, int nthreads);
-
-struct perf_sample;
-
-void *perf_evsel__rawptr(struct perf_evsel *evsel, struct perf_sample *sample,
-			 const char *name);
-u64 perf_evsel__intval(struct perf_evsel *evsel, struct perf_sample *sample,
-		       const char *name);
-
-static inline char *perf_evsel__strval(struct perf_evsel *evsel,
-				       struct perf_sample *sample,
-				       const char *name)
-{
-	return perf_evsel__rawptr(evsel, sample, name);
-}
-
-struct format_field;
-
-struct format_field *perf_evsel__field(struct perf_evsel *evsel, const char *name);
-
-#define perf_evsel__match(evsel, t, c)		\
-	(evsel->attr.type == PERF_TYPE_##t &&	\
-	 evsel->attr.config == PERF_COUNT_##c)
-
-static inline bool perf_evsel__match2(struct perf_evsel *e1,
-				      struct perf_evsel *e2)
-{
-	return (e1->attr.type == e2->attr.type) &&
-	       (e1->attr.config == e2->attr.config);
-}
-
-int __perf_evsel__read_on_cpu(struct perf_evsel *evsel,
-			      int cpu, int thread, bool scale);
-
-/**
- * perf_evsel__read_on_cpu - Read out the results on a CPU and thread
- *
- * @evsel - event selector to read value
- * @cpu - CPU of interest
- * @thread - thread of interest
- */
-static inline int perf_evsel__read_on_cpu(struct perf_evsel *evsel,
-					  int cpu, int thread)
-{
-	return __perf_evsel__read_on_cpu(evsel, cpu, thread, false);
-}
-
-/**
- * perf_evsel__read_on_cpu_scaled - Read out the results on a CPU and thread, scaled
- *
- * @evsel - event selector to read value
- * @cpu - CPU of interest
- * @thread - thread of interest
- */
-static inline int perf_evsel__read_on_cpu_scaled(struct perf_evsel *evsel,
-						 int cpu, int thread)
-{
-	return __perf_evsel__read_on_cpu(evsel, cpu, thread, true);
-}
-
-int __perf_evsel__read(struct perf_evsel *evsel, int ncpus, int nthreads,
-		       bool scale);
-
-/**
- * perf_evsel__read - Read the aggregate results on all CPUs
- *
- * @evsel - event selector to read value
- * @ncpus - Number of cpus affected, from zero
- * @nthreads - Number of threads affected, from zero
- */
-static inline int perf_evsel__read(struct perf_evsel *evsel,
-				    int ncpus, int nthreads)
-{
-	return __perf_evsel__read(evsel, ncpus, nthreads, false);
-}
-
-/**
- * perf_evsel__read_scaled - Read the aggregate results on all CPUs, scaled
- *
- * @evsel - event selector to read value
- * @ncpus - Number of cpus affected, from zero
- * @nthreads - Number of threads affected, from zero
- */
-static inline int perf_evsel__read_scaled(struct perf_evsel *evsel,
-					  int ncpus, int nthreads)
-{
-	return __perf_evsel__read(evsel, ncpus, nthreads, true);
-}
-
-void hists__init(struct hists *hists);
-
-int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
-			     struct perf_sample *sample);
-
-static inline struct perf_evsel *perf_evsel__next(struct perf_evsel *evsel)
-{
-	return list_entry(evsel->node.next, struct perf_evsel, node);
-}
-
-/**
- * perf_evsel__is_group_leader - Return whether given evsel is a leader event
- *
- * @evsel - evsel selector to be tested
- *
- * Return %true if @evsel is a group leader or a stand-alone event
- */
-static inline bool perf_evsel__is_group_leader(const struct perf_evsel *evsel)
-{
-	return evsel->leader == evsel;
-}
-
-/**
- * perf_evsel__is_group_event - Return whether given evsel is a group event
- *
- * @evsel - evsel selector to be tested
- *
- * Return %true iff event group view is enabled and @evsel is a actual group
- * leader which has other members in the group
- */
-static inline bool perf_evsel__is_group_event(struct perf_evsel *evsel)
-{
-	if (!symbol_conf.event_group)
-		return false;
-
-	return perf_evsel__is_group_leader(evsel) && evsel->nr_members > 1;
-}
-
-struct perf_attr_details {
-	bool freq;
-	bool verbose;
-	bool event_group;
-};
-
-int perf_evsel__fprintf(struct perf_evsel *evsel,
-			struct perf_attr_details *details, FILE *fp);
-
-bool perf_evsel__fallback(struct perf_evsel *evsel, int err,
-			  char *msg, size_t msgsize);
-int perf_evsel__open_strerror(struct perf_evsel *evsel,
-			      struct perf_target *target,
-			      int err, char *msg, size_t size);
-
-static inline int perf_evsel__group_idx(struct perf_evsel *evsel)
-{
-	return evsel->idx - evsel->leader->idx;
-}
-
-#define for_each_group_member(_evsel, _leader) 					\
-for ((_evsel) = list_entry((_leader)->node.next, struct perf_evsel, node); 	\
-     (_evsel) && (_evsel)->leader == (_leader);					\
-     (_evsel) = list_entry((_evsel)->node.next, struct perf_evsel, node))
-
-#endif /* __PERF_EVSEL_H */
diff --git a/src/tools/perf/util/exec_cmd.c b/src/tools/perf/util/exec_cmd.c
deleted file mode 100644
index 7adf4ad..0000000
--- a/src/tools/perf/util/exec_cmd.c
+++ /dev/null
@@ -1,148 +0,0 @@
-#include "cache.h"
-#include "exec_cmd.h"
-#include "quote.h"
-
-#include <string.h>
-
-#define MAX_ARGS	32
-
-static const char *argv_exec_path;
-static const char *argv0_path;
-
-const char *system_path(const char *path)
-{
-	static const char *prefix = PREFIX;
-	struct strbuf d = STRBUF_INIT;
-
-	if (is_absolute_path(path))
-		return path;
-
-	strbuf_addf(&d, "%s/%s", prefix, path);
-	path = strbuf_detach(&d, NULL);
-	return path;
-}
-
-const char *perf_extract_argv0_path(const char *argv0)
-{
-	const char *slash;
-
-	if (!argv0 || !*argv0)
-		return NULL;
-	slash = argv0 + strlen(argv0);
-
-	while (argv0 <= slash && !is_dir_sep(*slash))
-		slash--;
-
-	if (slash >= argv0) {
-		argv0_path = strndup(argv0, slash - argv0);
-		return argv0_path ? slash + 1 : NULL;
-	}
-
-	return argv0;
-}
-
-void perf_set_argv_exec_path(const char *exec_path)
-{
-	argv_exec_path = exec_path;
-	/*
-	 * Propagate this setting to external programs.
-	 */
-	setenv(EXEC_PATH_ENVIRONMENT, exec_path, 1);
-}
-
-
-/* Returns the highest-priority, location to look for perf programs. */
-const char *perf_exec_path(void)
-{
-	const char *env;
-
-	if (argv_exec_path)
-		return argv_exec_path;
-
-	env = getenv(EXEC_PATH_ENVIRONMENT);
-	if (env && *env) {
-		return env;
-	}
-
-	return system_path(PERF_EXEC_PATH);
-}
-
-static void add_path(struct strbuf *out, const char *path)
-{
-	if (path && *path) {
-		if (is_absolute_path(path))
-			strbuf_addstr(out, path);
-		else
-			strbuf_addstr(out, make_nonrelative_path(path));
-
-		strbuf_addch(out, PATH_SEP);
-	}
-}
-
-void setup_path(void)
-{
-	const char *old_path = getenv("PATH");
-	struct strbuf new_path = STRBUF_INIT;
-
-	add_path(&new_path, perf_exec_path());
-	add_path(&new_path, argv0_path);
-
-	if (old_path)
-		strbuf_addstr(&new_path, old_path);
-	else
-		strbuf_addstr(&new_path, "/usr/local/bin:/usr/bin:/bin");
-
-	setenv("PATH", new_path.buf, 1);
-
-	strbuf_release(&new_path);
-}
-
-static const char **prepare_perf_cmd(const char **argv)
-{
-	int argc;
-	const char **nargv;
-
-	for (argc = 0; argv[argc]; argc++)
-		; /* just counting */
-	nargv = malloc(sizeof(*nargv) * (argc + 2));
-
-	nargv[0] = "perf";
-	for (argc = 0; argv[argc]; argc++)
-		nargv[argc + 1] = argv[argc];
-	nargv[argc + 1] = NULL;
-	return nargv;
-}
-
-int execv_perf_cmd(const char **argv) {
-	const char **nargv = prepare_perf_cmd(argv);
-
-	/* execvp() can only ever return if it fails */
-	execvp("perf", (char **)nargv);
-
-	free(nargv);
-	return -1;
-}
-
-
-int execl_perf_cmd(const char *cmd,...)
-{
-	int argc;
-	const char *argv[MAX_ARGS + 1];
-	const char *arg;
-	va_list param;
-
-	va_start(param, cmd);
-	argv[0] = cmd;
-	argc = 1;
-	while (argc < MAX_ARGS) {
-		arg = argv[argc++] = va_arg(param, char *);
-		if (!arg)
-			break;
-	}
-	va_end(param);
-	if (MAX_ARGS <= argc)
-		return error("too many args to run %s", cmd);
-
-	argv[argc] = NULL;
-	return execv_perf_cmd(argv);
-}
diff --git a/src/tools/perf/util/exec_cmd.h b/src/tools/perf/util/exec_cmd.h
deleted file mode 100644
index bc4b915..0000000
--- a/src/tools/perf/util/exec_cmd.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef __PERF_EXEC_CMD_H
-#define __PERF_EXEC_CMD_H
-
-extern void perf_set_argv_exec_path(const char *exec_path);
-extern const char *perf_extract_argv0_path(const char *path);
-extern const char *perf_exec_path(void);
-extern void setup_path(void);
-extern int execv_perf_cmd(const char **argv); /* NULL terminated */
-extern int execl_perf_cmd(const char *cmd, ...);
-extern const char *system_path(const char *path);
-
-#endif /* __PERF_EXEC_CMD_H */
diff --git a/src/tools/perf/util/generate-cmdlist.sh b/src/tools/perf/util/generate-cmdlist.sh
deleted file mode 100755
index 3ac3803..0000000
--- a/src/tools/perf/util/generate-cmdlist.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/sh
-
-echo "/* Automatically generated by $0 */
-struct cmdname_help
-{
-    char name[16];
-    char help[80];
-};
-
-static struct cmdname_help common_cmds[] = {"
-
-sed -n -e 's/^perf-\([^ 	]*\)[ 	].* common.*/\1/p' command-list.txt |
-sort |
-while read cmd
-do
-     sed -n '
-     /^NAME/,/perf-'"$cmd"'/H
-     ${
-            x
-            s/.*perf-'"$cmd"' - \(.*\)/  {"'"$cmd"'", "\1"},/
-	    p
-     }' "Documentation/perf-$cmd.txt"
-done
-
-echo "#ifdef LIBELF_SUPPORT"
-sed -n -e 's/^perf-\([^ 	]*\)[ 	].* full.*/\1/p' command-list.txt |
-sort |
-while read cmd
-do
-     sed -n '
-     /^NAME/,/perf-'"$cmd"'/H
-     ${
-            x
-            s/.*perf-'"$cmd"' - \(.*\)/  {"'"$cmd"'", "\1"},/
-	    p
-     }' "Documentation/perf-$cmd.txt"
-done
-echo "#endif /* LIBELF_SUPPORT */"
-echo "};"
diff --git a/src/tools/perf/util/header.c b/src/tools/perf/util/header.c
deleted file mode 100644
index c3e5a3b..0000000
--- a/src/tools/perf/util/header.c
+++ /dev/null
@@ -1,3068 +0,0 @@
-#include "util.h"
-#include <sys/types.h>
-#include <byteswap.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <linux/list.h>
-#include <linux/kernel.h>
-#include <linux/bitops.h>
-#include <sys/utsname.h>
-
-#include "evlist.h"
-#include "evsel.h"
-#include "header.h"
-#include "../perf.h"
-#include "trace-event.h"
-#include "session.h"
-#include "symbol.h"
-#include "debug.h"
-#include "cpumap.h"
-#include "pmu.h"
-#include "vdso.h"
-#include "strbuf.h"
-#include "build-id.h"
-
-static bool no_buildid_cache = false;
-
-static u32 header_argc;
-static const char **header_argv;
-
-/*
- * magic2 = "PERFILE2"
- * must be a numerical value to let the endianness
- * determine the memory layout. That way we are able
- * to detect endianness when reading the perf.data file
- * back.
- *
- * we check for legacy (PERFFILE) format.
- */
-static const char *__perf_magic1 = "PERFFILE";
-static const u64 __perf_magic2    = 0x32454c4946524550ULL;
-static const u64 __perf_magic2_sw = 0x50455246494c4532ULL;
-
-#define PERF_MAGIC	__perf_magic2
-
-struct perf_file_attr {
-	struct perf_event_attr	attr;
-	struct perf_file_section	ids;
-};
-
-void perf_header__set_feat(struct perf_header *header, int feat)
-{
-	set_bit(feat, header->adds_features);
-}
-
-void perf_header__clear_feat(struct perf_header *header, int feat)
-{
-	clear_bit(feat, header->adds_features);
-}
-
-bool perf_header__has_feat(const struct perf_header *header, int feat)
-{
-	return test_bit(feat, header->adds_features);
-}
-
-static int do_write(int fd, const void *buf, size_t size)
-{
-	while (size) {
-		int ret = write(fd, buf, size);
-
-		if (ret < 0)
-			return -errno;
-
-		size -= ret;
-		buf += ret;
-	}
-
-	return 0;
-}
-
-#define NAME_ALIGN 64
-
-static int write_padded(int fd, const void *bf, size_t count,
-			size_t count_aligned)
-{
-	static const char zero_buf[NAME_ALIGN];
-	int err = do_write(fd, bf, count);
-
-	if (!err)
-		err = do_write(fd, zero_buf, count_aligned - count);
-
-	return err;
-}
-
-static int do_write_string(int fd, const char *str)
-{
-	u32 len, olen;
-	int ret;
-
-	olen = strlen(str) + 1;
-	len = PERF_ALIGN(olen, NAME_ALIGN);
-
-	/* write len, incl. \0 */
-	ret = do_write(fd, &len, sizeof(len));
-	if (ret < 0)
-		return ret;
-
-	return write_padded(fd, str, olen, len);
-}
-
-static char *do_read_string(int fd, struct perf_header *ph)
-{
-	ssize_t sz, ret;
-	u32 len;
-	char *buf;
-
-	sz = readn(fd, &len, sizeof(len));
-	if (sz < (ssize_t)sizeof(len))
-		return NULL;
-
-	if (ph->needs_swap)
-		len = bswap_32(len);
-
-	buf = malloc(len);
-	if (!buf)
-		return NULL;
-
-	ret = readn(fd, buf, len);
-	if (ret == (ssize_t)len) {
-		/*
-		 * strings are padded by zeroes
-		 * thus the actual strlen of buf
-		 * may be less than len
-		 */
-		return buf;
-	}
-
-	free(buf);
-	return NULL;
-}
-
-int
-perf_header__set_cmdline(int argc, const char **argv)
-{
-	int i;
-
-	/*
-	 * If header_argv has already been set, do not override it.
-	 * This allows a command to set the cmdline, parse args and
-	 * then call another builtin function that implements a
-	 * command -- e.g, cmd_kvm calling cmd_record.
-	 */
-	if (header_argv)
-		return 0;
-
-	header_argc = (u32)argc;
-
-	/* do not include NULL termination */
-	header_argv = calloc(argc, sizeof(char *));
-	if (!header_argv)
-		return -ENOMEM;
-
-	/*
-	 * must copy argv contents because it gets moved
-	 * around during option parsing
-	 */
-	for (i = 0; i < argc ; i++)
-		header_argv[i] = argv[i];
-
-	return 0;
-}
-
-#define dsos__for_each_with_build_id(pos, head)	\
-	list_for_each_entry(pos, head, node)	\
-		if (!pos->has_build_id)		\
-			continue;		\
-		else
-
-static int write_buildid(char *name, size_t name_len, u8 *build_id,
-			 pid_t pid, u16 misc, int fd)
-{
-	int err;
-	struct build_id_event b;
-	size_t len;
-
-	len = name_len + 1;
-	len = PERF_ALIGN(len, NAME_ALIGN);
-
-	memset(&b, 0, sizeof(b));
-	memcpy(&b.build_id, build_id, BUILD_ID_SIZE);
-	b.pid = pid;
-	b.header.misc = misc;
-	b.header.size = sizeof(b) + len;
-
-	err = do_write(fd, &b, sizeof(b));
-	if (err < 0)
-		return err;
-
-	return write_padded(fd, name, name_len + 1, len);
-}
-
-static int __dsos__write_buildid_table(struct list_head *head,
-				       struct machine *machine,
-				       pid_t pid, u16 misc, int fd)
-{
-	char nm[PATH_MAX];
-	struct dso *pos;
-
-	dsos__for_each_with_build_id(pos, head) {
-		int err;
-		char  *name;
-		size_t name_len;
-
-		if (!pos->hit)
-			continue;
-
-		if (is_vdso_map(pos->short_name)) {
-			name = (char *) VDSO__MAP_NAME;
-			name_len = sizeof(VDSO__MAP_NAME) + 1;
-		} else if (dso__is_kcore(pos)) {
-			machine__mmap_name(machine, nm, sizeof(nm));
-			name = nm;
-			name_len = strlen(nm) + 1;
-		} else {
-			name = pos->long_name;
-			name_len = pos->long_name_len + 1;
-		}
-
-		err = write_buildid(name, name_len, pos->build_id,
-				    pid, misc, fd);
-		if (err)
-			return err;
-	}
-
-	return 0;
-}
-
-static int machine__write_buildid_table(struct machine *machine, int fd)
-{
-	int err;
-	u16 kmisc = PERF_RECORD_MISC_KERNEL,
-	    umisc = PERF_RECORD_MISC_USER;
-
-	if (!machine__is_host(machine)) {
-		kmisc = PERF_RECORD_MISC_GUEST_KERNEL;
-		umisc = PERF_RECORD_MISC_GUEST_USER;
-	}
-
-	err = __dsos__write_buildid_table(&machine->kernel_dsos, machine,
-					  machine->pid, kmisc, fd);
-	if (err == 0)
-		err = __dsos__write_buildid_table(&machine->user_dsos, machine,
-						  machine->pid, umisc, fd);
-	return err;
-}
-
-static int dsos__write_buildid_table(struct perf_header *header, int fd)
-{
-	struct perf_session *session = container_of(header,
-			struct perf_session, header);
-	struct rb_node *nd;
-	int err = machine__write_buildid_table(&session->machines.host, fd);
-
-	if (err)
-		return err;
-
-	for (nd = rb_first(&session->machines.guests); nd; nd = rb_next(nd)) {
-		struct machine *pos = rb_entry(nd, struct machine, rb_node);
-		err = machine__write_buildid_table(pos, fd);
-		if (err)
-			break;
-	}
-	return err;
-}
-
-int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,
-			  const char *name, bool is_kallsyms, bool is_vdso)
-{
-	const size_t size = PATH_MAX;
-	char *realname, *filename = zalloc(size),
-	     *linkname = zalloc(size), *targetname;
-	int len, err = -1;
-	bool slash = is_kallsyms || is_vdso;
-
-	if (is_kallsyms) {
-		if (symbol_conf.kptr_restrict) {
-			pr_debug("Not caching a kptr_restrict'ed /proc/kallsyms\n");
-			err = 0;
-			goto out_free;
-		}
-		realname = (char *) name;
-	} else
-		realname = realpath(name, NULL);
-
-	if (realname == NULL || filename == NULL || linkname == NULL)
-		goto out_free;
-
-	len = scnprintf(filename, size, "%s%s%s",
-		       debugdir, slash ? "/" : "",
-		       is_vdso ? VDSO__MAP_NAME : realname);
-	if (mkdir_p(filename, 0755))
-		goto out_free;
-
-	snprintf(filename + len, size - len, "/%s", sbuild_id);
-
-	if (access(filename, F_OK)) {
-		if (is_kallsyms) {
-			 if (copyfile("/proc/kallsyms", filename))
-				goto out_free;
-		} else if (link(realname, filename) && copyfile(name, filename))
-			goto out_free;
-	}
-
-	len = scnprintf(linkname, size, "%s/.build-id/%.2s",
-		       debugdir, sbuild_id);
-
-	if (access(linkname, X_OK) && mkdir_p(linkname, 0755))
-		goto out_free;
-
-	snprintf(linkname + len, size - len, "/%s", sbuild_id + 2);
-	targetname = filename + strlen(debugdir) - 5;
-	memcpy(targetname, "../..", 5);
-
-	if (symlink(targetname, linkname) == 0)
-		err = 0;
-out_free:
-	if (!is_kallsyms)
-		free(realname);
-	free(filename);
-	free(linkname);
-	return err;
-}
-
-static int build_id_cache__add_b(const u8 *build_id, size_t build_id_size,
-				 const char *name, const char *debugdir,
-				 bool is_kallsyms, bool is_vdso)
-{
-	char sbuild_id[BUILD_ID_SIZE * 2 + 1];
-
-	build_id__sprintf(build_id, build_id_size, sbuild_id);
-
-	return build_id_cache__add_s(sbuild_id, debugdir, name,
-				     is_kallsyms, is_vdso);
-}
-
-int build_id_cache__remove_s(const char *sbuild_id, const char *debugdir)
-{
-	const size_t size = PATH_MAX;
-	char *filename = zalloc(size),
-	     *linkname = zalloc(size);
-	int err = -1;
-
-	if (filename == NULL || linkname == NULL)
-		goto out_free;
-
-	snprintf(linkname, size, "%s/.build-id/%.2s/%s",
-		 debugdir, sbuild_id, sbuild_id + 2);
-
-	if (access(linkname, F_OK))
-		goto out_free;
-
-	if (readlink(linkname, filename, size - 1) < 0)
-		goto out_free;
-
-	if (unlink(linkname))
-		goto out_free;
-
-	/*
-	 * Since the link is relative, we must make it absolute:
-	 */
-	snprintf(linkname, size, "%s/.build-id/%.2s/%s",
-		 debugdir, sbuild_id, filename);
-
-	if (unlink(linkname))
-		goto out_free;
-
-	err = 0;
-out_free:
-	free(filename);
-	free(linkname);
-	return err;
-}
-
-static int dso__cache_build_id(struct dso *dso, struct machine *machine,
-			       const char *debugdir)
-{
-	bool is_kallsyms = dso->kernel && dso->long_name[0] != '/';
-	bool is_vdso = is_vdso_map(dso->short_name);
-	char *name = dso->long_name;
-	char nm[PATH_MAX];
-
-	if (dso__is_kcore(dso)) {
-		is_kallsyms = true;
-		machine__mmap_name(machine, nm, sizeof(nm));
-		name = nm;
-	}
-	return build_id_cache__add_b(dso->build_id, sizeof(dso->build_id), name,
-				     debugdir, is_kallsyms, is_vdso);
-}
-
-static int __dsos__cache_build_ids(struct list_head *head,
-				   struct machine *machine, const char *debugdir)
-{
-	struct dso *pos;
-	int err = 0;
-
-	dsos__for_each_with_build_id(pos, head)
-		if (dso__cache_build_id(pos, machine, debugdir))
-			err = -1;
-
-	return err;
-}
-
-static int machine__cache_build_ids(struct machine *machine, const char *debugdir)
-{
-	int ret = __dsos__cache_build_ids(&machine->kernel_dsos, machine,
-					  debugdir);
-	ret |= __dsos__cache_build_ids(&machine->user_dsos, machine, debugdir);
-	return ret;
-}
-
-static int perf_session__cache_build_ids(struct perf_session *session)
-{
-	struct rb_node *nd;
-	int ret;
-	char debugdir[PATH_MAX];
-
-	snprintf(debugdir, sizeof(debugdir), "%s", buildid_dir);
-
-	if (mkdir(debugdir, 0755) != 0 && errno != EEXIST)
-		return -1;
-
-	ret = machine__cache_build_ids(&session->machines.host, debugdir);
-
-	for (nd = rb_first(&session->machines.guests); nd; nd = rb_next(nd)) {
-		struct machine *pos = rb_entry(nd, struct machine, rb_node);
-		ret |= machine__cache_build_ids(pos, debugdir);
-	}
-	return ret ? -1 : 0;
-}
-
-static bool machine__read_build_ids(struct machine *machine, bool with_hits)
-{
-	bool ret = __dsos__read_build_ids(&machine->kernel_dsos, with_hits);
-	ret |= __dsos__read_build_ids(&machine->user_dsos, with_hits);
-	return ret;
-}
-
-static bool perf_session__read_build_ids(struct perf_session *session, bool with_hits)
-{
-	struct rb_node *nd;
-	bool ret = machine__read_build_ids(&session->machines.host, with_hits);
-
-	for (nd = rb_first(&session->machines.guests); nd; nd = rb_next(nd)) {
-		struct machine *pos = rb_entry(nd, struct machine, rb_node);
-		ret |= machine__read_build_ids(pos, with_hits);
-	}
-
-	return ret;
-}
-
-static int write_tracing_data(int fd, struct perf_header *h __maybe_unused,
-			    struct perf_evlist *evlist)
-{
-	return read_tracing_data(fd, &evlist->entries);
-}
-
-
-static int write_build_id(int fd, struct perf_header *h,
-			  struct perf_evlist *evlist __maybe_unused)
-{
-	struct perf_session *session;
-	int err;
-
-	session = container_of(h, struct perf_session, header);
-
-	if (!perf_session__read_build_ids(session, true))
-		return -1;
-
-	err = dsos__write_buildid_table(h, fd);
-	if (err < 0) {
-		pr_debug("failed to write buildid table\n");
-		return err;
-	}
-	if (!no_buildid_cache)
-		perf_session__cache_build_ids(session);
-
-	return 0;
-}
-
-static int write_hostname(int fd, struct perf_header *h __maybe_unused,
-			  struct perf_evlist *evlist __maybe_unused)
-{
-	struct utsname uts;
-	int ret;
-
-	ret = uname(&uts);
-	if (ret < 0)
-		return -1;
-
-	return do_write_string(fd, uts.nodename);
-}
-
-static int write_osrelease(int fd, struct perf_header *h __maybe_unused,
-			   struct perf_evlist *evlist __maybe_unused)
-{
-	struct utsname uts;
-	int ret;
-
-	ret = uname(&uts);
-	if (ret < 0)
-		return -1;
-
-	return do_write_string(fd, uts.release);
-}
-
-static int write_arch(int fd, struct perf_header *h __maybe_unused,
-		      struct perf_evlist *evlist __maybe_unused)
-{
-	struct utsname uts;
-	int ret;
-
-	ret = uname(&uts);
-	if (ret < 0)
-		return -1;
-
-	return do_write_string(fd, uts.machine);
-}
-
-static int write_version(int fd, struct perf_header *h __maybe_unused,
-			 struct perf_evlist *evlist __maybe_unused)
-{
-	return do_write_string(fd, perf_version_string);
-}
-
-static int write_cpudesc(int fd, struct perf_header *h __maybe_unused,
-		       struct perf_evlist *evlist __maybe_unused)
-{
-#ifndef CPUINFO_PROC
-#define CPUINFO_PROC NULL
-#endif
-	FILE *file;
-	char *buf = NULL;
-	char *s, *p;
-	const char *search = CPUINFO_PROC;
-	size_t len = 0;
-	int ret = -1;
-
-	if (!search)
-		return -1;
-
-	file = fopen("/proc/cpuinfo", "r");
-	if (!file)
-		return -1;
-
-	while (getline(&buf, &len, file) > 0) {
-		ret = strncmp(buf, search, strlen(search));
-		if (!ret)
-			break;
-	}
-
-	if (ret)
-		goto done;
-
-	s = buf;
-
-	p = strchr(buf, ':');
-	if (p && *(p+1) == ' ' && *(p+2))
-		s = p + 2;
-	p = strchr(s, '\n');
-	if (p)
-		*p = '\0';
-
-	/* squash extra space characters (branding string) */
-	p = s;
-	while (*p) {
-		if (isspace(*p)) {
-			char *r = p + 1;
-			char *q = r;
-			*p = ' ';
-			while (*q && isspace(*q))
-				q++;
-			if (q != (p+1))
-				while ((*r++ = *q++));
-		}
-		p++;
-	}
-	ret = do_write_string(fd, s);
-done:
-	free(buf);
-	fclose(file);
-	return ret;
-}
-
-static int write_nrcpus(int fd, struct perf_header *h __maybe_unused,
-			struct perf_evlist *evlist __maybe_unused)
-{
-	long nr;
-	u32 nrc, nra;
-	int ret;
-
-	nr = sysconf(_SC_NPROCESSORS_CONF);
-	if (nr < 0)
-		return -1;
-
-	nrc = (u32)(nr & UINT_MAX);
-
-	nr = sysconf(_SC_NPROCESSORS_ONLN);
-	if (nr < 0)
-		return -1;
-
-	nra = (u32)(nr & UINT_MAX);
-
-	ret = do_write(fd, &nrc, sizeof(nrc));
-	if (ret < 0)
-		return ret;
-
-	return do_write(fd, &nra, sizeof(nra));
-}
-
-static int write_event_desc(int fd, struct perf_header *h __maybe_unused,
-			    struct perf_evlist *evlist)
-{
-	struct perf_evsel *evsel;
-	u32 nre, nri, sz;
-	int ret;
-
-	nre = evlist->nr_entries;
-
-	/*
-	 * write number of events
-	 */
-	ret = do_write(fd, &nre, sizeof(nre));
-	if (ret < 0)
-		return ret;
-
-	/*
-	 * size of perf_event_attr struct
-	 */
-	sz = (u32)sizeof(evsel->attr);
-	ret = do_write(fd, &sz, sizeof(sz));
-	if (ret < 0)
-		return ret;
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-
-		ret = do_write(fd, &evsel->attr, sz);
-		if (ret < 0)
-			return ret;
-		/*
-		 * write number of unique id per event
-		 * there is one id per instance of an event
-		 *
-		 * copy into an nri to be independent of the
-		 * type of ids,
-		 */
-		nri = evsel->ids;
-		ret = do_write(fd, &nri, sizeof(nri));
-		if (ret < 0)
-			return ret;
-
-		/*
-		 * write event string as passed on cmdline
-		 */
-		ret = do_write_string(fd, perf_evsel__name(evsel));
-		if (ret < 0)
-			return ret;
-		/*
-		 * write unique ids for this event
-		 */
-		ret = do_write(fd, evsel->id, evsel->ids * sizeof(u64));
-		if (ret < 0)
-			return ret;
-	}
-	return 0;
-}
-
-static int write_cmdline(int fd, struct perf_header *h __maybe_unused,
-			 struct perf_evlist *evlist __maybe_unused)
-{
-	char buf[MAXPATHLEN];
-	char proc[32];
-	u32 i, n;
-	int ret;
-
-	/*
-	 * actual atual path to perf binary
-	 */
-	sprintf(proc, "/proc/%d/exe", getpid());
-	ret = readlink(proc, buf, sizeof(buf));
-	if (ret <= 0)
-		return -1;
-
-	/* readlink() does not add null termination */
-	buf[ret] = '\0';
-
-	/* account for binary path */
-	n = header_argc + 1;
-
-	ret = do_write(fd, &n, sizeof(n));
-	if (ret < 0)
-		return ret;
-
-	ret = do_write_string(fd, buf);
-	if (ret < 0)
-		return ret;
-
-	for (i = 0 ; i < header_argc; i++) {
-		ret = do_write_string(fd, header_argv[i]);
-		if (ret < 0)
-			return ret;
-	}
-	return 0;
-}
-
-#define CORE_SIB_FMT \
-	"/sys/devices/system/cpu/cpu%d/topology/core_siblings_list"
-#define THRD_SIB_FMT \
-	"/sys/devices/system/cpu/cpu%d/topology/thread_siblings_list"
-
-struct cpu_topo {
-	u32 core_sib;
-	u32 thread_sib;
-	char **core_siblings;
-	char **thread_siblings;
-};
-
-static int build_cpu_topo(struct cpu_topo *tp, int cpu)
-{
-	FILE *fp;
-	char filename[MAXPATHLEN];
-	char *buf = NULL, *p;
-	size_t len = 0;
-	ssize_t sret;
-	u32 i = 0;
-	int ret = -1;
-
-	sprintf(filename, CORE_SIB_FMT, cpu);
-	fp = fopen(filename, "r");
-	if (!fp)
-		goto try_threads;
-
-	sret = getline(&buf, &len, fp);
-	fclose(fp);
-	if (sret <= 0)
-		goto try_threads;
-
-	p = strchr(buf, '\n');
-	if (p)
-		*p = '\0';
-
-	for (i = 0; i < tp->core_sib; i++) {
-		if (!strcmp(buf, tp->core_siblings[i]))
-			break;
-	}
-	if (i == tp->core_sib) {
-		tp->core_siblings[i] = buf;
-		tp->core_sib++;
-		buf = NULL;
-		len = 0;
-	}
-	ret = 0;
-
-try_threads:
-	sprintf(filename, THRD_SIB_FMT, cpu);
-	fp = fopen(filename, "r");
-	if (!fp)
-		goto done;
-
-	if (getline(&buf, &len, fp) <= 0)
-		goto done;
-
-	p = strchr(buf, '\n');
-	if (p)
-		*p = '\0';
-
-	for (i = 0; i < tp->thread_sib; i++) {
-		if (!strcmp(buf, tp->thread_siblings[i]))
-			break;
-	}
-	if (i == tp->thread_sib) {
-		tp->thread_siblings[i] = buf;
-		tp->thread_sib++;
-		buf = NULL;
-	}
-	ret = 0;
-done:
-	if(fp)
-		fclose(fp);
-	free(buf);
-	return ret;
-}
-
-static void free_cpu_topo(struct cpu_topo *tp)
-{
-	u32 i;
-
-	if (!tp)
-		return;
-
-	for (i = 0 ; i < tp->core_sib; i++)
-		free(tp->core_siblings[i]);
-
-	for (i = 0 ; i < tp->thread_sib; i++)
-		free(tp->thread_siblings[i]);
-
-	free(tp);
-}
-
-static struct cpu_topo *build_cpu_topology(void)
-{
-	struct cpu_topo *tp;
-	void *addr;
-	u32 nr, i;
-	size_t sz;
-	long ncpus;
-	int ret = -1;
-
-	ncpus = sysconf(_SC_NPROCESSORS_CONF);
-	if (ncpus < 0)
-		return NULL;
-
-	nr = (u32)(ncpus & UINT_MAX);
-
-	sz = nr * sizeof(char *);
-
-	addr = calloc(1, sizeof(*tp) + 2 * sz);
-	if (!addr)
-		return NULL;
-
-	tp = addr;
-
-	addr += sizeof(*tp);
-	tp->core_siblings = addr;
-	addr += sz;
-	tp->thread_siblings = addr;
-
-	for (i = 0; i < nr; i++) {
-		ret = build_cpu_topo(tp, i);
-		if (ret < 0)
-			break;
-	}
-	if (ret) {
-		free_cpu_topo(tp);
-		tp = NULL;
-	}
-	return tp;
-}
-
-static int write_cpu_topology(int fd, struct perf_header *h __maybe_unused,
-			  struct perf_evlist *evlist __maybe_unused)
-{
-	struct cpu_topo *tp;
-	u32 i;
-	int ret;
-
-	tp = build_cpu_topology();
-	if (!tp)
-		return -1;
-
-	ret = do_write(fd, &tp->core_sib, sizeof(tp->core_sib));
-	if (ret < 0)
-		goto done;
-
-	for (i = 0; i < tp->core_sib; i++) {
-		ret = do_write_string(fd, tp->core_siblings[i]);
-		if (ret < 0)
-			goto done;
-	}
-	ret = do_write(fd, &tp->thread_sib, sizeof(tp->thread_sib));
-	if (ret < 0)
-		goto done;
-
-	for (i = 0; i < tp->thread_sib; i++) {
-		ret = do_write_string(fd, tp->thread_siblings[i]);
-		if (ret < 0)
-			break;
-	}
-done:
-	free_cpu_topo(tp);
-	return ret;
-}
-
-
-
-static int write_total_mem(int fd, struct perf_header *h __maybe_unused,
-			  struct perf_evlist *evlist __maybe_unused)
-{
-	char *buf = NULL;
-	FILE *fp;
-	size_t len = 0;
-	int ret = -1, n;
-	uint64_t mem;
-
-	fp = fopen("/proc/meminfo", "r");
-	if (!fp)
-		return -1;
-
-	while (getline(&buf, &len, fp) > 0) {
-		ret = strncmp(buf, "MemTotal:", 9);
-		if (!ret)
-			break;
-	}
-	if (!ret) {
-		n = sscanf(buf, "%*s %"PRIu64, &mem);
-		if (n == 1)
-			ret = do_write(fd, &mem, sizeof(mem));
-	}
-	free(buf);
-	fclose(fp);
-	return ret;
-}
-
-static int write_topo_node(int fd, int node)
-{
-	char str[MAXPATHLEN];
-	char field[32];
-	char *buf = NULL, *p;
-	size_t len = 0;
-	FILE *fp;
-	u64 mem_total, mem_free, mem;
-	int ret = -1;
-
-	sprintf(str, "/sys/devices/system/node/node%d/meminfo", node);
-	fp = fopen(str, "r");
-	if (!fp)
-		return -1;
-
-	while (getline(&buf, &len, fp) > 0) {
-		/* skip over invalid lines */
-		if (!strchr(buf, ':'))
-			continue;
-		if (sscanf(buf, "%*s %*d %s %"PRIu64, field, &mem) != 2)
-			goto done;
-		if (!strcmp(field, "MemTotal:"))
-			mem_total = mem;
-		if (!strcmp(field, "MemFree:"))
-			mem_free = mem;
-	}
-
-	fclose(fp);
-	fp = NULL;
-
-	ret = do_write(fd, &mem_total, sizeof(u64));
-	if (ret)
-		goto done;
-
-	ret = do_write(fd, &mem_free, sizeof(u64));
-	if (ret)
-		goto done;
-
-	ret = -1;
-	sprintf(str, "/sys/devices/system/node/node%d/cpulist", node);
-
-	fp = fopen(str, "r");
-	if (!fp)
-		goto done;
-
-	if (getline(&buf, &len, fp) <= 0)
-		goto done;
-
-	p = strchr(buf, '\n');
-	if (p)
-		*p = '\0';
-
-	ret = do_write_string(fd, buf);
-done:
-	free(buf);
-	if (fp)
-		fclose(fp);
-	return ret;
-}
-
-static int write_numa_topology(int fd, struct perf_header *h __maybe_unused,
-			  struct perf_evlist *evlist __maybe_unused)
-{
-	char *buf = NULL;
-	size_t len = 0;
-	FILE *fp;
-	struct cpu_map *node_map = NULL;
-	char *c;
-	u32 nr, i, j;
-	int ret = -1;
-
-	fp = fopen("/sys/devices/system/node/online", "r");
-	if (!fp)
-		return -1;
-
-	if (getline(&buf, &len, fp) <= 0)
-		goto done;
-
-	c = strchr(buf, '\n');
-	if (c)
-		*c = '\0';
-
-	node_map = cpu_map__new(buf);
-	if (!node_map)
-		goto done;
-
-	nr = (u32)node_map->nr;
-
-	ret = do_write(fd, &nr, sizeof(nr));
-	if (ret < 0)
-		goto done;
-
-	for (i = 0; i < nr; i++) {
-		j = (u32)node_map->map[i];
-		ret = do_write(fd, &j, sizeof(j));
-		if (ret < 0)
-			break;
-
-		ret = write_topo_node(fd, i);
-		if (ret < 0)
-			break;
-	}
-done:
-	free(buf);
-	fclose(fp);
-	free(node_map);
-	return ret;
-}
-
-/*
- * File format:
- *
- * struct pmu_mappings {
- *	u32	pmu_num;
- *	struct pmu_map {
- *		u32	type;
- *		char	name[];
- *	}[pmu_num];
- * };
- */
-
-static int write_pmu_mappings(int fd, struct perf_header *h __maybe_unused,
-			      struct perf_evlist *evlist __maybe_unused)
-{
-	struct perf_pmu *pmu = NULL;
-	off_t offset = lseek(fd, 0, SEEK_CUR);
-	__u32 pmu_num = 0;
-	int ret;
-
-	/* write real pmu_num later */
-	ret = do_write(fd, &pmu_num, sizeof(pmu_num));
-	if (ret < 0)
-		return ret;
-
-	while ((pmu = perf_pmu__scan(pmu))) {
-		if (!pmu->name)
-			continue;
-		pmu_num++;
-
-		ret = do_write(fd, &pmu->type, sizeof(pmu->type));
-		if (ret < 0)
-			return ret;
-
-		ret = do_write_string(fd, pmu->name);
-		if (ret < 0)
-			return ret;
-	}
-
-	if (pwrite(fd, &pmu_num, sizeof(pmu_num), offset) != sizeof(pmu_num)) {
-		/* discard all */
-		lseek(fd, offset, SEEK_SET);
-		return -1;
-	}
-
-	return 0;
-}
-
-/*
- * File format:
- *
- * struct group_descs {
- *	u32	nr_groups;
- *	struct group_desc {
- *		char	name[];
- *		u32	leader_idx;
- *		u32	nr_members;
- *	}[nr_groups];
- * };
- */
-static int write_group_desc(int fd, struct perf_header *h __maybe_unused,
-			    struct perf_evlist *evlist)
-{
-	u32 nr_groups = evlist->nr_groups;
-	struct perf_evsel *evsel;
-	int ret;
-
-	ret = do_write(fd, &nr_groups, sizeof(nr_groups));
-	if (ret < 0)
-		return ret;
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		if (perf_evsel__is_group_leader(evsel) &&
-		    evsel->nr_members > 1) {
-			const char *name = evsel->group_name ?: "{anon_group}";
-			u32 leader_idx = evsel->idx;
-			u32 nr_members = evsel->nr_members;
-
-			ret = do_write_string(fd, name);
-			if (ret < 0)
-				return ret;
-
-			ret = do_write(fd, &leader_idx, sizeof(leader_idx));
-			if (ret < 0)
-				return ret;
-
-			ret = do_write(fd, &nr_members, sizeof(nr_members));
-			if (ret < 0)
-				return ret;
-		}
-	}
-	return 0;
-}
-
-/*
- * default get_cpuid(): nothing gets recorded
- * actual implementation must be in arch/$(ARCH)/util/header.c
- */
-int __attribute__ ((weak)) get_cpuid(char *buffer __maybe_unused,
-				     size_t sz __maybe_unused)
-{
-	return -1;
-}
-
-static int write_cpuid(int fd, struct perf_header *h __maybe_unused,
-		       struct perf_evlist *evlist __maybe_unused)
-{
-	char buffer[64];
-	int ret;
-
-	ret = get_cpuid(buffer, sizeof(buffer));
-	if (!ret)
-		goto write_it;
-
-	return -1;
-write_it:
-	return do_write_string(fd, buffer);
-}
-
-static int write_branch_stack(int fd __maybe_unused,
-			      struct perf_header *h __maybe_unused,
-		       struct perf_evlist *evlist __maybe_unused)
-{
-	return 0;
-}
-
-static void print_hostname(struct perf_header *ph, int fd __maybe_unused,
-			   FILE *fp)
-{
-	fprintf(fp, "# hostname : %s\n", ph->env.hostname);
-}
-
-static void print_osrelease(struct perf_header *ph, int fd __maybe_unused,
-			    FILE *fp)
-{
-	fprintf(fp, "# os release : %s\n", ph->env.os_release);
-}
-
-static void print_arch(struct perf_header *ph, int fd __maybe_unused, FILE *fp)
-{
-	fprintf(fp, "# arch : %s\n", ph->env.arch);
-}
-
-static void print_cpudesc(struct perf_header *ph, int fd __maybe_unused,
-			  FILE *fp)
-{
-	fprintf(fp, "# cpudesc : %s\n", ph->env.cpu_desc);
-}
-
-static void print_nrcpus(struct perf_header *ph, int fd __maybe_unused,
-			 FILE *fp)
-{
-	fprintf(fp, "# nrcpus online : %u\n", ph->env.nr_cpus_online);
-	fprintf(fp, "# nrcpus avail : %u\n", ph->env.nr_cpus_avail);
-}
-
-static void print_version(struct perf_header *ph, int fd __maybe_unused,
-			  FILE *fp)
-{
-	fprintf(fp, "# perf version : %s\n", ph->env.version);
-}
-
-static void print_cmdline(struct perf_header *ph, int fd __maybe_unused,
-			  FILE *fp)
-{
-	int nr, i;
-	char *str;
-
-	nr = ph->env.nr_cmdline;
-	str = ph->env.cmdline;
-
-	fprintf(fp, "# cmdline : ");
-
-	for (i = 0; i < nr; i++) {
-		fprintf(fp, "%s ", str);
-		str += strlen(str) + 1;
-	}
-	fputc('\n', fp);
-}
-
-static void print_cpu_topology(struct perf_header *ph, int fd __maybe_unused,
-			       FILE *fp)
-{
-	int nr, i;
-	char *str;
-
-	nr = ph->env.nr_sibling_cores;
-	str = ph->env.sibling_cores;
-
-	for (i = 0; i < nr; i++) {
-		fprintf(fp, "# sibling cores   : %s\n", str);
-		str += strlen(str) + 1;
-	}
-
-	nr = ph->env.nr_sibling_threads;
-	str = ph->env.sibling_threads;
-
-	for (i = 0; i < nr; i++) {
-		fprintf(fp, "# sibling threads : %s\n", str);
-		str += strlen(str) + 1;
-	}
-}
-
-static void free_event_desc(struct perf_evsel *events)
-{
-	struct perf_evsel *evsel;
-
-	if (!events)
-		return;
-
-	for (evsel = events; evsel->attr.size; evsel++) {
-		if (evsel->name)
-			free(evsel->name);
-		if (evsel->id)
-			free(evsel->id);
-	}
-
-	free(events);
-}
-
-static struct perf_evsel *
-read_event_desc(struct perf_header *ph, int fd)
-{
-	struct perf_evsel *evsel, *events = NULL;
-	u64 *id;
-	void *buf = NULL;
-	u32 nre, sz, nr, i, j;
-	ssize_t ret;
-	size_t msz;
-
-	/* number of events */
-	ret = readn(fd, &nre, sizeof(nre));
-	if (ret != (ssize_t)sizeof(nre))
-		goto error;
-
-	if (ph->needs_swap)
-		nre = bswap_32(nre);
-
-	ret = readn(fd, &sz, sizeof(sz));
-	if (ret != (ssize_t)sizeof(sz))
-		goto error;
-
-	if (ph->needs_swap)
-		sz = bswap_32(sz);
-
-	/* buffer to hold on file attr struct */
-	buf = malloc(sz);
-	if (!buf)
-		goto error;
-
-	/* the last event terminates with evsel->attr.size == 0: */
-	events = calloc(nre + 1, sizeof(*events));
-	if (!events)
-		goto error;
-
-	msz = sizeof(evsel->attr);
-	if (sz < msz)
-		msz = sz;
-
-	for (i = 0, evsel = events; i < nre; evsel++, i++) {
-		evsel->idx = i;
-
-		/*
-		 * must read entire on-file attr struct to
-		 * sync up with layout.
-		 */
-		ret = readn(fd, buf, sz);
-		if (ret != (ssize_t)sz)
-			goto error;
-
-		if (ph->needs_swap)
-			perf_event__attr_swap(buf);
-
-		memcpy(&evsel->attr, buf, msz);
-
-		ret = readn(fd, &nr, sizeof(nr));
-		if (ret != (ssize_t)sizeof(nr))
-			goto error;
-
-		if (ph->needs_swap) {
-			nr = bswap_32(nr);
-			evsel->needs_swap = true;
-		}
-
-		evsel->name = do_read_string(fd, ph);
-
-		if (!nr)
-			continue;
-
-		id = calloc(nr, sizeof(*id));
-		if (!id)
-			goto error;
-		evsel->ids = nr;
-		evsel->id = id;
-
-		for (j = 0 ; j < nr; j++) {
-			ret = readn(fd, id, sizeof(*id));
-			if (ret != (ssize_t)sizeof(*id))
-				goto error;
-			if (ph->needs_swap)
-				*id = bswap_64(*id);
-			id++;
-		}
-	}
-out:
-	if (buf)
-		free(buf);
-	return events;
-error:
-	if (events)
-		free_event_desc(events);
-	events = NULL;
-	goto out;
-}
-
-static void print_event_desc(struct perf_header *ph, int fd, FILE *fp)
-{
-	struct perf_evsel *evsel, *events = read_event_desc(ph, fd);
-	u32 j;
-	u64 *id;
-
-	if (!events) {
-		fprintf(fp, "# event desc: not available or unable to read\n");
-		return;
-	}
-
-	for (evsel = events; evsel->attr.size; evsel++) {
-		fprintf(fp, "# event : name = %s, ", evsel->name);
-
-		fprintf(fp, "type = %d, config = 0x%"PRIx64
-			    ", config1 = 0x%"PRIx64", config2 = 0x%"PRIx64,
-				evsel->attr.type,
-				(u64)evsel->attr.config,
-				(u64)evsel->attr.config1,
-				(u64)evsel->attr.config2);
-
-		fprintf(fp, ", excl_usr = %d, excl_kern = %d",
-				evsel->attr.exclude_user,
-				evsel->attr.exclude_kernel);
-
-		fprintf(fp, ", excl_host = %d, excl_guest = %d",
-				evsel->attr.exclude_host,
-				evsel->attr.exclude_guest);
-
-		fprintf(fp, ", precise_ip = %d", evsel->attr.precise_ip);
-
-		fprintf(fp, ", attr_mmap2 = %d", evsel->attr.mmap2);
-		fprintf(fp, ", attr_mmap  = %d", evsel->attr.mmap);
-		fprintf(fp, ", attr_mmap_data = %d", evsel->attr.mmap_data);
-		if (evsel->ids) {
-			fprintf(fp, ", id = {");
-			for (j = 0, id = evsel->id; j < evsel->ids; j++, id++) {
-				if (j)
-					fputc(',', fp);
-				fprintf(fp, " %"PRIu64, *id);
-			}
-			fprintf(fp, " }");
-		}
-
-		fputc('\n', fp);
-	}
-
-	free_event_desc(events);
-}
-
-static void print_total_mem(struct perf_header *ph, int fd __maybe_unused,
-			    FILE *fp)
-{
-	fprintf(fp, "# total memory : %Lu kB\n", ph->env.total_mem);
-}
-
-static void print_numa_topology(struct perf_header *ph, int fd __maybe_unused,
-				FILE *fp)
-{
-	u32 nr, c, i;
-	char *str, *tmp;
-	uint64_t mem_total, mem_free;
-
-	/* nr nodes */
-	nr = ph->env.nr_numa_nodes;
-	str = ph->env.numa_nodes;
-
-	for (i = 0; i < nr; i++) {
-		/* node number */
-		c = strtoul(str, &tmp, 0);
-		if (*tmp != ':')
-			goto error;
-
-		str = tmp + 1;
-		mem_total = strtoull(str, &tmp, 0);
-		if (*tmp != ':')
-			goto error;
-
-		str = tmp + 1;
-		mem_free = strtoull(str, &tmp, 0);
-		if (*tmp != ':')
-			goto error;
-
-		fprintf(fp, "# node%u meminfo  : total = %"PRIu64" kB,"
-			    " free = %"PRIu64" kB\n",
-			c, mem_total, mem_free);
-
-		str = tmp + 1;
-		fprintf(fp, "# node%u cpu list : %s\n", c, str);
-
-		str += strlen(str) + 1;
-	}
-	return;
-error:
-	fprintf(fp, "# numa topology : not available\n");
-}
-
-static void print_cpuid(struct perf_header *ph, int fd __maybe_unused, FILE *fp)
-{
-	fprintf(fp, "# cpuid : %s\n", ph->env.cpuid);
-}
-
-static void print_branch_stack(struct perf_header *ph __maybe_unused,
-			       int fd __maybe_unused, FILE *fp)
-{
-	fprintf(fp, "# contains samples with branch stack\n");
-}
-
-static void print_pmu_mappings(struct perf_header *ph, int fd __maybe_unused,
-			       FILE *fp)
-{
-	const char *delimiter = "# pmu mappings: ";
-	char *str, *tmp;
-	u32 pmu_num;
-	u32 type;
-
-	pmu_num = ph->env.nr_pmu_mappings;
-	if (!pmu_num) {
-		fprintf(fp, "# pmu mappings: not available\n");
-		return;
-	}
-
-	str = ph->env.pmu_mappings;
-
-	while (pmu_num) {
-		type = strtoul(str, &tmp, 0);
-		if (*tmp != ':')
-			goto error;
-
-		str = tmp + 1;
-		fprintf(fp, "%s%s = %" PRIu32, delimiter, str, type);
-
-		delimiter = ", ";
-		str += strlen(str) + 1;
-		pmu_num--;
-	}
-
-	fprintf(fp, "\n");
-
-	if (!pmu_num)
-		return;
-error:
-	fprintf(fp, "# pmu mappings: unable to read\n");
-}
-
-static void print_group_desc(struct perf_header *ph, int fd __maybe_unused,
-			     FILE *fp)
-{
-	struct perf_session *session;
-	struct perf_evsel *evsel;
-	u32 nr = 0;
-
-	session = container_of(ph, struct perf_session, header);
-
-	list_for_each_entry(evsel, &session->evlist->entries, node) {
-		if (perf_evsel__is_group_leader(evsel) &&
-		    evsel->nr_members > 1) {
-			fprintf(fp, "# group: %s{%s", evsel->group_name ?: "",
-				perf_evsel__name(evsel));
-
-			nr = evsel->nr_members - 1;
-		} else if (nr) {
-			fprintf(fp, ",%s", perf_evsel__name(evsel));
-
-			if (--nr == 0)
-				fprintf(fp, "}\n");
-		}
-	}
-}
-
-static int __event_process_build_id(struct build_id_event *bev,
-				    char *filename,
-				    struct perf_session *session)
-{
-	int err = -1;
-	struct list_head *head;
-	struct machine *machine;
-	u16 misc;
-	struct dso *dso;
-	enum dso_kernel_type dso_type;
-
-	machine = perf_session__findnew_machine(session, bev->pid);
-	if (!machine)
-		goto out;
-
-	misc = bev->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
-
-	switch (misc) {
-	case PERF_RECORD_MISC_KERNEL:
-		dso_type = DSO_TYPE_KERNEL;
-		head = &machine->kernel_dsos;
-		break;
-	case PERF_RECORD_MISC_GUEST_KERNEL:
-		dso_type = DSO_TYPE_GUEST_KERNEL;
-		head = &machine->kernel_dsos;
-		break;
-	case PERF_RECORD_MISC_USER:
-	case PERF_RECORD_MISC_GUEST_USER:
-		dso_type = DSO_TYPE_USER;
-		head = &machine->user_dsos;
-		break;
-	default:
-		goto out;
-	}
-
-	dso = __dsos__findnew(head, filename);
-	if (dso != NULL) {
-		char sbuild_id[BUILD_ID_SIZE * 2 + 1];
-
-		dso__set_build_id(dso, &bev->build_id);
-
-		if (filename[0] == '[')
-			dso->kernel = dso_type;
-
-		build_id__sprintf(dso->build_id, sizeof(dso->build_id),
-				  sbuild_id);
-		pr_debug("build id event received for %s: %s\n",
-			 dso->long_name, sbuild_id);
-	}
-
-	err = 0;
-out:
-	return err;
-}
-
-static int perf_header__read_build_ids_abi_quirk(struct perf_header *header,
-						 int input, u64 offset, u64 size)
-{
-	struct perf_session *session = container_of(header, struct perf_session, header);
-	struct {
-		struct perf_event_header   header;
-		u8			   build_id[PERF_ALIGN(BUILD_ID_SIZE, sizeof(u64))];
-		char			   filename[0];
-	} old_bev;
-	struct build_id_event bev;
-	char filename[PATH_MAX];
-	u64 limit = offset + size;
-
-	while (offset < limit) {
-		ssize_t len;
-
-		if (readn(input, &old_bev, sizeof(old_bev)) != sizeof(old_bev))
-			return -1;
-
-		if (header->needs_swap)
-			perf_event_header__bswap(&old_bev.header);
-
-		len = old_bev.header.size - sizeof(old_bev);
-		if (readn(input, filename, len) != len)
-			return -1;
-
-		bev.header = old_bev.header;
-
-		/*
-		 * As the pid is the missing value, we need to fill
-		 * it properly. The header.misc value give us nice hint.
-		 */
-		bev.pid	= HOST_KERNEL_ID;
-		if (bev.header.misc == PERF_RECORD_MISC_GUEST_USER ||
-		    bev.header.misc == PERF_RECORD_MISC_GUEST_KERNEL)
-			bev.pid	= DEFAULT_GUEST_KERNEL_ID;
-
-		memcpy(bev.build_id, old_bev.build_id, sizeof(bev.build_id));
-		__event_process_build_id(&bev, filename, session);
-
-		offset += bev.header.size;
-	}
-
-	return 0;
-}
-
-static int perf_header__read_build_ids(struct perf_header *header,
-				       int input, u64 offset, u64 size)
-{
-	struct perf_session *session = container_of(header, struct perf_session, header);
-	struct build_id_event bev;
-	char filename[PATH_MAX];
-	u64 limit = offset + size, orig_offset = offset;
-	int err = -1;
-
-	while (offset < limit) {
-		ssize_t len;
-
-		if (readn(input, &bev, sizeof(bev)) != sizeof(bev))
-			goto out;
-
-		if (header->needs_swap)
-			perf_event_header__bswap(&bev.header);
-
-		len = bev.header.size - sizeof(bev);
-		if (readn(input, filename, len) != len)
-			goto out;
-		/*
-		 * The a1645ce1 changeset:
-		 *
-		 * "perf: 'perf kvm' tool for monitoring guest performance from host"
-		 *
-		 * Added a field to struct build_id_event that broke the file
-		 * format.
-		 *
-		 * Since the kernel build-id is the first entry, process the
-		 * table using the old format if the well known
-		 * '[kernel.kallsyms]' string for the kernel build-id has the
-		 * first 4 characters chopped off (where the pid_t sits).
-		 */
-		if (memcmp(filename, "nel.kallsyms]", 13) == 0) {
-			if (lseek(input, orig_offset, SEEK_SET) == (off_t)-1)
-				return -1;
-			return perf_header__read_build_ids_abi_quirk(header, input, offset, size);
-		}
-
-		__event_process_build_id(&bev, filename, session);
-
-		offset += bev.header.size;
-	}
-	err = 0;
-out:
-	return err;
-}
-
-static int process_tracing_data(struct perf_file_section *section __maybe_unused,
-				struct perf_header *ph __maybe_unused,
-				int fd, void *data)
-{
-	ssize_t ret = trace_report(fd, data, false);
-	return ret < 0 ? -1 : 0;
-}
-
-static int process_build_id(struct perf_file_section *section,
-			    struct perf_header *ph, int fd,
-			    void *data __maybe_unused)
-{
-	if (perf_header__read_build_ids(ph, fd, section->offset, section->size))
-		pr_debug("Failed to read buildids, continuing...\n");
-	return 0;
-}
-
-static int process_hostname(struct perf_file_section *section __maybe_unused,
-			    struct perf_header *ph, int fd,
-			    void *data __maybe_unused)
-{
-	ph->env.hostname = do_read_string(fd, ph);
-	return ph->env.hostname ? 0 : -ENOMEM;
-}
-
-static int process_osrelease(struct perf_file_section *section __maybe_unused,
-			     struct perf_header *ph, int fd,
-			     void *data __maybe_unused)
-{
-	ph->env.os_release = do_read_string(fd, ph);
-	return ph->env.os_release ? 0 : -ENOMEM;
-}
-
-static int process_version(struct perf_file_section *section __maybe_unused,
-			   struct perf_header *ph, int fd,
-			   void *data __maybe_unused)
-{
-	ph->env.version = do_read_string(fd, ph);
-	return ph->env.version ? 0 : -ENOMEM;
-}
-
-static int process_arch(struct perf_file_section *section __maybe_unused,
-			struct perf_header *ph,	int fd,
-			void *data __maybe_unused)
-{
-	ph->env.arch = do_read_string(fd, ph);
-	return ph->env.arch ? 0 : -ENOMEM;
-}
-
-static int process_nrcpus(struct perf_file_section *section __maybe_unused,
-			  struct perf_header *ph, int fd,
-			  void *data __maybe_unused)
-{
-	size_t ret;
-	u32 nr;
-
-	ret = readn(fd, &nr, sizeof(nr));
-	if (ret != sizeof(nr))
-		return -1;
-
-	if (ph->needs_swap)
-		nr = bswap_32(nr);
-
-	ph->env.nr_cpus_online = nr;
-
-	ret = readn(fd, &nr, sizeof(nr));
-	if (ret != sizeof(nr))
-		return -1;
-
-	if (ph->needs_swap)
-		nr = bswap_32(nr);
-
-	ph->env.nr_cpus_avail = nr;
-	return 0;
-}
-
-static int process_cpudesc(struct perf_file_section *section __maybe_unused,
-			   struct perf_header *ph, int fd,
-			   void *data __maybe_unused)
-{
-	ph->env.cpu_desc = do_read_string(fd, ph);
-	return ph->env.cpu_desc ? 0 : -ENOMEM;
-}
-
-static int process_cpuid(struct perf_file_section *section __maybe_unused,
-			 struct perf_header *ph,  int fd,
-			 void *data __maybe_unused)
-{
-	ph->env.cpuid = do_read_string(fd, ph);
-	return ph->env.cpuid ? 0 : -ENOMEM;
-}
-
-static int process_total_mem(struct perf_file_section *section __maybe_unused,
-			     struct perf_header *ph, int fd,
-			     void *data __maybe_unused)
-{
-	uint64_t mem;
-	size_t ret;
-
-	ret = readn(fd, &mem, sizeof(mem));
-	if (ret != sizeof(mem))
-		return -1;
-
-	if (ph->needs_swap)
-		mem = bswap_64(mem);
-
-	ph->env.total_mem = mem;
-	return 0;
-}
-
-static struct perf_evsel *
-perf_evlist__find_by_index(struct perf_evlist *evlist, int idx)
-{
-	struct perf_evsel *evsel;
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		if (evsel->idx == idx)
-			return evsel;
-	}
-
-	return NULL;
-}
-
-static void
-perf_evlist__set_event_name(struct perf_evlist *evlist,
-			    struct perf_evsel *event)
-{
-	struct perf_evsel *evsel;
-
-	if (!event->name)
-		return;
-
-	evsel = perf_evlist__find_by_index(evlist, event->idx);
-	if (!evsel)
-		return;
-
-	if (evsel->name)
-		return;
-
-	evsel->name = strdup(event->name);
-}
-
-static int
-process_event_desc(struct perf_file_section *section __maybe_unused,
-		   struct perf_header *header, int fd,
-		   void *data __maybe_unused)
-{
-	struct perf_session *session;
-	struct perf_evsel *evsel, *events = read_event_desc(header, fd);
-
-	if (!events)
-		return 0;
-
-	session = container_of(header, struct perf_session, header);
-	for (evsel = events; evsel->attr.size; evsel++)
-		perf_evlist__set_event_name(session->evlist, evsel);
-
-	free_event_desc(events);
-
-	return 0;
-}
-
-static int process_cmdline(struct perf_file_section *section __maybe_unused,
-			   struct perf_header *ph, int fd,
-			   void *data __maybe_unused)
-{
-	size_t ret;
-	char *str;
-	u32 nr, i;
-	struct strbuf sb;
-
-	ret = readn(fd, &nr, sizeof(nr));
-	if (ret != sizeof(nr))
-		return -1;
-
-	if (ph->needs_swap)
-		nr = bswap_32(nr);
-
-	ph->env.nr_cmdline = nr;
-	strbuf_init(&sb, 128);
-
-	for (i = 0; i < nr; i++) {
-		str = do_read_string(fd, ph);
-		if (!str)
-			goto error;
-
-		/* include a NULL character at the end */
-		strbuf_add(&sb, str, strlen(str) + 1);
-		free(str);
-	}
-	ph->env.cmdline = strbuf_detach(&sb, NULL);
-	return 0;
-
-error:
-	strbuf_release(&sb);
-	return -1;
-}
-
-static int process_cpu_topology(struct perf_file_section *section __maybe_unused,
-				struct perf_header *ph, int fd,
-				void *data __maybe_unused)
-{
-	size_t ret;
-	u32 nr, i;
-	char *str;
-	struct strbuf sb;
-
-	ret = readn(fd, &nr, sizeof(nr));
-	if (ret != sizeof(nr))
-		return -1;
-
-	if (ph->needs_swap)
-		nr = bswap_32(nr);
-
-	ph->env.nr_sibling_cores = nr;
-	strbuf_init(&sb, 128);
-
-	for (i = 0; i < nr; i++) {
-		str = do_read_string(fd, ph);
-		if (!str)
-			goto error;
-
-		/* include a NULL character at the end */
-		strbuf_add(&sb, str, strlen(str) + 1);
-		free(str);
-	}
-	ph->env.sibling_cores = strbuf_detach(&sb, NULL);
-
-	ret = readn(fd, &nr, sizeof(nr));
-	if (ret != sizeof(nr))
-		return -1;
-
-	if (ph->needs_swap)
-		nr = bswap_32(nr);
-
-	ph->env.nr_sibling_threads = nr;
-
-	for (i = 0; i < nr; i++) {
-		str = do_read_string(fd, ph);
-		if (!str)
-			goto error;
-
-		/* include a NULL character at the end */
-		strbuf_add(&sb, str, strlen(str) + 1);
-		free(str);
-	}
-	ph->env.sibling_threads = strbuf_detach(&sb, NULL);
-	return 0;
-
-error:
-	strbuf_release(&sb);
-	return -1;
-}
-
-static int process_numa_topology(struct perf_file_section *section __maybe_unused,
-				 struct perf_header *ph, int fd,
-				 void *data __maybe_unused)
-{
-	size_t ret;
-	u32 nr, node, i;
-	char *str;
-	uint64_t mem_total, mem_free;
-	struct strbuf sb;
-
-	/* nr nodes */
-	ret = readn(fd, &nr, sizeof(nr));
-	if (ret != sizeof(nr))
-		goto error;
-
-	if (ph->needs_swap)
-		nr = bswap_32(nr);
-
-	ph->env.nr_numa_nodes = nr;
-	strbuf_init(&sb, 256);
-
-	for (i = 0; i < nr; i++) {
-		/* node number */
-		ret = readn(fd, &node, sizeof(node));
-		if (ret != sizeof(node))
-			goto error;
-
-		ret = readn(fd, &mem_total, sizeof(u64));
-		if (ret != sizeof(u64))
-			goto error;
-
-		ret = readn(fd, &mem_free, sizeof(u64));
-		if (ret != sizeof(u64))
-			goto error;
-
-		if (ph->needs_swap) {
-			node = bswap_32(node);
-			mem_total = bswap_64(mem_total);
-			mem_free = bswap_64(mem_free);
-		}
-
-		strbuf_addf(&sb, "%u:%"PRIu64":%"PRIu64":",
-			    node, mem_total, mem_free);
-
-		str = do_read_string(fd, ph);
-		if (!str)
-			goto error;
-
-		/* include a NULL character at the end */
-		strbuf_add(&sb, str, strlen(str) + 1);
-		free(str);
-	}
-	ph->env.numa_nodes = strbuf_detach(&sb, NULL);
-	return 0;
-
-error:
-	strbuf_release(&sb);
-	return -1;
-}
-
-static int process_pmu_mappings(struct perf_file_section *section __maybe_unused,
-				struct perf_header *ph, int fd,
-				void *data __maybe_unused)
-{
-	size_t ret;
-	char *name;
-	u32 pmu_num;
-	u32 type;
-	struct strbuf sb;
-
-	ret = readn(fd, &pmu_num, sizeof(pmu_num));
-	if (ret != sizeof(pmu_num))
-		return -1;
-
-	if (ph->needs_swap)
-		pmu_num = bswap_32(pmu_num);
-
-	if (!pmu_num) {
-		pr_debug("pmu mappings not available\n");
-		return 0;
-	}
-
-	ph->env.nr_pmu_mappings = pmu_num;
-	strbuf_init(&sb, 128);
-
-	while (pmu_num) {
-		if (readn(fd, &type, sizeof(type)) != sizeof(type))
-			goto error;
-		if (ph->needs_swap)
-			type = bswap_32(type);
-
-		name = do_read_string(fd, ph);
-		if (!name)
-			goto error;
-
-		strbuf_addf(&sb, "%u:%s", type, name);
-		/* include a NULL character at the end */
-		strbuf_add(&sb, "", 1);
-
-		free(name);
-		pmu_num--;
-	}
-	ph->env.pmu_mappings = strbuf_detach(&sb, NULL);
-	return 0;
-
-error:
-	strbuf_release(&sb);
-	return -1;
-}
-
-static int process_group_desc(struct perf_file_section *section __maybe_unused,
-			      struct perf_header *ph, int fd,
-			      void *data __maybe_unused)
-{
-	size_t ret = -1;
-	u32 i, nr, nr_groups;
-	struct perf_session *session;
-	struct perf_evsel *evsel, *leader = NULL;
-	struct group_desc {
-		char *name;
-		u32 leader_idx;
-		u32 nr_members;
-	} *desc;
-
-	if (readn(fd, &nr_groups, sizeof(nr_groups)) != sizeof(nr_groups))
-		return -1;
-
-	if (ph->needs_swap)
-		nr_groups = bswap_32(nr_groups);
-
-	ph->env.nr_groups = nr_groups;
-	if (!nr_groups) {
-		pr_debug("group desc not available\n");
-		return 0;
-	}
-
-	desc = calloc(nr_groups, sizeof(*desc));
-	if (!desc)
-		return -1;
-
-	for (i = 0; i < nr_groups; i++) {
-		desc[i].name = do_read_string(fd, ph);
-		if (!desc[i].name)
-			goto out_free;
-
-		if (readn(fd, &desc[i].leader_idx, sizeof(u32)) != sizeof(u32))
-			goto out_free;
-
-		if (readn(fd, &desc[i].nr_members, sizeof(u32)) != sizeof(u32))
-			goto out_free;
-
-		if (ph->needs_swap) {
-			desc[i].leader_idx = bswap_32(desc[i].leader_idx);
-			desc[i].nr_members = bswap_32(desc[i].nr_members);
-		}
-	}
-
-	/*
-	 * Rebuild group relationship based on the group_desc
-	 */
-	session = container_of(ph, struct perf_session, header);
-	session->evlist->nr_groups = nr_groups;
-
-	i = nr = 0;
-	list_for_each_entry(evsel, &session->evlist->entries, node) {
-		if (evsel->idx == (int) desc[i].leader_idx) {
-			evsel->leader = evsel;
-			/* {anon_group} is a dummy name */
-			if (strcmp(desc[i].name, "{anon_group}"))
-				evsel->group_name = desc[i].name;
-			evsel->nr_members = desc[i].nr_members;
-
-			if (i >= nr_groups || nr > 0) {
-				pr_debug("invalid group desc\n");
-				goto out_free;
-			}
-
-			leader = evsel;
-			nr = evsel->nr_members - 1;
-			i++;
-		} else if (nr) {
-			/* This is a group member */
-			evsel->leader = leader;
-
-			nr--;
-		}
-	}
-
-	if (i != nr_groups || nr != 0) {
-		pr_debug("invalid group desc\n");
-		goto out_free;
-	}
-
-	ret = 0;
-out_free:
-	while ((int) --i >= 0)
-		free(desc[i].name);
-	free(desc);
-
-	return ret;
-}
-
-struct feature_ops {
-	int (*write)(int fd, struct perf_header *h, struct perf_evlist *evlist);
-	void (*print)(struct perf_header *h, int fd, FILE *fp);
-	int (*process)(struct perf_file_section *section,
-		       struct perf_header *h, int fd, void *data);
-	const char *name;
-	bool full_only;
-};
-
-#define FEAT_OPA(n, func) \
-	[n] = { .name = #n, .write = write_##func, .print = print_##func }
-#define FEAT_OPP(n, func) \
-	[n] = { .name = #n, .write = write_##func, .print = print_##func, \
-		.process = process_##func }
-#define FEAT_OPF(n, func) \
-	[n] = { .name = #n, .write = write_##func, .print = print_##func, \
-		.process = process_##func, .full_only = true }
-
-/* feature_ops not implemented: */
-#define print_tracing_data	NULL
-#define print_build_id		NULL
-
-static const struct feature_ops feat_ops[HEADER_LAST_FEATURE] = {
-	FEAT_OPP(HEADER_TRACING_DATA,	tracing_data),
-	FEAT_OPP(HEADER_BUILD_ID,	build_id),
-	FEAT_OPP(HEADER_HOSTNAME,	hostname),
-	FEAT_OPP(HEADER_OSRELEASE,	osrelease),
-	FEAT_OPP(HEADER_VERSION,	version),
-	FEAT_OPP(HEADER_ARCH,		arch),
-	FEAT_OPP(HEADER_NRCPUS,		nrcpus),
-	FEAT_OPP(HEADER_CPUDESC,	cpudesc),
-	FEAT_OPP(HEADER_CPUID,		cpuid),
-	FEAT_OPP(HEADER_TOTAL_MEM,	total_mem),
-	FEAT_OPP(HEADER_EVENT_DESC,	event_desc),
-	FEAT_OPP(HEADER_CMDLINE,	cmdline),
-	FEAT_OPF(HEADER_CPU_TOPOLOGY,	cpu_topology),
-	FEAT_OPF(HEADER_NUMA_TOPOLOGY,	numa_topology),
-	FEAT_OPA(HEADER_BRANCH_STACK,	branch_stack),
-	FEAT_OPP(HEADER_PMU_MAPPINGS,	pmu_mappings),
-	FEAT_OPP(HEADER_GROUP_DESC,	group_desc),
-};
-
-struct header_print_data {
-	FILE *fp;
-	bool full; /* extended list of headers */
-};
-
-static int perf_file_section__fprintf_info(struct perf_file_section *section,
-					   struct perf_header *ph,
-					   int feat, int fd, void *data)
-{
-	struct header_print_data *hd = data;
-
-	if (lseek(fd, section->offset, SEEK_SET) == (off_t)-1) {
-		pr_debug("Failed to lseek to %" PRIu64 " offset for feature "
-				"%d, continuing...\n", section->offset, feat);
-		return 0;
-	}
-	if (feat >= HEADER_LAST_FEATURE) {
-		pr_warning("unknown feature %d\n", feat);
-		return 0;
-	}
-	if (!feat_ops[feat].print)
-		return 0;
-
-	if (!feat_ops[feat].full_only || hd->full)
-		feat_ops[feat].print(ph, fd, hd->fp);
-	else
-		fprintf(hd->fp, "# %s info available, use -I to display\n",
-			feat_ops[feat].name);
-
-	return 0;
-}
-
-int perf_header__fprintf_info(struct perf_session *session, FILE *fp, bool full)
-{
-	struct header_print_data hd;
-	struct perf_header *header = &session->header;
-	int fd = session->fd;
-	hd.fp = fp;
-	hd.full = full;
-
-	perf_header__process_sections(header, fd, &hd,
-				      perf_file_section__fprintf_info);
-	return 0;
-}
-
-static int do_write_feat(int fd, struct perf_header *h, int type,
-			 struct perf_file_section **p,
-			 struct perf_evlist *evlist)
-{
-	int err;
-	int ret = 0;
-
-	if (perf_header__has_feat(h, type)) {
-		if (!feat_ops[type].write)
-			return -1;
-
-		(*p)->offset = lseek(fd, 0, SEEK_CUR);
-
-		err = feat_ops[type].write(fd, h, evlist);
-		if (err < 0) {
-			pr_debug("failed to write feature %d\n", type);
-
-			/* undo anything written */
-			lseek(fd, (*p)->offset, SEEK_SET);
-
-			return -1;
-		}
-		(*p)->size = lseek(fd, 0, SEEK_CUR) - (*p)->offset;
-		(*p)++;
-	}
-	return ret;
-}
-
-static int perf_header__adds_write(struct perf_header *header,
-				   struct perf_evlist *evlist, int fd)
-{
-	int nr_sections;
-	struct perf_file_section *feat_sec, *p;
-	int sec_size;
-	u64 sec_start;
-	int feat;
-	int err;
-
-	nr_sections = bitmap_weight(header->adds_features, HEADER_FEAT_BITS);
-	if (!nr_sections)
-		return 0;
-
-	feat_sec = p = calloc(nr_sections, sizeof(*feat_sec));
-	if (feat_sec == NULL)
-		return -ENOMEM;
-
-	sec_size = sizeof(*feat_sec) * nr_sections;
-
-	sec_start = header->feat_offset;
-	lseek(fd, sec_start + sec_size, SEEK_SET);
-
-	for_each_set_bit(feat, header->adds_features, HEADER_FEAT_BITS) {
-		if (do_write_feat(fd, header, feat, &p, evlist))
-			perf_header__clear_feat(header, feat);
-	}
-
-	lseek(fd, sec_start, SEEK_SET);
-	/*
-	 * may write more than needed due to dropped feature, but
-	 * this is okay, reader will skip the mising entries
-	 */
-	err = do_write(fd, feat_sec, sec_size);
-	if (err < 0)
-		pr_debug("failed to write feature section\n");
-	free(feat_sec);
-	return err;
-}
-
-int perf_header__write_pipe(int fd)
-{
-	struct perf_pipe_file_header f_header;
-	int err;
-
-	f_header = (struct perf_pipe_file_header){
-		.magic	   = PERF_MAGIC,
-		.size	   = sizeof(f_header),
-	};
-
-	err = do_write(fd, &f_header, sizeof(f_header));
-	if (err < 0) {
-		pr_debug("failed to write perf pipe header\n");
-		return err;
-	}
-
-	return 0;
-}
-
-int perf_session__write_header(struct perf_session *session,
-			       struct perf_evlist *evlist,
-			       int fd, bool at_exit)
-{
-	struct perf_file_header f_header;
-	struct perf_file_attr   f_attr;
-	struct perf_header *header = &session->header;
-	struct perf_evsel *evsel;
-	u64 attr_offset;
-	int err;
-
-	lseek(fd, sizeof(f_header), SEEK_SET);
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		evsel->id_offset = lseek(fd, 0, SEEK_CUR);
-		err = do_write(fd, evsel->id, evsel->ids * sizeof(u64));
-		if (err < 0) {
-			pr_debug("failed to write perf header\n");
-			return err;
-		}
-	}
-
-	attr_offset = lseek(fd, 0, SEEK_CUR);
-
-	list_for_each_entry(evsel, &evlist->entries, node) {
-		f_attr = (struct perf_file_attr){
-			.attr = evsel->attr,
-			.ids  = {
-				.offset = evsel->id_offset,
-				.size   = evsel->ids * sizeof(u64),
-			}
-		};
-		err = do_write(fd, &f_attr, sizeof(f_attr));
-		if (err < 0) {
-			pr_debug("failed to write perf header attribute\n");
-			return err;
-		}
-	}
-
-	header->data_offset = lseek(fd, 0, SEEK_CUR);
-	header->feat_offset = header->data_offset + header->data_size;
-
-	if (at_exit) {
-		err = perf_header__adds_write(header, evlist, fd);
-		if (err < 0)
-			return err;
-	}
-
-	f_header = (struct perf_file_header){
-		.magic	   = PERF_MAGIC,
-		.size	   = sizeof(f_header),
-		.attr_size = sizeof(f_attr),
-		.attrs = {
-			.offset = attr_offset,
-			.size   = evlist->nr_entries * sizeof(f_attr),
-		},
-		.data = {
-			.offset = header->data_offset,
-			.size	= header->data_size,
-		},
-		/* event_types is ignored, store zeros */
-	};
-
-	memcpy(&f_header.adds_features, &header->adds_features, sizeof(header->adds_features));
-
-	lseek(fd, 0, SEEK_SET);
-	err = do_write(fd, &f_header, sizeof(f_header));
-	if (err < 0) {
-		pr_debug("failed to write perf header\n");
-		return err;
-	}
-	lseek(fd, header->data_offset + header->data_size, SEEK_SET);
-
-	return 0;
-}
-
-static int perf_header__getbuffer64(struct perf_header *header,
-				    int fd, void *buf, size_t size)
-{
-	if (readn(fd, buf, size) <= 0)
-		return -1;
-
-	if (header->needs_swap)
-		mem_bswap_64(buf, size);
-
-	return 0;
-}
-
-int perf_header__process_sections(struct perf_header *header, int fd,
-				  void *data,
-				  int (*process)(struct perf_file_section *section,
-						 struct perf_header *ph,
-						 int feat, int fd, void *data))
-{
-	struct perf_file_section *feat_sec, *sec;
-	int nr_sections;
-	int sec_size;
-	int feat;
-	int err;
-
-	nr_sections = bitmap_weight(header->adds_features, HEADER_FEAT_BITS);
-	if (!nr_sections)
-		return 0;
-
-	feat_sec = sec = calloc(nr_sections, sizeof(*feat_sec));
-	if (!feat_sec)
-		return -1;
-
-	sec_size = sizeof(*feat_sec) * nr_sections;
-
-	lseek(fd, header->feat_offset, SEEK_SET);
-
-	err = perf_header__getbuffer64(header, fd, feat_sec, sec_size);
-	if (err < 0)
-		goto out_free;
-
-	for_each_set_bit(feat, header->adds_features, HEADER_LAST_FEATURE) {
-		err = process(sec++, header, feat, fd, data);
-		if (err < 0)
-			goto out_free;
-	}
-	err = 0;
-out_free:
-	free(feat_sec);
-	return err;
-}
-
-static const int attr_file_abi_sizes[] = {
-	[0] = PERF_ATTR_SIZE_VER0,
-	[1] = PERF_ATTR_SIZE_VER1,
-	[2] = PERF_ATTR_SIZE_VER2,
-	[3] = PERF_ATTR_SIZE_VER3,
-	0,
-};
-
-/*
- * In the legacy file format, the magic number is not used to encode endianness.
- * hdr_sz was used to encode endianness. But given that hdr_sz can vary based
- * on ABI revisions, we need to try all combinations for all endianness to
- * detect the endianness.
- */
-static int try_all_file_abis(uint64_t hdr_sz, struct perf_header *ph)
-{
-	uint64_t ref_size, attr_size;
-	int i;
-
-	for (i = 0 ; attr_file_abi_sizes[i]; i++) {
-		ref_size = attr_file_abi_sizes[i]
-			 + sizeof(struct perf_file_section);
-		if (hdr_sz != ref_size) {
-			attr_size = bswap_64(hdr_sz);
-			if (attr_size != ref_size)
-				continue;
-
-			ph->needs_swap = true;
-		}
-		pr_debug("ABI%d perf.data file detected, need_swap=%d\n",
-			 i,
-			 ph->needs_swap);
-		return 0;
-	}
-	/* could not determine endianness */
-	return -1;
-}
-
-#define PERF_PIPE_HDR_VER0	16
-
-static const size_t attr_pipe_abi_sizes[] = {
-	[0] = PERF_PIPE_HDR_VER0,
-	0,
-};
-
-/*
- * In the legacy pipe format, there is an implicit assumption that endiannesss
- * between host recording the samples, and host parsing the samples is the
- * same. This is not always the case given that the pipe output may always be
- * redirected into a file and analyzed on a different machine with possibly a
- * different endianness and perf_event ABI revsions in the perf tool itself.
- */
-static int try_all_pipe_abis(uint64_t hdr_sz, struct perf_header *ph)
-{
-	u64 attr_size;
-	int i;
-
-	for (i = 0 ; attr_pipe_abi_sizes[i]; i++) {
-		if (hdr_sz != attr_pipe_abi_sizes[i]) {
-			attr_size = bswap_64(hdr_sz);
-			if (attr_size != hdr_sz)
-				continue;
-
-			ph->needs_swap = true;
-		}
-		pr_debug("Pipe ABI%d perf.data file detected\n", i);
-		return 0;
-	}
-	return -1;
-}
-
-bool is_perf_magic(u64 magic)
-{
-	if (!memcmp(&magic, __perf_magic1, sizeof(magic))
-		|| magic == __perf_magic2
-		|| magic == __perf_magic2_sw)
-		return true;
-
-	return false;
-}
-
-static int check_magic_endian(u64 magic, uint64_t hdr_sz,
-			      bool is_pipe, struct perf_header *ph)
-{
-	int ret;
-
-	/* check for legacy format */
-	ret = memcmp(&magic, __perf_magic1, sizeof(magic));
-	if (ret == 0) {
-		ph->version = PERF_HEADER_VERSION_1;
-		pr_debug("legacy perf.data format\n");
-		if (is_pipe)
-			return try_all_pipe_abis(hdr_sz, ph);
-
-		return try_all_file_abis(hdr_sz, ph);
-	}
-	/*
-	 * the new magic number serves two purposes:
-	 * - unique number to identify actual perf.data files
-	 * - encode endianness of file
-	 */
-
-	/* check magic number with one endianness */
-	if (magic == __perf_magic2)
-		return 0;
-
-	/* check magic number with opposite endianness */
-	if (magic != __perf_magic2_sw)
-		return -1;
-
-	ph->needs_swap = true;
-	ph->version = PERF_HEADER_VERSION_2;
-
-	return 0;
-}
-
-int perf_file_header__read(struct perf_file_header *header,
-			   struct perf_header *ph, int fd)
-{
-	int ret;
-
-	lseek(fd, 0, SEEK_SET);
-
-	ret = readn(fd, header, sizeof(*header));
-	if (ret <= 0)
-		return -1;
-
-	if (check_magic_endian(header->magic,
-			       header->attr_size, false, ph) < 0) {
-		pr_debug("magic/endian check failed\n");
-		return -1;
-	}
-
-	if (ph->needs_swap) {
-		mem_bswap_64(header, offsetof(struct perf_file_header,
-			     adds_features));
-	}
-
-	if (header->size != sizeof(*header)) {
-		/* Support the previous format */
-		if (header->size == offsetof(typeof(*header), adds_features))
-			bitmap_zero(header->adds_features, HEADER_FEAT_BITS);
-		else
-			return -1;
-	} else if (ph->needs_swap) {
-		/*
-		 * feature bitmap is declared as an array of unsigned longs --
-		 * not good since its size can differ between the host that
-		 * generated the data file and the host analyzing the file.
-		 *
-		 * We need to handle endianness, but we don't know the size of
-		 * the unsigned long where the file was generated. Take a best
-		 * guess at determining it: try 64-bit swap first (ie., file
-		 * created on a 64-bit host), and check if the hostname feature
-		 * bit is set (this feature bit is forced on as of fbe96f2).
-		 * If the bit is not, undo the 64-bit swap and try a 32-bit
-		 * swap. If the hostname bit is still not set (e.g., older data
-		 * file), punt and fallback to the original behavior --
-		 * clearing all feature bits and setting buildid.
-		 */
-		mem_bswap_64(&header->adds_features,
-			    BITS_TO_U64(HEADER_FEAT_BITS));
-
-		if (!test_bit(HEADER_HOSTNAME, header->adds_features)) {
-			/* unswap as u64 */
-			mem_bswap_64(&header->adds_features,
-				    BITS_TO_U64(HEADER_FEAT_BITS));
-
-			/* unswap as u32 */
-			mem_bswap_32(&header->adds_features,
-				    BITS_TO_U32(HEADER_FEAT_BITS));
-		}
-
-		if (!test_bit(HEADER_HOSTNAME, header->adds_features)) {
-			bitmap_zero(header->adds_features, HEADER_FEAT_BITS);
-			set_bit(HEADER_BUILD_ID, header->adds_features);
-		}
-	}
-
-	memcpy(&ph->adds_features, &header->adds_features,
-	       sizeof(ph->adds_features));
-
-	ph->data_offset  = header->data.offset;
-	ph->data_size	 = header->data.size;
-	ph->feat_offset  = header->data.offset + header->data.size;
-	return 0;
-}
-
-static int perf_file_section__process(struct perf_file_section *section,
-				      struct perf_header *ph,
-				      int feat, int fd, void *data)
-{
-	if (lseek(fd, section->offset, SEEK_SET) == (off_t)-1) {
-		pr_debug("Failed to lseek to %" PRIu64 " offset for feature "
-			  "%d, continuing...\n", section->offset, feat);
-		return 0;
-	}
-
-	if (feat >= HEADER_LAST_FEATURE) {
-		pr_debug("unknown feature %d, continuing...\n", feat);
-		return 0;
-	}
-
-	if (!feat_ops[feat].process)
-		return 0;
-
-	return feat_ops[feat].process(section, ph, fd, data);
-}
-
-static int perf_file_header__read_pipe(struct perf_pipe_file_header *header,
-				       struct perf_header *ph, int fd,
-				       bool repipe)
-{
-	int ret;
-
-	ret = readn(fd, header, sizeof(*header));
-	if (ret <= 0)
-		return -1;
-
-	if (check_magic_endian(header->magic, header->size, true, ph) < 0) {
-		pr_debug("endian/magic failed\n");
-		return -1;
-	}
-
-	if (ph->needs_swap)
-		header->size = bswap_64(header->size);
-
-	if (repipe && do_write(STDOUT_FILENO, header, sizeof(*header)) < 0)
-		return -1;
-
-	return 0;
-}
-
-static int perf_header__read_pipe(struct perf_session *session)
-{
-	struct perf_header *header = &session->header;
-	struct perf_pipe_file_header f_header;
-
-	if (perf_file_header__read_pipe(&f_header, header, session->fd,
-					session->repipe) < 0) {
-		pr_debug("incompatible file format\n");
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static int read_attr(int fd, struct perf_header *ph,
-		     struct perf_file_attr *f_attr)
-{
-	struct perf_event_attr *attr = &f_attr->attr;
-	size_t sz, left;
-	size_t our_sz = sizeof(f_attr->attr);
-	int ret;
-
-	memset(f_attr, 0, sizeof(*f_attr));
-
-	/* read minimal guaranteed structure */
-	ret = readn(fd, attr, PERF_ATTR_SIZE_VER0);
-	if (ret <= 0) {
-		pr_debug("cannot read %d bytes of header attr\n",
-			 PERF_ATTR_SIZE_VER0);
-		return -1;
-	}
-
-	/* on file perf_event_attr size */
-	sz = attr->size;
-
-	if (ph->needs_swap)
-		sz = bswap_32(sz);
-
-	if (sz == 0) {
-		/* assume ABI0 */
-		sz =  PERF_ATTR_SIZE_VER0;
-	} else if (sz > our_sz) {
-		pr_debug("file uses a more recent and unsupported ABI"
-			 " (%zu bytes extra)\n", sz - our_sz);
-		return -1;
-	}
-	/* what we have not yet read and that we know about */
-	left = sz - PERF_ATTR_SIZE_VER0;
-	if (left) {
-		void *ptr = attr;
-		ptr += PERF_ATTR_SIZE_VER0;
-
-		ret = readn(fd, ptr, left);
-	}
-	/* read perf_file_section, ids are read in caller */
-	ret = readn(fd, &f_attr->ids, sizeof(f_attr->ids));
-
-	return ret <= 0 ? -1 : 0;
-}
-
-static int perf_evsel__prepare_tracepoint_event(struct perf_evsel *evsel,
-						struct pevent *pevent)
-{
-	struct event_format *event;
-	char bf[128];
-
-	/* already prepared */
-	if (evsel->tp_format)
-		return 0;
-
-	if (pevent == NULL) {
-		pr_debug("broken or missing trace data\n");
-		return -1;
-	}
-
-	event = pevent_find_event(pevent, evsel->attr.config);
-	if (event == NULL)
-		return -1;
-
-	if (!evsel->name) {
-		snprintf(bf, sizeof(bf), "%s:%s", event->system, event->name);
-		evsel->name = strdup(bf);
-		if (evsel->name == NULL)
-			return -1;
-	}
-
-	evsel->tp_format = event;
-	return 0;
-}
-
-static int perf_evlist__prepare_tracepoint_events(struct perf_evlist *evlist,
-						  struct pevent *pevent)
-{
-	struct perf_evsel *pos;
-
-	list_for_each_entry(pos, &evlist->entries, node) {
-		if (pos->attr.type == PERF_TYPE_TRACEPOINT &&
-		    perf_evsel__prepare_tracepoint_event(pos, pevent))
-			return -1;
-	}
-
-	return 0;
-}
-
-int perf_session__read_header(struct perf_session *session)
-{
-	struct perf_header *header = &session->header;
-	struct perf_file_header	f_header;
-	struct perf_file_attr	f_attr;
-	u64			f_id;
-	int nr_attrs, nr_ids, i, j;
-	int fd = session->fd;
-
-	session->evlist = perf_evlist__new();
-	if (session->evlist == NULL)
-		return -ENOMEM;
-
-	if (session->fd_pipe)
-		return perf_header__read_pipe(session);
-
-	if (perf_file_header__read(&f_header, header, fd) < 0)
-		return -EINVAL;
-
-	/*
-	 * Sanity check that perf.data was written cleanly; data size is
-	 * initialized to 0 and updated only if the on_exit function is run.
-	 * If data size is still 0 then the file contains only partial
-	 * information.  Just warn user and process it as much as it can.
-	 */
-	if (f_header.data.size == 0) {
-		pr_warning("WARNING: The %s file's data size field is 0 which is unexpected.\n"
-			   "Was the 'perf record' command properly terminated?\n",
-			   session->filename);
-	}
-
-	nr_attrs = f_header.attrs.size / f_header.attr_size;
-	lseek(fd, f_header.attrs.offset, SEEK_SET);
-
-	for (i = 0; i < nr_attrs; i++) {
-		struct perf_evsel *evsel;
-		off_t tmp;
-
-		if (read_attr(fd, header, &f_attr) < 0)
-			goto out_errno;
-
-		if (header->needs_swap)
-			perf_event__attr_swap(&f_attr.attr);
-
-		tmp = lseek(fd, 0, SEEK_CUR);
-		evsel = perf_evsel__new(&f_attr.attr, i);
-
-		if (evsel == NULL)
-			goto out_delete_evlist;
-
-		evsel->needs_swap = header->needs_swap;
-		/*
-		 * Do it before so that if perf_evsel__alloc_id fails, this
-		 * entry gets purged too at perf_evlist__delete().
-		 */
-		perf_evlist__add(session->evlist, evsel);
-
-		nr_ids = f_attr.ids.size / sizeof(u64);
-		/*
-		 * We don't have the cpu and thread maps on the header, so
-		 * for allocating the perf_sample_id table we fake 1 cpu and
-		 * hattr->ids threads.
-		 */
-		if (perf_evsel__alloc_id(evsel, 1, nr_ids))
-			goto out_delete_evlist;
-
-		lseek(fd, f_attr.ids.offset, SEEK_SET);
-
-		for (j = 0; j < nr_ids; j++) {
-			if (perf_header__getbuffer64(header, fd, &f_id, sizeof(f_id)))
-				goto out_errno;
-
-			perf_evlist__id_add(session->evlist, evsel, 0, j, f_id);
-		}
-
-		lseek(fd, tmp, SEEK_SET);
-	}
-
-	symbol_conf.nr_events = nr_attrs;
-
-	perf_header__process_sections(header, fd, &session->pevent,
-				      perf_file_section__process);
-
-	if (perf_evlist__prepare_tracepoint_events(session->evlist,
-						   session->pevent))
-		goto out_delete_evlist;
-
-	return 0;
-out_errno:
-	return -errno;
-
-out_delete_evlist:
-	perf_evlist__delete(session->evlist);
-	session->evlist = NULL;
-	return -ENOMEM;
-}
-
-int perf_event__synthesize_attr(struct perf_tool *tool,
-				struct perf_event_attr *attr, u32 ids, u64 *id,
-				perf_event__handler_t process)
-{
-	union perf_event *ev;
-	size_t size;
-	int err;
-
-	size = sizeof(struct perf_event_attr);
-	size = PERF_ALIGN(size, sizeof(u64));
-	size += sizeof(struct perf_event_header);
-	size += ids * sizeof(u64);
-
-	ev = malloc(size);
-
-	if (ev == NULL)
-		return -ENOMEM;
-
-	ev->attr.attr = *attr;
-	memcpy(ev->attr.id, id, ids * sizeof(u64));
-
-	ev->attr.header.type = PERF_RECORD_HEADER_ATTR;
-	ev->attr.header.size = (u16)size;
-
-	if (ev->attr.header.size == size)
-		err = process(tool, ev, NULL, NULL);
-	else
-		err = -E2BIG;
-
-	free(ev);
-
-	return err;
-}
-
-int perf_event__synthesize_attrs(struct perf_tool *tool,
-				   struct perf_session *session,
-				   perf_event__handler_t process)
-{
-	struct perf_evsel *evsel;
-	int err = 0;
-
-	list_for_each_entry(evsel, &session->evlist->entries, node) {
-		err = perf_event__synthesize_attr(tool, &evsel->attr, evsel->ids,
-						  evsel->id, process);
-		if (err) {
-			pr_debug("failed to create perf header attribute\n");
-			return err;
-		}
-	}
-
-	return err;
-}
-
-int perf_event__process_attr(struct perf_tool *tool __maybe_unused,
-			     union perf_event *event,
-			     struct perf_evlist **pevlist)
-{
-	u32 i, ids, n_ids;
-	struct perf_evsel *evsel;
-	struct perf_evlist *evlist = *pevlist;
-
-	if (evlist == NULL) {
-		*pevlist = evlist = perf_evlist__new();
-		if (evlist == NULL)
-			return -ENOMEM;
-	}
-
-	evsel = perf_evsel__new(&event->attr.attr, evlist->nr_entries);
-	if (evsel == NULL)
-		return -ENOMEM;
-
-	perf_evlist__add(evlist, evsel);
-
-	ids = event->header.size;
-	ids -= (void *)&event->attr.id - (void *)event;
-	n_ids = ids / sizeof(u64);
-	/*
-	 * We don't have the cpu and thread maps on the header, so
-	 * for allocating the perf_sample_id table we fake 1 cpu and
-	 * hattr->ids threads.
-	 */
-	if (perf_evsel__alloc_id(evsel, 1, n_ids))
-		return -ENOMEM;
-
-	for (i = 0; i < n_ids; i++) {
-		perf_evlist__id_add(evlist, evsel, 0, i, event->attr.id[i]);
-	}
-
-	symbol_conf.nr_events = evlist->nr_entries;
-
-	return 0;
-}
-
-int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd,
-					struct perf_evlist *evlist,
-					perf_event__handler_t process)
-{
-	union perf_event ev;
-	struct tracing_data *tdata;
-	ssize_t size = 0, aligned_size = 0, padding;
-	int err __maybe_unused = 0;
-
-	/*
-	 * We are going to store the size of the data followed
-	 * by the data contents. Since the fd descriptor is a pipe,
-	 * we cannot seek back to store the size of the data once
-	 * we know it. Instead we:
-	 *
-	 * - write the tracing data to the temp file
-	 * - get/write the data size to pipe
-	 * - write the tracing data from the temp file
-	 *   to the pipe
-	 */
-	tdata = tracing_data_get(&evlist->entries, fd, true);
-	if (!tdata)
-		return -1;
-
-	memset(&ev, 0, sizeof(ev));
-
-	ev.tracing_data.header.type = PERF_RECORD_HEADER_TRACING_DATA;
-	size = tdata->size;
-	aligned_size = PERF_ALIGN(size, sizeof(u64));
-	padding = aligned_size - size;
-	ev.tracing_data.header.size = sizeof(ev.tracing_data);
-	ev.tracing_data.size = aligned_size;
-
-	process(tool, &ev, NULL, NULL);
-
-	/*
-	 * The put function will copy all the tracing data
-	 * stored in temp file to the pipe.
-	 */
-	tracing_data_put(tdata);
-
-	write_padded(fd, NULL, 0, padding);
-
-	return aligned_size;
-}
-
-int perf_event__process_tracing_data(struct perf_tool *tool __maybe_unused,
-				     union perf_event *event,
-				     struct perf_session *session)
-{
-	ssize_t size_read, padding, size = event->tracing_data.size;
-	off_t offset = lseek(session->fd, 0, SEEK_CUR);
-	char buf[BUFSIZ];
-
-	/* setup for reading amidst mmap */
-	lseek(session->fd, offset + sizeof(struct tracing_data_event),
-	      SEEK_SET);
-
-	size_read = trace_report(session->fd, &session->pevent,
-				 session->repipe);
-	padding = PERF_ALIGN(size_read, sizeof(u64)) - size_read;
-
-	if (readn(session->fd, buf, padding) < 0) {
-		pr_err("%s: reading input file", __func__);
-		return -1;
-	}
-	if (session->repipe) {
-		int retw = write(STDOUT_FILENO, buf, padding);
-		if (retw <= 0 || retw != padding) {
-			pr_err("%s: repiping tracing data padding", __func__);
-			return -1;
-		}
-	}
-
-	if (size_read + padding != size) {
-		pr_err("%s: tracing data size mismatch", __func__);
-		return -1;
-	}
-
-	perf_evlist__prepare_tracepoint_events(session->evlist,
-					       session->pevent);
-
-	return size_read + padding;
-}
-
-int perf_event__synthesize_build_id(struct perf_tool *tool,
-				    struct dso *pos, u16 misc,
-				    perf_event__handler_t process,
-				    struct machine *machine)
-{
-	union perf_event ev;
-	size_t len;
-	int err = 0;
-
-	if (!pos->hit)
-		return err;
-
-	memset(&ev, 0, sizeof(ev));
-
-	len = pos->long_name_len + 1;
-	len = PERF_ALIGN(len, NAME_ALIGN);
-	memcpy(&ev.build_id.build_id, pos->build_id, sizeof(pos->build_id));
-	ev.build_id.header.type = PERF_RECORD_HEADER_BUILD_ID;
-	ev.build_id.header.misc = misc;
-	ev.build_id.pid = machine->pid;
-	ev.build_id.header.size = sizeof(ev.build_id) + len;
-	memcpy(&ev.build_id.filename, pos->long_name, pos->long_name_len);
-
-	err = process(tool, &ev, NULL, machine);
-
-	return err;
-}
-
-int perf_event__process_build_id(struct perf_tool *tool __maybe_unused,
-				 union perf_event *event,
-				 struct perf_session *session)
-{
-	__event_process_build_id(&event->build_id,
-				 event->build_id.filename,
-				 session);
-	return 0;
-}
-
-void disable_buildid_cache(void)
-{
-	no_buildid_cache = true;
-}
diff --git a/src/tools/perf/util/header.h b/src/tools/perf/util/header.h
deleted file mode 100644
index 307c9ae..0000000
--- a/src/tools/perf/util/header.h
+++ /dev/null
@@ -1,159 +0,0 @@
-#ifndef __PERF_HEADER_H
-#define __PERF_HEADER_H
-
-#include <linux/perf_event.h>
-#include <sys/types.h>
-#include <stdbool.h>
-#include "types.h"
-#include "event.h"
-
-#include <linux/bitmap.h>
-
-enum {
-	HEADER_RESERVED		= 0,	/* always cleared */
-	HEADER_FIRST_FEATURE	= 1,
-	HEADER_TRACING_DATA	= 1,
-	HEADER_BUILD_ID,
-
-	HEADER_HOSTNAME,
-	HEADER_OSRELEASE,
-	HEADER_VERSION,
-	HEADER_ARCH,
-	HEADER_NRCPUS,
-	HEADER_CPUDESC,
-	HEADER_CPUID,
-	HEADER_TOTAL_MEM,
-	HEADER_CMDLINE,
-	HEADER_EVENT_DESC,
-	HEADER_CPU_TOPOLOGY,
-	HEADER_NUMA_TOPOLOGY,
-	HEADER_BRANCH_STACK,
-	HEADER_PMU_MAPPINGS,
-	HEADER_GROUP_DESC,
-	HEADER_LAST_FEATURE,
-	HEADER_FEAT_BITS	= 256,
-};
-
-enum perf_header_version {
-	PERF_HEADER_VERSION_1,
-	PERF_HEADER_VERSION_2,
-};
-
-struct perf_file_section {
-	u64 offset;
-	u64 size;
-};
-
-struct perf_file_header {
-	u64				magic;
-	u64				size;
-	u64				attr_size;
-	struct perf_file_section	attrs;
-	struct perf_file_section	data;
-	/* event_types is ignored */
-	struct perf_file_section	event_types;
-	DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
-};
-
-struct perf_pipe_file_header {
-	u64				magic;
-	u64				size;
-};
-
-struct perf_header;
-
-int perf_file_header__read(struct perf_file_header *header,
-			   struct perf_header *ph, int fd);
-
-struct perf_session_env {
-	char			*hostname;
-	char			*os_release;
-	char			*version;
-	char			*arch;
-	int			nr_cpus_online;
-	int			nr_cpus_avail;
-	char			*cpu_desc;
-	char			*cpuid;
-	unsigned long long	total_mem;
-
-	int			nr_cmdline;
-	char			*cmdline;
-	int			nr_sibling_cores;
-	char			*sibling_cores;
-	int			nr_sibling_threads;
-	char			*sibling_threads;
-	int			nr_numa_nodes;
-	char			*numa_nodes;
-	int			nr_pmu_mappings;
-	char			*pmu_mappings;
-	int			nr_groups;
-};
-
-struct perf_header {
-	enum perf_header_version	version;
-	bool				needs_swap;
-	u64				data_offset;
-	u64				data_size;
-	u64				feat_offset;
-	DECLARE_BITMAP(adds_features, HEADER_FEAT_BITS);
-	struct perf_session_env 	env;
-};
-
-struct perf_evlist;
-struct perf_session;
-
-int perf_session__read_header(struct perf_session *session);
-int perf_session__write_header(struct perf_session *session,
-			       struct perf_evlist *evlist,
-			       int fd, bool at_exit);
-int perf_header__write_pipe(int fd);
-
-void perf_header__set_feat(struct perf_header *header, int feat);
-void perf_header__clear_feat(struct perf_header *header, int feat);
-bool perf_header__has_feat(const struct perf_header *header, int feat);
-
-int perf_header__set_cmdline(int argc, const char **argv);
-
-int perf_header__process_sections(struct perf_header *header, int fd,
-				  void *data,
-				  int (*process)(struct perf_file_section *section,
-				  struct perf_header *ph,
-				  int feat, int fd, void *data));
-
-int perf_header__fprintf_info(struct perf_session *s, FILE *fp, bool full);
-
-int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,
-			  const char *name, bool is_kallsyms, bool is_vdso);
-int build_id_cache__remove_s(const char *sbuild_id, const char *debugdir);
-
-int perf_event__synthesize_attr(struct perf_tool *tool,
-				struct perf_event_attr *attr, u32 ids, u64 *id,
-				perf_event__handler_t process);
-int perf_event__synthesize_attrs(struct perf_tool *tool,
-				 struct perf_session *session,
-				 perf_event__handler_t process);
-int perf_event__process_attr(struct perf_tool *tool, union perf_event *event,
-			     struct perf_evlist **pevlist);
-
-int perf_event__synthesize_tracing_data(struct perf_tool *tool,
-					int fd, struct perf_evlist *evlist,
-					perf_event__handler_t process);
-int perf_event__process_tracing_data(struct perf_tool *tool,
-				     union perf_event *event,
-				     struct perf_session *session);
-
-int perf_event__synthesize_build_id(struct perf_tool *tool,
-				    struct dso *pos, u16 misc,
-				    perf_event__handler_t process,
-				    struct machine *machine);
-int perf_event__process_build_id(struct perf_tool *tool,
-				 union perf_event *event,
-				 struct perf_session *session);
-bool is_perf_magic(u64 magic);
-
-/*
- * arch specific callback
- */
-int get_cpuid(char *buffer, size_t sz);
-
-#endif /* __PERF_HEADER_H */
diff --git a/src/tools/perf/util/help.c b/src/tools/perf/util/help.c
deleted file mode 100644
index 8b1f6e8..0000000
--- a/src/tools/perf/util/help.c
+++ /dev/null
@@ -1,340 +0,0 @@
-#include "cache.h"
-#include "../builtin.h"
-#include "exec_cmd.h"
-#include "levenshtein.h"
-#include "help.h"
-#include <termios.h>
-
-void add_cmdname(struct cmdnames *cmds, const char *name, size_t len)
-{
-	struct cmdname *ent = malloc(sizeof(*ent) + len + 1);
-
-	ent->len = len;
-	memcpy(ent->name, name, len);
-	ent->name[len] = 0;
-
-	ALLOC_GROW(cmds->names, cmds->cnt + 1, cmds->alloc);
-	cmds->names[cmds->cnt++] = ent;
-}
-
-static void clean_cmdnames(struct cmdnames *cmds)
-{
-	unsigned int i;
-
-	for (i = 0; i < cmds->cnt; ++i)
-		free(cmds->names[i]);
-	free(cmds->names);
-	cmds->cnt = 0;
-	cmds->alloc = 0;
-}
-
-static int cmdname_compare(const void *a_, const void *b_)
-{
-	struct cmdname *a = *(struct cmdname **)a_;
-	struct cmdname *b = *(struct cmdname **)b_;
-	return strcmp(a->name, b->name);
-}
-
-static void uniq(struct cmdnames *cmds)
-{
-	unsigned int i, j;
-
-	if (!cmds->cnt)
-		return;
-
-	for (i = j = 1; i < cmds->cnt; i++)
-		if (strcmp(cmds->names[i]->name, cmds->names[i-1]->name))
-			cmds->names[j++] = cmds->names[i];
-
-	cmds->cnt = j;
-}
-
-void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes)
-{
-	size_t ci, cj, ei;
-	int cmp;
-
-	ci = cj = ei = 0;
-	while (ci < cmds->cnt && ei < excludes->cnt) {
-		cmp = strcmp(cmds->names[ci]->name, excludes->names[ei]->name);
-		if (cmp < 0)
-			cmds->names[cj++] = cmds->names[ci++];
-		else if (cmp == 0)
-			ci++, ei++;
-		else if (cmp > 0)
-			ei++;
-	}
-
-	while (ci < cmds->cnt)
-		cmds->names[cj++] = cmds->names[ci++];
-
-	cmds->cnt = cj;
-}
-
-static void pretty_print_string_list(struct cmdnames *cmds, int longest)
-{
-	int cols = 1, rows;
-	int space = longest + 1; /* min 1 SP between words */
-	struct winsize win;
-	int max_cols;
-	int i, j;
-
-	get_term_dimensions(&win);
-	max_cols = win.ws_col - 1; /* don't print *on* the edge */
-
-	if (space < max_cols)
-		cols = max_cols / space;
-	rows = (cmds->cnt + cols - 1) / cols;
-
-	for (i = 0; i < rows; i++) {
-		printf("  ");
-
-		for (j = 0; j < cols; j++) {
-			unsigned int n = j * rows + i;
-			unsigned int size = space;
-
-			if (n >= cmds->cnt)
-				break;
-			if (j == cols-1 || n + rows >= cmds->cnt)
-				size = 1;
-			printf("%-*s", size, cmds->names[n]->name);
-		}
-		putchar('\n');
-	}
-}
-
-static int is_executable(const char *name)
-{
-	struct stat st;
-
-	if (stat(name, &st) || /* stat, not lstat */
-	    !S_ISREG(st.st_mode))
-		return 0;
-
-	return st.st_mode & S_IXUSR;
-}
-
-static void list_commands_in_dir(struct cmdnames *cmds,
-					 const char *path,
-					 const char *prefix)
-{
-	int prefix_len;
-	DIR *dir = opendir(path);
-	struct dirent *de;
-	struct strbuf buf = STRBUF_INIT;
-	int len;
-
-	if (!dir)
-		return;
-	if (!prefix)
-		prefix = "perf-";
-	prefix_len = strlen(prefix);
-
-	strbuf_addf(&buf, "%s/", path);
-	len = buf.len;
-
-	while ((de = readdir(dir)) != NULL) {
-		int entlen;
-
-		if (prefixcmp(de->d_name, prefix))
-			continue;
-
-		strbuf_setlen(&buf, len);
-		strbuf_addstr(&buf, de->d_name);
-		if (!is_executable(buf.buf))
-			continue;
-
-		entlen = strlen(de->d_name) - prefix_len;
-		if (has_extension(de->d_name, ".exe"))
-			entlen -= 4;
-
-		add_cmdname(cmds, de->d_name + prefix_len, entlen);
-	}
-	closedir(dir);
-	strbuf_release(&buf);
-}
-
-void load_command_list(const char *prefix,
-		struct cmdnames *main_cmds,
-		struct cmdnames *other_cmds)
-{
-	const char *env_path = getenv("PATH");
-	const char *exec_path = perf_exec_path();
-
-	if (exec_path) {
-		list_commands_in_dir(main_cmds, exec_path, prefix);
-		qsort(main_cmds->names, main_cmds->cnt,
-		      sizeof(*main_cmds->names), cmdname_compare);
-		uniq(main_cmds);
-	}
-
-	if (env_path) {
-		char *paths, *path, *colon;
-		path = paths = strdup(env_path);
-		while (1) {
-			if ((colon = strchr(path, PATH_SEP)))
-				*colon = 0;
-			if (!exec_path || strcmp(path, exec_path))
-				list_commands_in_dir(other_cmds, path, prefix);
-
-			if (!colon)
-				break;
-			path = colon + 1;
-		}
-		free(paths);
-
-		qsort(other_cmds->names, other_cmds->cnt,
-		      sizeof(*other_cmds->names), cmdname_compare);
-		uniq(other_cmds);
-	}
-	exclude_cmds(other_cmds, main_cmds);
-}
-
-void list_commands(const char *title, struct cmdnames *main_cmds,
-		   struct cmdnames *other_cmds)
-{
-	unsigned int i, longest = 0;
-
-	for (i = 0; i < main_cmds->cnt; i++)
-		if (longest < main_cmds->names[i]->len)
-			longest = main_cmds->names[i]->len;
-	for (i = 0; i < other_cmds->cnt; i++)
-		if (longest < other_cmds->names[i]->len)
-			longest = other_cmds->names[i]->len;
-
-	if (main_cmds->cnt) {
-		const char *exec_path = perf_exec_path();
-		printf("available %s in '%s'\n", title, exec_path);
-		printf("----------------");
-		mput_char('-', strlen(title) + strlen(exec_path));
-		putchar('\n');
-		pretty_print_string_list(main_cmds, longest);
-		putchar('\n');
-	}
-
-	if (other_cmds->cnt) {
-		printf("%s available from elsewhere on your $PATH\n", title);
-		printf("---------------------------------------");
-		mput_char('-', strlen(title));
-		putchar('\n');
-		pretty_print_string_list(other_cmds, longest);
-		putchar('\n');
-	}
-}
-
-int is_in_cmdlist(struct cmdnames *c, const char *s)
-{
-	unsigned int i;
-
-	for (i = 0; i < c->cnt; i++)
-		if (!strcmp(s, c->names[i]->name))
-			return 1;
-	return 0;
-}
-
-static int autocorrect;
-static struct cmdnames aliases;
-
-static int perf_unknown_cmd_config(const char *var, const char *value, void *cb)
-{
-	if (!strcmp(var, "help.autocorrect"))
-		autocorrect = perf_config_int(var,value);
-	/* Also use aliases for command lookup */
-	if (!prefixcmp(var, "alias."))
-		add_cmdname(&aliases, var + 6, strlen(var + 6));
-
-	return perf_default_config(var, value, cb);
-}
-
-static int levenshtein_compare(const void *p1, const void *p2)
-{
-	const struct cmdname *const *c1 = p1, *const *c2 = p2;
-	const char *s1 = (*c1)->name, *s2 = (*c2)->name;
-	int l1 = (*c1)->len;
-	int l2 = (*c2)->len;
-	return l1 != l2 ? l1 - l2 : strcmp(s1, s2);
-}
-
-static void add_cmd_list(struct cmdnames *cmds, struct cmdnames *old)
-{
-	unsigned int i;
-
-	ALLOC_GROW(cmds->names, cmds->cnt + old->cnt, cmds->alloc);
-
-	for (i = 0; i < old->cnt; i++)
-		cmds->names[cmds->cnt++] = old->names[i];
-	free(old->names);
-	old->cnt = 0;
-	old->names = NULL;
-}
-
-const char *help_unknown_cmd(const char *cmd)
-{
-	unsigned int i, n = 0, best_similarity = 0;
-	struct cmdnames main_cmds, other_cmds;
-
-	memset(&main_cmds, 0, sizeof(main_cmds));
-	memset(&other_cmds, 0, sizeof(main_cmds));
-	memset(&aliases, 0, sizeof(aliases));
-
-	perf_config(perf_unknown_cmd_config, NULL);
-
-	load_command_list("perf-", &main_cmds, &other_cmds);
-
-	add_cmd_list(&main_cmds, &aliases);
-	add_cmd_list(&main_cmds, &other_cmds);
-	qsort(main_cmds.names, main_cmds.cnt,
-	      sizeof(main_cmds.names), cmdname_compare);
-	uniq(&main_cmds);
-
-	if (main_cmds.cnt) {
-		/* This reuses cmdname->len for similarity index */
-		for (i = 0; i < main_cmds.cnt; ++i)
-			main_cmds.names[i]->len =
-				levenshtein(cmd, main_cmds.names[i]->name, 0, 2, 1, 4);
-
-		qsort(main_cmds.names, main_cmds.cnt,
-		      sizeof(*main_cmds.names), levenshtein_compare);
-
-		best_similarity = main_cmds.names[0]->len;
-		n = 1;
-		while (n < main_cmds.cnt && best_similarity == main_cmds.names[n]->len)
-			++n;
-	}
-
-	if (autocorrect && n == 1) {
-		const char *assumed = main_cmds.names[0]->name;
-
-		main_cmds.names[0] = NULL;
-		clean_cmdnames(&main_cmds);
-		fprintf(stderr, "WARNING: You called a perf program named '%s', "
-			"which does not exist.\n"
-			"Continuing under the assumption that you meant '%s'\n",
-			cmd, assumed);
-		if (autocorrect > 0) {
-			fprintf(stderr, "in %0.1f seconds automatically...\n",
-				(float)autocorrect/10.0);
-			poll(NULL, 0, autocorrect * 100);
-		}
-		return assumed;
-	}
-
-	fprintf(stderr, "perf: '%s' is not a perf-command. See 'perf --help'.\n", cmd);
-
-	if (main_cmds.cnt && best_similarity < 6) {
-		fprintf(stderr, "\nDid you mean %s?\n",
-			n < 2 ? "this": "one of these");
-
-		for (i = 0; i < n; i++)
-			fprintf(stderr, "\t%s\n", main_cmds.names[i]->name);
-	}
-
-	exit(1);
-}
-
-int cmd_version(int argc __maybe_unused, const char **argv __maybe_unused,
-		const char *prefix __maybe_unused)
-{
-	printf("perf version %s\n", perf_version_string);
-	return 0;
-}
diff --git a/src/tools/perf/util/help.h b/src/tools/perf/util/help.h
deleted file mode 100644
index 7f5c6de..0000000
--- a/src/tools/perf/util/help.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef __PERF_HELP_H
-#define __PERF_HELP_H
-
-struct cmdnames {
-	size_t alloc;
-	size_t cnt;
-	struct cmdname {
-		size_t len; /* also used for similarity index in help.c */
-		char name[FLEX_ARRAY];
-	} **names;
-};
-
-static inline void mput_char(char c, unsigned int num)
-{
-	while(num--)
-		putchar(c);
-}
-
-void load_command_list(const char *prefix,
-		struct cmdnames *main_cmds,
-		struct cmdnames *other_cmds);
-void add_cmdname(struct cmdnames *cmds, const char *name, size_t len);
-/* Here we require that excludes is a sorted list. */
-void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes);
-int is_in_cmdlist(struct cmdnames *c, const char *s);
-void list_commands(const char *title, struct cmdnames *main_cmds,
-		   struct cmdnames *other_cmds);
-
-#endif /* __PERF_HELP_H */
diff --git a/src/tools/perf/util/hist.c b/src/tools/perf/util/hist.c
deleted file mode 100644
index 9ff6cf3..0000000
--- a/src/tools/perf/util/hist.c
+++ /dev/null
@@ -1,1000 +0,0 @@
-#include "annotate.h"
-#include "util.h"
-#include "build-id.h"
-#include "hist.h"
-#include "session.h"
-#include "sort.h"
-#include "evsel.h"
-#include <math.h>
-
-static bool hists__filter_entry_by_dso(struct hists *hists,
-				       struct hist_entry *he);
-static bool hists__filter_entry_by_thread(struct hists *hists,
-					  struct hist_entry *he);
-static bool hists__filter_entry_by_symbol(struct hists *hists,
-					  struct hist_entry *he);
-
-enum hist_filter {
-	HIST_FILTER__DSO,
-	HIST_FILTER__THREAD,
-	HIST_FILTER__PARENT,
-	HIST_FILTER__SYMBOL,
-};
-
-struct callchain_param	callchain_param = {
-	.mode	= CHAIN_GRAPH_REL,
-	.min_percent = 0.5,
-	.order  = ORDER_CALLEE,
-	.key	= CCKEY_FUNCTION
-};
-
-u16 hists__col_len(struct hists *hists, enum hist_column col)
-{
-	return hists->col_len[col];
-}
-
-void hists__set_col_len(struct hists *hists, enum hist_column col, u16 len)
-{
-	hists->col_len[col] = len;
-}
-
-bool hists__new_col_len(struct hists *hists, enum hist_column col, u16 len)
-{
-	if (len > hists__col_len(hists, col)) {
-		hists__set_col_len(hists, col, len);
-		return true;
-	}
-	return false;
-}
-
-void hists__reset_col_len(struct hists *hists)
-{
-	enum hist_column col;
-
-	for (col = 0; col < HISTC_NR_COLS; ++col)
-		hists__set_col_len(hists, col, 0);
-}
-
-static void hists__set_unres_dso_col_len(struct hists *hists, int dso)
-{
-	const unsigned int unresolved_col_width = BITS_PER_LONG / 4;
-
-	if (hists__col_len(hists, dso) < unresolved_col_width &&
-	    !symbol_conf.col_width_list_str && !symbol_conf.field_sep &&
-	    !symbol_conf.dso_list)
-		hists__set_col_len(hists, dso, unresolved_col_width);
-}
-
-void hists__calc_col_len(struct hists *hists, struct hist_entry *h)
-{
-	const unsigned int unresolved_col_width = BITS_PER_LONG / 4;
-	int symlen;
-	u16 len;
-
-	/*
-	 * +4 accounts for '[x] ' priv level info
-	 * +2 accounts for 0x prefix on raw addresses
-	 * +3 accounts for ' y ' symtab origin info
-	 */
-	if (h->ms.sym) {
-		symlen = h->ms.sym->namelen + 4;
-		if (verbose)
-			symlen += BITS_PER_LONG / 4 + 2 + 3;
-		hists__new_col_len(hists, HISTC_SYMBOL, symlen);
-	} else {
-		symlen = unresolved_col_width + 4 + 2;
-		hists__new_col_len(hists, HISTC_SYMBOL, symlen);
-		hists__set_unres_dso_col_len(hists, HISTC_DSO);
-	}
-
-	len = thread__comm_len(h->thread);
-	if (hists__new_col_len(hists, HISTC_COMM, len))
-		hists__set_col_len(hists, HISTC_THREAD, len + 6);
-
-	if (h->ms.map) {
-		len = dso__name_len(h->ms.map->dso);
-		hists__new_col_len(hists, HISTC_DSO, len);
-	}
-
-	if (h->parent)
-		hists__new_col_len(hists, HISTC_PARENT, h->parent->namelen);
-
-	if (h->branch_info) {
-		if (h->branch_info->from.sym) {
-			symlen = (int)h->branch_info->from.sym->namelen + 4;
-			if (verbose)
-				symlen += BITS_PER_LONG / 4 + 2 + 3;
-			hists__new_col_len(hists, HISTC_SYMBOL_FROM, symlen);
-
-			symlen = dso__name_len(h->branch_info->from.map->dso);
-			hists__new_col_len(hists, HISTC_DSO_FROM, symlen);
-		} else {
-			symlen = unresolved_col_width + 4 + 2;
-			hists__new_col_len(hists, HISTC_SYMBOL_FROM, symlen);
-			hists__set_unres_dso_col_len(hists, HISTC_DSO_FROM);
-		}
-
-		if (h->branch_info->to.sym) {
-			symlen = (int)h->branch_info->to.sym->namelen + 4;
-			if (verbose)
-				symlen += BITS_PER_LONG / 4 + 2 + 3;
-			hists__new_col_len(hists, HISTC_SYMBOL_TO, symlen);
-
-			symlen = dso__name_len(h->branch_info->to.map->dso);
-			hists__new_col_len(hists, HISTC_DSO_TO, symlen);
-		} else {
-			symlen = unresolved_col_width + 4 + 2;
-			hists__new_col_len(hists, HISTC_SYMBOL_TO, symlen);
-			hists__set_unres_dso_col_len(hists, HISTC_DSO_TO);
-		}
-	}
-
-	if (h->mem_info) {
-		if (h->mem_info->daddr.sym) {
-			symlen = (int)h->mem_info->daddr.sym->namelen + 4
-			       + unresolved_col_width + 2;
-			hists__new_col_len(hists, HISTC_MEM_DADDR_SYMBOL,
-					   symlen);
-		} else {
-			symlen = unresolved_col_width + 4 + 2;
-			hists__new_col_len(hists, HISTC_MEM_DADDR_SYMBOL,
-					   symlen);
-		}
-		if (h->mem_info->daddr.map) {
-			symlen = dso__name_len(h->mem_info->daddr.map->dso);
-			hists__new_col_len(hists, HISTC_MEM_DADDR_DSO,
-					   symlen);
-		} else {
-			symlen = unresolved_col_width + 4 + 2;
-			hists__set_unres_dso_col_len(hists, HISTC_MEM_DADDR_DSO);
-		}
-	} else {
-		symlen = unresolved_col_width + 4 + 2;
-		hists__new_col_len(hists, HISTC_MEM_DADDR_SYMBOL, symlen);
-		hists__set_unres_dso_col_len(hists, HISTC_MEM_DADDR_DSO);
-	}
-
-	hists__new_col_len(hists, HISTC_MEM_LOCKED, 6);
-	hists__new_col_len(hists, HISTC_MEM_TLB, 22);
-	hists__new_col_len(hists, HISTC_MEM_SNOOP, 12);
-	hists__new_col_len(hists, HISTC_MEM_LVL, 21 + 3);
-	hists__new_col_len(hists, HISTC_LOCAL_WEIGHT, 12);
-	hists__new_col_len(hists, HISTC_GLOBAL_WEIGHT, 12);
-}
-
-void hists__output_recalc_col_len(struct hists *hists, int max_rows)
-{
-	struct rb_node *next = rb_first(&hists->entries);
-	struct hist_entry *n;
-	int row = 0;
-
-	hists__reset_col_len(hists);
-
-	while (next && row++ < max_rows) {
-		n = rb_entry(next, struct hist_entry, rb_node);
-		if (!n->filtered)
-			hists__calc_col_len(hists, n);
-		next = rb_next(&n->rb_node);
-	}
-}
-
-static void hist_entry__add_cpumode_period(struct hist_entry *he,
-					   unsigned int cpumode, u64 period)
-{
-	switch (cpumode) {
-	case PERF_RECORD_MISC_KERNEL:
-		he->stat.period_sys += period;
-		break;
-	case PERF_RECORD_MISC_USER:
-		he->stat.period_us += period;
-		break;
-	case PERF_RECORD_MISC_GUEST_KERNEL:
-		he->stat.period_guest_sys += period;
-		break;
-	case PERF_RECORD_MISC_GUEST_USER:
-		he->stat.period_guest_us += period;
-		break;
-	default:
-		break;
-	}
-}
-
-static void he_stat__add_period(struct he_stat *he_stat, u64 period,
-				u64 weight)
-{
-
-	he_stat->period		+= period;
-	he_stat->weight		+= weight;
-	he_stat->nr_events	+= 1;
-}
-
-static void he_stat__add_stat(struct he_stat *dest, struct he_stat *src)
-{
-	dest->period		+= src->period;
-	dest->period_sys	+= src->period_sys;
-	dest->period_us		+= src->period_us;
-	dest->period_guest_sys	+= src->period_guest_sys;
-	dest->period_guest_us	+= src->period_guest_us;
-	dest->nr_events		+= src->nr_events;
-	dest->weight		+= src->weight;
-}
-
-static void hist_entry__decay(struct hist_entry *he)
-{
-	he->stat.period = (he->stat.period * 7) / 8;
-	he->stat.nr_events = (he->stat.nr_events * 7) / 8;
-	/* XXX need decay for weight too? */
-}
-
-static bool hists__decay_entry(struct hists *hists, struct hist_entry *he)
-{
-	u64 prev_period = he->stat.period;
-
-	if (prev_period == 0)
-		return true;
-
-	hist_entry__decay(he);
-
-	if (!he->filtered)
-		hists->stats.total_period -= prev_period - he->stat.period;
-
-	return he->stat.period == 0;
-}
-
-void hists__decay_entries(struct hists *hists, bool zap_user, bool zap_kernel)
-{
-	struct rb_node *next = rb_first(&hists->entries);
-	struct hist_entry *n;
-
-	while (next) {
-		n = rb_entry(next, struct hist_entry, rb_node);
-		next = rb_next(&n->rb_node);
-		/*
-		 * We may be annotating this, for instance, so keep it here in
-		 * case some it gets new samples, we'll eventually free it when
-		 * the user stops browsing and it agains gets fully decayed.
-		 */
-		if (((zap_user && n->level == '.') ||
-		     (zap_kernel && n->level != '.') ||
-		     hists__decay_entry(hists, n)) &&
-		    !n->used) {
-			rb_erase(&n->rb_node, &hists->entries);
-
-			if (sort__need_collapse)
-				rb_erase(&n->rb_node_in, &hists->entries_collapsed);
-
-			hist_entry__free(n);
-			--hists->nr_entries;
-		}
-	}
-}
-
-/*
- * histogram, sorted on item, collects periods
- */
-
-static struct hist_entry *hist_entry__new(struct hist_entry *template)
-{
-	size_t callchain_size = symbol_conf.use_callchain ? sizeof(struct callchain_root) : 0;
-	struct hist_entry *he = zalloc(sizeof(*he) + callchain_size);
-
-	if (he != NULL) {
-		*he = *template;
-
-		if (he->ms.map)
-			he->ms.map->referenced = true;
-
-		if (he->branch_info) {
-			/*
-			 * This branch info is (a part of) allocated from
-			 * machine__resolve_bstack() and will be freed after
-			 * adding new entries.  So we need to save a copy.
-			 */
-			he->branch_info = malloc(sizeof(*he->branch_info));
-			if (he->branch_info == NULL) {
-				free(he);
-				return NULL;
-			}
-
-			memcpy(he->branch_info, template->branch_info,
-			       sizeof(*he->branch_info));
-
-			if (he->branch_info->from.map)
-				he->branch_info->from.map->referenced = true;
-			if (he->branch_info->to.map)
-				he->branch_info->to.map->referenced = true;
-		}
-
-		if (he->mem_info) {
-			if (he->mem_info->iaddr.map)
-				he->mem_info->iaddr.map->referenced = true;
-			if (he->mem_info->daddr.map)
-				he->mem_info->daddr.map->referenced = true;
-		}
-
-		if (symbol_conf.use_callchain)
-			callchain_init(he->callchain);
-
-		INIT_LIST_HEAD(&he->pairs.node);
-	}
-
-	return he;
-}
-
-void hists__inc_nr_entries(struct hists *hists, struct hist_entry *h)
-{
-	if (!h->filtered) {
-		hists__calc_col_len(hists, h);
-		++hists->nr_entries;
-		hists->stats.total_period += h->stat.period;
-	}
-}
-
-static u8 symbol__parent_filter(const struct symbol *parent)
-{
-	if (symbol_conf.exclude_other && parent == NULL)
-		return 1 << HIST_FILTER__PARENT;
-	return 0;
-}
-
-static struct hist_entry *add_hist_entry(struct hists *hists,
-				      struct hist_entry *entry,
-				      struct addr_location *al,
-				      u64 period,
-				      u64 weight)
-{
-	struct rb_node **p;
-	struct rb_node *parent = NULL;
-	struct hist_entry *he;
-	int cmp;
-
-	p = &hists->entries_in->rb_node;
-
-	while (*p != NULL) {
-		parent = *p;
-		he = rb_entry(parent, struct hist_entry, rb_node_in);
-
-		/*
-		 * Make sure that it receives arguments in a same order as
-		 * hist_entry__collapse() so that we can use an appropriate
-		 * function when searching an entry regardless which sort
-		 * keys were used.
-		 */
-		cmp = hist_entry__cmp(he, entry);
-
-		if (!cmp) {
-			he_stat__add_period(&he->stat, period, weight);
-
-			/*
-			 * This mem info was allocated from machine__resolve_mem
-			 * and will not be used anymore.
-			 */
-			free(entry->mem_info);
-
-			/* If the map of an existing hist_entry has
-			 * become out-of-date due to an exec() or
-			 * similar, update it.  Otherwise we will
-			 * mis-adjust symbol addresses when computing
-			 * the history counter to increment.
-			 */
-			if (he->ms.map != entry->ms.map) {
-				he->ms.map = entry->ms.map;
-				if (he->ms.map)
-					he->ms.map->referenced = true;
-			}
-			goto out;
-		}
-
-		if (cmp < 0)
-			p = &(*p)->rb_left;
-		else
-			p = &(*p)->rb_right;
-	}
-
-	he = hist_entry__new(entry);
-	if (!he)
-		return NULL;
-
-	rb_link_node(&he->rb_node_in, parent, p);
-	rb_insert_color(&he->rb_node_in, hists->entries_in);
-out:
-	hist_entry__add_cpumode_period(he, al->cpumode, period);
-	return he;
-}
-
-struct hist_entry *__hists__add_mem_entry(struct hists *self,
-					  struct addr_location *al,
-					  struct symbol *sym_parent,
-					  struct mem_info *mi,
-					  u64 period,
-					  u64 weight)
-{
-	struct hist_entry entry = {
-		.thread	= al->thread,
-		.ms = {
-			.map	= al->map,
-			.sym	= al->sym,
-		},
-		.stat = {
-			.period	= period,
-			.weight = weight,
-			.nr_events = 1,
-		},
-		.cpu	= al->cpu,
-		.ip	= al->addr,
-		.level	= al->level,
-		.parent = sym_parent,
-		.filtered = symbol__parent_filter(sym_parent),
-		.hists = self,
-		.mem_info = mi,
-		.branch_info = NULL,
-	};
-	return add_hist_entry(self, &entry, al, period, weight);
-}
-
-struct hist_entry *__hists__add_branch_entry(struct hists *self,
-					     struct addr_location *al,
-					     struct symbol *sym_parent,
-					     struct branch_info *bi,
-					     u64 period,
-					     u64 weight)
-{
-	struct hist_entry entry = {
-		.thread	= al->thread,
-		.ms = {
-			.map	= bi->to.map,
-			.sym	= bi->to.sym,
-		},
-		.cpu	= al->cpu,
-		.ip	= bi->to.addr,
-		.level	= al->level,
-		.stat = {
-			.period	= period,
-			.nr_events = 1,
-			.weight = weight,
-		},
-		.parent = sym_parent,
-		.filtered = symbol__parent_filter(sym_parent),
-		.branch_info = bi,
-		.hists	= self,
-		.mem_info = NULL,
-	};
-
-	return add_hist_entry(self, &entry, al, period, weight);
-}
-
-struct hist_entry *__hists__add_entry(struct hists *self,
-				      struct addr_location *al,
-				      struct symbol *sym_parent, u64 period,
-				      u64 weight)
-{
-	struct hist_entry entry = {
-		.thread	= al->thread,
-		.ms = {
-			.map	= al->map,
-			.sym	= al->sym,
-		},
-		.cpu	= al->cpu,
-		.ip	= al->addr,
-		.level	= al->level,
-		.stat = {
-			.period	= period,
-			.nr_events = 1,
-			.weight = weight,
-		},
-		.parent = sym_parent,
-		.filtered = symbol__parent_filter(sym_parent),
-		.hists	= self,
-		.branch_info = NULL,
-		.mem_info = NULL,
-	};
-
-	return add_hist_entry(self, &entry, al, period, weight);
-}
-
-int64_t
-hist_entry__cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	struct sort_entry *se;
-	int64_t cmp = 0;
-
-	list_for_each_entry(se, &hist_entry__sort_list, list) {
-		cmp = se->se_cmp(left, right);
-		if (cmp)
-			break;
-	}
-
-	return cmp;
-}
-
-int64_t
-hist_entry__collapse(struct hist_entry *left, struct hist_entry *right)
-{
-	struct sort_entry *se;
-	int64_t cmp = 0;
-
-	list_for_each_entry(se, &hist_entry__sort_list, list) {
-		int64_t (*f)(struct hist_entry *, struct hist_entry *);
-
-		f = se->se_collapse ?: se->se_cmp;
-
-		cmp = f(left, right);
-		if (cmp)
-			break;
-	}
-
-	return cmp;
-}
-
-void hist_entry__free(struct hist_entry *he)
-{
-	free(he->branch_info);
-	free(he->mem_info);
-	free(he);
-}
-
-/*
- * collapse the histogram
- */
-
-static bool hists__collapse_insert_entry(struct hists *hists __maybe_unused,
-					 struct rb_root *root,
-					 struct hist_entry *he)
-{
-	struct rb_node **p = &root->rb_node;
-	struct rb_node *parent = NULL;
-	struct hist_entry *iter;
-	int64_t cmp;
-
-	while (*p != NULL) {
-		parent = *p;
-		iter = rb_entry(parent, struct hist_entry, rb_node_in);
-
-		cmp = hist_entry__collapse(iter, he);
-
-		if (!cmp) {
-			he_stat__add_stat(&iter->stat, &he->stat);
-
-			if (symbol_conf.use_callchain) {
-				callchain_cursor_reset(&callchain_cursor);
-				callchain_merge(&callchain_cursor,
-						iter->callchain,
-						he->callchain);
-			}
-			hist_entry__free(he);
-			return false;
-		}
-
-		if (cmp < 0)
-			p = &(*p)->rb_left;
-		else
-			p = &(*p)->rb_right;
-	}
-
-	rb_link_node(&he->rb_node_in, parent, p);
-	rb_insert_color(&he->rb_node_in, root);
-	return true;
-}
-
-static struct rb_root *hists__get_rotate_entries_in(struct hists *hists)
-{
-	struct rb_root *root;
-
-	pthread_mutex_lock(&hists->lock);
-
-	root = hists->entries_in;
-	if (++hists->entries_in > &hists->entries_in_array[1])
-		hists->entries_in = &hists->entries_in_array[0];
-
-	pthread_mutex_unlock(&hists->lock);
-
-	return root;
-}
-
-static void hists__apply_filters(struct hists *hists, struct hist_entry *he)
-{
-	hists__filter_entry_by_dso(hists, he);
-	hists__filter_entry_by_thread(hists, he);
-	hists__filter_entry_by_symbol(hists, he);
-}
-
-void hists__collapse_resort(struct hists *hists)
-{
-	struct rb_root *root;
-	struct rb_node *next;
-	struct hist_entry *n;
-
-	if (!sort__need_collapse)
-		return;
-
-	root = hists__get_rotate_entries_in(hists);
-	next = rb_first(root);
-
-	while (next) {
-		if (session_done())
-			break;
-		n = rb_entry(next, struct hist_entry, rb_node_in);
-		next = rb_next(&n->rb_node_in);
-
-		rb_erase(&n->rb_node_in, root);
-		if (hists__collapse_insert_entry(hists, &hists->entries_collapsed, n)) {
-			/*
-			 * If it wasn't combined with one of the entries already
-			 * collapsed, we need to apply the filters that may have
-			 * been set by, say, the hist_browser.
-			 */
-			hists__apply_filters(hists, n);
-		}
-	}
-}
-
-/*
- * reverse the map, sort on period.
- */
-
-static int period_cmp(u64 period_a, u64 period_b)
-{
-	if (period_a > period_b)
-		return 1;
-	if (period_a < period_b)
-		return -1;
-	return 0;
-}
-
-static int hist_entry__sort_on_period(struct hist_entry *a,
-				      struct hist_entry *b)
-{
-	int ret;
-	int i, nr_members;
-	struct perf_evsel *evsel;
-	struct hist_entry *pair;
-	u64 *periods_a, *periods_b;
-
-	ret = period_cmp(a->stat.period, b->stat.period);
-	if (ret || !symbol_conf.event_group)
-		return ret;
-
-	evsel = hists_to_evsel(a->hists);
-	nr_members = evsel->nr_members;
-	if (nr_members <= 1)
-		return ret;
-
-	periods_a = zalloc(sizeof(periods_a) * nr_members);
-	periods_b = zalloc(sizeof(periods_b) * nr_members);
-
-	if (!periods_a || !periods_b)
-		goto out;
-
-	list_for_each_entry(pair, &a->pairs.head, pairs.node) {
-		evsel = hists_to_evsel(pair->hists);
-		periods_a[perf_evsel__group_idx(evsel)] = pair->stat.period;
-	}
-
-	list_for_each_entry(pair, &b->pairs.head, pairs.node) {
-		evsel = hists_to_evsel(pair->hists);
-		periods_b[perf_evsel__group_idx(evsel)] = pair->stat.period;
-	}
-
-	for (i = 1; i < nr_members; i++) {
-		ret = period_cmp(periods_a[i], periods_b[i]);
-		if (ret)
-			break;
-	}
-
-out:
-	free(periods_a);
-	free(periods_b);
-
-	return ret;
-}
-
-static void __hists__insert_output_entry(struct rb_root *entries,
-					 struct hist_entry *he,
-					 u64 min_callchain_hits)
-{
-	struct rb_node **p = &entries->rb_node;
-	struct rb_node *parent = NULL;
-	struct hist_entry *iter;
-
-	if (symbol_conf.use_callchain)
-		callchain_param.sort(&he->sorted_chain, he->callchain,
-				      min_callchain_hits, &callchain_param);
-
-	while (*p != NULL) {
-		parent = *p;
-		iter = rb_entry(parent, struct hist_entry, rb_node);
-
-		if (hist_entry__sort_on_period(he, iter) > 0)
-			p = &(*p)->rb_left;
-		else
-			p = &(*p)->rb_right;
-	}
-
-	rb_link_node(&he->rb_node, parent, p);
-	rb_insert_color(&he->rb_node, entries);
-}
-
-void hists__output_resort(struct hists *hists)
-{
-	struct rb_root *root;
-	struct rb_node *next;
-	struct hist_entry *n;
-	u64 min_callchain_hits;
-
-	min_callchain_hits = hists->stats.total_period * (callchain_param.min_percent / 100);
-
-	if (sort__need_collapse)
-		root = &hists->entries_collapsed;
-	else
-		root = hists->entries_in;
-
-	next = rb_first(root);
-	hists->entries = RB_ROOT;
-
-	hists->nr_entries = 0;
-	hists->stats.total_period = 0;
-	hists__reset_col_len(hists);
-
-	while (next) {
-		n = rb_entry(next, struct hist_entry, rb_node_in);
-		next = rb_next(&n->rb_node_in);
-
-		__hists__insert_output_entry(&hists->entries, n, min_callchain_hits);
-		hists__inc_nr_entries(hists, n);
-	}
-}
-
-static void hists__remove_entry_filter(struct hists *hists, struct hist_entry *h,
-				       enum hist_filter filter)
-{
-	h->filtered &= ~(1 << filter);
-	if (h->filtered)
-		return;
-
-	++hists->nr_entries;
-	if (h->ms.unfolded)
-		hists->nr_entries += h->nr_rows;
-	h->row_offset = 0;
-	hists->stats.total_period += h->stat.period;
-	hists->stats.nr_events[PERF_RECORD_SAMPLE] += h->stat.nr_events;
-
-	hists__calc_col_len(hists, h);
-}
-
-
-static bool hists__filter_entry_by_dso(struct hists *hists,
-				       struct hist_entry *he)
-{
-	if (hists->dso_filter != NULL &&
-	    (he->ms.map == NULL || he->ms.map->dso != hists->dso_filter)) {
-		he->filtered |= (1 << HIST_FILTER__DSO);
-		return true;
-	}
-
-	return false;
-}
-
-void hists__filter_by_dso(struct hists *hists)
-{
-	struct rb_node *nd;
-
-	hists->nr_entries = hists->stats.total_period = 0;
-	hists->stats.nr_events[PERF_RECORD_SAMPLE] = 0;
-	hists__reset_col_len(hists);
-
-	for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) {
-		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
-
-		if (symbol_conf.exclude_other && !h->parent)
-			continue;
-
-		if (hists__filter_entry_by_dso(hists, h))
-			continue;
-
-		hists__remove_entry_filter(hists, h, HIST_FILTER__DSO);
-	}
-}
-
-static bool hists__filter_entry_by_thread(struct hists *hists,
-					  struct hist_entry *he)
-{
-	if (hists->thread_filter != NULL &&
-	    he->thread != hists->thread_filter) {
-		he->filtered |= (1 << HIST_FILTER__THREAD);
-		return true;
-	}
-
-	return false;
-}
-
-void hists__filter_by_thread(struct hists *hists)
-{
-	struct rb_node *nd;
-
-	hists->nr_entries = hists->stats.total_period = 0;
-	hists->stats.nr_events[PERF_RECORD_SAMPLE] = 0;
-	hists__reset_col_len(hists);
-
-	for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) {
-		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
-
-		if (hists__filter_entry_by_thread(hists, h))
-			continue;
-
-		hists__remove_entry_filter(hists, h, HIST_FILTER__THREAD);
-	}
-}
-
-static bool hists__filter_entry_by_symbol(struct hists *hists,
-					  struct hist_entry *he)
-{
-	if (hists->symbol_filter_str != NULL &&
-	    (!he->ms.sym || strstr(he->ms.sym->name,
-				   hists->symbol_filter_str) == NULL)) {
-		he->filtered |= (1 << HIST_FILTER__SYMBOL);
-		return true;
-	}
-
-	return false;
-}
-
-void hists__filter_by_symbol(struct hists *hists)
-{
-	struct rb_node *nd;
-
-	hists->nr_entries = hists->stats.total_period = 0;
-	hists->stats.nr_events[PERF_RECORD_SAMPLE] = 0;
-	hists__reset_col_len(hists);
-
-	for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) {
-		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
-
-		if (hists__filter_entry_by_symbol(hists, h))
-			continue;
-
-		hists__remove_entry_filter(hists, h, HIST_FILTER__SYMBOL);
-	}
-}
-
-int hist_entry__inc_addr_samples(struct hist_entry *he, int evidx, u64 ip)
-{
-	return symbol__inc_addr_samples(he->ms.sym, he->ms.map, evidx, ip);
-}
-
-int hist_entry__annotate(struct hist_entry *he, size_t privsize)
-{
-	return symbol__annotate(he->ms.sym, he->ms.map, privsize);
-}
-
-void events_stats__inc(struct events_stats *stats, u32 type)
-{
-	++stats->nr_events[0];
-	++stats->nr_events[type];
-}
-
-void hists__inc_nr_events(struct hists *hists, u32 type)
-{
-	events_stats__inc(&hists->stats, type);
-}
-
-static struct hist_entry *hists__add_dummy_entry(struct hists *hists,
-						 struct hist_entry *pair)
-{
-	struct rb_root *root;
-	struct rb_node **p;
-	struct rb_node *parent = NULL;
-	struct hist_entry *he;
-	int cmp;
-
-	if (sort__need_collapse)
-		root = &hists->entries_collapsed;
-	else
-		root = hists->entries_in;
-
-	p = &root->rb_node;
-
-	while (*p != NULL) {
-		parent = *p;
-		he = rb_entry(parent, struct hist_entry, rb_node_in);
-
-		cmp = hist_entry__collapse(he, pair);
-
-		if (!cmp)
-			goto out;
-
-		if (cmp < 0)
-			p = &(*p)->rb_left;
-		else
-			p = &(*p)->rb_right;
-	}
-
-	he = hist_entry__new(pair);
-	if (he) {
-		memset(&he->stat, 0, sizeof(he->stat));
-		he->hists = hists;
-		rb_link_node(&he->rb_node_in, parent, p);
-		rb_insert_color(&he->rb_node_in, root);
-		hists__inc_nr_entries(hists, he);
-		he->dummy = true;
-	}
-out:
-	return he;
-}
-
-static struct hist_entry *hists__find_entry(struct hists *hists,
-					    struct hist_entry *he)
-{
-	struct rb_node *n;
-
-	if (sort__need_collapse)
-		n = hists->entries_collapsed.rb_node;
-	else
-		n = hists->entries_in->rb_node;
-
-	while (n) {
-		struct hist_entry *iter = rb_entry(n, struct hist_entry, rb_node_in);
-		int64_t cmp = hist_entry__collapse(iter, he);
-
-		if (cmp < 0)
-			n = n->rb_left;
-		else if (cmp > 0)
-			n = n->rb_right;
-		else
-			return iter;
-	}
-
-	return NULL;
-}
-
-/*
- * Look for pairs to link to the leader buckets (hist_entries):
- */
-void hists__match(struct hists *leader, struct hists *other)
-{
-	struct rb_root *root;
-	struct rb_node *nd;
-	struct hist_entry *pos, *pair;
-
-	if (sort__need_collapse)
-		root = &leader->entries_collapsed;
-	else
-		root = leader->entries_in;
-
-	for (nd = rb_first(root); nd; nd = rb_next(nd)) {
-		pos  = rb_entry(nd, struct hist_entry, rb_node_in);
-		pair = hists__find_entry(other, pos);
-
-		if (pair)
-			hist_entry__add_pair(pair, pos);
-	}
-}
-
-/*
- * Look for entries in the other hists that are not present in the leader, if
- * we find them, just add a dummy entry on the leader hists, with period=0,
- * nr_events=0, to serve as the list header.
- */
-int hists__link(struct hists *leader, struct hists *other)
-{
-	struct rb_root *root;
-	struct rb_node *nd;
-	struct hist_entry *pos, *pair;
-
-	if (sort__need_collapse)
-		root = &other->entries_collapsed;
-	else
-		root = other->entries_in;
-
-	for (nd = rb_first(root); nd; nd = rb_next(nd)) {
-		pos = rb_entry(nd, struct hist_entry, rb_node_in);
-
-		if (!hist_entry__has_pairs(pos)) {
-			pair = hists__add_dummy_entry(leader, pos);
-			if (pair == NULL)
-				return -1;
-			hist_entry__add_pair(pos, pair);
-		}
-	}
-
-	return 0;
-}
diff --git a/src/tools/perf/util/hist.h b/src/tools/perf/util/hist.h
deleted file mode 100644
index ce8dc61..0000000
--- a/src/tools/perf/util/hist.h
+++ /dev/null
@@ -1,256 +0,0 @@
-#ifndef __PERF_HIST_H
-#define __PERF_HIST_H
-
-#include <linux/types.h>
-#include <pthread.h>
-#include "callchain.h"
-#include "header.h"
-#include "color.h"
-
-extern struct callchain_param callchain_param;
-
-struct hist_entry;
-struct addr_location;
-struct symbol;
-
-/*
- * The kernel collects the number of events it couldn't send in a stretch and
- * when possible sends this number in a PERF_RECORD_LOST event. The number of
- * such "chunks" of lost events is stored in .nr_events[PERF_EVENT_LOST] while
- * total_lost tells exactly how many events the kernel in fact lost, i.e. it is
- * the sum of all struct lost_event.lost fields reported.
- *
- * The total_period is needed because by default auto-freq is used, so
- * multipling nr_events[PERF_EVENT_SAMPLE] by a frequency isn't possible to get
- * the total number of low level events, it is necessary to to sum all struct
- * sample_event.period and stash the result in total_period.
- */
-struct events_stats {
-	u64 total_period;
-	u64 total_lost;
-	u64 total_invalid_chains;
-	u32 nr_events[PERF_RECORD_HEADER_MAX];
-	u32 nr_lost_warned;
-	u32 nr_unknown_events;
-	u32 nr_invalid_chains;
-	u32 nr_unknown_id;
-	u32 nr_unprocessable_samples;
-};
-
-enum hist_column {
-	HISTC_SYMBOL,
-	HISTC_DSO,
-	HISTC_THREAD,
-	HISTC_COMM,
-	HISTC_PARENT,
-	HISTC_CPU,
-	HISTC_SRCLINE,
-	HISTC_MISPREDICT,
-	HISTC_SYMBOL_FROM,
-	HISTC_SYMBOL_TO,
-	HISTC_DSO_FROM,
-	HISTC_DSO_TO,
-	HISTC_LOCAL_WEIGHT,
-	HISTC_GLOBAL_WEIGHT,
-	HISTC_MEM_DADDR_SYMBOL,
-	HISTC_MEM_DADDR_DSO,
-	HISTC_MEM_LOCKED,
-	HISTC_MEM_TLB,
-	HISTC_MEM_LVL,
-	HISTC_MEM_SNOOP,
-	HISTC_NR_COLS, /* Last entry */
-};
-
-struct thread;
-struct dso;
-
-struct hists {
-	struct rb_root		entries_in_array[2];
-	struct rb_root		*entries_in;
-	struct rb_root		entries;
-	struct rb_root		entries_collapsed;
-	u64			nr_entries;
-	const struct thread	*thread_filter;
-	const struct dso	*dso_filter;
-	const char		*uid_filter_str;
-	const char		*symbol_filter_str;
-	pthread_mutex_t		lock;
-	struct events_stats	stats;
-	u64			event_stream;
-	u16			col_len[HISTC_NR_COLS];
-};
-
-struct hist_entry *__hists__add_entry(struct hists *self,
-				      struct addr_location *al,
-				      struct symbol *parent, u64 period,
-				      u64 weight);
-int64_t hist_entry__cmp(struct hist_entry *left, struct hist_entry *right);
-int64_t hist_entry__collapse(struct hist_entry *left, struct hist_entry *right);
-int hist_entry__sort_snprintf(struct hist_entry *self, char *bf, size_t size,
-			      struct hists *hists);
-void hist_entry__free(struct hist_entry *);
-
-struct hist_entry *__hists__add_branch_entry(struct hists *self,
-					     struct addr_location *al,
-					     struct symbol *sym_parent,
-					     struct branch_info *bi,
-					     u64 period,
-					     u64 weight);
-
-struct hist_entry *__hists__add_mem_entry(struct hists *self,
-					  struct addr_location *al,
-					  struct symbol *sym_parent,
-					  struct mem_info *mi,
-					  u64 period,
-					  u64 weight);
-
-void hists__output_resort(struct hists *self);
-void hists__collapse_resort(struct hists *self);
-
-void hists__decay_entries(struct hists *hists, bool zap_user, bool zap_kernel);
-void hists__output_recalc_col_len(struct hists *hists, int max_rows);
-
-void hists__inc_nr_entries(struct hists *hists, struct hist_entry *h);
-void hists__inc_nr_events(struct hists *self, u32 type);
-void events_stats__inc(struct events_stats *stats, u32 type);
-size_t events_stats__fprintf(struct events_stats *stats, FILE *fp);
-
-size_t hists__fprintf(struct hists *self, bool show_header, int max_rows,
-		      int max_cols, float min_pcnt, FILE *fp);
-
-int hist_entry__inc_addr_samples(struct hist_entry *self, int evidx, u64 addr);
-int hist_entry__annotate(struct hist_entry *self, size_t privsize);
-
-void hists__filter_by_dso(struct hists *hists);
-void hists__filter_by_thread(struct hists *hists);
-void hists__filter_by_symbol(struct hists *hists);
-
-u16 hists__col_len(struct hists *self, enum hist_column col);
-void hists__set_col_len(struct hists *self, enum hist_column col, u16 len);
-bool hists__new_col_len(struct hists *self, enum hist_column col, u16 len);
-void hists__reset_col_len(struct hists *hists);
-void hists__calc_col_len(struct hists *hists, struct hist_entry *he);
-
-void hists__match(struct hists *leader, struct hists *other);
-int hists__link(struct hists *leader, struct hists *other);
-
-struct perf_hpp {
-	char *buf;
-	size_t size;
-	const char *sep;
-	void *ptr;
-};
-
-struct perf_hpp_fmt {
-	int (*header)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp);
-	int (*width)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp);
-	int (*color)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
-		     struct hist_entry *he);
-	int (*entry)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
-		     struct hist_entry *he);
-
-	struct list_head list;
-};
-
-extern struct list_head perf_hpp__list;
-
-#define perf_hpp__for_each_format(format) \
-	list_for_each_entry(format, &perf_hpp__list, list)
-
-extern struct perf_hpp_fmt perf_hpp__format[];
-
-enum {
-	/* Matches perf_hpp__format array. */
-	PERF_HPP__OVERHEAD,
-	PERF_HPP__OVERHEAD_SYS,
-	PERF_HPP__OVERHEAD_US,
-	PERF_HPP__OVERHEAD_GUEST_SYS,
-	PERF_HPP__OVERHEAD_GUEST_US,
-	PERF_HPP__SAMPLES,
-	PERF_HPP__PERIOD,
-
-	PERF_HPP__MAX_INDEX
-};
-
-void perf_hpp__init(void);
-void perf_hpp__column_register(struct perf_hpp_fmt *format);
-void perf_hpp__column_enable(unsigned col);
-
-static inline size_t perf_hpp__use_color(void)
-{
-	return !symbol_conf.field_sep;
-}
-
-static inline size_t perf_hpp__color_overhead(void)
-{
-	return perf_hpp__use_color() ?
-	       (COLOR_MAXLEN + sizeof(PERF_COLOR_RESET)) * PERF_HPP__MAX_INDEX
-	       : 0;
-}
-
-struct perf_evlist;
-
-struct hist_browser_timer {
-	void (*timer)(void *arg);
-	void *arg;
-	int refresh;
-};
-
-#ifdef SLANG_SUPPORT
-#include "../ui/keysyms.h"
-int hist_entry__tui_annotate(struct hist_entry *he, struct perf_evsel *evsel,
-			     struct hist_browser_timer *hbt);
-
-int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help,
-				  struct hist_browser_timer *hbt,
-				  float min_pcnt,
-				  struct perf_session_env *env);
-int script_browse(const char *script_opt);
-#else
-static inline
-int perf_evlist__tui_browse_hists(struct perf_evlist *evlist __maybe_unused,
-				  const char *help __maybe_unused,
-				  struct hist_browser_timer *hbt __maybe_unused,
-				  float min_pcnt __maybe_unused,
-				  struct perf_session_env *env __maybe_unused)
-{
-	return 0;
-}
-
-static inline int hist_entry__tui_annotate(struct hist_entry *self
-					   __maybe_unused,
-					   struct perf_evsel *evsel
-					   __maybe_unused,
-					   struct hist_browser_timer *hbt
-					   __maybe_unused)
-{
-	return 0;
-}
-
-static inline int script_browse(const char *script_opt __maybe_unused)
-{
-	return 0;
-}
-
-#define K_LEFT  -1000
-#define K_RIGHT -2000
-#define K_SWITCH_INPUT_DATA -3000
-#endif
-
-#ifdef GTK2_SUPPORT
-int perf_evlist__gtk_browse_hists(struct perf_evlist *evlist, const char *help,
-				  struct hist_browser_timer *hbt __maybe_unused,
-				  float min_pcnt);
-#else
-static inline
-int perf_evlist__gtk_browse_hists(struct perf_evlist *evlist __maybe_unused,
-				  const char *help __maybe_unused,
-				  struct hist_browser_timer *hbt __maybe_unused,
-				  float min_pcnt __maybe_unused)
-{
-	return 0;
-}
-#endif
-
-unsigned int hists__sort_list_width(struct hists *self);
-#endif	/* __PERF_HIST_H */
diff --git a/src/tools/perf/util/hweight.c b/src/tools/perf/util/hweight.c
deleted file mode 100644
index 5c1d0d0..0000000
--- a/src/tools/perf/util/hweight.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <linux/bitops.h>
-
-/**
- * hweightN - returns the hamming weight of a N-bit word
- * @x: the word to weigh
- *
- * The Hamming Weight of a number is the total number of bits set in it.
- */
-
-unsigned int hweight32(unsigned int w)
-{
-	unsigned int res = w - ((w >> 1) & 0x55555555);
-	res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
-	res = (res + (res >> 4)) & 0x0F0F0F0F;
-	res = res + (res >> 8);
-	return (res + (res >> 16)) & 0x000000FF;
-}
-
-unsigned long hweight64(__u64 w)
-{
-#if BITS_PER_LONG == 32
-	return hweight32((unsigned int)(w >> 32)) + hweight32((unsigned int)w);
-#elif BITS_PER_LONG == 64
-	__u64 res = w - ((w >> 1) & 0x5555555555555555ul);
-	res = (res & 0x3333333333333333ul) + ((res >> 2) & 0x3333333333333333ul);
-	res = (res + (res >> 4)) & 0x0F0F0F0F0F0F0F0Ful;
-	res = res + (res >> 8);
-	res = res + (res >> 16);
-	return (res + (res >> 32)) & 0x00000000000000FFul;
-#endif
-}
diff --git a/src/tools/perf/util/include/asm/alternative-asm.h b/src/tools/perf/util/include/asm/alternative-asm.h
deleted file mode 100644
index 6789d78..0000000
--- a/src/tools/perf/util/include/asm/alternative-asm.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef _PERF_ASM_ALTERNATIVE_ASM_H
-#define _PERF_ASM_ALTERNATIVE_ASM_H
-
-/* Just disable it so we can build arch/x86/lib/memcpy_64.S for perf bench: */
-
-#define altinstruction_entry #
-
-#endif
diff --git a/src/tools/perf/util/include/asm/asm-offsets.h b/src/tools/perf/util/include/asm/asm-offsets.h
deleted file mode 100644
index ed53894..0000000
--- a/src/tools/perf/util/include/asm/asm-offsets.h
+++ /dev/null
@@ -1 +0,0 @@
-/* stub */
diff --git a/src/tools/perf/util/include/asm/bug.h b/src/tools/perf/util/include/asm/bug.h
deleted file mode 100644
index 7fcc681..0000000
--- a/src/tools/perf/util/include/asm/bug.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef _PERF_ASM_GENERIC_BUG_H
-#define _PERF_ASM_GENERIC_BUG_H
-
-#define __WARN_printf(arg...)	do { fprintf(stderr, arg); } while (0)
-
-#define WARN(condition, format...) ({		\
-	int __ret_warn_on = !!(condition);	\
-	if (unlikely(__ret_warn_on))		\
-		__WARN_printf(format);		\
-	unlikely(__ret_warn_on);		\
-})
-
-#define WARN_ONCE(condition, format...)	({	\
-	static int __warned;			\
-	int __ret_warn_once = !!(condition);	\
-						\
-	if (unlikely(__ret_warn_once))		\
-		if (WARN(!__warned, format)) 	\
-			__warned = 1;		\
-	unlikely(__ret_warn_once);		\
-})
-#endif
diff --git a/src/tools/perf/util/include/asm/cpufeature.h b/src/tools/perf/util/include/asm/cpufeature.h
deleted file mode 100644
index acffd5e..0000000
--- a/src/tools/perf/util/include/asm/cpufeature.h
+++ /dev/null
@@ -1,9 +0,0 @@
-
-#ifndef PERF_CPUFEATURE_H
-#define PERF_CPUFEATURE_H
-
-/* cpufeature.h ... dummy header file for including arch/x86/lib/memcpy_64.S */
-
-#define X86_FEATURE_REP_GOOD 0
-
-#endif	/* PERF_CPUFEATURE_H */
diff --git a/src/tools/perf/util/include/asm/dwarf2.h b/src/tools/perf/util/include/asm/dwarf2.h
deleted file mode 100644
index afe3819..0000000
--- a/src/tools/perf/util/include/asm/dwarf2.h
+++ /dev/null
@@ -1,13 +0,0 @@
-
-#ifndef PERF_DWARF2_H
-#define PERF_DWARF2_H
-
-/* dwarf2.h ... dummy header file for including arch/x86/lib/mem{cpy,set}_64.S */
-
-#define CFI_STARTPROC
-#define CFI_ENDPROC
-#define CFI_REMEMBER_STATE
-#define CFI_RESTORE_STATE
-
-#endif	/* PERF_DWARF2_H */
-
diff --git a/src/tools/perf/util/include/asm/hweight.h b/src/tools/perf/util/include/asm/hweight.h
deleted file mode 100644
index 36cf26d..0000000
--- a/src/tools/perf/util/include/asm/hweight.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef PERF_HWEIGHT_H
-#define PERF_HWEIGHT_H
-
-#include <linux/types.h>
-unsigned int hweight32(unsigned int w);
-unsigned long hweight64(__u64 w);
-
-#endif /* PERF_HWEIGHT_H */
diff --git a/src/tools/perf/util/include/asm/swab.h b/src/tools/perf/util/include/asm/swab.h
deleted file mode 100644
index ed53894..0000000
--- a/src/tools/perf/util/include/asm/swab.h
+++ /dev/null
@@ -1 +0,0 @@
-/* stub */
diff --git a/src/tools/perf/util/include/asm/system.h b/src/tools/perf/util/include/asm/system.h
deleted file mode 100644
index 710cecc..0000000
--- a/src/tools/perf/util/include/asm/system.h
+++ /dev/null
@@ -1 +0,0 @@
-/* Empty */
diff --git a/src/tools/perf/util/include/asm/uaccess.h b/src/tools/perf/util/include/asm/uaccess.h
deleted file mode 100644
index d0f72b8..0000000
--- a/src/tools/perf/util/include/asm/uaccess.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef _PERF_ASM_UACCESS_H_
-#define _PERF_ASM_UACCESS_H_
-
-#define __get_user(src, dest)						\
-({									\
-	(src) = *dest;							\
-	0;								\
-})
-
-#define get_user	__get_user
-
-#define access_ok(type, addr, size)	1
-
-#endif
diff --git a/src/tools/perf/util/include/asm/unistd_32.h b/src/tools/perf/util/include/asm/unistd_32.h
deleted file mode 100644
index 8b13789..0000000
--- a/src/tools/perf/util/include/asm/unistd_32.h
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/tools/perf/util/include/asm/unistd_64.h b/src/tools/perf/util/include/asm/unistd_64.h
deleted file mode 100644
index 8b13789..0000000
--- a/src/tools/perf/util/include/asm/unistd_64.h
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/tools/perf/util/include/dwarf-regs.h b/src/tools/perf/util/include/dwarf-regs.h
deleted file mode 100644
index cf6727e..0000000
--- a/src/tools/perf/util/include/dwarf-regs.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef _PERF_DWARF_REGS_H_
-#define _PERF_DWARF_REGS_H_
-
-#ifdef DWARF_SUPPORT
-const char *get_arch_regstr(unsigned int n);
-#endif
-
-#endif
diff --git a/src/tools/perf/util/include/linux/bitmap.h b/src/tools/perf/util/include/linux/bitmap.h
deleted file mode 100644
index bb162e4..0000000
--- a/src/tools/perf/util/include/linux/bitmap.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef _PERF_BITOPS_H
-#define _PERF_BITOPS_H
-
-#include <string.h>
-#include <linux/bitops.h>
-
-int __bitmap_weight(const unsigned long *bitmap, int bits);
-void __bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
-		 const unsigned long *bitmap2, int bits);
-
-#define BITMAP_LAST_WORD_MASK(nbits)					\
-(									\
-	((nbits) % BITS_PER_LONG) ?					\
-		(1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL		\
-)
-
-#define small_const_nbits(nbits) \
-	(__builtin_constant_p(nbits) && (nbits) <= BITS_PER_LONG)
-
-static inline void bitmap_zero(unsigned long *dst, int nbits)
-{
-	if (small_const_nbits(nbits))
-		*dst = 0UL;
-	else {
-		int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
-		memset(dst, 0, len);
-	}
-}
-
-static inline int bitmap_weight(const unsigned long *src, int nbits)
-{
-	if (small_const_nbits(nbits))
-		return hweight_long(*src & BITMAP_LAST_WORD_MASK(nbits));
-	return __bitmap_weight(src, nbits);
-}
-
-static inline void bitmap_or(unsigned long *dst, const unsigned long *src1,
-			     const unsigned long *src2, int nbits)
-{
-	if (small_const_nbits(nbits))
-		*dst = *src1 | *src2;
-	else
-		__bitmap_or(dst, src1, src2, nbits);
-}
-
-#endif /* _PERF_BITOPS_H */
diff --git a/src/tools/perf/util/include/linux/bitops.h b/src/tools/perf/util/include/linux/bitops.h
deleted file mode 100644
index 45cf10a..0000000
--- a/src/tools/perf/util/include/linux/bitops.h
+++ /dev/null
@@ -1,158 +0,0 @@
-#ifndef _PERF_LINUX_BITOPS_H_
-#define _PERF_LINUX_BITOPS_H_
-
-#include <linux/kernel.h>
-#include <linux/compiler.h>
-#include <asm/hweight.h>
-
-#ifndef __WORDSIZE
-#define __WORDSIZE (__SIZEOF_LONG__ * 8)
-#endif
-
-#define BITS_PER_LONG __WORDSIZE
-#define BITS_PER_BYTE           8
-#define BITS_TO_LONGS(nr)       DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
-#define BITS_TO_U64(nr)         DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u64))
-#define BITS_TO_U32(nr)         DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u32))
-#define BITS_TO_BYTES(nr)       DIV_ROUND_UP(nr, BITS_PER_BYTE)
-
-#define for_each_set_bit(bit, addr, size) \
-	for ((bit) = find_first_bit((addr), (size));		\
-	     (bit) < (size);					\
-	     (bit) = find_next_bit((addr), (size), (bit) + 1))
-
-/* same as for_each_set_bit() but use bit as value to start with */
-#define for_each_set_bit_from(bit, addr, size) \
-	for ((bit) = find_next_bit((addr), (size), (bit));	\
-	     (bit) < (size);					\
-	     (bit) = find_next_bit((addr), (size), (bit) + 1))
-
-static inline void set_bit(int nr, unsigned long *addr)
-{
-	addr[nr / BITS_PER_LONG] |= 1UL << (nr % BITS_PER_LONG);
-}
-
-static inline void clear_bit(int nr, unsigned long *addr)
-{
-	addr[nr / BITS_PER_LONG] &= ~(1UL << (nr % BITS_PER_LONG));
-}
-
-static __always_inline int test_bit(unsigned int nr, const unsigned long *addr)
-{
-	return ((1UL << (nr % BITS_PER_LONG)) &
-		(((unsigned long *)addr)[nr / BITS_PER_LONG])) != 0;
-}
-
-static inline unsigned long hweight_long(unsigned long w)
-{
-	return sizeof(w) == 4 ? hweight32(w) : hweight64(w);
-}
-
-#define BITOP_WORD(nr)		((nr) / BITS_PER_LONG)
-
-/**
- * __ffs - find first bit in word.
- * @word: The word to search
- *
- * Undefined if no bit exists, so code should check against 0 first.
- */
-static __always_inline unsigned long __ffs(unsigned long word)
-{
-	int num = 0;
-
-#if BITS_PER_LONG == 64
-	if ((word & 0xffffffff) == 0) {
-		num += 32;
-		word >>= 32;
-	}
-#endif
-	if ((word & 0xffff) == 0) {
-		num += 16;
-		word >>= 16;
-	}
-	if ((word & 0xff) == 0) {
-		num += 8;
-		word >>= 8;
-	}
-	if ((word & 0xf) == 0) {
-		num += 4;
-		word >>= 4;
-	}
-	if ((word & 0x3) == 0) {
-		num += 2;
-		word >>= 2;
-	}
-	if ((word & 0x1) == 0)
-		num += 1;
-	return num;
-}
-
-/*
- * Find the first set bit in a memory region.
- */
-static inline unsigned long
-find_first_bit(const unsigned long *addr, unsigned long size)
-{
-	const unsigned long *p = addr;
-	unsigned long result = 0;
-	unsigned long tmp;
-
-	while (size & ~(BITS_PER_LONG-1)) {
-		if ((tmp = *(p++)))
-			goto found;
-		result += BITS_PER_LONG;
-		size -= BITS_PER_LONG;
-	}
-	if (!size)
-		return result;
-
-	tmp = (*p) & (~0UL >> (BITS_PER_LONG - size));
-	if (tmp == 0UL)		/* Are any bits set? */
-		return result + size;	/* Nope. */
-found:
-	return result + __ffs(tmp);
-}
-
-/*
- * Find the next set bit in a memory region.
- */
-static inline unsigned long
-find_next_bit(const unsigned long *addr, unsigned long size, unsigned long offset)
-{
-	const unsigned long *p = addr + BITOP_WORD(offset);
-	unsigned long result = offset & ~(BITS_PER_LONG-1);
-	unsigned long tmp;
-
-	if (offset >= size)
-		return size;
-	size -= result;
-	offset %= BITS_PER_LONG;
-	if (offset) {
-		tmp = *(p++);
-		tmp &= (~0UL << offset);
-		if (size < BITS_PER_LONG)
-			goto found_first;
-		if (tmp)
-			goto found_middle;
-		size -= BITS_PER_LONG;
-		result += BITS_PER_LONG;
-	}
-	while (size & ~(BITS_PER_LONG-1)) {
-		if ((tmp = *(p++)))
-			goto found_middle;
-		result += BITS_PER_LONG;
-		size -= BITS_PER_LONG;
-	}
-	if (!size)
-		return result;
-	tmp = *p;
-
-found_first:
-	tmp &= (~0UL >> (BITS_PER_LONG - size));
-	if (tmp == 0UL)		/* Are any bits set? */
-		return result + size;	/* Nope. */
-found_middle:
-	return result + __ffs(tmp);
-}
-
-#endif
diff --git a/src/tools/perf/util/include/linux/compiler.h b/src/tools/perf/util/include/linux/compiler.h
deleted file mode 100644
index 96b919d..0000000
--- a/src/tools/perf/util/include/linux/compiler.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef _PERF_LINUX_COMPILER_H_
-#define _PERF_LINUX_COMPILER_H_
-
-#ifndef __always_inline
-#define __always_inline	inline
-#endif
-#define __user
-#ifndef __attribute_const__
-#define __attribute_const__
-#endif
-
-#ifndef __maybe_unused
-#define __maybe_unused		__attribute__((unused))
-#endif
-#define __packed	__attribute__((__packed__))
-
-#ifndef __force
-#define __force
-#endif
-
-#endif
diff --git a/src/tools/perf/util/include/linux/ctype.h b/src/tools/perf/util/include/linux/ctype.h
deleted file mode 100644
index a53d4ee..0000000
--- a/src/tools/perf/util/include/linux/ctype.h
+++ /dev/null
@@ -1 +0,0 @@
-#include "../util.h"
diff --git a/src/tools/perf/util/include/linux/export.h b/src/tools/perf/util/include/linux/export.h
deleted file mode 100644
index b43e2dc..0000000
--- a/src/tools/perf/util/include/linux/export.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef PERF_LINUX_MODULE_H
-#define PERF_LINUX_MODULE_H
-
-#define EXPORT_SYMBOL(name)
-
-#endif
diff --git a/src/tools/perf/util/include/linux/hash.h b/src/tools/perf/util/include/linux/hash.h
deleted file mode 100644
index 201f573..0000000
--- a/src/tools/perf/util/include/linux/hash.h
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "../../../../include/linux/hash.h"
-
-#ifndef PERF_HASH_H
-#define PERF_HASH_H
-#endif
diff --git a/src/tools/perf/util/include/linux/kernel.h b/src/tools/perf/util/include/linux/kernel.h
deleted file mode 100644
index d8c927c..0000000
--- a/src/tools/perf/util/include/linux/kernel.h
+++ /dev/null
@@ -1,134 +0,0 @@
-#ifndef PERF_LINUX_KERNEL_H_
-#define PERF_LINUX_KERNEL_H_
-
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-
-#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
-
-#define PERF_ALIGN(x, a)	__PERF_ALIGN_MASK(x, (typeof(x))(a)-1)
-#define __PERF_ALIGN_MASK(x, mask)	(((x)+(mask))&~(mask))
-
-#ifndef offsetof
-#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
-#endif
-
-#ifndef container_of
-/**
- * container_of - cast a member of a structure out to the containing structure
- * @ptr:	the pointer to the member.
- * @type:	the type of the container struct this is embedded in.
- * @member:	the name of the member within the struct.
- *
- */
-#define container_of(ptr, type, member) ({			\
-	const typeof(((type *)0)->member) * __mptr = (ptr);	\
-	(type *)((char *)__mptr - offsetof(type, member)); })
-#endif
-
-#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
-
-#ifndef max
-#define max(x, y) ({				\
-	typeof(x) _max1 = (x);			\
-	typeof(y) _max2 = (y);			\
-	(void) (&_max1 == &_max2);		\
-	_max1 > _max2 ? _max1 : _max2; })
-#endif
-
-#ifndef min
-#define min(x, y) ({				\
-	typeof(x) _min1 = (x);			\
-	typeof(y) _min2 = (y);			\
-	(void) (&_min1 == &_min2);		\
-	_min1 < _min2 ? _min1 : _min2; })
-#endif
-
-#ifndef roundup
-#define roundup(x, y) (                                \
-{                                                      \
-	const typeof(y) __y = y;		       \
-	(((x) + (__y - 1)) / __y) * __y;	       \
-}                                                      \
-)
-#endif
-
-#ifndef BUG_ON
-#ifdef NDEBUG
-#define BUG_ON(cond) do { if (cond) {} } while (0)
-#else
-#define BUG_ON(cond) assert(!(cond))
-#endif
-#endif
-
-/*
- * Both need more care to handle endianness
- * (Don't use bitmap_copy_le() for now)
- */
-#define cpu_to_le64(x)	(x)
-#define cpu_to_le32(x)	(x)
-
-static inline int
-vscnprintf(char *buf, size_t size, const char *fmt, va_list args)
-{
-	int i;
-	ssize_t ssize = size;
-
-	i = vsnprintf(buf, size, fmt, args);
-
-	return (i >= ssize) ? (ssize - 1) : i;
-}
-
-static inline int scnprintf(char * buf, size_t size, const char * fmt, ...)
-{
-	va_list args;
-	ssize_t ssize = size;
-	int i;
-
-	va_start(args, fmt);
-	i = vsnprintf(buf, size, fmt, args);
-	va_end(args);
-
-	return (i >= ssize) ? (ssize - 1) : i;
-}
-
-static inline unsigned long
-simple_strtoul(const char *nptr, char **endptr, int base)
-{
-	return strtoul(nptr, endptr, base);
-}
-
-int eprintf(int level,
-	    const char *fmt, ...) __attribute__((format(printf, 2, 3)));
-
-#ifndef pr_fmt
-#define pr_fmt(fmt) fmt
-#endif
-
-#define pr_err(fmt, ...) \
-	eprintf(0, pr_fmt(fmt), ##__VA_ARGS__)
-#define pr_warning(fmt, ...) \
-	eprintf(0, pr_fmt(fmt), ##__VA_ARGS__)
-#define pr_info(fmt, ...) \
-	eprintf(0, pr_fmt(fmt), ##__VA_ARGS__)
-#define pr_debug(fmt, ...) \
-	eprintf(1, pr_fmt(fmt), ##__VA_ARGS__)
-#define pr_debugN(n, fmt, ...) \
-	eprintf(n, pr_fmt(fmt), ##__VA_ARGS__)
-#define pr_debug2(fmt, ...) pr_debugN(2, pr_fmt(fmt), ##__VA_ARGS__)
-#define pr_debug3(fmt, ...) pr_debugN(3, pr_fmt(fmt), ##__VA_ARGS__)
-#define pr_debug4(fmt, ...) pr_debugN(4, pr_fmt(fmt), ##__VA_ARGS__)
-
-/*
- * This looks more complex than it should be. But we need to
- * get the type for the ~ right in round_down (it needs to be
- * as wide as the result!), and we want to evaluate the macro
- * arguments just once each.
- */
-#define __round_mask(x, y) ((__typeof__(x))((y)-1))
-#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
-#define round_down(x, y) ((x) & ~__round_mask(x, y))
-
-#endif
diff --git a/src/tools/perf/util/include/linux/linkage.h b/src/tools/perf/util/include/linux/linkage.h
deleted file mode 100644
index 06387cf..0000000
--- a/src/tools/perf/util/include/linux/linkage.h
+++ /dev/null
@@ -1,13 +0,0 @@
-
-#ifndef PERF_LINUX_LINKAGE_H_
-#define PERF_LINUX_LINKAGE_H_
-
-/* linkage.h ... for including arch/x86/lib/memcpy_64.S */
-
-#define ENTRY(name)				\
-	.globl name;				\
-	name:
-
-#define ENDPROC(name)
-
-#endif	/* PERF_LINUX_LINKAGE_H_ */
diff --git a/src/tools/perf/util/include/linux/list.h b/src/tools/perf/util/include/linux/list.h
deleted file mode 100644
index 1d928a0..0000000
--- a/src/tools/perf/util/include/linux/list.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/prefetch.h>
-
-#include "../../../../include/linux/list.h"
-
-#ifndef PERF_LIST_H
-#define PERF_LIST_H
-/**
- * list_del_range - deletes range of entries from list.
- * @begin: first element in the range to delete from the list.
- * @end: last element in the range to delete from the list.
- * Note: list_empty on the range of entries does not return true after this,
- * the entries is in an undefined state.
- */
-static inline void list_del_range(struct list_head *begin,
-				  struct list_head *end)
-{
-	begin->prev->next = end->next;
-	end->next->prev = begin->prev;
-}
-
-/**
- * list_for_each_from	-	iterate over a list from one of its nodes
- * @pos:  the &struct list_head to use as a loop cursor, from where to start
- * @head: the head for your list.
- */
-#define list_for_each_from(pos, head) \
-	for (; pos != (head); pos = pos->next)
-#endif
diff --git a/src/tools/perf/util/include/linux/magic.h b/src/tools/perf/util/include/linux/magic.h
deleted file mode 100644
index 58b64ed..0000000
--- a/src/tools/perf/util/include/linux/magic.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef _PERF_LINUX_MAGIC_H_
-#define _PERF_LINUX_MAGIC_H_
-
-#ifndef DEBUGFS_MAGIC
-#define DEBUGFS_MAGIC          0x64626720
-#endif
-
-#ifndef SYSFS_MAGIC
-#define SYSFS_MAGIC            0x62656572
-#endif
-
-#endif
diff --git a/src/tools/perf/util/include/linux/poison.h b/src/tools/perf/util/include/linux/poison.h
deleted file mode 100644
index fef6dbc..0000000
--- a/src/tools/perf/util/include/linux/poison.h
+++ /dev/null
@@ -1 +0,0 @@
-#include "../../../../include/linux/poison.h"
diff --git a/src/tools/perf/util/include/linux/prefetch.h b/src/tools/perf/util/include/linux/prefetch.h
deleted file mode 100644
index 7841e48..0000000
--- a/src/tools/perf/util/include/linux/prefetch.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef PERF_LINUX_PREFETCH_H
-#define PERF_LINUX_PREFETCH_H
-
-static inline void prefetch(void *a __attribute__((unused))) { }
-
-#endif
diff --git a/src/tools/perf/util/include/linux/rbtree.h b/src/tools/perf/util/include/linux/rbtree.h
deleted file mode 100644
index 2a030c5..0000000
--- a/src/tools/perf/util/include/linux/rbtree.h
+++ /dev/null
@@ -1,2 +0,0 @@
-#include <stdbool.h>
-#include "../../../../include/linux/rbtree.h"
diff --git a/src/tools/perf/util/include/linux/rbtree_augmented.h b/src/tools/perf/util/include/linux/rbtree_augmented.h
deleted file mode 100644
index 9d6fcdf..0000000
--- a/src/tools/perf/util/include/linux/rbtree_augmented.h
+++ /dev/null
@@ -1,2 +0,0 @@
-#include <stdbool.h>
-#include "../../../../include/linux/rbtree_augmented.h"
diff --git a/src/tools/perf/util/include/linux/string.h b/src/tools/perf/util/include/linux/string.h
deleted file mode 100644
index 97a8007..0000000
--- a/src/tools/perf/util/include/linux/string.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#include <string.h>
-
-void *memdup(const void *src, size_t len);
-int str_append(char **s, int *len, const char *a);
diff --git a/src/tools/perf/util/include/linux/types.h b/src/tools/perf/util/include/linux/types.h
deleted file mode 100644
index eb46478..0000000
--- a/src/tools/perf/util/include/linux/types.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef _PERF_LINUX_TYPES_H_
-#define _PERF_LINUX_TYPES_H_
-
-#include <asm/types.h>
-
-#ifndef __bitwise
-#define __bitwise
-#endif
-
-#ifndef __le32
-typedef __u32 __bitwise __le32;
-#endif
-
-#define DECLARE_BITMAP(name,bits) \
-	unsigned long name[BITS_TO_LONGS(bits)]
-
-struct list_head {
-	struct list_head *next, *prev;
-};
-
-struct hlist_head {
-	struct hlist_node *first;
-};
-
-struct hlist_node {
-	struct hlist_node *next, **pprev;
-};
-
-#endif
diff --git a/src/tools/perf/util/intlist.c b/src/tools/perf/util/intlist.c
deleted file mode 100644
index 11a8d86..0000000
--- a/src/tools/perf/util/intlist.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Based on intlist.c by:
- * (c) 2009 Arnaldo Carvalho de Melo <acme@redhat.com>
- *
- * Licensed under the GPLv2.
- */
-
-#include <errno.h>
-#include <stdlib.h>
-#include <linux/compiler.h>
-
-#include "intlist.h"
-
-static struct rb_node *intlist__node_new(struct rblist *rblist __maybe_unused,
-					 const void *entry)
-{
-	int i = (int)((long)entry);
-	struct rb_node *rc = NULL;
-	struct int_node *node = malloc(sizeof(*node));
-
-	if (node != NULL) {
-		node->i = i;
-		rc = &node->rb_node;
-	}
-
-	return rc;
-}
-
-static void int_node__delete(struct int_node *ilist)
-{
-	free(ilist);
-}
-
-static void intlist__node_delete(struct rblist *rblist __maybe_unused,
-				 struct rb_node *rb_node)
-{
-	struct int_node *node = container_of(rb_node, struct int_node, rb_node);
-
-	int_node__delete(node);
-}
-
-static int intlist__node_cmp(struct rb_node *rb_node, const void *entry)
-{
-	int i = (int)((long)entry);
-	struct int_node *node = container_of(rb_node, struct int_node, rb_node);
-
-	return node->i - i;
-}
-
-int intlist__add(struct intlist *ilist, int i)
-{
-	return rblist__add_node(&ilist->rblist, (void *)((long)i));
-}
-
-void intlist__remove(struct intlist *ilist, struct int_node *node)
-{
-	rblist__remove_node(&ilist->rblist, &node->rb_node);
-}
-
-struct int_node *intlist__find(struct intlist *ilist, int i)
-{
-	struct int_node *node;
-	struct rb_node *rb_node;
-
-	if (ilist == NULL)
-		return NULL;
-
-	node = NULL;
-	rb_node = rblist__find(&ilist->rblist, (void *)((long)i));
-	if (rb_node)
-		node = container_of(rb_node, struct int_node, rb_node);
-
-	return node;
-}
-
-static int intlist__parse_list(struct intlist *ilist, const char *s)
-{
-	char *sep;
-	int err;
-
-	do {
-		long value = strtol(s, &sep, 10);
-		err = -EINVAL;
-		if (*sep != ',' && *sep != '\0')
-			break;
-		err = intlist__add(ilist, value);
-		if (err)
-			break;
-		s = sep + 1;
-	} while (*sep != '\0');
-
-	return err;
-}
-
-struct intlist *intlist__new(const char *slist)
-{
-	struct intlist *ilist = malloc(sizeof(*ilist));
-
-	if (ilist != NULL) {
-		rblist__init(&ilist->rblist);
-		ilist->rblist.node_cmp    = intlist__node_cmp;
-		ilist->rblist.node_new    = intlist__node_new;
-		ilist->rblist.node_delete = intlist__node_delete;
-
-		if (slist && intlist__parse_list(ilist, slist))
-			goto out_delete;
-	}
-
-	return ilist;
-out_delete:
-	intlist__delete(ilist);
-	return NULL;
-}
-
-void intlist__delete(struct intlist *ilist)
-{
-	if (ilist != NULL)
-		rblist__delete(&ilist->rblist);
-}
-
-struct int_node *intlist__entry(const struct intlist *ilist, unsigned int idx)
-{
-	struct int_node *node = NULL;
-	struct rb_node *rb_node;
-
-	rb_node = rblist__entry(&ilist->rblist, idx);
-	if (rb_node)
-		node = container_of(rb_node, struct int_node, rb_node);
-
-	return node;
-}
diff --git a/src/tools/perf/util/intlist.h b/src/tools/perf/util/intlist.h
deleted file mode 100644
index 62351da..0000000
--- a/src/tools/perf/util/intlist.h
+++ /dev/null
@@ -1,75 +0,0 @@
-#ifndef __PERF_INTLIST_H
-#define __PERF_INTLIST_H
-
-#include <linux/rbtree.h>
-#include <stdbool.h>
-
-#include "rblist.h"
-
-struct int_node {
-	struct rb_node rb_node;
-	int i;
-};
-
-struct intlist {
-	struct rblist rblist;
-};
-
-struct intlist *intlist__new(const char *slist);
-void intlist__delete(struct intlist *ilist);
-
-void intlist__remove(struct intlist *ilist, struct int_node *in);
-int intlist__add(struct intlist *ilist, int i);
-
-struct int_node *intlist__entry(const struct intlist *ilist, unsigned int idx);
-struct int_node *intlist__find(struct intlist *ilist, int i);
-
-static inline bool intlist__has_entry(struct intlist *ilist, int i)
-{
-	return intlist__find(ilist, i) != NULL;
-}
-
-static inline bool intlist__empty(const struct intlist *ilist)
-{
-	return rblist__empty(&ilist->rblist);
-}
-
-static inline unsigned int intlist__nr_entries(const struct intlist *ilist)
-{
-	return rblist__nr_entries(&ilist->rblist);
-}
-
-/* For intlist iteration */
-static inline struct int_node *intlist__first(struct intlist *ilist)
-{
-	struct rb_node *rn = rb_first(&ilist->rblist.entries);
-	return rn ? rb_entry(rn, struct int_node, rb_node) : NULL;
-}
-static inline struct int_node *intlist__next(struct int_node *in)
-{
-	struct rb_node *rn;
-	if (!in)
-		return NULL;
-	rn = rb_next(&in->rb_node);
-	return rn ? rb_entry(rn, struct int_node, rb_node) : NULL;
-}
-
-/**
- * intlist_for_each      - iterate over a intlist
- * @pos:	the &struct int_node to use as a loop cursor.
- * @ilist:	the &struct intlist for loop.
- */
-#define intlist__for_each(pos, ilist)	\
-	for (pos = intlist__first(ilist); pos; pos = intlist__next(pos))
-
-/**
- * intlist_for_each_safe - iterate over a intlist safe against removal of
- *                         int_node
- * @pos:	the &struct int_node to use as a loop cursor.
- * @n:		another &struct int_node to use as temporary storage.
- * @ilist:	the &struct intlist for loop.
- */
-#define intlist__for_each_safe(pos, n, ilist)	\
-	for (pos = intlist__first(ilist), n = intlist__next(pos); pos;\
-	     pos = n, n = intlist__next(n))
-#endif /* __PERF_INTLIST_H */
diff --git a/src/tools/perf/util/levenshtein.c b/src/tools/perf/util/levenshtein.c
deleted file mode 100644
index e521d15..0000000
--- a/src/tools/perf/util/levenshtein.c
+++ /dev/null
@@ -1,84 +0,0 @@
-#include "cache.h"
-#include "levenshtein.h"
-
-/*
- * This function implements the Damerau-Levenshtein algorithm to
- * calculate a distance between strings.
- *
- * Basically, it says how many letters need to be swapped, substituted,
- * deleted from, or added to string1, at least, to get string2.
- *
- * The idea is to build a distance matrix for the substrings of both
- * strings.  To avoid a large space complexity, only the last three rows
- * are kept in memory (if swaps had the same or higher cost as one deletion
- * plus one insertion, only two rows would be needed).
- *
- * At any stage, "i + 1" denotes the length of the current substring of
- * string1 that the distance is calculated for.
- *
- * row2 holds the current row, row1 the previous row (i.e. for the substring
- * of string1 of length "i"), and row0 the row before that.
- *
- * In other words, at the start of the big loop, row2[j + 1] contains the
- * Damerau-Levenshtein distance between the substring of string1 of length
- * "i" and the substring of string2 of length "j + 1".
- *
- * All the big loop does is determine the partial minimum-cost paths.
- *
- * It does so by calculating the costs of the path ending in characters
- * i (in string1) and j (in string2), respectively, given that the last
- * operation is a substition, a swap, a deletion, or an insertion.
- *
- * This implementation allows the costs to be weighted:
- *
- * - w (as in "sWap")
- * - s (as in "Substitution")
- * - a (for insertion, AKA "Add")
- * - d (as in "Deletion")
- *
- * Note that this algorithm calculates a distance _iff_ d == a.
- */
-int levenshtein(const char *string1, const char *string2,
-		int w, int s, int a, int d)
-{
-	int len1 = strlen(string1), len2 = strlen(string2);
-	int *row0 = malloc(sizeof(int) * (len2 + 1));
-	int *row1 = malloc(sizeof(int) * (len2 + 1));
-	int *row2 = malloc(sizeof(int) * (len2 + 1));
-	int i, j;
-
-	for (j = 0; j <= len2; j++)
-		row1[j] = j * a;
-	for (i = 0; i < len1; i++) {
-		int *dummy;
-
-		row2[0] = (i + 1) * d;
-		for (j = 0; j < len2; j++) {
-			/* substitution */
-			row2[j + 1] = row1[j] + s * (string1[i] != string2[j]);
-			/* swap */
-			if (i > 0 && j > 0 && string1[i - 1] == string2[j] &&
-					string1[i] == string2[j - 1] &&
-					row2[j + 1] > row0[j - 1] + w)
-				row2[j + 1] = row0[j - 1] + w;
-			/* deletion */
-			if (row2[j + 1] > row1[j + 1] + d)
-				row2[j + 1] = row1[j + 1] + d;
-			/* insertion */
-			if (row2[j + 1] > row2[j] + a)
-				row2[j + 1] = row2[j] + a;
-		}
-
-		dummy = row0;
-		row0 = row1;
-		row1 = row2;
-		row2 = dummy;
-	}
-
-	i = row1[len2];
-	free(row0);
-	free(row1);
-	free(row2);
-
-	return i;
-}
diff --git a/src/tools/perf/util/levenshtein.h b/src/tools/perf/util/levenshtein.h
deleted file mode 100644
index b0fcb6d..0000000
--- a/src/tools/perf/util/levenshtein.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef __PERF_LEVENSHTEIN_H
-#define __PERF_LEVENSHTEIN_H
-
-int levenshtein(const char *string1, const char *string2,
-	int swap_penalty, int substition_penalty,
-	int insertion_penalty, int deletion_penalty);
-
-#endif /* __PERF_LEVENSHTEIN_H */
diff --git a/src/tools/perf/util/machine.c b/src/tools/perf/util/machine.c
deleted file mode 100644
index 6188d28..0000000
--- a/src/tools/perf/util/machine.c
+++ /dev/null
@@ -1,1378 +0,0 @@
-#include "callchain.h"
-#include "debug.h"
-#include "event.h"
-#include "evsel.h"
-#include "hist.h"
-#include "machine.h"
-#include "map.h"
-#include "sort.h"
-#include "strlist.h"
-#include "thread.h"
-#include <stdbool.h>
-#include "unwind.h"
-
-int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
-{
-	map_groups__init(&machine->kmaps);
-	RB_CLEAR_NODE(&machine->rb_node);
-	INIT_LIST_HEAD(&machine->user_dsos);
-	INIT_LIST_HEAD(&machine->kernel_dsos);
-
-	machine->threads = RB_ROOT;
-	INIT_LIST_HEAD(&machine->dead_threads);
-	machine->last_match = NULL;
-
-	machine->kmaps.machine = machine;
-	machine->pid = pid;
-
-	machine->symbol_filter = NULL;
-
-	machine->root_dir = strdup(root_dir);
-	if (machine->root_dir == NULL)
-		return -ENOMEM;
-
-	if (pid != HOST_KERNEL_ID) {
-		struct thread *thread = machine__findnew_thread(machine, 0,
-								pid);
-		char comm[64];
-
-		if (thread == NULL)
-			return -ENOMEM;
-
-		snprintf(comm, sizeof(comm), "[guest/%d]", pid);
-		thread__set_comm(thread, comm);
-	}
-
-	return 0;
-}
-
-static void dsos__delete(struct list_head *dsos)
-{
-	struct dso *pos, *n;
-
-	list_for_each_entry_safe(pos, n, dsos, node) {
-		list_del(&pos->node);
-		dso__delete(pos);
-	}
-}
-
-void machine__delete_dead_threads(struct machine *machine)
-{
-	struct thread *n, *t;
-
-	list_for_each_entry_safe(t, n, &machine->dead_threads, node) {
-		list_del(&t->node);
-		thread__delete(t);
-	}
-}
-
-void machine__delete_threads(struct machine *machine)
-{
-	struct rb_node *nd = rb_first(&machine->threads);
-
-	while (nd) {
-		struct thread *t = rb_entry(nd, struct thread, rb_node);
-
-		rb_erase(&t->rb_node, &machine->threads);
-		nd = rb_next(nd);
-		thread__delete(t);
-	}
-}
-
-void machine__exit(struct machine *machine)
-{
-	map_groups__exit(&machine->kmaps);
-	dsos__delete(&machine->user_dsos);
-	dsos__delete(&machine->kernel_dsos);
-	free(machine->root_dir);
-	machine->root_dir = NULL;
-}
-
-void machine__delete(struct machine *machine)
-{
-	machine__exit(machine);
-	free(machine);
-}
-
-void machines__init(struct machines *machines)
-{
-	machine__init(&machines->host, "", HOST_KERNEL_ID);
-	machines->guests = RB_ROOT;
-	machines->symbol_filter = NULL;
-}
-
-void machines__exit(struct machines *machines)
-{
-	machine__exit(&machines->host);
-	/* XXX exit guest */
-}
-
-struct machine *machines__add(struct machines *machines, pid_t pid,
-			      const char *root_dir)
-{
-	struct rb_node **p = &machines->guests.rb_node;
-	struct rb_node *parent = NULL;
-	struct machine *pos, *machine = malloc(sizeof(*machine));
-
-	if (machine == NULL)
-		return NULL;
-
-	if (machine__init(machine, root_dir, pid) != 0) {
-		free(machine);
-		return NULL;
-	}
-
-	machine->symbol_filter = machines->symbol_filter;
-
-	while (*p != NULL) {
-		parent = *p;
-		pos = rb_entry(parent, struct machine, rb_node);
-		if (pid < pos->pid)
-			p = &(*p)->rb_left;
-		else
-			p = &(*p)->rb_right;
-	}
-
-	rb_link_node(&machine->rb_node, parent, p);
-	rb_insert_color(&machine->rb_node, &machines->guests);
-
-	return machine;
-}
-
-void machines__set_symbol_filter(struct machines *machines,
-				 symbol_filter_t symbol_filter)
-{
-	struct rb_node *nd;
-
-	machines->symbol_filter = symbol_filter;
-	machines->host.symbol_filter = symbol_filter;
-
-	for (nd = rb_first(&machines->guests); nd; nd = rb_next(nd)) {
-		struct machine *machine = rb_entry(nd, struct machine, rb_node);
-
-		machine->symbol_filter = symbol_filter;
-	}
-}
-
-struct machine *machines__find(struct machines *machines, pid_t pid)
-{
-	struct rb_node **p = &machines->guests.rb_node;
-	struct rb_node *parent = NULL;
-	struct machine *machine;
-	struct machine *default_machine = NULL;
-
-	if (pid == HOST_KERNEL_ID)
-		return &machines->host;
-
-	while (*p != NULL) {
-		parent = *p;
-		machine = rb_entry(parent, struct machine, rb_node);
-		if (pid < machine->pid)
-			p = &(*p)->rb_left;
-		else if (pid > machine->pid)
-			p = &(*p)->rb_right;
-		else
-			return machine;
-		if (!machine->pid)
-			default_machine = machine;
-	}
-
-	return default_machine;
-}
-
-struct machine *machines__findnew(struct machines *machines, pid_t pid)
-{
-	char path[PATH_MAX];
-	const char *root_dir = "";
-	struct machine *machine = machines__find(machines, pid);
-
-	if (machine && (machine->pid == pid))
-		goto out;
-
-	if ((pid != HOST_KERNEL_ID) &&
-	    (pid != DEFAULT_GUEST_KERNEL_ID) &&
-	    (symbol_conf.guestmount)) {
-		sprintf(path, "%s/%d", symbol_conf.guestmount, pid);
-		if (access(path, R_OK)) {
-			static struct strlist *seen;
-
-			if (!seen)
-				seen = strlist__new(true, NULL);
-
-			if (!strlist__has_entry(seen, path)) {
-				pr_err("Can't access file %s\n", path);
-				strlist__add(seen, path);
-			}
-			machine = NULL;
-			goto out;
-		}
-		root_dir = path;
-	}
-
-	machine = machines__add(machines, pid, root_dir);
-out:
-	return machine;
-}
-
-void machines__process_guests(struct machines *machines,
-			      machine__process_t process, void *data)
-{
-	struct rb_node *nd;
-
-	for (nd = rb_first(&machines->guests); nd; nd = rb_next(nd)) {
-		struct machine *pos = rb_entry(nd, struct machine, rb_node);
-		process(pos, data);
-	}
-}
-
-char *machine__mmap_name(struct machine *machine, char *bf, size_t size)
-{
-	if (machine__is_host(machine))
-		snprintf(bf, size, "[%s]", "kernel.kallsyms");
-	else if (machine__is_default_guest(machine))
-		snprintf(bf, size, "[%s]", "guest.kernel.kallsyms");
-	else {
-		snprintf(bf, size, "[%s.%d]", "guest.kernel.kallsyms",
-			 machine->pid);
-	}
-
-	return bf;
-}
-
-void machines__set_id_hdr_size(struct machines *machines, u16 id_hdr_size)
-{
-	struct rb_node *node;
-	struct machine *machine;
-
-	machines->host.id_hdr_size = id_hdr_size;
-
-	for (node = rb_first(&machines->guests); node; node = rb_next(node)) {
-		machine = rb_entry(node, struct machine, rb_node);
-		machine->id_hdr_size = id_hdr_size;
-	}
-
-	return;
-}
-
-static struct thread *__machine__findnew_thread(struct machine *machine,
-						pid_t pid, pid_t tid,
-						bool create)
-{
-	struct rb_node **p = &machine->threads.rb_node;
-	struct rb_node *parent = NULL;
-	struct thread *th;
-
-	/*
-	 * Front-end cache - TID lookups come in blocks,
-	 * so most of the time we dont have to look up
-	 * the full rbtree:
-	 */
-	if (machine->last_match && machine->last_match->tid == tid) {
-		if (pid && pid != machine->last_match->pid_)
-			machine->last_match->pid_ = pid;
-		return machine->last_match;
-	}
-
-	while (*p != NULL) {
-		parent = *p;
-		th = rb_entry(parent, struct thread, rb_node);
-
-		if (th->tid == tid) {
-			machine->last_match = th;
-			if (pid && pid != th->pid_)
-				th->pid_ = pid;
-			return th;
-		}
-
-		if (tid < th->tid)
-			p = &(*p)->rb_left;
-		else
-			p = &(*p)->rb_right;
-	}
-
-	if (!create)
-		return NULL;
-
-	th = thread__new(pid, tid);
-	if (th != NULL) {
-		rb_link_node(&th->rb_node, parent, p);
-		rb_insert_color(&th->rb_node, &machine->threads);
-		machine->last_match = th;
-	}
-
-	return th;
-}
-
-struct thread *machine__findnew_thread(struct machine *machine, pid_t pid,
-				       pid_t tid)
-{
-	return __machine__findnew_thread(machine, pid, tid, true);
-}
-
-struct thread *machine__find_thread(struct machine *machine, pid_t tid)
-{
-	return __machine__findnew_thread(machine, 0, tid, false);
-}
-
-int machine__process_comm_event(struct machine *machine, union perf_event *event)
-{
-	struct thread *thread = machine__findnew_thread(machine,
-							event->comm.pid,
-							event->comm.tid);
-
-	if (dump_trace)
-		perf_event__fprintf_comm(event, stdout);
-
-	if (thread == NULL || thread__set_comm(thread, event->comm.comm)) {
-		dump_printf("problem processing PERF_RECORD_COMM, skipping event.\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-int machine__process_lost_event(struct machine *machine __maybe_unused,
-				union perf_event *event)
-{
-	dump_printf(": id:%" PRIu64 ": lost:%" PRIu64 "\n",
-		    event->lost.id, event->lost.lost);
-	return 0;
-}
-
-struct map *machine__new_module(struct machine *machine, u64 start,
-				const char *filename)
-{
-	struct map *map;
-	struct dso *dso = __dsos__findnew(&machine->kernel_dsos, filename);
-
-	if (dso == NULL)
-		return NULL;
-
-	map = map__new2(start, dso, MAP__FUNCTION);
-	if (map == NULL)
-		return NULL;
-
-	if (machine__is_host(machine))
-		dso->symtab_type = DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE;
-	else
-		dso->symtab_type = DSO_BINARY_TYPE__GUEST_KMODULE;
-	map_groups__insert(&machine->kmaps, map);
-	return map;
-}
-
-size_t machines__fprintf_dsos(struct machines *machines, FILE *fp)
-{
-	struct rb_node *nd;
-	size_t ret = __dsos__fprintf(&machines->host.kernel_dsos, fp) +
-		     __dsos__fprintf(&machines->host.user_dsos, fp);
-
-	for (nd = rb_first(&machines->guests); nd; nd = rb_next(nd)) {
-		struct machine *pos = rb_entry(nd, struct machine, rb_node);
-		ret += __dsos__fprintf(&pos->kernel_dsos, fp);
-		ret += __dsos__fprintf(&pos->user_dsos, fp);
-	}
-
-	return ret;
-}
-
-size_t machine__fprintf_dsos_buildid(struct machine *machine, FILE *fp,
-				     bool (skip)(struct dso *dso, int parm), int parm)
-{
-	return __dsos__fprintf_buildid(&machine->kernel_dsos, fp, skip, parm) +
-	       __dsos__fprintf_buildid(&machine->user_dsos, fp, skip, parm);
-}
-
-size_t machines__fprintf_dsos_buildid(struct machines *machines, FILE *fp,
-				     bool (skip)(struct dso *dso, int parm), int parm)
-{
-	struct rb_node *nd;
-	size_t ret = machine__fprintf_dsos_buildid(&machines->host, fp, skip, parm);
-
-	for (nd = rb_first(&machines->guests); nd; nd = rb_next(nd)) {
-		struct machine *pos = rb_entry(nd, struct machine, rb_node);
-		ret += machine__fprintf_dsos_buildid(pos, fp, skip, parm);
-	}
-	return ret;
-}
-
-size_t machine__fprintf_vmlinux_path(struct machine *machine, FILE *fp)
-{
-	int i;
-	size_t printed = 0;
-	struct dso *kdso = machine->vmlinux_maps[MAP__FUNCTION]->dso;
-
-	if (kdso->has_build_id) {
-		char filename[PATH_MAX];
-		if (dso__build_id_filename(kdso, filename, sizeof(filename)))
-			printed += fprintf(fp, "[0] %s\n", filename);
-	}
-
-	for (i = 0; i < vmlinux_path__nr_entries; ++i)
-		printed += fprintf(fp, "[%d] %s\n",
-				   i + kdso->has_build_id, vmlinux_path[i]);
-
-	return printed;
-}
-
-size_t machine__fprintf(struct machine *machine, FILE *fp)
-{
-	size_t ret = 0;
-	struct rb_node *nd;
-
-	for (nd = rb_first(&machine->threads); nd; nd = rb_next(nd)) {
-		struct thread *pos = rb_entry(nd, struct thread, rb_node);
-
-		ret += thread__fprintf(pos, fp);
-	}
-
-	return ret;
-}
-
-static struct dso *machine__get_kernel(struct machine *machine)
-{
-	const char *vmlinux_name = NULL;
-	struct dso *kernel;
-
-	if (machine__is_host(machine)) {
-		vmlinux_name = symbol_conf.vmlinux_name;
-		if (!vmlinux_name)
-			vmlinux_name = "[kernel.kallsyms]";
-
-		kernel = dso__kernel_findnew(machine, vmlinux_name,
-					     "[kernel]",
-					     DSO_TYPE_KERNEL);
-	} else {
-		char bf[PATH_MAX];
-
-		if (machine__is_default_guest(machine))
-			vmlinux_name = symbol_conf.default_guest_vmlinux_name;
-		if (!vmlinux_name)
-			vmlinux_name = machine__mmap_name(machine, bf,
-							  sizeof(bf));
-
-		kernel = dso__kernel_findnew(machine, vmlinux_name,
-					     "[guest.kernel]",
-					     DSO_TYPE_GUEST_KERNEL);
-	}
-
-	if (kernel != NULL && (!kernel->has_build_id))
-		dso__read_running_kernel_build_id(kernel, machine);
-
-	return kernel;
-}
-
-struct process_args {
-	u64 start;
-};
-
-static int symbol__in_kernel(void *arg, const char *name,
-			     char type __maybe_unused, u64 start)
-{
-	struct process_args *args = arg;
-
-	if (strchr(name, '['))
-		return 0;
-
-	args->start = start;
-	return 1;
-}
-
-/* Figure out the start address of kernel map from /proc/kallsyms */
-static u64 machine__get_kernel_start_addr(struct machine *machine)
-{
-	const char *filename;
-	char path[PATH_MAX];
-	struct process_args args;
-
-	if (machine__is_host(machine)) {
-		filename = "/proc/kallsyms";
-	} else {
-		if (machine__is_default_guest(machine))
-			filename = (char *)symbol_conf.default_guest_kallsyms;
-		else {
-			sprintf(path, "%s/proc/kallsyms", machine->root_dir);
-			filename = path;
-		}
-	}
-
-	if (symbol__restricted_filename(filename, "/proc/kallsyms"))
-		return 0;
-
-	if (kallsyms__parse(filename, &args, symbol__in_kernel) <= 0)
-		return 0;
-
-	return args.start;
-}
-
-int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel)
-{
-	enum map_type type;
-	u64 start = machine__get_kernel_start_addr(machine);
-
-	for (type = 0; type < MAP__NR_TYPES; ++type) {
-		struct kmap *kmap;
-
-		machine->vmlinux_maps[type] = map__new2(start, kernel, type);
-		if (machine->vmlinux_maps[type] == NULL)
-			return -1;
-
-		machine->vmlinux_maps[type]->map_ip =
-			machine->vmlinux_maps[type]->unmap_ip =
-				identity__map_ip;
-		kmap = map__kmap(machine->vmlinux_maps[type]);
-		kmap->kmaps = &machine->kmaps;
-		map_groups__insert(&machine->kmaps,
-				   machine->vmlinux_maps[type]);
-	}
-
-	return 0;
-}
-
-void machine__destroy_kernel_maps(struct machine *machine)
-{
-	enum map_type type;
-
-	for (type = 0; type < MAP__NR_TYPES; ++type) {
-		struct kmap *kmap;
-
-		if (machine->vmlinux_maps[type] == NULL)
-			continue;
-
-		kmap = map__kmap(machine->vmlinux_maps[type]);
-		map_groups__remove(&machine->kmaps,
-				   machine->vmlinux_maps[type]);
-		if (kmap->ref_reloc_sym) {
-			/*
-			 * ref_reloc_sym is shared among all maps, so free just
-			 * on one of them.
-			 */
-			if (type == MAP__FUNCTION) {
-				free((char *)kmap->ref_reloc_sym->name);
-				kmap->ref_reloc_sym->name = NULL;
-				free(kmap->ref_reloc_sym);
-			}
-			kmap->ref_reloc_sym = NULL;
-		}
-
-		map__delete(machine->vmlinux_maps[type]);
-		machine->vmlinux_maps[type] = NULL;
-	}
-}
-
-int machines__create_guest_kernel_maps(struct machines *machines)
-{
-	int ret = 0;
-	struct dirent **namelist = NULL;
-	int i, items = 0;
-	char path[PATH_MAX];
-	pid_t pid;
-	char *endp;
-
-	if (symbol_conf.default_guest_vmlinux_name ||
-	    symbol_conf.default_guest_modules ||
-	    symbol_conf.default_guest_kallsyms) {
-		machines__create_kernel_maps(machines, DEFAULT_GUEST_KERNEL_ID);
-	}
-
-	if (symbol_conf.guestmount) {
-		items = scandir(symbol_conf.guestmount, &namelist, NULL, NULL);
-		if (items <= 0)
-			return -ENOENT;
-		for (i = 0; i < items; i++) {
-			if (!isdigit(namelist[i]->d_name[0])) {
-				/* Filter out . and .. */
-				continue;
-			}
-			pid = (pid_t)strtol(namelist[i]->d_name, &endp, 10);
-			if ((*endp != '\0') ||
-			    (endp == namelist[i]->d_name) ||
-			    (errno == ERANGE)) {
-				pr_debug("invalid directory (%s). Skipping.\n",
-					 namelist[i]->d_name);
-				continue;
-			}
-			sprintf(path, "%s/%s/proc/kallsyms",
-				symbol_conf.guestmount,
-				namelist[i]->d_name);
-			ret = access(path, R_OK);
-			if (ret) {
-				pr_debug("Can't access file %s\n", path);
-				goto failure;
-			}
-			machines__create_kernel_maps(machines, pid);
-		}
-failure:
-		free(namelist);
-	}
-
-	return ret;
-}
-
-void machines__destroy_kernel_maps(struct machines *machines)
-{
-	struct rb_node *next = rb_first(&machines->guests);
-
-	machine__destroy_kernel_maps(&machines->host);
-
-	while (next) {
-		struct machine *pos = rb_entry(next, struct machine, rb_node);
-
-		next = rb_next(&pos->rb_node);
-		rb_erase(&pos->rb_node, &machines->guests);
-		machine__delete(pos);
-	}
-}
-
-int machines__create_kernel_maps(struct machines *machines, pid_t pid)
-{
-	struct machine *machine = machines__findnew(machines, pid);
-
-	if (machine == NULL)
-		return -1;
-
-	return machine__create_kernel_maps(machine);
-}
-
-int machine__load_kallsyms(struct machine *machine, const char *filename,
-			   enum map_type type, symbol_filter_t filter)
-{
-	struct map *map = machine->vmlinux_maps[type];
-	int ret = dso__load_kallsyms(map->dso, filename, map, filter);
-
-	if (ret > 0) {
-		dso__set_loaded(map->dso, type);
-		/*
-		 * Since /proc/kallsyms will have multiple sessions for the
-		 * kernel, with modules between them, fixup the end of all
-		 * sections.
-		 */
-		__map_groups__fixup_end(&machine->kmaps, type);
-	}
-
-	return ret;
-}
-
-int machine__load_vmlinux_path(struct machine *machine, enum map_type type,
-			       symbol_filter_t filter)
-{
-	struct map *map = machine->vmlinux_maps[type];
-	int ret = dso__load_vmlinux_path(map->dso, map, filter);
-
-	if (ret > 0)
-		dso__set_loaded(map->dso, type);
-
-	return ret;
-}
-
-static void map_groups__fixup_end(struct map_groups *mg)
-{
-	int i;
-	for (i = 0; i < MAP__NR_TYPES; ++i)
-		__map_groups__fixup_end(mg, i);
-}
-
-static char *get_kernel_version(const char *root_dir)
-{
-	char version[PATH_MAX];
-	FILE *file;
-	char *name, *tmp;
-	const char *prefix = "Linux version ";
-
-	sprintf(version, "%s/proc/version", root_dir);
-	file = fopen(version, "r");
-	if (!file)
-		return NULL;
-
-	version[0] = '\0';
-	tmp = fgets(version, sizeof(version), file);
-	fclose(file);
-
-	name = strstr(version, prefix);
-	if (!name)
-		return NULL;
-	name += strlen(prefix);
-	tmp = strchr(name, ' ');
-	if (tmp)
-		*tmp = '\0';
-
-	return strdup(name);
-}
-
-static int map_groups__set_modules_path_dir(struct map_groups *mg,
-				const char *dir_name)
-{
-	struct dirent *dent;
-	DIR *dir = opendir(dir_name);
-	int ret = 0;
-
-	if (!dir) {
-		pr_debug("%s: cannot open %s dir\n", __func__, dir_name);
-		return -1;
-	}
-
-	while ((dent = readdir(dir)) != NULL) {
-		char path[PATH_MAX];
-		struct stat st;
-
-		/*sshfs might return bad dent->d_type, so we have to stat*/
-		snprintf(path, sizeof(path), "%s/%s", dir_name, dent->d_name);
-		if (stat(path, &st))
-			continue;
-
-		if (S_ISDIR(st.st_mode)) {
-			if (!strcmp(dent->d_name, ".") ||
-			    !strcmp(dent->d_name, ".."))
-				continue;
-
-			ret = map_groups__set_modules_path_dir(mg, path);
-			if (ret < 0)
-				goto out;
-		} else {
-			char *dot = strrchr(dent->d_name, '.'),
-			     dso_name[PATH_MAX];
-			struct map *map;
-			char *long_name;
-
-			if (dot == NULL || strcmp(dot, ".ko"))
-				continue;
-			snprintf(dso_name, sizeof(dso_name), "[%.*s]",
-				 (int)(dot - dent->d_name), dent->d_name);
-
-			strxfrchar(dso_name, '-', '_');
-			map = map_groups__find_by_name(mg, MAP__FUNCTION,
-						       dso_name);
-			if (map == NULL)
-				continue;
-
-			long_name = strdup(path);
-			if (long_name == NULL) {
-				ret = -1;
-				goto out;
-			}
-			dso__set_long_name(map->dso, long_name);
-			map->dso->lname_alloc = 1;
-			dso__kernel_module_get_build_id(map->dso, "");
-		}
-	}
-
-out:
-	closedir(dir);
-	return ret;
-}
-
-static int machine__set_modules_path(struct machine *machine)
-{
-	char *version;
-	char modules_path[PATH_MAX];
-
-	version = get_kernel_version(machine->root_dir);
-	if (!version)
-		return -1;
-
-	snprintf(modules_path, sizeof(modules_path), "%s/lib/modules/%s/kernel",
-		 machine->root_dir, version);
-	free(version);
-
-	return map_groups__set_modules_path_dir(&machine->kmaps, modules_path);
-}
-
-static int machine__create_modules(struct machine *machine)
-{
-	char *line = NULL;
-	size_t n;
-	FILE *file;
-	struct map *map;
-	const char *modules;
-	char path[PATH_MAX];
-
-	if (machine__is_default_guest(machine))
-		modules = symbol_conf.default_guest_modules;
-	else {
-		sprintf(path, "%s/proc/modules", machine->root_dir);
-		modules = path;
-	}
-
-	if (symbol__restricted_filename(modules, "/proc/modules"))
-		return -1;
-
-	file = fopen(modules, "r");
-	if (file == NULL)
-		return -1;
-
-	while (!feof(file)) {
-		char name[PATH_MAX];
-		u64 start;
-		char *sep;
-		int line_len;
-
-		line_len = getline(&line, &n, file);
-		if (line_len < 0)
-			break;
-
-		if (!line)
-			goto out_failure;
-
-		line[--line_len] = '\0'; /* \n */
-
-		sep = strrchr(line, 'x');
-		if (sep == NULL)
-			continue;
-
-		hex2u64(sep + 1, &start);
-
-		sep = strchr(line, ' ');
-		if (sep == NULL)
-			continue;
-
-		*sep = '\0';
-
-		snprintf(name, sizeof(name), "[%s]", line);
-		map = machine__new_module(machine, start, name);
-		if (map == NULL)
-			goto out_delete_line;
-		dso__kernel_module_get_build_id(map->dso, machine->root_dir);
-	}
-
-	free(line);
-	fclose(file);
-
-	if (machine__set_modules_path(machine) < 0) {
-		pr_debug("Problems setting modules path maps, continuing anyway...\n");
-	}
-	return 0;
-
-out_delete_line:
-	free(line);
-out_failure:
-	return -1;
-}
-
-int machine__create_kernel_maps(struct machine *machine)
-{
-	struct dso *kernel = machine__get_kernel(machine);
-
-	if (kernel == NULL ||
-	    __machine__create_kernel_maps(machine, kernel) < 0)
-		return -1;
-
-	if (symbol_conf.use_modules && machine__create_modules(machine) < 0) {
-		if (machine__is_host(machine))
-			pr_debug("Problems creating module maps, "
-				 "continuing anyway...\n");
-		else
-			pr_debug("Problems creating module maps for guest %d, "
-				 "continuing anyway...\n", machine->pid);
-	}
-
-	/*
-	 * Now that we have all the maps created, just set the ->end of them:
-	 */
-	map_groups__fixup_end(&machine->kmaps);
-	return 0;
-}
-
-static void machine__set_kernel_mmap_len(struct machine *machine,
-					 union perf_event *event)
-{
-	int i;
-
-	for (i = 0; i < MAP__NR_TYPES; i++) {
-		machine->vmlinux_maps[i]->start = event->mmap.start;
-		machine->vmlinux_maps[i]->end   = (event->mmap.start +
-						   event->mmap.len);
-		/*
-		 * Be a bit paranoid here, some perf.data file came with
-		 * a zero sized synthesized MMAP event for the kernel.
-		 */
-		if (machine->vmlinux_maps[i]->end == 0)
-			machine->vmlinux_maps[i]->end = ~0ULL;
-	}
-}
-
-static bool machine__uses_kcore(struct machine *machine)
-{
-	struct dso *dso;
-
-	list_for_each_entry(dso, &machine->kernel_dsos, node) {
-		if (dso__is_kcore(dso))
-			return true;
-	}
-
-	return false;
-}
-
-static int machine__process_kernel_mmap_event(struct machine *machine,
-					      union perf_event *event)
-{
-	struct map *map;
-	char kmmap_prefix[PATH_MAX];
-	enum dso_kernel_type kernel_type;
-	bool is_kernel_mmap;
-
-	/* If we have maps from kcore then we do not need or want any others */
-	if (machine__uses_kcore(machine))
-		return 0;
-
-	machine__mmap_name(machine, kmmap_prefix, sizeof(kmmap_prefix));
-	if (machine__is_host(machine))
-		kernel_type = DSO_TYPE_KERNEL;
-	else
-		kernel_type = DSO_TYPE_GUEST_KERNEL;
-
-	is_kernel_mmap = memcmp(event->mmap.filename,
-				kmmap_prefix,
-				strlen(kmmap_prefix) - 1) == 0;
-	if (event->mmap.filename[0] == '/' ||
-	    (!is_kernel_mmap && event->mmap.filename[0] == '[')) {
-
-		char short_module_name[1024];
-		char *name, *dot;
-
-		if (event->mmap.filename[0] == '/') {
-			name = strrchr(event->mmap.filename, '/');
-			if (name == NULL)
-				goto out_problem;
-
-			++name; /* skip / */
-			dot = strrchr(name, '.');
-			if (dot == NULL)
-				goto out_problem;
-			snprintf(short_module_name, sizeof(short_module_name),
-					"[%.*s]", (int)(dot - name), name);
-			strxfrchar(short_module_name, '-', '_');
-		} else
-			strcpy(short_module_name, event->mmap.filename);
-
-		map = machine__new_module(machine, event->mmap.start,
-					  event->mmap.filename);
-		if (map == NULL)
-			goto out_problem;
-
-		name = strdup(short_module_name);
-		if (name == NULL)
-			goto out_problem;
-
-		map->dso->short_name = name;
-		map->dso->sname_alloc = 1;
-		map->end = map->start + event->mmap.len;
-	} else if (is_kernel_mmap) {
-		const char *symbol_name = (event->mmap.filename +
-				strlen(kmmap_prefix));
-		/*
-		 * Should be there already, from the build-id table in
-		 * the header.
-		 */
-		struct dso *kernel = __dsos__findnew(&machine->kernel_dsos,
-						     kmmap_prefix);
-		if (kernel == NULL)
-			goto out_problem;
-
-		kernel->kernel = kernel_type;
-		if (__machine__create_kernel_maps(machine, kernel) < 0)
-			goto out_problem;
-
-		machine__set_kernel_mmap_len(machine, event);
-
-		/*
-		 * Avoid using a zero address (kptr_restrict) for the ref reloc
-		 * symbol. Effectively having zero here means that at record
-		 * time /proc/sys/kernel/kptr_restrict was non zero.
-		 */
-		if (event->mmap.pgoff != 0) {
-			maps__set_kallsyms_ref_reloc_sym(machine->vmlinux_maps,
-							 symbol_name,
-							 event->mmap.pgoff);
-		}
-
-		if (machine__is_default_guest(machine)) {
-			/*
-			 * preload dso of guest kernel and modules
-			 */
-			dso__load(kernel, machine->vmlinux_maps[MAP__FUNCTION],
-				  NULL);
-		}
-	}
-	return 0;
-out_problem:
-	return -1;
-}
-
-int machine__process_mmap2_event(struct machine *machine,
-				 union perf_event *event)
-{
-	u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
-	struct thread *thread;
-	struct map *map;
-	enum map_type type;
-	int ret = 0;
-
-	if (dump_trace)
-		perf_event__fprintf_mmap2(event, stdout);
-
-	if (cpumode == PERF_RECORD_MISC_GUEST_KERNEL ||
-	    cpumode == PERF_RECORD_MISC_KERNEL) {
-		ret = machine__process_kernel_mmap_event(machine, event);
-		if (ret < 0)
-			goto out_problem;
-		return 0;
-	}
-
-	thread = machine__findnew_thread(machine, event->mmap2.pid,
-					event->mmap2.pid);
-	if (thread == NULL)
-		goto out_problem;
-
-	if (event->header.misc & PERF_RECORD_MISC_MMAP_DATA)
-		type = MAP__VARIABLE;
-	else
-		type = MAP__FUNCTION;
-
-	map = map__new(&machine->user_dsos, event->mmap2.start,
-			event->mmap2.len, event->mmap2.pgoff,
-			event->mmap2.pid, event->mmap2.maj,
-			event->mmap2.min, event->mmap2.ino,
-			event->mmap2.ino_generation,
-			event->mmap2.filename, type);
-
-	if (map == NULL)
-		goto out_problem;
-
-	thread__insert_map(thread, map);
-	return 0;
-
-out_problem:
-	dump_printf("problem processing PERF_RECORD_MMAP2, skipping event.\n");
-	return 0;
-}
-
-int machine__process_mmap_event(struct machine *machine, union perf_event *event)
-{
-	u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
-	struct thread *thread;
-	struct map *map;
-	enum map_type type;
-	int ret = 0;
-
-	if (dump_trace)
-		perf_event__fprintf_mmap(event, stdout);
-
-	if (cpumode == PERF_RECORD_MISC_GUEST_KERNEL ||
-	    cpumode == PERF_RECORD_MISC_KERNEL) {
-		ret = machine__process_kernel_mmap_event(machine, event);
-		if (ret < 0)
-			goto out_problem;
-		return 0;
-	}
-
-	thread = machine__findnew_thread(machine, event->mmap.pid,
-					 event->mmap.pid);
-	if (thread == NULL)
-		goto out_problem;
-
-	if (event->header.misc & PERF_RECORD_MISC_MMAP_DATA)
-		type = MAP__VARIABLE;
-	else
-		type = MAP__FUNCTION;
-
-	map = map__new(&machine->user_dsos, event->mmap.start,
-			event->mmap.len, event->mmap.pgoff,
-			event->mmap.pid, 0, 0, 0, 0,
-			event->mmap.filename,
-			type);
-
-	if (map == NULL)
-		goto out_problem;
-
-	thread__insert_map(thread, map);
-	return 0;
-
-out_problem:
-	dump_printf("problem processing PERF_RECORD_MMAP, skipping event.\n");
-	return 0;
-}
-
-static void machine__remove_thread(struct machine *machine, struct thread *th)
-{
-	machine->last_match = NULL;
-	rb_erase(&th->rb_node, &machine->threads);
-	/*
-	 * We may have references to this thread, for instance in some hist_entry
-	 * instances, so just move them to a separate list.
-	 */
-	list_add_tail(&th->node, &machine->dead_threads);
-}
-
-int machine__process_fork_event(struct machine *machine, union perf_event *event)
-{
-	struct thread *thread = machine__find_thread(machine, event->fork.tid);
-	struct thread *parent = machine__findnew_thread(machine,
-							event->fork.ppid,
-							event->fork.ptid);
-
-	/* if a thread currently exists for the thread id remove it */
-	if (thread != NULL)
-		machine__remove_thread(machine, thread);
-
-	thread = machine__findnew_thread(machine, event->fork.pid,
-					 event->fork.tid);
-	if (dump_trace)
-		perf_event__fprintf_task(event, stdout);
-
-	if (thread == NULL || parent == NULL ||
-	    thread__fork(thread, parent) < 0) {
-		dump_printf("problem processing PERF_RECORD_FORK, skipping event.\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-int machine__process_exit_event(struct machine *machine __maybe_unused,
-				union perf_event *event)
-{
-	struct thread *thread = machine__find_thread(machine, event->fork.tid);
-
-	if (dump_trace)
-		perf_event__fprintf_task(event, stdout);
-
-	if (thread != NULL)
-		thread__exited(thread);
-
-	return 0;
-}
-
-int machine__process_event(struct machine *machine, union perf_event *event)
-{
-	int ret;
-
-	switch (event->header.type) {
-	case PERF_RECORD_COMM:
-		ret = machine__process_comm_event(machine, event); break;
-	case PERF_RECORD_MMAP:
-		ret = machine__process_mmap_event(machine, event); break;
-	case PERF_RECORD_MMAP2:
-		ret = machine__process_mmap2_event(machine, event); break;
-	case PERF_RECORD_FORK:
-		ret = machine__process_fork_event(machine, event); break;
-	case PERF_RECORD_EXIT:
-		ret = machine__process_exit_event(machine, event); break;
-	case PERF_RECORD_LOST:
-		ret = machine__process_lost_event(machine, event); break;
-	default:
-		ret = -1;
-		break;
-	}
-
-	return ret;
-}
-
-static bool symbol__match_regex(struct symbol *sym, regex_t *regex)
-{
-	if (sym->name && !regexec(regex, sym->name, 0, NULL, 0))
-		return 1;
-	return 0;
-}
-
-static const u8 cpumodes[] = {
-	PERF_RECORD_MISC_USER,
-	PERF_RECORD_MISC_KERNEL,
-	PERF_RECORD_MISC_GUEST_USER,
-	PERF_RECORD_MISC_GUEST_KERNEL
-};
-#define NCPUMODES (sizeof(cpumodes)/sizeof(u8))
-
-static void ip__resolve_ams(struct machine *machine, struct thread *thread,
-			    struct addr_map_symbol *ams,
-			    u64 ip)
-{
-	struct addr_location al;
-	size_t i;
-	u8 m;
-
-	memset(&al, 0, sizeof(al));
-
-	for (i = 0; i < NCPUMODES; i++) {
-		m = cpumodes[i];
-		/*
-		 * We cannot use the header.misc hint to determine whether a
-		 * branch stack address is user, kernel, guest, hypervisor.
-		 * Branches may straddle the kernel/user/hypervisor boundaries.
-		 * Thus, we have to try consecutively until we find a match
-		 * or else, the symbol is unknown
-		 */
-		thread__find_addr_location(thread, machine, m, MAP__FUNCTION,
-				ip, &al);
-		if (al.sym)
-			goto found;
-	}
-found:
-	ams->addr = ip;
-	ams->al_addr = al.addr;
-	ams->sym = al.sym;
-	ams->map = al.map;
-}
-
-static void ip__resolve_data(struct machine *machine, struct thread *thread,
-			     u8 m, struct addr_map_symbol *ams, u64 addr)
-{
-	struct addr_location al;
-
-	memset(&al, 0, sizeof(al));
-
-	thread__find_addr_location(thread, machine, m, MAP__VARIABLE, addr,
-				   &al);
-	ams->addr = addr;
-	ams->al_addr = al.addr;
-	ams->sym = al.sym;
-	ams->map = al.map;
-}
-
-struct mem_info *machine__resolve_mem(struct machine *machine,
-				      struct thread *thr,
-				      struct perf_sample *sample,
-				      u8 cpumode)
-{
-	struct mem_info *mi = zalloc(sizeof(*mi));
-
-	if (!mi)
-		return NULL;
-
-	ip__resolve_ams(machine, thr, &mi->iaddr, sample->ip);
-	ip__resolve_data(machine, thr, cpumode, &mi->daddr, sample->addr);
-	mi->data_src.val = sample->data_src;
-
-	return mi;
-}
-
-struct branch_info *machine__resolve_bstack(struct machine *machine,
-					    struct thread *thr,
-					    struct branch_stack *bs)
-{
-	struct branch_info *bi;
-	unsigned int i;
-
-	bi = calloc(bs->nr, sizeof(struct branch_info));
-	if (!bi)
-		return NULL;
-
-	for (i = 0; i < bs->nr; i++) {
-		ip__resolve_ams(machine, thr, &bi[i].to, bs->entries[i].to);
-		ip__resolve_ams(machine, thr, &bi[i].from, bs->entries[i].from);
-		bi[i].flags = bs->entries[i].flags;
-	}
-	return bi;
-}
-
-static int machine__resolve_callchain_sample(struct machine *machine,
-					     struct thread *thread,
-					     struct ip_callchain *chain,
-					     struct symbol **parent,
-					     struct addr_location *root_al)
-{
-	u8 cpumode = PERF_RECORD_MISC_USER;
-	unsigned int i;
-	int err;
-
-	callchain_cursor_reset(&callchain_cursor);
-
-	if (chain->nr > PERF_MAX_STACK_DEPTH) {
-		pr_warning("corrupted callchain. skipping...\n");
-		return 0;
-	}
-
-	for (i = 0; i < chain->nr; i++) {
-		u64 ip;
-		struct addr_location al;
-
-		if (callchain_param.order == ORDER_CALLEE)
-			ip = chain->ips[i];
-		else
-			ip = chain->ips[chain->nr - i - 1];
-
-		if (ip >= PERF_CONTEXT_MAX) {
-			switch (ip) {
-			case PERF_CONTEXT_HV:
-				cpumode = PERF_RECORD_MISC_HYPERVISOR;
-				break;
-			case PERF_CONTEXT_KERNEL:
-				cpumode = PERF_RECORD_MISC_KERNEL;
-				break;
-			case PERF_CONTEXT_USER:
-				cpumode = PERF_RECORD_MISC_USER;
-				break;
-			default:
-				pr_debug("invalid callchain context: "
-					 "%"PRId64"\n", (s64) ip);
-				/*
-				 * It seems the callchain is corrupted.
-				 * Discard all.
-				 */
-				callchain_cursor_reset(&callchain_cursor);
-				return 0;
-			}
-			continue;
-		}
-
-		al.filtered = false;
-		thread__find_addr_location(thread, machine, cpumode,
-					   MAP__FUNCTION, ip, &al);
-		if (al.sym != NULL) {
-			if (sort__has_parent && !*parent &&
-			    symbol__match_regex(al.sym, &parent_regex))
-				*parent = al.sym;
-			else if (have_ignore_callees && root_al &&
-			  symbol__match_regex(al.sym, &ignore_callees_regex)) {
-				/* Treat this symbol as the root,
-				   forgetting its callees. */
-				*root_al = al;
-				callchain_cursor_reset(&callchain_cursor);
-			}
-			if (!symbol_conf.use_callchain)
-				break;
-		}
-
-		err = callchain_cursor_append(&callchain_cursor,
-					      ip, al.map, al.sym);
-		if (err)
-			return err;
-	}
-
-	return 0;
-}
-
-static int unwind_entry(struct unwind_entry *entry, void *arg)
-{
-	struct callchain_cursor *cursor = arg;
-	return callchain_cursor_append(cursor, entry->ip,
-				       entry->map, entry->sym);
-}
-
-int machine__resolve_callchain(struct machine *machine,
-			       struct perf_evsel *evsel,
-			       struct thread *thread,
-			       struct perf_sample *sample,
-			       struct symbol **parent,
-			       struct addr_location *root_al)
-{
-	int ret;
-
-	ret = machine__resolve_callchain_sample(machine, thread,
-						sample->callchain, parent, root_al);
-	if (ret)
-		return ret;
-
-	/* Can we do dwarf post unwind? */
-	if (!((evsel->attr.sample_type & PERF_SAMPLE_REGS_USER) &&
-	      (evsel->attr.sample_type & PERF_SAMPLE_STACK_USER)))
-		return 0;
-
-	/* Bail out if nothing was captured. */
-	if ((!sample->user_regs.regs) ||
-	    (!sample->user_stack.size))
-		return 0;
-
-	return unwind__get_entries(unwind_entry, &callchain_cursor, machine,
-				   thread, evsel->attr.sample_regs_user,
-				   sample);
-
-}
diff --git a/src/tools/perf/util/machine.h b/src/tools/perf/util/machine.h
deleted file mode 100644
index 58a6be1..0000000
--- a/src/tools/perf/util/machine.h
+++ /dev/null
@@ -1,168 +0,0 @@
-#ifndef __PERF_MACHINE_H
-#define __PERF_MACHINE_H
-
-#include <sys/types.h>
-#include <linux/rbtree.h>
-#include "map.h"
-
-struct addr_location;
-struct branch_stack;
-struct perf_evsel;
-struct perf_sample;
-struct symbol;
-struct thread;
-union perf_event;
-
-/* Native host kernel uses -1 as pid index in machine */
-#define	HOST_KERNEL_ID			(-1)
-#define	DEFAULT_GUEST_KERNEL_ID		(0)
-
-struct machine {
-	struct rb_node	  rb_node;
-	pid_t		  pid;
-	u16		  id_hdr_size;
-	char		  *root_dir;
-	struct rb_root	  threads;
-	struct list_head  dead_threads;
-	struct thread	  *last_match;
-	struct list_head  user_dsos;
-	struct list_head  kernel_dsos;
-	struct map_groups kmaps;
-	struct map	  *vmlinux_maps[MAP__NR_TYPES];
-	symbol_filter_t	  symbol_filter;
-};
-
-static inline
-struct map *machine__kernel_map(struct machine *machine, enum map_type type)
-{
-	return machine->vmlinux_maps[type];
-}
-
-struct thread *machine__find_thread(struct machine *machine, pid_t tid);
-
-int machine__process_comm_event(struct machine *machine, union perf_event *event);
-int machine__process_exit_event(struct machine *machine, union perf_event *event);
-int machine__process_fork_event(struct machine *machine, union perf_event *event);
-int machine__process_lost_event(struct machine *machine, union perf_event *event);
-int machine__process_mmap_event(struct machine *machine, union perf_event *event);
-int machine__process_mmap2_event(struct machine *machine, union perf_event *event);
-int machine__process_event(struct machine *machine, union perf_event *event);
-
-typedef void (*machine__process_t)(struct machine *machine, void *data);
-
-struct machines {
-	struct machine host;
-	struct rb_root guests;
-	symbol_filter_t symbol_filter;
-};
-
-void machines__init(struct machines *machines);
-void machines__exit(struct machines *machines);
-
-void machines__process_guests(struct machines *machines,
-			      machine__process_t process, void *data);
-
-struct machine *machines__add(struct machines *machines, pid_t pid,
-			      const char *root_dir);
-struct machine *machines__find_host(struct machines *machines);
-struct machine *machines__find(struct machines *machines, pid_t pid);
-struct machine *machines__findnew(struct machines *machines, pid_t pid);
-
-void machines__set_id_hdr_size(struct machines *machines, u16 id_hdr_size);
-char *machine__mmap_name(struct machine *machine, char *bf, size_t size);
-
-void machines__set_symbol_filter(struct machines *machines,
-				 symbol_filter_t symbol_filter);
-
-int machine__init(struct machine *machine, const char *root_dir, pid_t pid);
-void machine__exit(struct machine *machine);
-void machine__delete_dead_threads(struct machine *machine);
-void machine__delete_threads(struct machine *machine);
-void machine__delete(struct machine *machine);
-
-struct branch_info *machine__resolve_bstack(struct machine *machine,
-					    struct thread *thread,
-					    struct branch_stack *bs);
-struct mem_info *machine__resolve_mem(struct machine *machine,
-				      struct thread *thread,
-				      struct perf_sample *sample, u8 cpumode);
-int machine__resolve_callchain(struct machine *machine,
-			       struct perf_evsel *evsel,
-			       struct thread *thread,
-			       struct perf_sample *sample,
-			       struct symbol **parent,
-			       struct addr_location *root_al);
-
-/*
- * Default guest kernel is defined by parameter --guestkallsyms
- * and --guestmodules
- */
-static inline bool machine__is_default_guest(struct machine *machine)
-{
-	return machine ? machine->pid == DEFAULT_GUEST_KERNEL_ID : false;
-}
-
-static inline bool machine__is_host(struct machine *machine)
-{
-	return machine ? machine->pid == HOST_KERNEL_ID : false;
-}
-
-struct thread *machine__findnew_thread(struct machine *machine, pid_t pid,
-				       pid_t tid);
-
-size_t machine__fprintf(struct machine *machine, FILE *fp);
-
-static inline
-struct symbol *machine__find_kernel_symbol(struct machine *machine,
-					   enum map_type type, u64 addr,
-					   struct map **mapp,
-					   symbol_filter_t filter)
-{
-	return map_groups__find_symbol(&machine->kmaps, type, addr,
-				       mapp, filter);
-}
-
-static inline
-struct symbol *machine__find_kernel_function(struct machine *machine, u64 addr,
-					     struct map **mapp,
-					     symbol_filter_t filter)
-{
-	return machine__find_kernel_symbol(machine, MAP__FUNCTION, addr,
-					   mapp, filter);
-}
-
-static inline
-struct symbol *machine__find_kernel_function_by_name(struct machine *machine,
-						     const char *name,
-						     struct map **mapp,
-						     symbol_filter_t filter)
-{
-	return map_groups__find_function_by_name(&machine->kmaps, name, mapp,
-						 filter);
-}
-
-struct map *machine__new_module(struct machine *machine, u64 start,
-				const char *filename);
-
-int machine__load_kallsyms(struct machine *machine, const char *filename,
-			   enum map_type type, symbol_filter_t filter);
-int machine__load_vmlinux_path(struct machine *machine, enum map_type type,
-			       symbol_filter_t filter);
-
-size_t machine__fprintf_dsos_buildid(struct machine *machine, FILE *fp,
-				     bool (skip)(struct dso *dso, int parm), int parm);
-size_t machines__fprintf_dsos(struct machines *machines, FILE *fp);
-size_t machines__fprintf_dsos_buildid(struct machines *machines, FILE *fp,
-				     bool (skip)(struct dso *dso, int parm), int parm);
-
-void machine__destroy_kernel_maps(struct machine *machine);
-int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel);
-int machine__create_kernel_maps(struct machine *machine);
-
-int machines__create_kernel_maps(struct machines *machines, pid_t pid);
-int machines__create_guest_kernel_maps(struct machines *machines);
-void machines__destroy_kernel_maps(struct machines *machines);
-
-size_t machine__fprintf_vmlinux_path(struct machine *machine, FILE *fp);
-
-#endif /* __PERF_MACHINE_H */
diff --git a/src/tools/perf/util/map.c b/src/tools/perf/util/map.c
deleted file mode 100644
index 4f6680d..0000000
--- a/src/tools/perf/util/map.c
+++ /dev/null
@@ -1,581 +0,0 @@
-#include "symbol.h"
-#include <errno.h>
-#include <inttypes.h>
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <unistd.h>
-#include "map.h"
-#include "thread.h"
-#include "strlist.h"
-#include "vdso.h"
-#include "build-id.h"
-#include <linux/string.h>
-
-const char *map_type__name[MAP__NR_TYPES] = {
-	[MAP__FUNCTION] = "Functions",
-	[MAP__VARIABLE] = "Variables",
-};
-
-static inline int is_anon_memory(const char *filename)
-{
-	return !strcmp(filename, "//anon") ||
-	       !strcmp(filename, "/dev/zero (deleted)") ||
-	       !strcmp(filename, "/anon_hugepage (deleted)");
-}
-
-static inline int is_no_dso_memory(const char *filename)
-{
-	return !strncmp(filename, "[stack", 6) ||
-	       !strcmp(filename, "[heap]");
-}
-
-void map__init(struct map *map, enum map_type type,
-	       u64 start, u64 end, u64 pgoff, struct dso *dso)
-{
-	map->type     = type;
-	map->start    = start;
-	map->end      = end;
-	map->pgoff    = pgoff;
-	map->dso      = dso;
-	map->map_ip   = map__map_ip;
-	map->unmap_ip = map__unmap_ip;
-	RB_CLEAR_NODE(&map->rb_node);
-	map->groups   = NULL;
-	map->referenced = false;
-	map->erange_warned = false;
-}
-
-struct map *map__new(struct list_head *dsos__list, u64 start, u64 len,
-		     u64 pgoff, u32 pid, u32 d_maj, u32 d_min, u64 ino,
-		     u64 ino_gen, char *filename,
-		     enum map_type type)
-{
-	struct map *map = malloc(sizeof(*map));
-
-	if (map != NULL) {
-		char newfilename[PATH_MAX];
-		struct dso *dso;
-		int anon, no_dso, vdso;
-
-		anon = is_anon_memory(filename);
-		vdso = is_vdso_map(filename);
-		no_dso = is_no_dso_memory(filename);
-
-		map->maj = d_maj;
-		map->min = d_min;
-		map->ino = ino;
-		map->ino_generation = ino_gen;
-
-		if (anon) {
-			snprintf(newfilename, sizeof(newfilename), "/tmp/perf-%d.map", pid);
-			filename = newfilename;
-		}
-
-		if (vdso) {
-			pgoff = 0;
-			dso = vdso__dso_findnew(dsos__list);
-		} else
-			dso = __dsos__findnew(dsos__list, filename);
-
-		if (dso == NULL)
-			goto out_delete;
-
-		map__init(map, type, start, start + len, pgoff, dso);
-
-		if (anon || no_dso) {
-			map->map_ip = map->unmap_ip = identity__map_ip;
-
-			/*
-			 * Set memory without DSO as loaded. All map__find_*
-			 * functions still return NULL, and we avoid the
-			 * unnecessary map__load warning.
-			 */
-			if (no_dso)
-				dso__set_loaded(dso, map->type);
-		}
-	}
-	return map;
-out_delete:
-	free(map);
-	return NULL;
-}
-
-/*
- * Constructor variant for modules (where we know from /proc/modules where
- * they are loaded) and for vmlinux, where only after we load all the
- * symbols we'll know where it starts and ends.
- */
-struct map *map__new2(u64 start, struct dso *dso, enum map_type type)
-{
-	struct map *map = calloc(1, (sizeof(*map) +
-				     (dso->kernel ? sizeof(struct kmap) : 0)));
-	if (map != NULL) {
-		/*
-		 * ->end will be filled after we load all the symbols
-		 */
-		map__init(map, type, start, 0, 0, dso);
-	}
-
-	return map;
-}
-
-void map__delete(struct map *map)
-{
-	free(map);
-}
-
-void map__fixup_start(struct map *map)
-{
-	struct rb_root *symbols = &map->dso->symbols[map->type];
-	struct rb_node *nd = rb_first(symbols);
-	if (nd != NULL) {
-		struct symbol *sym = rb_entry(nd, struct symbol, rb_node);
-		map->start = sym->start;
-	}
-}
-
-void map__fixup_end(struct map *map)
-{
-	struct rb_root *symbols = &map->dso->symbols[map->type];
-	struct rb_node *nd = rb_last(symbols);
-	if (nd != NULL) {
-		struct symbol *sym = rb_entry(nd, struct symbol, rb_node);
-		map->end = sym->end;
-	}
-}
-
-#define DSO__DELETED "(deleted)"
-
-int map__load(struct map *map, symbol_filter_t filter)
-{
-	const char *name = map->dso->long_name;
-	int nr;
-
-	if (dso__loaded(map->dso, map->type))
-		return 0;
-
-	nr = dso__load(map->dso, map, filter);
-	if (nr < 0) {
-		if (map->dso->has_build_id) {
-			char sbuild_id[BUILD_ID_SIZE * 2 + 1];
-
-			build_id__sprintf(map->dso->build_id,
-					  sizeof(map->dso->build_id),
-					  sbuild_id);
-			pr_warning("%s with build id %s not found",
-				   name, sbuild_id);
-		} else
-			pr_warning("Failed to open %s", name);
-
-		pr_warning(", continuing without symbols\n");
-		return -1;
-	} else if (nr == 0) {
-#ifdef LIBELF_SUPPORT
-		const size_t len = strlen(name);
-		const size_t real_len = len - sizeof(DSO__DELETED);
-
-		if (len > sizeof(DSO__DELETED) &&
-		    strcmp(name + real_len + 1, DSO__DELETED) == 0) {
-			pr_warning("%.*s was updated (is prelink enabled?). "
-				"Restart the long running apps that use it!\n",
-				   (int)real_len, name);
-		} else {
-			pr_warning("no symbols found in %s, maybe install "
-				   "a debug package?\n", name);
-		}
-#endif
-		return -1;
-	}
-
-	return 0;
-}
-
-struct symbol *map__find_symbol(struct map *map, u64 addr,
-				symbol_filter_t filter)
-{
-	if (map__load(map, filter) < 0)
-		return NULL;
-
-	return dso__find_symbol(map->dso, map->type, addr);
-}
-
-struct symbol *map__find_symbol_by_name(struct map *map, const char *name,
-					symbol_filter_t filter)
-{
-	if (map__load(map, filter) < 0)
-		return NULL;
-
-	if (!dso__sorted_by_name(map->dso, map->type))
-		dso__sort_by_name(map->dso, map->type);
-
-	return dso__find_symbol_by_name(map->dso, map->type, name);
-}
-
-struct map *map__clone(struct map *map)
-{
-	return memdup(map, sizeof(*map));
-}
-
-int map__overlap(struct map *l, struct map *r)
-{
-	if (l->start > r->start) {
-		struct map *t = l;
-		l = r;
-		r = t;
-	}
-
-	if (l->end > r->start)
-		return 1;
-
-	return 0;
-}
-
-size_t map__fprintf(struct map *map, FILE *fp)
-{
-	return fprintf(fp, " %" PRIx64 "-%" PRIx64 " %" PRIx64 " %s\n",
-		       map->start, map->end, map->pgoff, map->dso->name);
-}
-
-size_t map__fprintf_dsoname(struct map *map, FILE *fp)
-{
-	const char *dsoname = "[unknown]";
-
-	if (map && map->dso && (map->dso->name || map->dso->long_name)) {
-		if (symbol_conf.show_kernel_path && map->dso->long_name)
-			dsoname = map->dso->long_name;
-		else if (map->dso->name)
-			dsoname = map->dso->name;
-	}
-
-	return fprintf(fp, "%s", dsoname);
-}
-
-/*
- * objdump wants/reports absolute IPs for ET_EXEC, and RIPs for ET_DYN.
- * map->dso->adjust_symbols==1 for ET_EXEC-like cases except ET_REL which is
- * relative to section start.
- */
-u64 map__rip_2objdump(struct map *map, u64 rip)
-{
-	if (!map->dso->adjust_symbols)
-		return rip;
-
-	if (map->dso->rel)
-		return rip - map->pgoff;
-
-	return map->unmap_ip(map, rip);
-}
-
-void map_groups__init(struct map_groups *mg)
-{
-	int i;
-	for (i = 0; i < MAP__NR_TYPES; ++i) {
-		mg->maps[i] = RB_ROOT;
-		INIT_LIST_HEAD(&mg->removed_maps[i]);
-	}
-	mg->machine = NULL;
-}
-
-static void maps__delete(struct rb_root *maps)
-{
-	struct rb_node *next = rb_first(maps);
-
-	while (next) {
-		struct map *pos = rb_entry(next, struct map, rb_node);
-
-		next = rb_next(&pos->rb_node);
-		rb_erase(&pos->rb_node, maps);
-		map__delete(pos);
-	}
-}
-
-static void maps__delete_removed(struct list_head *maps)
-{
-	struct map *pos, *n;
-
-	list_for_each_entry_safe(pos, n, maps, node) {
-		list_del(&pos->node);
-		map__delete(pos);
-	}
-}
-
-void map_groups__exit(struct map_groups *mg)
-{
-	int i;
-
-	for (i = 0; i < MAP__NR_TYPES; ++i) {
-		maps__delete(&mg->maps[i]);
-		maps__delete_removed(&mg->removed_maps[i]);
-	}
-}
-
-void map_groups__flush(struct map_groups *mg)
-{
-	int type;
-
-	for (type = 0; type < MAP__NR_TYPES; type++) {
-		struct rb_root *root = &mg->maps[type];
-		struct rb_node *next = rb_first(root);
-
-		while (next) {
-			struct map *pos = rb_entry(next, struct map, rb_node);
-			next = rb_next(&pos->rb_node);
-			rb_erase(&pos->rb_node, root);
-			/*
-			 * We may have references to this map, for
-			 * instance in some hist_entry instances, so
-			 * just move them to a separate list.
-			 */
-			list_add_tail(&pos->node, &mg->removed_maps[pos->type]);
-		}
-	}
-}
-
-struct symbol *map_groups__find_symbol(struct map_groups *mg,
-				       enum map_type type, u64 addr,
-				       struct map **mapp,
-				       symbol_filter_t filter)
-{
-	struct map *map = map_groups__find(mg, type, addr);
-
-	if (map != NULL) {
-		if (mapp != NULL)
-			*mapp = map;
-		return map__find_symbol(map, map->map_ip(map, addr), filter);
-	}
-
-	return NULL;
-}
-
-struct symbol *map_groups__find_symbol_by_name(struct map_groups *mg,
-					       enum map_type type,
-					       const char *name,
-					       struct map **mapp,
-					       symbol_filter_t filter)
-{
-	struct rb_node *nd;
-
-	for (nd = rb_first(&mg->maps[type]); nd; nd = rb_next(nd)) {
-		struct map *pos = rb_entry(nd, struct map, rb_node);
-		struct symbol *sym = map__find_symbol_by_name(pos, name, filter);
-
-		if (sym == NULL)
-			continue;
-		if (mapp != NULL)
-			*mapp = pos;
-		return sym;
-	}
-
-	return NULL;
-}
-
-size_t __map_groups__fprintf_maps(struct map_groups *mg,
-				  enum map_type type, int verbose, FILE *fp)
-{
-	size_t printed = fprintf(fp, "%s:\n", map_type__name[type]);
-	struct rb_node *nd;
-
-	for (nd = rb_first(&mg->maps[type]); nd; nd = rb_next(nd)) {
-		struct map *pos = rb_entry(nd, struct map, rb_node);
-		printed += fprintf(fp, "Map:");
-		printed += map__fprintf(pos, fp);
-		if (verbose > 2) {
-			printed += dso__fprintf(pos->dso, type, fp);
-			printed += fprintf(fp, "--\n");
-		}
-	}
-
-	return printed;
-}
-
-size_t map_groups__fprintf_maps(struct map_groups *mg, int verbose, FILE *fp)
-{
-	size_t printed = 0, i;
-	for (i = 0; i < MAP__NR_TYPES; ++i)
-		printed += __map_groups__fprintf_maps(mg, i, verbose, fp);
-	return printed;
-}
-
-static size_t __map_groups__fprintf_removed_maps(struct map_groups *mg,
-						 enum map_type type,
-						 int verbose, FILE *fp)
-{
-	struct map *pos;
-	size_t printed = 0;
-
-	list_for_each_entry(pos, &mg->removed_maps[type], node) {
-		printed += fprintf(fp, "Map:");
-		printed += map__fprintf(pos, fp);
-		if (verbose > 1) {
-			printed += dso__fprintf(pos->dso, type, fp);
-			printed += fprintf(fp, "--\n");
-		}
-	}
-	return printed;
-}
-
-static size_t map_groups__fprintf_removed_maps(struct map_groups *mg,
-					       int verbose, FILE *fp)
-{
-	size_t printed = 0, i;
-	for (i = 0; i < MAP__NR_TYPES; ++i)
-		printed += __map_groups__fprintf_removed_maps(mg, i, verbose, fp);
-	return printed;
-}
-
-size_t map_groups__fprintf(struct map_groups *mg, int verbose, FILE *fp)
-{
-	size_t printed = map_groups__fprintf_maps(mg, verbose, fp);
-	printed += fprintf(fp, "Removed maps:\n");
-	return printed + map_groups__fprintf_removed_maps(mg, verbose, fp);
-}
-
-int map_groups__fixup_overlappings(struct map_groups *mg, struct map *map,
-				   int verbose, FILE *fp)
-{
-	struct rb_root *root = &mg->maps[map->type];
-	struct rb_node *next = rb_first(root);
-	int err = 0;
-
-	while (next) {
-		struct map *pos = rb_entry(next, struct map, rb_node);
-		next = rb_next(&pos->rb_node);
-
-		if (!map__overlap(pos, map))
-			continue;
-
-		if (verbose >= 2) {
-			fputs("overlapping maps:\n", fp);
-			map__fprintf(map, fp);
-			map__fprintf(pos, fp);
-		}
-
-		rb_erase(&pos->rb_node, root);
-		/*
-		 * Now check if we need to create new maps for areas not
-		 * overlapped by the new map:
-		 */
-		if (map->start > pos->start) {
-			struct map *before = map__clone(pos);
-
-			if (before == NULL) {
-				err = -ENOMEM;
-				goto move_map;
-			}
-
-			before->end = map->start - 1;
-			map_groups__insert(mg, before);
-			if (verbose >= 2)
-				map__fprintf(before, fp);
-		}
-
-		if (map->end < pos->end) {
-			struct map *after = map__clone(pos);
-
-			if (after == NULL) {
-				err = -ENOMEM;
-				goto move_map;
-			}
-
-			after->start = map->end + 1;
-			map_groups__insert(mg, after);
-			if (verbose >= 2)
-				map__fprintf(after, fp);
-		}
-move_map:
-		/*
-		 * If we have references, just move them to a separate list.
-		 */
-		if (pos->referenced)
-			list_add_tail(&pos->node, &mg->removed_maps[map->type]);
-		else
-			map__delete(pos);
-
-		if (err)
-			return err;
-	}
-
-	return 0;
-}
-
-/*
- * XXX This should not really _copy_ te maps, but refcount them.
- */
-int map_groups__clone(struct map_groups *mg,
-		      struct map_groups *parent, enum map_type type)
-{
-	struct rb_node *nd;
-	for (nd = rb_first(&parent->maps[type]); nd; nd = rb_next(nd)) {
-		struct map *map = rb_entry(nd, struct map, rb_node);
-		struct map *new = map__clone(map);
-		if (new == NULL)
-			return -ENOMEM;
-		map_groups__insert(mg, new);
-	}
-	return 0;
-}
-
-void maps__insert(struct rb_root *maps, struct map *map)
-{
-	struct rb_node **p = &maps->rb_node;
-	struct rb_node *parent = NULL;
-	const u64 ip = map->start;
-	struct map *m;
-
-	while (*p != NULL) {
-		parent = *p;
-		m = rb_entry(parent, struct map, rb_node);
-		if (ip < m->start)
-			p = &(*p)->rb_left;
-		else
-			p = &(*p)->rb_right;
-	}
-
-	rb_link_node(&map->rb_node, parent, p);
-	rb_insert_color(&map->rb_node, maps);
-}
-
-void maps__remove(struct rb_root *maps, struct map *map)
-{
-	rb_erase(&map->rb_node, maps);
-}
-
-struct map *maps__find(struct rb_root *maps, u64 ip)
-{
-	struct rb_node **p = &maps->rb_node;
-	struct rb_node *parent = NULL;
-	struct map *m;
-
-	while (*p != NULL) {
-		parent = *p;
-		m = rb_entry(parent, struct map, rb_node);
-		if (ip < m->start)
-			p = &(*p)->rb_left;
-		else if (ip > m->end)
-			p = &(*p)->rb_right;
-		else
-			return m;
-	}
-
-	return NULL;
-}
-
-struct map *maps__first(struct rb_root *maps)
-{
-	struct rb_node *first = rb_first(maps);
-
-	if (first)
-		return rb_entry(first, struct map, rb_node);
-	return NULL;
-}
-
-struct map *maps__next(struct map *map)
-{
-	struct rb_node *next = rb_next(&map->rb_node);
-
-	if (next)
-		return rb_entry(next, struct map, rb_node);
-	return NULL;
-}
diff --git a/src/tools/perf/util/map.h b/src/tools/perf/util/map.h
deleted file mode 100644
index 4886ca2..0000000
--- a/src/tools/perf/util/map.h
+++ /dev/null
@@ -1,186 +0,0 @@
-#ifndef __PERF_MAP_H
-#define __PERF_MAP_H
-
-#include <linux/compiler.h>
-#include <linux/list.h>
-#include <linux/rbtree.h>
-#include <stdio.h>
-#include <stdbool.h>
-#include "types.h"
-
-enum map_type {
-	MAP__FUNCTION = 0,
-	MAP__VARIABLE,
-};
-
-#define MAP__NR_TYPES (MAP__VARIABLE + 1)
-
-extern const char *map_type__name[MAP__NR_TYPES];
-
-struct dso;
-struct ip_callchain;
-struct ref_reloc_sym;
-struct map_groups;
-struct machine;
-struct perf_evsel;
-
-struct map {
-	union {
-		struct rb_node	rb_node;
-		struct list_head node;
-	};
-	u64			start;
-	u64			end;
-	u8 /* enum map_type */	type;
-	bool			referenced;
-	bool			erange_warned;
-	u32			priv;
-	u64			pgoff;
-	u32			maj, min; /* only valid for MMAP2 record */
-	u64			ino;      /* only valid for MMAP2 record */
-	u64			ino_generation;/* only valid for MMAP2 record */
-
-	/* ip -> dso rip */
-	u64			(*map_ip)(struct map *, u64);
-	/* dso rip -> ip */
-	u64			(*unmap_ip)(struct map *, u64);
-
-	struct dso		*dso;
-	struct map_groups	*groups;
-};
-
-struct kmap {
-	struct ref_reloc_sym	*ref_reloc_sym;
-	struct map_groups	*kmaps;
-};
-
-struct map_groups {
-	struct rb_root	 maps[MAP__NR_TYPES];
-	struct list_head removed_maps[MAP__NR_TYPES];
-	struct machine	 *machine;
-};
-
-static inline struct kmap *map__kmap(struct map *map)
-{
-	return (struct kmap *)(map + 1);
-}
-
-static inline u64 map__map_ip(struct map *map, u64 ip)
-{
-	return ip - map->start + map->pgoff;
-}
-
-static inline u64 map__unmap_ip(struct map *map, u64 ip)
-{
-	return ip + map->start - map->pgoff;
-}
-
-static inline u64 identity__map_ip(struct map *map __maybe_unused, u64 ip)
-{
-	return ip;
-}
-
-
-/* rip/ip <-> addr suitable for passing to `objdump --start-address=` */
-u64 map__rip_2objdump(struct map *map, u64 rip);
-
-struct symbol;
-
-typedef int (*symbol_filter_t)(struct map *map, struct symbol *sym);
-
-void map__init(struct map *map, enum map_type type,
-	       u64 start, u64 end, u64 pgoff, struct dso *dso);
-struct map *map__new(struct list_head *dsos__list, u64 start, u64 len,
-		     u64 pgoff, u32 pid, u32 d_maj, u32 d_min, u64 ino,
-		     u64 ino_gen,
-		     char *filename, enum map_type type);
-struct map *map__new2(u64 start, struct dso *dso, enum map_type type);
-void map__delete(struct map *map);
-struct map *map__clone(struct map *map);
-int map__overlap(struct map *l, struct map *r);
-size_t map__fprintf(struct map *map, FILE *fp);
-size_t map__fprintf_dsoname(struct map *map, FILE *fp);
-
-int map__load(struct map *map, symbol_filter_t filter);
-struct symbol *map__find_symbol(struct map *map,
-				u64 addr, symbol_filter_t filter);
-struct symbol *map__find_symbol_by_name(struct map *map, const char *name,
-					symbol_filter_t filter);
-void map__fixup_start(struct map *map);
-void map__fixup_end(struct map *map);
-
-void map__reloc_vmlinux(struct map *map);
-
-size_t __map_groups__fprintf_maps(struct map_groups *mg,
-				  enum map_type type, int verbose, FILE *fp);
-void maps__insert(struct rb_root *maps, struct map *map);
-void maps__remove(struct rb_root *maps, struct map *map);
-struct map *maps__find(struct rb_root *maps, u64 addr);
-struct map *maps__first(struct rb_root *maps);
-struct map *maps__next(struct map *map);
-void map_groups__init(struct map_groups *mg);
-void map_groups__exit(struct map_groups *mg);
-int map_groups__clone(struct map_groups *mg,
-		      struct map_groups *parent, enum map_type type);
-size_t map_groups__fprintf(struct map_groups *mg, int verbose, FILE *fp);
-size_t map_groups__fprintf_maps(struct map_groups *mg, int verbose, FILE *fp);
-
-int maps__set_kallsyms_ref_reloc_sym(struct map **maps, const char *symbol_name,
-				     u64 addr);
-
-static inline void map_groups__insert(struct map_groups *mg, struct map *map)
-{
-	maps__insert(&mg->maps[map->type], map);
-	map->groups = mg;
-}
-
-static inline void map_groups__remove(struct map_groups *mg, struct map *map)
-{
-	maps__remove(&mg->maps[map->type], map);
-}
-
-static inline struct map *map_groups__find(struct map_groups *mg,
-					   enum map_type type, u64 addr)
-{
-	return maps__find(&mg->maps[type], addr);
-}
-
-static inline struct map *map_groups__first(struct map_groups *mg,
-					    enum map_type type)
-{
-	return maps__first(&mg->maps[type]);
-}
-
-static inline struct map *map_groups__next(struct map *map)
-{
-	return maps__next(map);
-}
-
-struct symbol *map_groups__find_symbol(struct map_groups *mg,
-				       enum map_type type, u64 addr,
-				       struct map **mapp,
-				       symbol_filter_t filter);
-
-struct symbol *map_groups__find_symbol_by_name(struct map_groups *mg,
-					       enum map_type type,
-					       const char *name,
-					       struct map **mapp,
-					       symbol_filter_t filter);
-
-static inline
-struct symbol *map_groups__find_function_by_name(struct map_groups *mg,
-						 const char *name, struct map **mapp,
-						 symbol_filter_t filter)
-{
-	return map_groups__find_symbol_by_name(mg, MAP__FUNCTION, name, mapp, filter);
-}
-
-int map_groups__fixup_overlappings(struct map_groups *mg, struct map *map,
-				   int verbose, FILE *fp);
-
-struct map *map_groups__find_by_name(struct map_groups *mg,
-				     enum map_type type, const char *name);
-
-void map_groups__flush(struct map_groups *mg);
-
-#endif /* __PERF_MAP_H */
diff --git a/src/tools/perf/util/pager.c b/src/tools/perf/util/pager.c
deleted file mode 100644
index 2051a4c..0000000
--- a/src/tools/perf/util/pager.c
+++ /dev/null
@@ -1,104 +0,0 @@
-#include "cache.h"
-#include "run-command.h"
-#include "sigchain.h"
-
-/*
- * This is split up from the rest of git so that we can do
- * something different on Windows.
- */
-
-static int spawned_pager;
-
-static void pager_preexec(void)
-{
-	/*
-	 * Work around bug in "less" by not starting it until we
-	 * have real input
-	 */
-	fd_set in;
-
-	FD_ZERO(&in);
-	FD_SET(0, &in);
-	select(1, &in, NULL, &in, NULL);
-
-	setenv("LESS", "FRSX", 0);
-}
-
-static const char *pager_argv[] = { "sh", "-c", NULL, NULL };
-static struct child_process pager_process;
-
-static void wait_for_pager(void)
-{
-	fflush(stdout);
-	fflush(stderr);
-	/* signal EOF to pager */
-	close(1);
-	close(2);
-	finish_command(&pager_process);
-}
-
-static void wait_for_pager_signal(int signo)
-{
-	wait_for_pager();
-	sigchain_pop(signo);
-	raise(signo);
-}
-
-void setup_pager(void)
-{
-	const char *pager = getenv("PERF_PAGER");
-
-	if (!isatty(1))
-		return;
-	if (!pager) {
-		if (!pager_program)
-			perf_config(perf_default_config, NULL);
-		pager = pager_program;
-	}
-	if (!pager)
-		pager = getenv("PAGER");
-	if (!pager) {
-		if (!access("/usr/bin/pager", X_OK))
-			pager = "/usr/bin/pager";
-	}
-	if (!pager)
-#if defined(ANDROID_PATCHES)
-		pager = "cat";
-#else
-		pager = "less";
-#endif
-	else if (!*pager || !strcmp(pager, "cat"))
-		return;
-
-	spawned_pager = 1; /* means we are emitting to terminal */
-
-	/* spawn the pager */
-	pager_argv[2] = pager;
-	pager_process.argv = pager_argv;
-	pager_process.in = -1;
-	pager_process.preexec_cb = pager_preexec;
-
-	if (start_command(&pager_process))
-		return;
-
-	/* original process continues, but writes to the pipe */
-	dup2(pager_process.in, 1);
-	if (isatty(2))
-		dup2(pager_process.in, 2);
-	close(pager_process.in);
-
-	/* this makes sure that the parent terminates after the pager */
-	sigchain_push_common(wait_for_pager_signal);
-	atexit(wait_for_pager);
-}
-
-int pager_in_use(void)
-{
-	const char *env;
-
-	if (spawned_pager)
-		return 1;
-
-	env = getenv("PERF_PAGER_IN_USE");
-	return env ? perf_config_bool("PERF_PAGER_IN_USE", env) : 0;
-}
diff --git a/src/tools/perf/util/parse-events-bison.c b/src/tools/perf/util/parse-events-bison.c
deleted file mode 100644
index 44364d6..0000000
--- a/src/tools/perf/util/parse-events-bison.c
+++ /dev/null
@@ -1,2164 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.5.  */
-
-/* Bison implementation for Yacc-like parsers in C
-   
-      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
-   
-   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 3 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/>.  */
-
-/* As a special exception, you may create a larger work that contains
-   part or all of the Bison parser skeleton and distribute that work
-   under terms of your choice, so long as that work isn't itself a
-   parser generator using the skeleton or a modified version thereof
-   as a parser skeleton.  Alternatively, if you modify or redistribute
-   the parser skeleton itself, you may (at your option) remove this
-   special exception, which will cause the skeleton and the resulting
-   Bison output files to be licensed under the GNU General Public
-   License without this special exception.
-   
-   This special exception was added by the Free Software Foundation in
-   version 2.2 of Bison.  */
-
-/* C LALR(1) parser skeleton written by Richard Stallman, by
-   simplifying the original so-called "semantic" parser.  */
-
-/* All symbols defined below should begin with yy or YY, to avoid
-   infringing on user name space.  This should be done even for local
-   variables, as they might otherwise be expanded by user macros.
-   There are some unavoidable exceptions within include files to
-   define necessary library symbols; they are noted "INFRINGES ON
-   USER NAME SPACE" below.  */
-
-/* Identify Bison output.  */
-#define YYBISON 1
-
-/* Bison version.  */
-#define YYBISON_VERSION "2.5"
-
-/* Skeleton name.  */
-#define YYSKELETON_NAME "yacc.c"
-
-/* Pure parsers.  */
-#define YYPURE 1
-
-/* Push parsers.  */
-#define YYPUSH 0
-
-/* Pull parsers.  */
-#define YYPULL 1
-
-/* Using locations.  */
-#define YYLSP_NEEDED 0
-
-/* Substitute the variable and function names.  */
-#define yyparse         parse_events_parse
-#define yylex           parse_events_lex
-#define yyerror         parse_events_error
-#define yylval          parse_events_lval
-#define yychar          parse_events_char
-#define yydebug         parse_events_debug
-#define yynerrs         parse_events_nerrs
-
-
-/* Copy the first part of user declarations.  */
-
-/* Line 268 of yacc.c  */
-#line 6 "util/parse-events.y"
-
-
-#define YYDEBUG 1
-
-#include <linux/compiler.h>
-#include <linux/list.h>
-#include "types.h"
-#include "util.h"
-#include "parse-events.h"
-#include "parse-events-bison.h"
-
-extern int parse_events_lex (YYSTYPE* lvalp, void* scanner);
-
-#define ABORT_ON(val) \
-do { \
-	if (val) \
-		YYABORT; \
-} while (0)
-
-#define ALLOC_LIST(list) \
-do { \
-	list = malloc(sizeof(*list)); \
-	ABORT_ON(!list);              \
-	INIT_LIST_HEAD(list);         \
-} while (0)
-
-static inc_group_count(struct list_head *list,
-		       struct parse_events_evlist *data)
-{
-	/* Count groups only have more than 1 members */
-	if (!list_is_last(list->next, list))
-		data->nr_groups++;
-}
-
-
-
-/* Line 268 of yacc.c  */
-#line 116 "util/parse-events-bison.c"
-
-/* Enabling traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
-
-/* Enabling verbose error messages.  */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE 0
-#endif
-
-/* Enabling the token table.  */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE 0
-#endif
-
-
-/* Tokens.  */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-     PE_START_EVENTS = 258,
-     PE_START_TERMS = 259,
-     PE_VALUE = 260,
-     PE_VALUE_SYM_HW = 261,
-     PE_VALUE_SYM_SW = 262,
-     PE_RAW = 263,
-     PE_TERM = 264,
-     PE_EVENT_NAME = 265,
-     PE_NAME = 266,
-     PE_MODIFIER_EVENT = 267,
-     PE_MODIFIER_BP = 268,
-     PE_NAME_CACHE_TYPE = 269,
-     PE_NAME_CACHE_OP_RESULT = 270,
-     PE_PREFIX_MEM = 271,
-     PE_PREFIX_RAW = 272,
-     PE_PREFIX_GROUP = 273,
-     PE_ERROR = 274
-   };
-#endif
-
-
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-{
-
-/* Line 293 of yacc.c  */
-#line 81 "util/parse-events.y"
-
-	char *str;
-	u64 num;
-	struct list_head *head;
-	struct parse_events_term *term;
-
-
-
-/* Line 293 of yacc.c  */
-#line 180 "util/parse-events-bison.c"
-} YYSTYPE;
-# define YYSTYPE_IS_TRIVIAL 1
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-#endif
-
-
-/* Copy the second part of user declarations.  */
-
-
-/* Line 343 of yacc.c  */
-#line 192 "util/parse-events-bison.c"
-
-#ifdef short
-# undef short
-#endif
-
-#ifdef YYTYPE_UINT8
-typedef YYTYPE_UINT8 yytype_uint8;
-#else
-typedef unsigned char yytype_uint8;
-#endif
-
-#ifdef YYTYPE_INT8
-typedef YYTYPE_INT8 yytype_int8;
-#elif (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-typedef signed char yytype_int8;
-#else
-typedef short int yytype_int8;
-#endif
-
-#ifdef YYTYPE_UINT16
-typedef YYTYPE_UINT16 yytype_uint16;
-#else
-typedef unsigned short int yytype_uint16;
-#endif
-
-#ifdef YYTYPE_INT16
-typedef YYTYPE_INT16 yytype_int16;
-#else
-typedef short int yytype_int16;
-#endif
-
-#ifndef YYSIZE_T
-# ifdef __SIZE_TYPE__
-#  define YYSIZE_T __SIZE_TYPE__
-# elif defined size_t
-#  define YYSIZE_T size_t
-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
-#  define YYSIZE_T size_t
-# else
-#  define YYSIZE_T unsigned int
-# endif
-#endif
-
-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
-
-#ifndef YY_
-# if defined YYENABLE_NLS && YYENABLE_NLS
-#  if ENABLE_NLS
-#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
-#   define YY_(msgid) dgettext ("bison-runtime", msgid)
-#  endif
-# endif
-# ifndef YY_
-#  define YY_(msgid) msgid
-# endif
-#endif
-
-/* Suppress unused-variable warnings by "using" E.  */
-#if ! defined lint || defined __GNUC__
-# define YYUSE(e) ((void) (e))
-#else
-# define YYUSE(e) /* empty */
-#endif
-
-/* Identity function, used to suppress warnings about constant conditions.  */
-#ifndef lint
-# define YYID(n) (n)
-#else
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static int
-YYID (int yyi)
-#else
-static int
-YYID (yyi)
-    int yyi;
-#endif
-{
-  return yyi;
-}
-#endif
-
-#if ! defined yyoverflow || YYERROR_VERBOSE
-
-/* The parser invokes alloca or malloc; define the necessary symbols.  */
-
-# ifdef YYSTACK_USE_ALLOCA
-#  if YYSTACK_USE_ALLOCA
-#   ifdef __GNUC__
-#    define YYSTACK_ALLOC __builtin_alloca
-#   elif defined __BUILTIN_VA_ARG_INCR
-#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
-#   elif defined _AIX
-#    define YYSTACK_ALLOC __alloca
-#   elif defined _MSC_VER
-#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
-#    define alloca _alloca
-#   else
-#    define YYSTACK_ALLOC alloca
-#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-#     ifndef EXIT_SUCCESS
-#      define EXIT_SUCCESS 0
-#     endif
-#    endif
-#   endif
-#  endif
-# endif
-
-# ifdef YYSTACK_ALLOC
-   /* Pacify GCC's `empty if-body' warning.  */
-#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
-#  ifndef YYSTACK_ALLOC_MAXIMUM
-    /* The OS might guarantee only one guard page at the bottom of the stack,
-       and a page size can be as small as 4096 bytes.  So we cannot safely
-       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
-       to allow for a few compiler-allocated temporary stack slots.  */
-#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
-#  endif
-# else
-#  define YYSTACK_ALLOC YYMALLOC
-#  define YYSTACK_FREE YYFREE
-#  ifndef YYSTACK_ALLOC_MAXIMUM
-#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
-#  endif
-#  if (defined __cplusplus && ! defined EXIT_SUCCESS \
-       && ! ((defined YYMALLOC || defined malloc) \
-	     && (defined YYFREE || defined free)))
-#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-#   ifndef EXIT_SUCCESS
-#    define EXIT_SUCCESS 0
-#   endif
-#  endif
-#  ifndef YYMALLOC
-#   define YYMALLOC malloc
-#   if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
-#   endif
-#  endif
-#  ifndef YYFREE
-#   define YYFREE free
-#   if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-void free (void *); /* INFRINGES ON USER NAME SPACE */
-#   endif
-#  endif
-# endif
-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
-
-
-#if (! defined yyoverflow \
-     && (! defined __cplusplus \
-	 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
-
-/* A type that is properly aligned for any stack member.  */
-union yyalloc
-{
-  yytype_int16 yyss_alloc;
-  YYSTYPE yyvs_alloc;
-};
-
-/* The size of the maximum gap between one aligned stack and the next.  */
-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
-
-/* The size of an array large to enough to hold all stacks, each with
-   N elements.  */
-# define YYSTACK_BYTES(N) \
-     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
-      + YYSTACK_GAP_MAXIMUM)
-
-# define YYCOPY_NEEDED 1
-
-/* Relocate STACK from its old location to the new one.  The
-   local variables YYSIZE and YYSTACKSIZE give the old and new number of
-   elements in the stack, and YYPTR gives the new location of the
-   stack.  Advance YYPTR to a properly aligned location for the next
-   stack.  */
-# define YYSTACK_RELOCATE(Stack_alloc, Stack)				\
-    do									\
-      {									\
-	YYSIZE_T yynewbytes;						\
-	YYCOPY (&yyptr->Stack_alloc, Stack, yysize);			\
-	Stack = &yyptr->Stack_alloc;					\
-	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
-	yyptr += yynewbytes / sizeof (*yyptr);				\
-      }									\
-    while (YYID (0))
-
-#endif
-
-#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
-/* Copy COUNT objects from FROM to TO.  The source and destination do
-   not overlap.  */
-# ifndef YYCOPY
-#  if defined __GNUC__ && 1 < __GNUC__
-#   define YYCOPY(To, From, Count) \
-      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-#  else
-#   define YYCOPY(To, From, Count)		\
-      do					\
-	{					\
-	  YYSIZE_T yyi;				\
-	  for (yyi = 0; yyi < (Count); yyi++)	\
-	    (To)[yyi] = (From)[yyi];		\
-	}					\
-      while (YYID (0))
-#  endif
-# endif
-#endif /* !YYCOPY_NEEDED */
-
-/* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  35
-/* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   87
-
-/* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  27
-/* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  24
-/* YYNRULES -- Number of rules.  */
-#define YYNRULES  55
-/* YYNRULES -- Number of states.  */
-#define YYNSTATES  87
-
-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
-#define YYUNDEFTOK  2
-#define YYMAXUTOK   274
-
-#define YYTRANSLATE(YYX)						\
-  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-
-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
-static const yytype_uint8 yytranslate[] =
-{
-       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,    20,    25,     2,    24,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,    21,     2,
-       2,    26,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,    22,     2,    23,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19
-};
-
-#if YYDEBUG
-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
-   YYRHS.  */
-static const yytype_uint8 yyprhs[] =
-{
-       0,     0,     3,     6,     9,    11,    15,    19,    21,    23,
-      27,    29,    34,    38,    42,    44,    46,    49,    51,    54,
-      56,    58,    60,    63,    65,    68,    71,    74,    79,    81,
-      83,    88,    91,    97,   101,   103,   109,   113,   117,   121,
-     123,   125,   129,   131,   135,   139,   143,   145,   147,   151,
-     155,   157,   159,   160,   162,   164
-};
-
-/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
-static const yytype_int8 yyrhs[] =
-{
-      28,     0,    -1,     3,    29,    -1,     4,    46,    -1,    30,
-      -1,    30,    20,    31,    -1,    30,    20,    34,    -1,    31,
-      -1,    34,    -1,    32,    21,    12,    -1,    32,    -1,    11,
-      22,    33,    23,    -1,    22,    33,    23,    -1,    33,    20,
-      34,    -1,    34,    -1,    35,    -1,    36,    12,    -1,    36,
-      -1,    10,    37,    -1,    37,    -1,    38,    -1,    40,    -1,
-      41,    49,    -1,    42,    -1,    43,    49,    -1,    44,    49,
-      -1,    45,    49,    -1,    11,    24,    47,    24,    -1,     6,
-      -1,     7,    -1,    39,    24,    47,    24,    -1,    39,    50,
-      -1,    14,    25,    15,    25,    15,    -1,    14,    25,    15,
-      -1,    14,    -1,    16,     5,    21,    13,    49,    -1,    16,
-       5,    49,    -1,    11,    21,    11,    -1,     5,    21,     5,
-      -1,     8,    -1,    47,    -1,    47,    20,    48,    -1,    48,
-      -1,    11,    26,    11,    -1,    11,    26,     5,    -1,    11,
-      26,     6,    -1,    11,    -1,     6,    -1,     9,    26,    11,
-      -1,     9,    26,     5,    -1,     9,    -1,    21,    -1,    -1,
-      24,    -1,    21,    -1,    -1
-};
-
-/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
-static const yytype_uint16 yyrline[] =
-{
-       0,    90,    90,    92,    94,   102,   111,   120,   122,   125,
-     133,   136,   145,   155,   164,   166,   169,   182,   185,   192,
-     194,   195,   196,   197,   198,   199,   200,   203,   215,   217,
-     220,   234,   248,   258,   268,   279,   290,   302,   313,   324,
-     335,   342,   352,   364,   373,   382,   391,   400,   409,   417,
-     425,   433,   433,   435,   435,   435
-};
-#endif
-
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
-static const char *const yytname[] =
-{
-  "$end", "error", "$undefined", "PE_START_EVENTS", "PE_START_TERMS",
-  "PE_VALUE", "PE_VALUE_SYM_HW", "PE_VALUE_SYM_SW", "PE_RAW", "PE_TERM",
-  "PE_EVENT_NAME", "PE_NAME", "PE_MODIFIER_EVENT", "PE_MODIFIER_BP",
-  "PE_NAME_CACHE_TYPE", "PE_NAME_CACHE_OP_RESULT", "PE_PREFIX_MEM",
-  "PE_PREFIX_RAW", "PE_PREFIX_GROUP", "PE_ERROR", "','", "':'", "'{'",
-  "'}'", "'/'", "'-'", "'='", "$accept", "start", "start_events", "groups",
-  "group", "group_def", "events", "event", "event_mod", "event_name",
-  "event_def", "event_pmu", "value_sym", "event_legacy_symbol",
-  "event_legacy_cache", "event_legacy_mem", "event_legacy_tracepoint",
-  "event_legacy_numeric", "event_legacy_raw", "start_terms",
-  "event_config", "event_term", "sep_dc", "sep_slash_dc", 0
-};
-#endif
-
-# ifdef YYPRINT
-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
-   token YYLEX-NUM.  */
-static const yytype_uint16 yytoknum[] =
-{
-       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
-     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-      44,    58,   123,   125,    47,    45,    61
-};
-# endif
-
-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const yytype_uint8 yyr1[] =
-{
-       0,    27,    28,    28,    29,    30,    30,    30,    30,    31,
-      31,    32,    32,    33,    33,    34,    35,    35,    36,    36,
-      37,    37,    37,    37,    37,    37,    37,    38,    39,    39,
-      40,    40,    41,    41,    41,    42,    42,    43,    44,    45,
-      46,    47,    47,    48,    48,    48,    48,    48,    48,    48,
-      48,    49,    49,    50,    50,    50
-};
-
-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
-static const yytype_uint8 yyr2[] =
-{
-       0,     2,     2,     2,     1,     3,     3,     1,     1,     3,
-       1,     4,     3,     3,     1,     1,     2,     1,     2,     1,
-       1,     1,     2,     1,     2,     2,     2,     4,     1,     1,
-       4,     2,     5,     3,     1,     5,     3,     3,     3,     1,
-       1,     3,     1,     3,     3,     3,     1,     1,     3,     3,
-       1,     1,     0,     1,     1,     0
-};
-
-/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
-   Performed when YYTABLE doesn't specify something else to do.  Zero
-   means the default is an error.  */
-static const yytype_uint8 yydefact[] =
-{
-       0,     0,     0,     0,     0,    28,    29,    39,     0,     0,
-      34,     0,     0,     2,     4,     7,    10,     8,    15,    17,
-      19,    20,    55,    21,    52,    23,    52,    52,    52,    47,
-      50,    46,     3,    40,    42,     1,     0,     0,    18,     0,
-       0,     0,     0,    52,     0,    14,     0,     0,    16,    54,
-      53,    31,    51,    22,    24,    25,    26,     0,     0,     0,
-      38,    37,     0,     0,    33,    51,    36,     0,    12,     5,
-       6,     9,     0,    49,    48,    44,    45,    43,    41,    11,
-      27,     0,    52,    13,    30,    32,    35
-};
-
-/* YYDEFGOTO[NTERM-NUM].  */
-static const yytype_int8 yydefgoto[] =
-{
-      -1,     3,    13,    14,    15,    16,    44,    45,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,    32,
-      33,    34,    53,    51
-};
-
-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-   STATE-NUM.  */
-#define YYPACT_NINF -38
-static const yytype_int8 yypact[] =
-{
-      16,     0,    41,    12,    19,   -38,   -38,   -38,    30,    32,
-      14,    44,    18,   -38,    31,   -38,    43,   -38,   -38,    49,
-     -38,   -38,     9,   -38,    46,   -38,    46,    46,    46,   -38,
-      42,    45,   -38,    50,   -38,   -38,    60,    34,   -38,    58,
-      18,    41,    57,    52,    39,   -38,     0,    62,   -38,   -38,
-      41,   -38,   -38,   -38,   -38,   -38,   -38,     4,    37,    41,
-     -38,   -38,    40,    -3,    51,    64,   -38,    18,   -38,   -38,
-     -38,   -38,     7,   -38,   -38,   -38,   -38,   -38,   -38,   -38,
-     -38,    63,    46,   -38,   -38,   -38,   -38
-};
-
-/* YYPGOTO[NTERM-NUM].  */
-static const yytype_int8 yypgoto[] =
-{
-     -38,   -38,   -38,   -38,    29,   -38,    47,    -1,   -38,   -38,
-      71,   -38,   -38,   -38,   -38,   -38,   -38,   -38,   -38,   -38,
-     -37,    21,   -25,   -38
-};
-
-/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
-   positive, shift that token.  If negative, reduce the rule which
-   number is the opposite.  If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -1
-static const yytype_uint8 yytable[] =
-{
-      17,    54,    55,    56,    63,     4,     5,     6,     7,    73,
-       8,     9,    35,    72,    10,    74,    11,    59,    66,     1,
-       2,    80,    12,     4,     5,     6,     7,    59,     8,    37,
-      49,    84,    10,    50,    11,     4,     5,     6,     7,    42,
-      36,    37,    75,    76,    10,    70,    11,    29,    77,    43,
-      30,    46,    31,    39,    40,    39,    41,    86,    41,    67,
-      67,    48,    68,    79,    47,    60,    83,    52,    57,    61,
-      59,    58,    64,    65,    71,    69,    81,    82,    85,    38,
-      78,     0,     0,     0,     0,     0,     0,    62
-};
-
-#define yypact_value_is_default(yystate) \
-  ((yystate) == (-38))
-
-#define yytable_value_is_error(yytable_value) \
-  YYID (0)
-
-static const yytype_int8 yycheck[] =
-{
-       1,    26,    27,    28,    41,     5,     6,     7,     8,     5,
-      10,    11,     0,    50,    14,    11,    16,    20,    43,     3,
-       4,    24,    22,     5,     6,     7,     8,    20,    10,    11,
-      21,    24,    14,    24,    16,     5,     6,     7,     8,    25,
-      21,    11,     5,     6,    14,    46,    16,     6,    11,     5,
-       9,    20,    11,    21,    22,    21,    24,    82,    24,    20,
-      20,    12,    23,    23,    21,     5,    67,    21,    26,    11,
-      20,    26,    15,    21,    12,    46,    25,    13,    15,     8,
-      59,    -1,    -1,    -1,    -1,    -1,    -1,    40
-};
-
-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-   symbol of state STATE-NUM.  */
-static const yytype_uint8 yystos[] =
-{
-       0,     3,     4,    28,     5,     6,     7,     8,    10,    11,
-      14,    16,    22,    29,    30,    31,    32,    34,    35,    36,
-      37,    38,    39,    40,    41,    42,    43,    44,    45,     6,
-       9,    11,    46,    47,    48,     0,    21,    11,    37,    21,
-      22,    24,    25,     5,    33,    34,    20,    21,    12,    21,
-      24,    50,    21,    49,    49,    49,    49,    26,    26,    20,
-       5,    11,    33,    47,    15,    21,    49,    20,    23,    31,
-      34,    12,    47,     5,    11,     5,     6,    11,    48,    23,
-      24,    25,    13,    34,    24,    15,    49
-};
-
-#define yyerrok		(yyerrstatus = 0)
-#define yyclearin	(yychar = YYEMPTY)
-#define YYEMPTY		(-2)
-#define YYEOF		0
-
-#define YYACCEPT	goto yyacceptlab
-#define YYABORT		goto yyabortlab
-#define YYERROR		goto yyerrorlab
-
-
-/* Like YYERROR except do call yyerror.  This remains here temporarily
-   to ease the transition to the new meaning of YYERROR, for GCC.
-   Once GCC version 2 has supplanted version 1, this can go.  However,
-   YYFAIL appears to be in use.  Nevertheless, it is formally deprecated
-   in Bison 2.4.2's NEWS entry, where a plan to phase it out is
-   discussed.  */
-
-#define YYFAIL		goto yyerrlab
-#if defined YYFAIL
-  /* This is here to suppress warnings from the GCC cpp's
-     -Wunused-macros.  Normally we don't worry about that warning, but
-     some users do, and we want to make it easy for users to remove
-     YYFAIL uses, which will produce warnings from Bison 2.5.  */
-#endif
-
-#define YYRECOVERING()  (!!yyerrstatus)
-
-#define YYBACKUP(Token, Value)					\
-do								\
-  if (yychar == YYEMPTY && yylen == 1)				\
-    {								\
-      yychar = (Token);						\
-      yylval = (Value);						\
-      YYPOPSTACK (1);						\
-      goto yybackup;						\
-    }								\
-  else								\
-    {								\
-      yyerror (_data, scanner, YY_("syntax error: cannot back up")); \
-      YYERROR;							\
-    }								\
-while (YYID (0))
-
-
-#define YYTERROR	1
-#define YYERRCODE	256
-
-
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-   If N is 0, then set CURRENT to the empty location which ends
-   the previous symbol: RHS[0] (always defined).  */
-
-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N)				\
-    do									\
-      if (YYID (N))                                                    \
-	{								\
-	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
-	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
-	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
-	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
-	}								\
-      else								\
-	{								\
-	  (Current).first_line   = (Current).last_line   =		\
-	    YYRHSLOC (Rhs, 0).last_line;				\
-	  (Current).first_column = (Current).last_column =		\
-	    YYRHSLOC (Rhs, 0).last_column;				\
-	}								\
-    while (YYID (0))
-#endif
-
-
-/* This macro is provided for backward compatibility. */
-
-#ifndef YY_LOCATION_PRINT
-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-#endif
-
-
-/* YYLEX -- calling `yylex' with the right arguments.  */
-
-#ifdef YYLEX_PARAM
-# define YYLEX yylex (&yylval, YYLEX_PARAM)
-#else
-# define YYLEX yylex (&yylval, scanner)
-#endif
-
-/* Enable debugging if requested.  */
-#if YYDEBUG
-
-# ifndef YYFPRINTF
-#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
-#  define YYFPRINTF fprintf
-# endif
-
-# define YYDPRINTF(Args)			\
-do {						\
-  if (yydebug)					\
-    YYFPRINTF Args;				\
-} while (YYID (0))
-
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
-do {									  \
-  if (yydebug)								  \
-    {									  \
-      YYFPRINTF (stderr, "%s ", Title);					  \
-      yy_symbol_print (stderr,						  \
-		  Type, Value, _data, scanner); \
-      YYFPRINTF (stderr, "\n");						  \
-    }									  \
-} while (YYID (0))
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
-
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static void
-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, void *_data, void *scanner)
-#else
-static void
-yy_symbol_value_print (yyoutput, yytype, yyvaluep, _data, scanner)
-    FILE *yyoutput;
-    int yytype;
-    YYSTYPE const * const yyvaluep;
-    void *_data;
-    void *scanner;
-#endif
-{
-  if (!yyvaluep)
-    return;
-  YYUSE (_data);
-  YYUSE (scanner);
-# ifdef YYPRINT
-  if (yytype < YYNTOKENS)
-    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# else
-  YYUSE (yyoutput);
-# endif
-  switch (yytype)
-    {
-      default:
-	break;
-    }
-}
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static void
-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, void *_data, void *scanner)
-#else
-static void
-yy_symbol_print (yyoutput, yytype, yyvaluep, _data, scanner)
-    FILE *yyoutput;
-    int yytype;
-    YYSTYPE const * const yyvaluep;
-    void *_data;
-    void *scanner;
-#endif
-{
-  if (yytype < YYNTOKENS)
-    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
-  else
-    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-
-  yy_symbol_value_print (yyoutput, yytype, yyvaluep, _data, scanner);
-  YYFPRINTF (yyoutput, ")");
-}
-
-/*------------------------------------------------------------------.
-| yy_stack_print -- Print the state stack from its BOTTOM up to its |
-| TOP (included).                                                   |
-`------------------------------------------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static void
-yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
-#else
-static void
-yy_stack_print (yybottom, yytop)
-    yytype_int16 *yybottom;
-    yytype_int16 *yytop;
-#endif
-{
-  YYFPRINTF (stderr, "Stack now");
-  for (; yybottom <= yytop; yybottom++)
-    {
-      int yybot = *yybottom;
-      YYFPRINTF (stderr, " %d", yybot);
-    }
-  YYFPRINTF (stderr, "\n");
-}
-
-# define YY_STACK_PRINT(Bottom, Top)				\
-do {								\
-  if (yydebug)							\
-    yy_stack_print ((Bottom), (Top));				\
-} while (YYID (0))
-
-
-/*------------------------------------------------.
-| Report that the YYRULE is going to be reduced.  |
-`------------------------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static void
-yy_reduce_print (YYSTYPE *yyvsp, int yyrule, void *_data, void *scanner)
-#else
-static void
-yy_reduce_print (yyvsp, yyrule, _data, scanner)
-    YYSTYPE *yyvsp;
-    int yyrule;
-    void *_data;
-    void *scanner;
-#endif
-{
-  int yynrhs = yyr2[yyrule];
-  int yyi;
-  unsigned long int yylno = yyrline[yyrule];
-  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
-	     yyrule - 1, yylno);
-  /* The symbols being reduced.  */
-  for (yyi = 0; yyi < yynrhs; yyi++)
-    {
-      YYFPRINTF (stderr, "   $%d = ", yyi + 1);
-      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
-		       &(yyvsp[(yyi + 1) - (yynrhs)])
-		       		       , _data, scanner);
-      YYFPRINTF (stderr, "\n");
-    }
-}
-
-# define YY_REDUCE_PRINT(Rule)		\
-do {					\
-  if (yydebug)				\
-    yy_reduce_print (yyvsp, Rule, _data, scanner); \
-} while (YYID (0))
-
-/* Nonzero means print parse trace.  It is left uninitialized so that
-   multiple parsers can coexist.  */
-int yydebug;
-#else /* !YYDEBUG */
-# define YYDPRINTF(Args)
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-# define YY_STACK_PRINT(Bottom, Top)
-# define YY_REDUCE_PRINT(Rule)
-#endif /* !YYDEBUG */
-
-
-/* YYINITDEPTH -- initial size of the parser's stacks.  */
-#ifndef	YYINITDEPTH
-# define YYINITDEPTH 200
-#endif
-
-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
-   if the built-in stack extension method is used).
-
-   Do not make this value too large; the results are undefined if
-   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
-   evaluated with infinite-precision integer arithmetic.  */
-
-#ifndef YYMAXDEPTH
-# define YYMAXDEPTH 10000
-#endif
-
-
-#if YYERROR_VERBOSE
-
-# ifndef yystrlen
-#  if defined __GLIBC__ && defined _STRING_H
-#   define yystrlen strlen
-#  else
-/* Return the length of YYSTR.  */
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static YYSIZE_T
-yystrlen (const char *yystr)
-#else
-static YYSIZE_T
-yystrlen (yystr)
-    const char *yystr;
-#endif
-{
-  YYSIZE_T yylen;
-  for (yylen = 0; yystr[yylen]; yylen++)
-    continue;
-  return yylen;
-}
-#  endif
-# endif
-
-# ifndef yystpcpy
-#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-#   define yystpcpy stpcpy
-#  else
-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
-   YYDEST.  */
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static char *
-yystpcpy (char *yydest, const char *yysrc)
-#else
-static char *
-yystpcpy (yydest, yysrc)
-    char *yydest;
-    const char *yysrc;
-#endif
-{
-  char *yyd = yydest;
-  const char *yys = yysrc;
-
-  while ((*yyd++ = *yys++) != '\0')
-    continue;
-
-  return yyd - 1;
-}
-#  endif
-# endif
-
-# ifndef yytnamerr
-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
-   quotes and backslashes, so that it's suitable for yyerror.  The
-   heuristic is that double-quoting is unnecessary unless the string
-   contains an apostrophe, a comma, or backslash (other than
-   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
-   null, do not copy; instead, return the length of what the result
-   would have been.  */
-static YYSIZE_T
-yytnamerr (char *yyres, const char *yystr)
-{
-  if (*yystr == '"')
-    {
-      YYSIZE_T yyn = 0;
-      char const *yyp = yystr;
-
-      for (;;)
-	switch (*++yyp)
-	  {
-	  case '\'':
-	  case ',':
-	    goto do_not_strip_quotes;
-
-	  case '\\':
-	    if (*++yyp != '\\')
-	      goto do_not_strip_quotes;
-	    /* Fall through.  */
-	  default:
-	    if (yyres)
-	      yyres[yyn] = *yyp;
-	    yyn++;
-	    break;
-
-	  case '"':
-	    if (yyres)
-	      yyres[yyn] = '\0';
-	    return yyn;
-	  }
-    do_not_strip_quotes: ;
-    }
-
-  if (! yyres)
-    return yystrlen (yystr);
-
-  return yystpcpy (yyres, yystr) - yyres;
-}
-# endif
-
-/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
-   about the unexpected token YYTOKEN for the state stack whose top is
-   YYSSP.
-
-   Return 0 if *YYMSG was successfully written.  Return 1 if *YYMSG is
-   not large enough to hold the message.  In that case, also set
-   *YYMSG_ALLOC to the required number of bytes.  Return 2 if the
-   required number of bytes is too large to store.  */
-static int
-yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
-                yytype_int16 *yyssp, int yytoken)
-{
-  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]);
-  YYSIZE_T yysize = yysize0;
-  YYSIZE_T yysize1;
-  enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
-  /* Internationalized format string. */
-  const char *yyformat = 0;
-  /* Arguments of yyformat. */
-  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-  /* Number of reported tokens (one for the "unexpected", one per
-     "expected"). */
-  int yycount = 0;
-
-  /* There are many possibilities here to consider:
-     - Assume YYFAIL is not used.  It's too flawed to consider.  See
-       <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
-       for details.  YYERROR is fine as it does not invoke this
-       function.
-     - If this state is a consistent state with a default action, then
-       the only way this function was invoked is if the default action
-       is an error action.  In that case, don't check for expected
-       tokens because there are none.
-     - The only way there can be no lookahead present (in yychar) is if
-       this state is a consistent state with a default action.  Thus,
-       detecting the absence of a lookahead is sufficient to determine
-       that there is no unexpected or expected token to report.  In that
-       case, just report a simple "syntax error".
-     - Don't assume there isn't a lookahead just because this state is a
-       consistent state with a default action.  There might have been a
-       previous inconsistent state, consistent state with a non-default
-       action, or user semantic action that manipulated yychar.
-     - Of course, the expected token list depends on states to have
-       correct lookahead information, and it depends on the parser not
-       to perform extra reductions after fetching a lookahead from the
-       scanner and before detecting a syntax error.  Thus, state merging
-       (from LALR or IELR) and default reductions corrupt the expected
-       token list.  However, the list is correct for canonical LR with
-       one exception: it will still contain any token that will not be
-       accepted due to an error action in a later state.
-  */
-  if (yytoken != YYEMPTY)
-    {
-      int yyn = yypact[*yyssp];
-      yyarg[yycount++] = yytname[yytoken];
-      if (!yypact_value_is_default (yyn))
-        {
-          /* Start YYX at -YYN if negative to avoid negative indexes in
-             YYCHECK.  In other words, skip the first -YYN actions for
-             this state because they are default actions.  */
-          int yyxbegin = yyn < 0 ? -yyn : 0;
-          /* Stay within bounds of both yycheck and yytname.  */
-          int yychecklim = YYLAST - yyn + 1;
-          int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-          int yyx;
-
-          for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-            if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
-                && !yytable_value_is_error (yytable[yyx + yyn]))
-              {
-                if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-                  {
-                    yycount = 1;
-                    yysize = yysize0;
-                    break;
-                  }
-                yyarg[yycount++] = yytname[yyx];
-                yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-                if (! (yysize <= yysize1
-                       && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-                  return 2;
-                yysize = yysize1;
-              }
-        }
-    }
-
-  switch (yycount)
-    {
-# define YYCASE_(N, S)                      \
-      case N:                               \
-        yyformat = S;                       \
-      break
-      YYCASE_(0, YY_("syntax error"));
-      YYCASE_(1, YY_("syntax error, unexpected %s"));
-      YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
-      YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
-      YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
-      YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
-# undef YYCASE_
-    }
-
-  yysize1 = yysize + yystrlen (yyformat);
-  if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-    return 2;
-  yysize = yysize1;
-
-  if (*yymsg_alloc < yysize)
-    {
-      *yymsg_alloc = 2 * yysize;
-      if (! (yysize <= *yymsg_alloc
-             && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
-        *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
-      return 1;
-    }
-
-  /* Avoid sprintf, as that infringes on the user's name space.
-     Don't have undefined behavior even if the translation
-     produced a string with the wrong number of "%s"s.  */
-  {
-    char *yyp = *yymsg;
-    int yyi = 0;
-    while ((*yyp = *yyformat) != '\0')
-      if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
-        {
-          yyp += yytnamerr (yyp, yyarg[yyi++]);
-          yyformat += 2;
-        }
-      else
-        {
-          yyp++;
-          yyformat++;
-        }
-  }
-  return 0;
-}
-#endif /* YYERROR_VERBOSE */
-
-/*-----------------------------------------------.
-| Release the memory associated to this symbol.  |
-`-----------------------------------------------*/
-
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static void
-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, void *_data, void *scanner)
-#else
-static void
-yydestruct (yymsg, yytype, yyvaluep, _data, scanner)
-    const char *yymsg;
-    int yytype;
-    YYSTYPE *yyvaluep;
-    void *_data;
-    void *scanner;
-#endif
-{
-  YYUSE (yyvaluep);
-  YYUSE (_data);
-  YYUSE (scanner);
-
-  if (!yymsg)
-    yymsg = "Deleting";
-  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-
-  switch (yytype)
-    {
-
-      default:
-	break;
-    }
-}
-
-
-/* Prevent warnings from -Wmissing-prototypes.  */
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void *YYPARSE_PARAM);
-#else
-int yyparse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void *_data, void *scanner);
-#else
-int yyparse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
-
-
-/*----------.
-| yyparse.  |
-`----------*/
-
-#ifdef YYPARSE_PARAM
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void *YYPARSE_PARAM)
-#else
-int
-yyparse (YYPARSE_PARAM)
-    void *YYPARSE_PARAM;
-#endif
-#else /* ! YYPARSE_PARAM */
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void *_data, void *scanner)
-#else
-int
-yyparse (_data, scanner)
-    void *_data;
-    void *scanner;
-#endif
-#endif
-{
-/* The lookahead symbol.  */
-int yychar;
-
-/* The semantic value of the lookahead symbol.  */
-YYSTYPE yylval;
-
-    /* Number of syntax errors so far.  */
-    int yynerrs;
-
-    int yystate;
-    /* Number of tokens to shift before error messages enabled.  */
-    int yyerrstatus;
-
-    /* The stacks and their tools:
-       `yyss': related to states.
-       `yyvs': related to semantic values.
-
-       Refer to the stacks thru separate pointers, to allow yyoverflow
-       to reallocate them elsewhere.  */
-
-    /* The state stack.  */
-    yytype_int16 yyssa[YYINITDEPTH];
-    yytype_int16 *yyss;
-    yytype_int16 *yyssp;
-
-    /* The semantic value stack.  */
-    YYSTYPE yyvsa[YYINITDEPTH];
-    YYSTYPE *yyvs;
-    YYSTYPE *yyvsp;
-
-    YYSIZE_T yystacksize;
-
-  int yyn;
-  int yyresult;
-  /* Lookahead token as an internal (translated) token number.  */
-  int yytoken;
-  /* The variables used to return semantic value and location from the
-     action routines.  */
-  YYSTYPE yyval;
-
-#if YYERROR_VERBOSE
-  /* Buffer for error messages, and its allocated size.  */
-  char yymsgbuf[128];
-  char *yymsg = yymsgbuf;
-  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
-#endif
-
-#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
-
-  /* The number of symbols on the RHS of the reduced rule.
-     Keep to zero when no symbol should be popped.  */
-  int yylen = 0;
-
-  yytoken = 0;
-  yyss = yyssa;
-  yyvs = yyvsa;
-  yystacksize = YYINITDEPTH;
-
-  YYDPRINTF ((stderr, "Starting parse\n"));
-
-  yystate = 0;
-  yyerrstatus = 0;
-  yynerrs = 0;
-  yychar = YYEMPTY; /* Cause a token to be read.  */
-
-  /* Initialize stack pointers.
-     Waste one element of value and location stack
-     so that they stay on the same level as the state stack.
-     The wasted elements are never initialized.  */
-  yyssp = yyss;
-  yyvsp = yyvs;
-
-  goto yysetstate;
-
-/*------------------------------------------------------------.
-| yynewstate -- Push a new state, which is found in yystate.  |
-`------------------------------------------------------------*/
- yynewstate:
-  /* In all cases, when you get here, the value and location stacks
-     have just been pushed.  So pushing a state here evens the stacks.  */
-  yyssp++;
-
- yysetstate:
-  *yyssp = yystate;
-
-  if (yyss + yystacksize - 1 <= yyssp)
-    {
-      /* Get the current used size of the three stacks, in elements.  */
-      YYSIZE_T yysize = yyssp - yyss + 1;
-
-#ifdef yyoverflow
-      {
-	/* Give user a chance to reallocate the stack.  Use copies of
-	   these so that the &'s don't force the real ones into
-	   memory.  */
-	YYSTYPE *yyvs1 = yyvs;
-	yytype_int16 *yyss1 = yyss;
-
-	/* Each stack pointer address is followed by the size of the
-	   data in use in that stack, in bytes.  This used to be a
-	   conditional around just the two extra args, but that might
-	   be undefined if yyoverflow is a macro.  */
-	yyoverflow (YY_("memory exhausted"),
-		    &yyss1, yysize * sizeof (*yyssp),
-		    &yyvs1, yysize * sizeof (*yyvsp),
-		    &yystacksize);
-
-	yyss = yyss1;
-	yyvs = yyvs1;
-      }
-#else /* no yyoverflow */
-# ifndef YYSTACK_RELOCATE
-      goto yyexhaustedlab;
-# else
-      /* Extend the stack our own way.  */
-      if (YYMAXDEPTH <= yystacksize)
-	goto yyexhaustedlab;
-      yystacksize *= 2;
-      if (YYMAXDEPTH < yystacksize)
-	yystacksize = YYMAXDEPTH;
-
-      {
-	yytype_int16 *yyss1 = yyss;
-	union yyalloc *yyptr =
-	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
-	if (! yyptr)
-	  goto yyexhaustedlab;
-	YYSTACK_RELOCATE (yyss_alloc, yyss);
-	YYSTACK_RELOCATE (yyvs_alloc, yyvs);
-#  undef YYSTACK_RELOCATE
-	if (yyss1 != yyssa)
-	  YYSTACK_FREE (yyss1);
-      }
-# endif
-#endif /* no yyoverflow */
-
-      yyssp = yyss + yysize - 1;
-      yyvsp = yyvs + yysize - 1;
-
-      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
-		  (unsigned long int) yystacksize));
-
-      if (yyss + yystacksize - 1 <= yyssp)
-	YYABORT;
-    }
-
-  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-
-  if (yystate == YYFINAL)
-    YYACCEPT;
-
-  goto yybackup;
-
-/*-----------.
-| yybackup.  |
-`-----------*/
-yybackup:
-
-  /* Do appropriate processing given the current state.  Read a
-     lookahead token if we need one and don't already have one.  */
-
-  /* First try to decide what to do without reference to lookahead token.  */
-  yyn = yypact[yystate];
-  if (yypact_value_is_default (yyn))
-    goto yydefault;
-
-  /* Not known => get a lookahead token if don't already have one.  */
-
-  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
-  if (yychar == YYEMPTY)
-    {
-      YYDPRINTF ((stderr, "Reading a token: "));
-      yychar = YYLEX;
-    }
-
-  if (yychar <= YYEOF)
-    {
-      yychar = yytoken = YYEOF;
-      YYDPRINTF ((stderr, "Now at end of input.\n"));
-    }
-  else
-    {
-      yytoken = YYTRANSLATE (yychar);
-      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
-    }
-
-  /* If the proper action on seeing token YYTOKEN is to reduce or to
-     detect an error, take that action.  */
-  yyn += yytoken;
-  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
-    goto yydefault;
-  yyn = yytable[yyn];
-  if (yyn <= 0)
-    {
-      if (yytable_value_is_error (yyn))
-        goto yyerrlab;
-      yyn = -yyn;
-      goto yyreduce;
-    }
-
-  /* Count tokens shifted since error; after three, turn off error
-     status.  */
-  if (yyerrstatus)
-    yyerrstatus--;
-
-  /* Shift the lookahead token.  */
-  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-
-  /* Discard the shifted token.  */
-  yychar = YYEMPTY;
-
-  yystate = yyn;
-  *++yyvsp = yylval;
-
-  goto yynewstate;
-
-
-/*-----------------------------------------------------------.
-| yydefault -- do the default action for the current state.  |
-`-----------------------------------------------------------*/
-yydefault:
-  yyn = yydefact[yystate];
-  if (yyn == 0)
-    goto yyerrlab;
-  goto yyreduce;
-
-
-/*-----------------------------.
-| yyreduce -- Do a reduction.  |
-`-----------------------------*/
-yyreduce:
-  /* yyn is the number of a rule to reduce with.  */
-  yylen = yyr2[yyn];
-
-  /* If YYLEN is nonzero, implement the default value of the action:
-     `$$ = $1'.
-
-     Otherwise, the following line sets YYVAL to garbage.
-     This behavior is undocumented and Bison
-     users should not rely upon it.  Assigning to YYVAL
-     unconditionally makes the parser a bit smaller, and it avoids a
-     GCC warning that YYVAL may be used uninitialized.  */
-  yyval = yyvsp[1-yylen];
-
-
-  YY_REDUCE_PRINT (yyn);
-  switch (yyn)
-    {
-        case 4:
-
-/* Line 1806 of yacc.c  */
-#line 95 "util/parse-events.y"
-    {
-	struct parse_events_evlist *data = _data;
-
-	parse_events_update_lists((yyvsp[(1) - (1)].head), &data->list);
-}
-    break;
-
-  case 5:
-
-/* Line 1806 of yacc.c  */
-#line 103 "util/parse-events.y"
-    {
-	struct list_head *list  = (yyvsp[(1) - (3)].head);
-	struct list_head *group = (yyvsp[(3) - (3)].head);
-
-	parse_events_update_lists(group, list);
-	(yyval.head) = list;
-}
-    break;
-
-  case 6:
-
-/* Line 1806 of yacc.c  */
-#line 112 "util/parse-events.y"
-    {
-	struct list_head *list  = (yyvsp[(1) - (3)].head);
-	struct list_head *event = (yyvsp[(3) - (3)].head);
-
-	parse_events_update_lists(event, list);
-	(yyval.head) = list;
-}
-    break;
-
-  case 9:
-
-/* Line 1806 of yacc.c  */
-#line 126 "util/parse-events.y"
-    {
-	struct list_head *list = (yyvsp[(1) - (3)].head);
-
-	ABORT_ON(parse_events__modifier_group(list, (yyvsp[(3) - (3)].str)));
-	(yyval.head) = list;
-}
-    break;
-
-  case 11:
-
-/* Line 1806 of yacc.c  */
-#line 137 "util/parse-events.y"
-    {
-	struct list_head *list = (yyvsp[(3) - (4)].head);
-
-	inc_group_count(list, _data);
-	parse_events__set_leader((yyvsp[(1) - (4)].str), list);
-	(yyval.head) = list;
-}
-    break;
-
-  case 12:
-
-/* Line 1806 of yacc.c  */
-#line 146 "util/parse-events.y"
-    {
-	struct list_head *list = (yyvsp[(2) - (3)].head);
-
-	inc_group_count(list, _data);
-	parse_events__set_leader(NULL, list);
-	(yyval.head) = list;
-}
-    break;
-
-  case 13:
-
-/* Line 1806 of yacc.c  */
-#line 156 "util/parse-events.y"
-    {
-	struct list_head *event = (yyvsp[(3) - (3)].head);
-	struct list_head *list  = (yyvsp[(1) - (3)].head);
-
-	parse_events_update_lists(event, list);
-	(yyval.head) = list;
-}
-    break;
-
-  case 16:
-
-/* Line 1806 of yacc.c  */
-#line 170 "util/parse-events.y"
-    {
-	struct list_head *list = (yyvsp[(1) - (2)].head);
-
-	/*
-	 * Apply modifier on all events added by single event definition
-	 * (there could be more events added for multiple tracepoint
-	 * definitions via '*?'.
-	 */
-	ABORT_ON(parse_events__modifier_event(list, (yyvsp[(2) - (2)].str), false));
-	(yyval.head) = list;
-}
-    break;
-
-  case 18:
-
-/* Line 1806 of yacc.c  */
-#line 186 "util/parse-events.y"
-    {
-	ABORT_ON(parse_events_name((yyvsp[(2) - (2)].head), (yyvsp[(1) - (2)].str)));
-	free((yyvsp[(1) - (2)].str));
-	(yyval.head) = (yyvsp[(2) - (2)].head);
-}
-    break;
-
-  case 27:
-
-/* Line 1806 of yacc.c  */
-#line 204 "util/parse-events.y"
-    {
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_pmu(list, &data->idx, (yyvsp[(1) - (4)].str), (yyvsp[(3) - (4)].head)));
-	parse_events__free_terms((yyvsp[(3) - (4)].head));
-	(yyval.head) = list;
-}
-    break;
-
-  case 30:
-
-/* Line 1806 of yacc.c  */
-#line 221 "util/parse-events.y"
-    {
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-	int type = (yyvsp[(1) - (4)].num) >> 16;
-	int config = (yyvsp[(1) - (4)].num) & 255;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_numeric(list, &data->idx,
-					  type, config, (yyvsp[(3) - (4)].head)));
-	parse_events__free_terms((yyvsp[(3) - (4)].head));
-	(yyval.head) = list;
-}
-    break;
-
-  case 31:
-
-/* Line 1806 of yacc.c  */
-#line 235 "util/parse-events.y"
-    {
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-	int type = (yyvsp[(1) - (2)].num) >> 16;
-	int config = (yyvsp[(1) - (2)].num) & 255;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_numeric(list, &data->idx,
-					  type, config, NULL));
-	(yyval.head) = list;
-}
-    break;
-
-  case 32:
-
-/* Line 1806 of yacc.c  */
-#line 249 "util/parse-events.y"
-    {
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_cache(list, &data->idx, (yyvsp[(1) - (5)].str), (yyvsp[(3) - (5)].str), (yyvsp[(5) - (5)].str)));
-	(yyval.head) = list;
-}
-    break;
-
-  case 33:
-
-/* Line 1806 of yacc.c  */
-#line 259 "util/parse-events.y"
-    {
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_cache(list, &data->idx, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str), NULL));
-	(yyval.head) = list;
-}
-    break;
-
-  case 34:
-
-/* Line 1806 of yacc.c  */
-#line 269 "util/parse-events.y"
-    {
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_cache(list, &data->idx, (yyvsp[(1) - (1)].str), NULL, NULL));
-	(yyval.head) = list;
-}
-    break;
-
-  case 35:
-
-/* Line 1806 of yacc.c  */
-#line 280 "util/parse-events.y"
-    {
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
-					     (void *)(uintptr_t) (yyvsp[(2) - (5)].num), (yyvsp[(4) - (5)].str)));
-	(yyval.head) = list;
-}
-    break;
-
-  case 36:
-
-/* Line 1806 of yacc.c  */
-#line 291 "util/parse-events.y"
-    {
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
-					     (void *)(uintptr_t) (yyvsp[(2) - (3)].num), NULL));
-	(yyval.head) = list;
-}
-    break;
-
-  case 37:
-
-/* Line 1806 of yacc.c  */
-#line 303 "util/parse-events.y"
-    {
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_tracepoint(list, &data->idx, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str)));
-	(yyval.head) = list;
-}
-    break;
-
-  case 38:
-
-/* Line 1806 of yacc.c  */
-#line 314 "util/parse-events.y"
-    {
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_numeric(list, &data->idx, (u32)(yyvsp[(1) - (3)].num), (yyvsp[(3) - (3)].num), NULL));
-	(yyval.head) = list;
-}
-    break;
-
-  case 39:
-
-/* Line 1806 of yacc.c  */
-#line 325 "util/parse-events.y"
-    {
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_numeric(list, &data->idx,
-					  PERF_TYPE_RAW, (yyvsp[(1) - (1)].num), NULL));
-	(yyval.head) = list;
-}
-    break;
-
-  case 40:
-
-/* Line 1806 of yacc.c  */
-#line 336 "util/parse-events.y"
-    {
-	struct parse_events_terms *data = _data;
-	data->terms = (yyvsp[(1) - (1)].head);
-}
-    break;
-
-  case 41:
-
-/* Line 1806 of yacc.c  */
-#line 343 "util/parse-events.y"
-    {
-	struct list_head *head = (yyvsp[(1) - (3)].head);
-	struct parse_events_term *term = (yyvsp[(3) - (3)].term);
-
-	ABORT_ON(!head);
-	list_add_tail(&term->list, head);
-	(yyval.head) = (yyvsp[(1) - (3)].head);
-}
-    break;
-
-  case 42:
-
-/* Line 1806 of yacc.c  */
-#line 353 "util/parse-events.y"
-    {
-	struct list_head *head = malloc(sizeof(*head));
-	struct parse_events_term *term = (yyvsp[(1) - (1)].term);
-
-	ABORT_ON(!head);
-	INIT_LIST_HEAD(head);
-	list_add_tail(&term->list, head);
-	(yyval.head) = head;
-}
-    break;
-
-  case 43:
-
-/* Line 1806 of yacc.c  */
-#line 365 "util/parse-events.y"
-    {
-	struct parse_events_term *term;
-
-	ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
-					(yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str)));
-	(yyval.term) = term;
-}
-    break;
-
-  case 44:
-
-/* Line 1806 of yacc.c  */
-#line 374 "util/parse-events.y"
-    {
-	struct parse_events_term *term;
-
-	ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
-					(yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].num)));
-	(yyval.term) = term;
-}
-    break;
-
-  case 45:
-
-/* Line 1806 of yacc.c  */
-#line 383 "util/parse-events.y"
-    {
-	struct parse_events_term *term;
-	int config = (yyvsp[(3) - (3)].num) & 255;
-
-	ABORT_ON(parse_events_term__sym_hw(&term, (yyvsp[(1) - (3)].str), config));
-	(yyval.term) = term;
-}
-    break;
-
-  case 46:
-
-/* Line 1806 of yacc.c  */
-#line 392 "util/parse-events.y"
-    {
-	struct parse_events_term *term;
-
-	ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
-					(yyvsp[(1) - (1)].str), 1));
-	(yyval.term) = term;
-}
-    break;
-
-  case 47:
-
-/* Line 1806 of yacc.c  */
-#line 401 "util/parse-events.y"
-    {
-	struct parse_events_term *term;
-	int config = (yyvsp[(1) - (1)].num) & 255;
-
-	ABORT_ON(parse_events_term__sym_hw(&term, NULL, config));
-	(yyval.term) = term;
-}
-    break;
-
-  case 48:
-
-/* Line 1806 of yacc.c  */
-#line 410 "util/parse-events.y"
-    {
-	struct parse_events_term *term;
-
-	ABORT_ON(parse_events_term__str(&term, (int)(yyvsp[(1) - (3)].num), NULL, (yyvsp[(3) - (3)].str)));
-	(yyval.term) = term;
-}
-    break;
-
-  case 49:
-
-/* Line 1806 of yacc.c  */
-#line 418 "util/parse-events.y"
-    {
-	struct parse_events_term *term;
-
-	ABORT_ON(parse_events_term__num(&term, (int)(yyvsp[(1) - (3)].num), NULL, (yyvsp[(3) - (3)].num)));
-	(yyval.term) = term;
-}
-    break;
-
-  case 50:
-
-/* Line 1806 of yacc.c  */
-#line 426 "util/parse-events.y"
-    {
-	struct parse_events_term *term;
-
-	ABORT_ON(parse_events_term__num(&term, (int)(yyvsp[(1) - (1)].num), NULL, 1));
-	(yyval.term) = term;
-}
-    break;
-
-
-
-/* Line 1806 of yacc.c  */
-#line 1927 "util/parse-events-bison.c"
-      default: break;
-    }
-  /* User semantic actions sometimes alter yychar, and that requires
-     that yytoken be updated with the new translation.  We take the
-     approach of translating immediately before every use of yytoken.
-     One alternative is translating here after every semantic action,
-     but that translation would be missed if the semantic action invokes
-     YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
-     if it invokes YYBACKUP.  In the case of YYABORT or YYACCEPT, an
-     incorrect destructor might then be invoked immediately.  In the
-     case of YYERROR or YYBACKUP, subsequent parser actions might lead
-     to an incorrect destructor call or verbose syntax error message
-     before the lookahead is translated.  */
-  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
-
-  YYPOPSTACK (yylen);
-  yylen = 0;
-  YY_STACK_PRINT (yyss, yyssp);
-
-  *++yyvsp = yyval;
-
-  /* Now `shift' the result of the reduction.  Determine what state
-     that goes to, based on the state we popped back to and the rule
-     number reduced by.  */
-
-  yyn = yyr1[yyn];
-
-  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
-  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
-    yystate = yytable[yystate];
-  else
-    yystate = yydefgoto[yyn - YYNTOKENS];
-
-  goto yynewstate;
-
-
-/*------------------------------------.
-| yyerrlab -- here on detecting error |
-`------------------------------------*/
-yyerrlab:
-  /* Make sure we have latest lookahead translation.  See comments at
-     user semantic actions for why this is necessary.  */
-  yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
-
-  /* If not already recovering from an error, report this error.  */
-  if (!yyerrstatus)
-    {
-      ++yynerrs;
-#if ! YYERROR_VERBOSE
-      yyerror (_data, scanner, YY_("syntax error"));
-#else
-# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
-                                        yyssp, yytoken)
-      {
-        char const *yymsgp = YY_("syntax error");
-        int yysyntax_error_status;
-        yysyntax_error_status = YYSYNTAX_ERROR;
-        if (yysyntax_error_status == 0)
-          yymsgp = yymsg;
-        else if (yysyntax_error_status == 1)
-          {
-            if (yymsg != yymsgbuf)
-              YYSTACK_FREE (yymsg);
-            yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
-            if (!yymsg)
-              {
-                yymsg = yymsgbuf;
-                yymsg_alloc = sizeof yymsgbuf;
-                yysyntax_error_status = 2;
-              }
-            else
-              {
-                yysyntax_error_status = YYSYNTAX_ERROR;
-                yymsgp = yymsg;
-              }
-          }
-        yyerror (_data, scanner, yymsgp);
-        if (yysyntax_error_status == 2)
-          goto yyexhaustedlab;
-      }
-# undef YYSYNTAX_ERROR
-#endif
-    }
-
-
-
-  if (yyerrstatus == 3)
-    {
-      /* If just tried and failed to reuse lookahead token after an
-	 error, discard it.  */
-
-      if (yychar <= YYEOF)
-	{
-	  /* Return failure if at end of input.  */
-	  if (yychar == YYEOF)
-	    YYABORT;
-	}
-      else
-	{
-	  yydestruct ("Error: discarding",
-		      yytoken, &yylval, _data, scanner);
-	  yychar = YYEMPTY;
-	}
-    }
-
-  /* Else will try to reuse lookahead token after shifting the error
-     token.  */
-  goto yyerrlab1;
-
-
-/*---------------------------------------------------.
-| yyerrorlab -- error raised explicitly by YYERROR.  |
-`---------------------------------------------------*/
-yyerrorlab:
-
-  /* Pacify compilers like GCC when the user code never invokes
-     YYERROR and the label yyerrorlab therefore never appears in user
-     code.  */
-  if (/*CONSTCOND*/ 0)
-     goto yyerrorlab;
-
-  /* Do not reclaim the symbols of the rule which action triggered
-     this YYERROR.  */
-  YYPOPSTACK (yylen);
-  yylen = 0;
-  YY_STACK_PRINT (yyss, yyssp);
-  yystate = *yyssp;
-  goto yyerrlab1;
-
-
-/*-------------------------------------------------------------.
-| yyerrlab1 -- common code for both syntax error and YYERROR.  |
-`-------------------------------------------------------------*/
-yyerrlab1:
-  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
-
-  for (;;)
-    {
-      yyn = yypact[yystate];
-      if (!yypact_value_is_default (yyn))
-	{
-	  yyn += YYTERROR;
-	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
-	    {
-	      yyn = yytable[yyn];
-	      if (0 < yyn)
-		break;
-	    }
-	}
-
-      /* Pop the current state because it cannot handle the error token.  */
-      if (yyssp == yyss)
-	YYABORT;
-
-
-      yydestruct ("Error: popping",
-		  yystos[yystate], yyvsp, _data, scanner);
-      YYPOPSTACK (1);
-      yystate = *yyssp;
-      YY_STACK_PRINT (yyss, yyssp);
-    }
-
-  *++yyvsp = yylval;
-
-
-  /* Shift the error token.  */
-  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
-
-  yystate = yyn;
-  goto yynewstate;
-
-
-/*-------------------------------------.
-| yyacceptlab -- YYACCEPT comes here.  |
-`-------------------------------------*/
-yyacceptlab:
-  yyresult = 0;
-  goto yyreturn;
-
-/*-----------------------------------.
-| yyabortlab -- YYABORT comes here.  |
-`-----------------------------------*/
-yyabortlab:
-  yyresult = 1;
-  goto yyreturn;
-
-#if !defined(yyoverflow) || YYERROR_VERBOSE
-/*-------------------------------------------------.
-| yyexhaustedlab -- memory exhaustion comes here.  |
-`-------------------------------------------------*/
-yyexhaustedlab:
-  yyerror (_data, scanner, YY_("memory exhausted"));
-  yyresult = 2;
-  /* Fall through.  */
-#endif
-
-yyreturn:
-  if (yychar != YYEMPTY)
-    {
-      /* Make sure we have latest lookahead translation.  See comments at
-         user semantic actions for why this is necessary.  */
-      yytoken = YYTRANSLATE (yychar);
-      yydestruct ("Cleanup: discarding lookahead",
-                  yytoken, &yylval, _data, scanner);
-    }
-  /* Do not reclaim the symbols of the rule which action triggered
-     this YYABORT or YYACCEPT.  */
-  YYPOPSTACK (yylen);
-  YY_STACK_PRINT (yyss, yyssp);
-  while (yyssp != yyss)
-    {
-      yydestruct ("Cleanup: popping",
-		  yystos[*yyssp], yyvsp, _data, scanner);
-      YYPOPSTACK (1);
-    }
-#ifndef yyoverflow
-  if (yyss != yyssa)
-    YYSTACK_FREE (yyss);
-#endif
-#if YYERROR_VERBOSE
-  if (yymsg != yymsgbuf)
-    YYSTACK_FREE (yymsg);
-#endif
-  /* Make sure YYID is used.  */
-  return YYID (yyresult);
-}
-
-
-
-/* Line 2067 of yacc.c  */
-#line 437 "util/parse-events.y"
-
-
-void parse_events_error(void *data __maybe_unused, void *scanner __maybe_unused,
-			char const *msg __maybe_unused)
-{
-}
-
diff --git a/src/tools/perf/util/parse-events-bison.h b/src/tools/perf/util/parse-events-bison.h
deleted file mode 100644
index 550be73..0000000
--- a/src/tools/perf/util/parse-events-bison.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.5.  */
-
-/* Bison interface for Yacc-like parsers in C
-   
-      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
-   
-   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 3 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/>.  */
-
-/* As a special exception, you may create a larger work that contains
-   part or all of the Bison parser skeleton and distribute that work
-   under terms of your choice, so long as that work isn't itself a
-   parser generator using the skeleton or a modified version thereof
-   as a parser skeleton.  Alternatively, if you modify or redistribute
-   the parser skeleton itself, you may (at your option) remove this
-   special exception, which will cause the skeleton and the resulting
-   Bison output files to be licensed under the GNU General Public
-   License without this special exception.
-   
-   This special exception was added by the Free Software Foundation in
-   version 2.2 of Bison.  */
-
-
-/* Tokens.  */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-     PE_START_EVENTS = 258,
-     PE_START_TERMS = 259,
-     PE_VALUE = 260,
-     PE_VALUE_SYM_HW = 261,
-     PE_VALUE_SYM_SW = 262,
-     PE_RAW = 263,
-     PE_TERM = 264,
-     PE_EVENT_NAME = 265,
-     PE_NAME = 266,
-     PE_MODIFIER_EVENT = 267,
-     PE_MODIFIER_BP = 268,
-     PE_NAME_CACHE_TYPE = 269,
-     PE_NAME_CACHE_OP_RESULT = 270,
-     PE_PREFIX_MEM = 271,
-     PE_PREFIX_RAW = 272,
-     PE_PREFIX_GROUP = 273,
-     PE_ERROR = 274
-   };
-#endif
-
-
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-{
-
-/* Line 2068 of yacc.c  */
-#line 81 "util/parse-events.y"
-
-	char *str;
-	u64 num;
-	struct list_head *head;
-	struct parse_events_term *term;
-
-
-
-/* Line 2068 of yacc.c  */
-#line 78 "util/parse-events-bison.h"
-} YYSTYPE;
-# define YYSTYPE_IS_TRIVIAL 1
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-#endif
-
-
-
-
diff --git a/src/tools/perf/util/parse-events-flex.c b/src/tools/perf/util/parse-events-flex.c
deleted file mode 100644
index 7e725a8..0000000
--- a/src/tools/perf/util/parse-events-flex.c
+++ /dev/null
@@ -1,2996 +0,0 @@
-
-#line 3 "<stdout>"
-
-#define  YY_INT_ALIGNED short int
-
-/* A lexical scanner generated by flex */
-
-#define FLEX_SCANNER
-#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 35
-#if YY_FLEX_SUBMINOR_VERSION > 0
-#define FLEX_BETA
-#endif
-
-/* First, we deal with  platform-specific or compiler-specific issues. */
-
-/* begin standard C headers. */
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <stdlib.h>
-
-/* end standard C headers. */
-
-/* flex integer type definitions */
-
-#ifndef FLEXINT_H
-#define FLEXINT_H
-
-/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
-
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-
-/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
- * if you want the limit (max/min) macros for int types. 
- */
-#ifndef __STDC_LIMIT_MACROS
-#define __STDC_LIMIT_MACROS 1
-#endif
-
-#include <inttypes.h>
-typedef int8_t flex_int8_t;
-typedef uint8_t flex_uint8_t;
-typedef int16_t flex_int16_t;
-typedef uint16_t flex_uint16_t;
-typedef int32_t flex_int32_t;
-typedef uint32_t flex_uint32_t;
-#else
-typedef signed char flex_int8_t;
-typedef short int flex_int16_t;
-typedef int flex_int32_t;
-typedef unsigned char flex_uint8_t; 
-typedef unsigned short int flex_uint16_t;
-typedef unsigned int flex_uint32_t;
-
-/* Limits of integral types. */
-#ifndef INT8_MIN
-#define INT8_MIN               (-128)
-#endif
-#ifndef INT16_MIN
-#define INT16_MIN              (-32767-1)
-#endif
-#ifndef INT32_MIN
-#define INT32_MIN              (-2147483647-1)
-#endif
-#ifndef INT8_MAX
-#define INT8_MAX               (127)
-#endif
-#ifndef INT16_MAX
-#define INT16_MAX              (32767)
-#endif
-#ifndef INT32_MAX
-#define INT32_MAX              (2147483647)
-#endif
-#ifndef UINT8_MAX
-#define UINT8_MAX              (255U)
-#endif
-#ifndef UINT16_MAX
-#define UINT16_MAX             (65535U)
-#endif
-#ifndef UINT32_MAX
-#define UINT32_MAX             (4294967295U)
-#endif
-
-#endif /* ! C99 */
-
-#endif /* ! FLEXINT_H */
-
-#ifdef __cplusplus
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else	/* ! __cplusplus */
-
-/* C99 requires __STDC__ to be defined as 1. */
-#if defined (__STDC__)
-
-#define YY_USE_CONST
-
-#endif	/* defined (__STDC__) */
-#endif	/* ! __cplusplus */
-
-#ifdef YY_USE_CONST
-#define yyconst const
-#else
-#define yyconst
-#endif
-
-/* Returned upon end-of-file. */
-#define YY_NULL 0
-
-/* Promotes a possibly negative, possibly signed char to an unsigned
- * integer for use as an array index.  If the signed char is negative,
- * we want to instead treat it as an 8-bit unsigned char, hence the
- * double cast.
- */
-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
-
-/* An opaque pointer. */
-#ifndef YY_TYPEDEF_YY_SCANNER_T
-#define YY_TYPEDEF_YY_SCANNER_T
-typedef void* yyscan_t;
-#endif
-
-/* For convenience, these vars (plus the bison vars far below)
-   are macros in the reentrant scanner. */
-#define yyin yyg->yyin_r
-#define yyout yyg->yyout_r
-#define yyextra yyg->yyextra_r
-#define yyleng yyg->yyleng_r
-#define yytext yyg->yytext_r
-#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)
-#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)
-#define yy_flex_debug yyg->yy_flex_debug_r
-
-/* Enter a start condition.  This macro really ought to take a parameter,
- * but we do it the disgusting crufty way forced on us by the ()-less
- * definition of BEGIN.
- */
-#define BEGIN yyg->yy_start = 1 + 2 *
-
-/* Translate the current start state into a value that can be later handed
- * to BEGIN to return to the state.  The YYSTATE alias is for lex
- * compatibility.
- */
-#define YY_START ((yyg->yy_start - 1) / 2)
-#define YYSTATE YY_START
-
-/* Action number for EOF rule of a given start state. */
-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
-
-/* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE parse_events_restart(yyin ,yyscanner )
-
-#define YY_END_OF_BUFFER_CHAR 0
-
-/* Size of default input buffer. */
-#ifndef YY_BUF_SIZE
-#ifdef __ia64__
-/* On IA-64, the buffer size is 16k, not 8k.
- * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
- * Ditto for the __ia64__ case accordingly.
- */
-#define YY_BUF_SIZE 32768
-#else
-#define YY_BUF_SIZE 16384
-#endif /* __ia64__ */
-#endif
-
-/* The state buf must be large enough to hold one state per character in the main buffer.
- */
-#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
-
-#ifndef YY_TYPEDEF_YY_BUFFER_STATE
-#define YY_TYPEDEF_YY_BUFFER_STATE
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-#endif
-
-#define EOB_ACT_CONTINUE_SCAN 0
-#define EOB_ACT_END_OF_FILE 1
-#define EOB_ACT_LAST_MATCH 2
-
-    #define YY_LESS_LINENO(n)
-    
-/* Return all but the first "n" matched characters back to the input stream. */
-#define yyless(n) \
-	do \
-		{ \
-		/* Undo effects of setting up yytext. */ \
-        int yyless_macro_arg = (n); \
-        YY_LESS_LINENO(yyless_macro_arg);\
-		*yy_cp = yyg->yy_hold_char; \
-		YY_RESTORE_YY_MORE_OFFSET \
-		yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
-		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
-		} \
-	while ( 0 )
-
-#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner )
-
-#ifndef YY_TYPEDEF_YY_SIZE_T
-#define YY_TYPEDEF_YY_SIZE_T
-typedef size_t yy_size_t;
-#endif
-
-#ifndef YY_STRUCT_YY_BUFFER_STATE
-#define YY_STRUCT_YY_BUFFER_STATE
-struct yy_buffer_state
-	{
-	FILE *yy_input_file;
-
-	char *yy_ch_buf;		/* input buffer */
-	char *yy_buf_pos;		/* current position in input buffer */
-
-	/* Size of input buffer in bytes, not including room for EOB
-	 * characters.
-	 */
-	yy_size_t yy_buf_size;
-
-	/* Number of characters read into yy_ch_buf, not including EOB
-	 * characters.
-	 */
-	int yy_n_chars;
-
-	/* Whether we "own" the buffer - i.e., we know we created it,
-	 * and can realloc() it to grow it, and should free() it to
-	 * delete it.
-	 */
-	int yy_is_our_buffer;
-
-	/* Whether this is an "interactive" input source; if so, and
-	 * if we're using stdio for input, then we want to use getc()
-	 * instead of fread(), to make sure we stop fetching input after
-	 * each newline.
-	 */
-	int yy_is_interactive;
-
-	/* Whether we're considered to be at the beginning of a line.
-	 * If so, '^' rules will be active on the next match, otherwise
-	 * not.
-	 */
-	int yy_at_bol;
-
-    int yy_bs_lineno; /**< The line count. */
-    int yy_bs_column; /**< The column count. */
-    
-	/* Whether to try to fill the input buffer when we reach the
-	 * end of it.
-	 */
-	int yy_fill_buffer;
-
-	int yy_buffer_status;
-
-#define YY_BUFFER_NEW 0
-#define YY_BUFFER_NORMAL 1
-	/* When an EOF's been seen but there's still some text to process
-	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
-	 * shouldn't try reading from the input source any more.  We might
-	 * still have a bunch of tokens to match, though, because of
-	 * possible backing-up.
-	 *
-	 * When we actually see the EOF, we change the status to "new"
-	 * (via parse_events_restart()), so that the user can continue scanning by
-	 * just pointing yyin at a new input file.
-	 */
-#define YY_BUFFER_EOF_PENDING 2
-
-	};
-#endif /* !YY_STRUCT_YY_BUFFER_STATE */
-
-/* We provide macros for accessing buffer states in case in the
- * future we want to put the buffer states in a more general
- * "scanner state".
- *
- * Returns the top of the stack, or NULL.
- */
-#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \
-                          ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \
-                          : NULL)
-
-/* Same as previous macro, but useful when we know that the buffer stack is not
- * NULL or when we need an lvalue. For internal use only.
- */
-#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]
-
-void parse_events_restart (FILE *input_file ,yyscan_t yyscanner );
-void parse_events__switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
-YY_BUFFER_STATE parse_events__create_buffer (FILE *file,int size ,yyscan_t yyscanner );
-void parse_events__delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
-void parse_events__flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
-void parse_events_push_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
-void parse_events_pop_buffer_state (yyscan_t yyscanner );
-
-static void parse_events_ensure_buffer_stack (yyscan_t yyscanner );
-static void parse_events__load_buffer_state (yyscan_t yyscanner );
-static void parse_events__init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner );
-
-#define YY_FLUSH_BUFFER parse_events__flush_buffer(YY_CURRENT_BUFFER ,yyscanner)
-
-YY_BUFFER_STATE parse_events__scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );
-YY_BUFFER_STATE parse_events__scan_string (yyconst char *yy_str ,yyscan_t yyscanner );
-YY_BUFFER_STATE parse_events__scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner );
-
-void *parse_events_alloc (yy_size_t ,yyscan_t yyscanner );
-void *parse_events_realloc (void *,yy_size_t ,yyscan_t yyscanner );
-void parse_events_free (void * ,yyscan_t yyscanner );
-
-#define yy_new_buffer parse_events__create_buffer
-
-#define yy_set_interactive(is_interactive) \
-	{ \
-	if ( ! YY_CURRENT_BUFFER ){ \
-        parse_events_ensure_buffer_stack (yyscanner); \
-		YY_CURRENT_BUFFER_LVALUE =    \
-            parse_events__create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
-	} \
-	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
-	}
-
-#define yy_set_bol(at_bol) \
-	{ \
-	if ( ! YY_CURRENT_BUFFER ){\
-        parse_events_ensure_buffer_stack (yyscanner); \
-		YY_CURRENT_BUFFER_LVALUE =    \
-            parse_events__create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
-	} \
-	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
-	}
-
-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
-
-/* Begin user sect3 */
-
-typedef unsigned char YY_CHAR;
-
-typedef int yy_state_type;
-
-#define yytext_ptr yytext_r
-
-static yy_state_type yy_get_previous_state (yyscan_t yyscanner );
-static yy_state_type yy_try_NUL_trans (yy_state_type current_state  ,yyscan_t yyscanner);
-static int yy_get_next_buffer (yyscan_t yyscanner );
-static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );
-
-/* Done after the current pattern has been matched and before the
- * corresponding action - sets up yytext.
- */
-#define YY_DO_BEFORE_ACTION \
-	yyg->yytext_ptr = yy_bp; \
-	yyleng = (size_t) (yy_cp - yy_bp); \
-	yyg->yy_hold_char = *yy_cp; \
-	*yy_cp = '\0'; \
-	yyg->yy_c_buf_p = yy_cp;
-
-#define YY_NUM_RULES 66
-#define YY_END_OF_BUFFER 67
-/* This struct is not used in this scanner,
-   but its presence is necessary. */
-struct yy_trans_info
-	{
-	flex_int32_t yy_verify;
-	flex_int32_t yy_nxt;
-	};
-static yyconst flex_int16_t yy_accept[900] =
-    {   0,
-        0,    0,    0,    0,    0,    0,    0,    0,   67,   66,
-       60,   52,   55,   54,   53,   49,   49,   56,   59,   51,
-       51,   52,   52,   52,   52,   52,   52,   52,   52,   52,
-       52,   52,   52,   52,   52,   51,   52,   52,   52,   52,
-       57,   58,   65,   63,   63,   62,   61,   46,   44,   45,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,
-       46,    3,    3,    4,    4,   52,   49,    0,   51,   52,
-       52,   52,   27,   52,   52,   52,   52,   52,   52,   52,
-       52,   52,   52,   52,   20,   52,    0,   52,   52,   52,
-
-       52,    0,   52,   52,   52,   52,   52,   52,   52,   52,
-       52,   52,   52,   52,   48,   48,   52,   52,   52,   52,
-       63,    0,   61,   46,   46,   46,   46,   46,   46,   27,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,
-       46,   20,   46,   46,   46,   46,   46,   46,   46,   46,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,    3,
-        0,    0,    0,    1,   50,   52,   52,    0,   52,   52,
-       52,   30,   52,   52,   52,   52,   52,   52,    0,   52,
-       52,   52,   52,    0,   52,   52,   52,    0,   25,   26,
-
-       52,   52,   52,   52,   52,   52,   52,   36,   52,   52,
-       48,   48,   52,   52,   52,   52,   52,   64,   61,   46,
-       46,   46,   46,   46,   46,   30,   46,   46,   46,   46,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,
-       46,   46,   25,   26,   46,   46,   46,   46,   46,   46,
-       46,   46,   36,   46,   46,   46,   46,   46,   46,   46,
-       46,   46,   46,    0,    2,    1,   52,   52,    0,    0,
-       52,   52,   52,   52,    0,   52,   52,    0,   52,    0,
-       28,   52,   52,   52,    0,   29,   52,   52,   25,   26,
-       32,   52,   47,   52,   52,   37,   31,   52,   52,   32,
-
-        0,   52,   52,   52,   52,   52,   46,   46,   46,   46,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,
-       46,   28,   46,   46,   46,   46,   29,   46,   46,   25,
-       26,   32,   46,   46,   46,   37,   41,   31,   46,   46,
-       46,   32,   46,   46,   46,   46,   46,   46,    2,    0,
-       52,    0,    0,    0,    0,   52,   52,   52,   52,    0,
-       52,   52,    0,    0,   52,   28,   24,   52,   52,   29,
-        0,   52,   32,   52,   52,   52,   52,    0,   52,    0,
-       52,   52,   33,    0,   33,   46,   46,   46,   46,   46,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,
-
-       46,   46,   28,   24,   46,   46,   29,   46,   46,   32,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,
-       33,   46,   33,    0,   52,    0,    0,    0,    0,   52,
-       52,   30,    0,    0,   52,    0,    0,    0,    5,   52,
-       17,    0,   52,    0,   52,    0,   37,    0,   52,    0,
-       52,   52,    0,   46,   46,   46,   46,   46,   46,   46,
-       46,   30,   46,   46,   38,   46,   46,   46,   46,    5,
-       46,   17,   46,   46,   46,   46,   46,   37,   46,   42,
-       46,   46,   46,   46,   46,    0,   52,    0,    0,    0,
-       52,   52,    0,   52,    0,    0,    0,   52,    0,    0,
-
-        0,   52,    0,   52,    0,   52,    0,    0,   52,    0,
-       52,   52,    0,   46,   46,   46,   46,   46,   46,   46,
-       46,   46,   46,   46,   46,   46,   39,   40,   46,   46,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,
-       46,   46,   46,   46,   52,    0,    0,    0,   52,   52,
-        0,    0,   11,    0,    0,    0,    0,    0,    0,    0,
-       52,    0,   52,    0,   52,    0,    0,   34,    0,   52,
-        0,    0,   46,   46,   46,   46,   46,   46,   46,   46,
-       46,   11,   46,   46,   46,   46,   46,   46,   46,   46,
-       46,   46,   46,   46,   46,   46,   34,   46,   46,   46,
-
-       46,   52,    0,   52,    0,    0,    0,    0,    0,    0,
-       15,    0,    0,   52,    0,   52,    0,   52,    0,    0,
-       52,    0,   52,    0,    0,   46,   46,   46,   46,   46,
-       46,   46,   46,   46,   46,   15,   46,   46,   46,   46,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,
-       52,    0,    0,    0,    0,   13,    0,    0,    0,    5,
-        0,    0,    0,   52,    0,   21,    0,    0,   34,   14,
-       52,    0,   16,   46,   46,   46,   46,   46,   46,   13,
-       46,   46,   46,    5,   46,   46,   46,   46,   46,   21,
-       46,   46,   34,   14,   46,   46,   16,   52,    0,    0,
-
-        0,    0,    0,    0,    0,    0,    0,    0,   52,    0,
-        0,   17,   52,    0,   46,   46,   46,   46,   46,   43,
-       46,   46,   46,   46,   46,   46,   46,   46,   46,   17,
-       46,   46,    0,    0,    0,    0,    0,   10,    0,    0,
-        0,    0,    0,    8,   19,   18,    0,    0,   46,   46,
-       46,   46,   46,   10,   46,   46,   46,   46,   46,    8,
-       19,   18,   46,   46,    0,    0,    0,    0,   12,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,   46,   46,
-       46,   46,   12,   46,   46,   46,   46,   46,   46,   46,
-       46,   46,    0,    0,    0,    0,    0,   21,    0,    0,
-
-        0,    0,    0,    0,   46,   46,   46,   46,   46,   21,
-       46,   46,   46,   46,   46,   46,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,   46,   46,   46,   46,
-       46,   46,   46,   46,   46,   46,   22,    0,    9,   20,
-       23,    0,    0,   35,    0,    0,   22,   46,    9,   20,
-       23,   46,   46,   35,   46,   46,    0,    0,    0,    0,
-        0,   46,   46,   46,   46,   46,    0,    0,    0,    0,
-        0,   46,   46,   46,   46,   46,   11,    7,    0,    0,
-        0,   11,    7,   46,   46,   46,    6,    0,    0,    6,
-       46,   46,    0,    0,   46,   46,    0,   46,    0
-
-    } ;
-
-static yyconst flex_int32_t yy_ec[256] =
-    {   0,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    2,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    3,    1,    4,    5,    1,    6,    7,    8,    9,
-       10,   10,   10,   10,   10,   10,   10,   11,    1,    1,
-       12,    1,    3,    1,   13,   14,   15,   16,   13,   13,
-       17,   17,   18,    3,    3,   19,    3,    3,    3,    3,
-        3,   20,   17,   21,    3,    3,    3,    3,    3,    3,
-        1,    1,    1,    1,   22,    1,   23,   24,   25,   26,
-
-       27,   28,   29,   30,   31,   32,   33,   34,   35,   36,
-       37,   38,    3,   39,   40,   41,   42,   43,   44,   45,
-       46,    3,   47,    1,   48,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1
-    } ;
-
-static yyconst flex_int32_t yy_meta[49] =
-    {   0,
-        1,    1,    2,    3,    4,    5,    6,    6,    6,    6,
-        1,    1,    6,    6,    6,    6,    2,    2,    2,    2,
-        2,    2,    6,    6,    6,    6,    6,    6,    2,    2,
-        2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
-        2,    2,    2,    2,    2,    2,    5,    3
-    } ;
-
-static yyconst flex_int16_t yy_base[912] =
-    {   0,
-        0,    0,   47,   91,  136,    0,   57,   60, 1304, 1305,
-     1305,    0, 1305, 1305, 1305,   43,   60, 1305, 1305,   73,
-      169, 1267,   63, 1275,   40,   37,   72,   92, 1266, 1277,
-      182,   77,   50, 1262, 1260,  203,  239,   42, 1274, 1257,
-     1305, 1305, 1305,  182,  112, 1305,   84, 1290, 1305, 1305,
-      263, 1271,   89,  196,  183,  188,  190,  235,  193,   82,
-      189,  256,  201,  264,  220,  192,  251,  301,  218,  211,
-      212,  190,  238, 1305, 1245,    0,  290,    0,   93, 1251,
-     1251, 1285,    0, 1274, 1260, 1262, 1255,  246, 1262, 1260,
-     1243, 1257, 1245, 1238,    0, 1254, 1237, 1258, 1241, 1233,
-
-     1232, 1232, 1253, 1237, 1230,  307, 1246, 1236, 1232,  294,
-     1240, 1225, 1235, 1236, 1235,  308, 1234,  247, 1220, 1228,
-      311,    0,  298, 1253,    0, 1234,  219,  299, 1251, 1250,
-      298,  317,  327,  245,  335,  216,  278,  336,  339,  342,
-      341, 1249,  343, 1212,  344,  345,  346,  348, 1211,  350,
-      351,  349,  353,  284,  354,  352,  362,  357,  356,  360,
-       55,  365,  366, 1224,  378,  367,  376,  368,  390,  360,
-     1244, 1201, 1200,    0,    0, 1224, 1205,  100, 1218, 1217,
-     1214,    0, 1206, 1236, 1210, 1198, 1233, 1203, 1202, 1221,
-     1199, 1199, 1198, 1197, 1216, 1202, 1187,  383,    0,    0,
-
-     1201, 1189, 1214, 1185, 1186, 1182, 1194,    0, 1193, 1191,
-      348,  391, 1193, 1183, 1177, 1182, 1173,    0, 1305,  392,
-      398,  385,  405,  407,  412, 1208,  414, 1207,  415,  418,
-     1206,  417, 1176,  119,  419,  421,  422, 1175,  423,  420,
-      424,  404, 1203, 1202,  431,  433,  437,  428,  435,  438,
-      439,  444, 1201,  447,  448,  453,  434,  457,  458,  459,
-      463,  468,  464, 1199,    0,    0, 1199, 1164,  452,  451,
-     1163, 1161, 1164, 1174, 1173, 1170, 1169,  455, 1168, 1170,
-        0, 1147, 1169, 1150, 1166,    0, 1184, 1149, 1305, 1305,
-     1147, 1147, 1305, 1162, 1145, 1156,    0, 1177, 1154, 1153,
-
-     1154, 1136, 1143, 1149, 1170, 1147, 1168,  477,  463,  460,
-      484,  486,  489,  487, 1147,  490,  493,  494,  475,  501,
-     1147, 1165,  498,  499,  502, 1145, 1163, 1162,  503,    0,
-        0,  506,  508,  504,  509,  510, 1161, 1160, 1159,  513,
-      514, 1136, 1137,  515,  524,  525, 1156,  526,    0, 1139,
-     1117, 1117, 1134, 1133, 1115, 1127, 1113, 1117, 1121, 1104,
-     1144, 1103,  499, 1116, 1106, 1305,    0, 1104, 1104, 1305,
-     1118, 1100,    0, 1136, 1099, 1134, 1098, 1109, 1095, 1089,
-     1100, 1106, 1092, 1106,    0, 1109,  527, 1088, 1105, 1104,
-     1086,  529,  530,  531,  533, 1079, 1119,  535,  534,  515,
-
-     1092,  546,    0, 1117,  549,  554,    0, 1096,  550, 1115,
-     1114,  555, 1113,  557, 1089,  562,  560, 1070,  566,  568,
-      563, 1090, 1109, 1094, 1087, 1088, 1085, 1084, 1067, 1071,
-     1079,  571, 1080,  539, 1063, 1066, 1077, 1072,    0, 1069,
-        0, 1053, 1073, 1069, 1065, 1067,    0, 1071, 1068, 1067,
-     1068, 1064, 1055, 1069,  577, 1064, 1061, 1060, 1043,  570,
-      572,  582, 1058,  545,  602,  567, 1045, 1056, 1051, 1074,
-      584, 1073, 1031,  580, 1048,  586, 1047, 1069, 1050, 1067,
-      588, 1046,  607,  609, 1036, 1055, 1027, 1037, 1036, 1026,
-     1039, 1027,  585, 1022, 1027, 1029, 1032, 1053, 1032, 1022,
-
-     1016, 1017, 1028, 1011, 1028, 1013, 1026, 1006, 1017, 1012,
-     1004, 1039, 1006, 1028,  578, 1011, 1010, 1000,  613,  616,
-      591,  618,  620, 1004, 1006, 1009, 1030, 1029, 1028, 1007,
-      997,  991,  619, 1004,  622, 1005,  624, 1004,  984,  623,
-      991,  626, 1019,  986,  991,  994,  993,  977,  991,  976,
-      980,  984,    0,  987,  973,  984,  971,  977,  982,  985,
-      971,  972,  974,  962,  967,  960,  967,  973,  972,  967,
-      972,  971,  627,  968,  967,  951,  628,  629,  956,  960,
-      631,  985,  962,  948,  959,  946,  952,  957,  960,  632,
-      948,  634,  939,  635,  938,  945,  637,  951,  638,  952,
-
-      951,  938,  949,  968,  932,  931,  930,  929,  941,  923,
-     1305,  926,  924,  959,  936,  925,  927,  920,  925,  917,
-      917,  916,  912,  908,  920,  636,  927,  946,  910,  909,
-      640,  908,  907,  919,  901,    0,  904,  902,  937,  914,
-      639,  906,  641,  905,  897,  642,  897,  643,  890,  902,
-      898,  892,  904,  890,  890, 1305,  902,  889,  896, 1305,
-      895,  897,  884,  887,  881,    0,  880,  880,    0, 1305,
-      892,  893, 1305,  644,  876,  888,  874,  874,  645,    0,
-      886,  873,  880,    0,  879,  881,  868,  649,  866,  901,
-      864,  864,  898,    0,  652,  877,    0,  896,  869,  876,
-
-      859,  870,  856,  868,  853,  856,  869,  886,  850,  849,
-      848, 1305,  882,  852,  880,  853,  860,  843,  854,  875,
-      839,  851,  836,  839,  852,  869,  657,  833,  832,    0,
-      866,  836,  848,  831,  825,  824,  825, 1305,  828,  838,
-      826,  819,  659,    0, 1305, 1305,  650,  833,  838,  821,
-      815,  814,  815,    0,  818,  828,  816,  809,  664,  845,
-        0,    0,  656,  822,  829,  811,  812,  820, 1305,  819,
-      813,  802,  807,  817,  800,  801,  810,  796,  816,  798,
-      799,  807,    0,  806,  800,  789,  794,  804,  787,  788,
-      797,  783,  808,  780,  779,  792,  791, 1305,  776,  791,
-
-      777,  789,  785,  801,  782,  753,  742,  752,  750,    0,
-      733,  102,  163,  271,  558,  646,  626,  643,  635,  651,
-      653,  661,  660,  672,  673,  676,  661,  671,  663,  665,
-      666,  674,  672,  683,  684,  687, 1305,  675, 1305, 1305,
-     1305,  686,  673, 1305,  693,  678,    0,  681,    0,    0,
-        0,  692,  679,    0,  698,  683,  687,  688,  698,  701,
-      690,  692,  693,  703,  706,  695,  693,  708,  699,  703,
-      701,  698,  713,  704,  708,  706, 1305, 1305,  717,  717,
-      704,    0,    0,  720,  720,  707, 1305,  713,  723,    0,
-      715,  725,  727,  718,  729,  720,  731,  732, 1305,  758,
-
-      764,  769,  774,  780,  786,  766,  767,  791,  797,  803,
-      809
-    } ;
-
-static yyconst flex_int16_t yy_def[912] =
-    {   0,
-      899,    1,  900,  900,  899,    5,  901,  901,  899,  899,
-      899,  902,  899,  899,  899,  899,  899,  899,  899,  902,
-      902,  902,  902,  902,  902,  902,  902,  902,  902,  902,
-      902,  902,  902,  902,  902,  902,  902,  902,  902,  902,
-      899,  899,  899,  899,  899,  899,  899,  903,  899,  899,
-      903,   51,  903,  903,  903,  903,  903,  903,  903,  903,
-      903,  903,  903,  903,  903,  903,   51,  903,  903,  903,
-      903,  904,  904,  899,  905,  902,  899,  906,   36,  902,
-      902,  902,  902,  902,  902,  902,  902,  902,  902,  902,
-      902,  902,  902,  902,  902,  902,  899,  902,  902,  902,
-
-      902,  899,  902,  902,  902,  902,  902,  902,  902,  902,
-      902,  902,  902,  902,   37,   37,  902,  902,  902,  902,
-      899,  907,  899,  903,  908,   51,  903,  903,  903,  903,
-      903,  903,  903,  903,  903,  903,  903,  903,  903,  903,
-      903,  903,  903,  908,  903,  903,  903,  903,  908,  903,
-      903,  903,  903,  903,  903,  903,  903,  903,  903,  903,
-      903,  903,  903,   68,   68,  903,  903,  903,  903,  904,
-      909,  905,  905,  910,  906,  902,  902,  899,  902,  902,
-      902,  902,  902,  902,  902,  902,  902,  902,  899,  902,
-      902,  902,  902,  899,  902,  902,  902,  899,  902,  902,
-
-      902,  902,  902,  902,  902,  902,  902,  902,  902,  902,
-       37,   37,  902,  902,  902,  902,  902,  907,  899,  903,
-      903,  908,  903,  903,  903,  903,  903,  903,  903,  903,
-      903,  903,  908,  903,  903,  903,  903,  908,  903,  903,
-      903,  908,  903,  903,  903,  903,  903,  903,  903,  903,
-      903,  903,  903,  903,  903,  903,   68,   68,  903,  903,
-      903,  903,  903,  909,  911,  910,  902,  902,  899,  899,
-      902,  902,  902,  902,  899,  902,  902,  899,  902,  899,
-      902,  902,  902,  902,  899,  902,  902,  902,  899,  899,
-      902,  902,  899,  902,  902,  902,  902,  902,  902,   37,
-
-      899,  902,  902,  902,  902,  902,  903,  903,  908,  908,
-      903,  903,  903,  903,  908,  903,  903,  903,  908,  903,
-      908,  903,  903,  903,  903,  908,  903,  903,  903,  908,
-      908,  903,  903,  903,  903,  903,  903,  903,  903,  903,
-      903,   68,  908,  903,  903,  903,  903,  903,  911,  899,
-      902,  899,  899,  899,  899,  902,  902,  902,  902,  899,
-      902,  902,  899,  899,  902,  899,  902,  902,  902,  899,
-      899,  902,  902,  902,  902,  902,  902,  899,  902,  899,
-      902,  902,  902,  899,  902,  908,  903,  908,  908,  908,
-      908,  903,  903,  903,  903,  908,  903,  903,  903,  908,
-
-      908,  903,  908,  903,  903,  903,  908,  908,  903,  903,
-      903,  903,  903,  903,  908,  903,  903,  908,  903,  903,
-      903,  908,  903,  899,  902,  899,  899,  899,  899,  902,
-      902,  902,  899,  899,  902,  899,  899,  899,  902,  902,
-      902,  899,  902,  899,  902,  899,  902,  899,  902,  899,
-      902,  902,  899,  908,  903,  908,  908,  908,  908,  903,
-      903,  903,  908,  908,  903,  903,  908,  908,  908,  903,
-      903,  903,  908,  903,  908,  903,  908,  903,  908,  903,
-      903,  908,  903,  903,  908,  899,  902,  899,  899,  899,
-      902,  902,  899,  902,  899,  899,  899,  902,  899,  899,
-
-      899,  902,  899,  902,  899,  902,  899,  899,  902,  899,
-      902,  902,  899,  908,  903,  908,  908,  908,  903,  903,
-      908,  903,  903,  908,  908,  908,  903,  903,  903,  908,
-      908,  908,  903,  908,  903,  908,  903,  908,  908,  903,
-      908,  903,  903,  908,  902,  899,  899,  899,  902,  902,
-      899,  899,  902,  899,  899,  899,  899,  899,  899,  899,
-      902,  899,  902,  899,  902,  899,  899,  902,  899,  902,
-      899,  899,  903,  908,  908,  908,  903,  903,  908,  908,
-      903,  903,  908,  908,  908,  908,  908,  908,  908,  903,
-      908,  903,  908,  903,  908,  908,  903,  908,  903,  908,
-
-      908,  902,  899,  902,  899,  899,  899,  899,  899,  899,
-      899,  899,  899,  902,  899,  902,  899,  902,  899,  899,
-      902,  899,  902,  899,  899,  903,  908,  903,  908,  908,
-      903,  908,  908,  908,  908,  908,  908,  908,  903,  908,
-      903,  908,  903,  908,  908,  903,  908,  903,  908,  908,
-      902,  899,  899,  899,  899,  899,  899,  899,  899,  899,
-      899,  899,  899,  902,  899,  902,  899,  899,  902,  899,
-      902,  899,  899,  903,  908,  908,  908,  908,  903,  908,
-      908,  908,  908,  908,  908,  908,  908,  903,  908,  903,
-      908,  908,  903,  908,  903,  908,  908,  902,  899,  899,
-
-      899,  899,  899,  899,  899,  899,  899,  899,  902,  899,
-      899,  899,  902,  899,  903,  908,  908,  908,  908,  903,
-      908,  908,  908,  908,  908,  908,  903,  908,  908,  908,
-      903,  908,  899,  899,  899,  899,  899,  899,  899,  899,
-      899,  899,  899,  902,  899,  899,  899,  899,  908,  908,
-      908,  908,  908,  908,  908,  908,  908,  908,  908,  903,
-      908,  908,  908,  908,  899,  899,  899,  899,  899,  899,
-      899,  899,  899,  899,  899,  899,  899,  899,  908,  908,
-      908,  908,  908,  908,  908,  908,  908,  908,  908,  908,
-      908,  908,  899,  899,  899,  899,  899,  899,  899,  899,
-
-      899,  899,  899,  899,  908,  908,  908,  908,  908,  908,
-      908,  908,  908,  908,  908,  908,  899,  899,  899,  899,
-      899,  899,  899,  899,  899,  899,  908,  908,  908,  908,
-      908,  908,  908,  908,  908,  908,  899,  899,  899,  899,
-      899,  899,  899,  899,  899,  899,  908,  908,  908,  908,
-      908,  908,  908,  908,  908,  908,  899,  899,  899,  899,
-      899,  908,  908,  908,  908,  908,  899,  899,  899,  899,
-      899,  908,  908,  908,  908,  908,  899,  899,  899,  899,
-      899,  908,  908,  908,  908,  908,  899,  899,  899,  908,
-      908,  908,  899,  899,  908,  908,  899,  908,    0,  899,
-
-      899,  899,  899,  899,  899,  899,  899,  899,  899,  899,
-      899
-    } ;
-
-static yyconst flex_int16_t yy_nxt[1354] =
-    {   0,
-       10,   11,   12,   13,   14,   15,   16,   17,   17,   17,
-       18,   19,   12,   12,   12,   20,   21,   22,   23,   24,
-       12,   12,   25,   26,   27,   28,   29,   30,   12,   21,
-       31,   12,   21,   32,   33,   34,   35,   36,   37,   38,
-       39,   21,   12,   40,   12,   12,   41,   42,   10,   77,
-       77,   77,   77,   44,   45,   45,   45,   46,   73,  125,
-       74,   73,   74,   74,   86,   74,   77,   77,   77,   77,
-       82,   83,  108,   87,   88,   89,  109,   90,   91,  117,
-      110,   84,  118,  254,  106,   47,  125,   78,   79,   79,
-       47,   47,   10,  125,   92,   80,   97,   44,   45,   45,
-
-       45,   46,   79,   75,   74,   79,   75,   74,   93,   94,
-       79,   95,   98,  107,   79,   76,  147,   96,  121,  121,
-      121,  121,  123,  125,  128,  269,  832,  123,  123,   47,
-      270,   76,  322,   99,   47,   47,   10,   11,   48,   49,
-       14,   50,   16,   17,   17,   17,   18,   19,   48,   48,
-       48,   51,   52,   53,   54,   55,   48,   48,   56,   57,
-       58,   59,   60,   61,   48,   52,   62,   48,   52,   63,
-       64,   65,   66,   67,   68,   69,   70,   52,   48,   71,
-       48,   48,   41,   42,   79,   79,  102,  125,  121,  121,
-      121,  121,  125,  125,  125,  171,  125,  144,   79,  833,
-
-      125,   79,  103,  129,  130,  125,   79,  104,  153,  132,
-       79,  148,  133,  145,  131,  125,  125,  105,   79,   79,
-      125,  134,  125,  125,  125,  113,  122,  135,  136,  160,
-      137,  138,   79,  168,  146,   79,  172,  154,  227,  125,
-       79,  114,  158,  171,   79,  115,  115,  115,  115,  125,
-      169,  115,  115,  115,  115,  166,  159,  139,  167,  220,
-      149,  115,  115,  115,  115,  116,  115,  125,  125,  214,
-      182,  140,  141,  161,  142,  225,  150,  162,  126,  126,
-      143,  151,  125,  215,  172,  127,  155,  182,  125,  163,
-      156,  152,  126,  834,  157,  126,   77,   77,   77,   77,
-
-      126,  226,  125,  125,  126,  125,  245,  164,  164,  164,
-      164,  198,  130,  164,  164,  164,  164,  121,  121,  121,
-      121,  125,  204,  164,  164,  164,  164,  165,  164,  205,
-      211,  125,  199,  206,  115,  212,  219,  200,  221,  125,
-      125,  219,  219,  125,  223,  125,  125,  125,  125,  125,
-      125,  224,  125,  125,  125,  125,  125,  242,  125,  226,
-      125,  125,  234,  229,  125,  171,  125,  232,  239,  125,
-      125,  125,  125,  300,  115,  228,  226,  230,  243,  235,
-      125,  252,  231,  244,  240,  246,  247,  236,  241,  237,
-      248,  251,  256,  259,  125,  301,  125,  249,  260,  253,
-
-      257,  250,  125,  255,  164,  258,  172,  262,  289,  125,
-      309,  125,  261,  290,  307,  310,  125,  115,  125,  125,
-      263,  125,  125,  125,  125,  125,  125,  125,  125,  330,
-      208,  311,  125,  312,  331,  125,  327,  125,  308,  125,
-      313,  125,  125,  125,  316,  317,  328,  293,  125,  314,
-      320,  125,  125,  323,  324,  325,  332,  125,  318,  342,
-      164,  343,  125,  125,  329,  337,  334,  125,  125,  333,
-      338,  335,  125,  339,  352,  354,  353,  336,  340,  363,
-      341,  125,  344,  164,  390,  388,  355,  389,  125,  364,
-      125,  125,  345,  125,  125,  391,  253,  125,  125,  400,
-
-      347,  346,  125,  125,  348,  125,  125,  125,  125,  401,
-      125,  395,  125,  125,  125,  387,  397,  125,  125,  125,
-      399,  405,  392,  398,  394,  393,  412,  402,  125,  125,
-      125,  125,  436,  125,  125,  125,  414,  125,  125,  125,
-      417,  409,  406,  404,  437,  410,  411,  413,  467,  416,
-      125,  421,  423,  125,  125,  460,  419,  420,  125,  125,
-      468,  125,  462,  465,  125,  461,  125,  125,  455,  253,
-      125,  125,  125,  496,  125,  493,  125,  497,  466,  525,
-      835,  125,  125,  526,  125,  470,  521,  480,  125,  471,
-      125,  474,  125,  472,  484,  476,  478,  494,  520,  483,
-
-      481,  515,  423,  522,  535,  519,  125,  529,  523,  527,
-      528,  125,  540,  125,  533,  551,  537,  125,  573,  552,
-      125,  579,  125,  125,  125,  580,  125,  125,  125,  542,
-      125,  125,  125,  125,  543,  125,  125,  577,  125,  125,
-      125,  125,  125,  125,  125,  125,  125,  125,  125,  125,
-      836,  578,  597,  125,  253,  590,  125,  626,  581,  582,
-      594,  125,  592,  646,  641,  837,  599,  639,  648,  628,
-      643,  720,  674,  838,  839,  688,  631,  679,  731,  715,
-      690,  693,  774,  776,  727,  695,  775,  788,  777,  790,
-      840,  789,  841,  842,  791,  843,  760,  844,  844,  845,
-
-      847,  848,  849,  846,  850,  851,  852,  853,  854,  854,
-      855,  857,  858,  859,  856,  860,  861,  862,  863,  864,
-      865,  866,  867,  868,  869,  870,  871,  872,  873,  874,
-      875,  876,  877,  878,  879,  880,  881,  882,  883,  884,
-      885,  886,  887,  888,  889,  890,  891,  892,  893,  894,
-      895,  896,  878,  897,  883,  898,  887,  890,   43,   43,
-       43,   43,   43,   43,   72,   72,   72,   72,   72,   72,
-       76,  175,  218,  831,   76,  124,  830,  124,  829,  124,
-      170,  170,  828,  170,  170,  170,  173,  173,  173,  173,
-      173,  173,  125,  827,  125,  407,  125,  264,  264,  264,
-
-      264,  264,  264,  266,  266,  826,  266,  825,  266,  349,
-      349,  824,  349,  823,  349,  822,  821,  820,  819,  818,
-      817,  370,  816,  815,  814,  813,  812,  811,  810,  809,
-      808,  807,  806,  331,  805,  804,  803,  802,  801,  800,
-      799,  798,  797,  796,  795,  794,  290,  793,  792,  125,
-      787,  786,  785,  784,  783,  782,  781,  780,  779,  778,
-      773,  772,  771,  770,  769,  768,  767,  766,  765,  764,
-      763,  762,  761,  759,  758,  757,  756,  755,  754,  125,
-      753,  752,  751,  750,  749,  748,  747,  746,  745,  744,
-      743,  742,  741,  740,  739,  738,  737,  736,  735,  734,
-
-      733,  732,  125,  730,  729,  125,  728,  726,  725,  724,
-      723,  722,  721,  719,  718,  717,  716,  714,  713,  712,
-      711,  710,  709,  708,  707,  706,  705,  704,  703,  702,
-      701,  700,  699,  698,  697,  696,  694,  692,  691,  689,
-      687,  686,  685,  684,  683,  682,  681,  680,  678,  677,
-      676,  675,  673,  672,  671,  670,  669,  668,  667,  666,
-      665,  664,  663,  662,  661,  660,  659,  658,  657,  656,
-      655,  654,  653,  652,  651,  650,  649,  647,  645,  644,
-      642,  640,  638,  637,  636,  635,  634,  633,  632,  125,
-      630,  629,  627,  331,  330,  625,  624,  623,  622,  621,
-
-      620,  619,  618,  617,  616,  615,  614,  613,  612,  611,
-      610,  609,  608,  607,  606,  605,  604,  208,  603,  290,
-      289,  602,  601,  600,  598,  596,  595,  593,  591,  589,
-      588,  587,  586,  125,  125,  585,  584,  583,  576,  575,
-      574,  403,  572,  571,  570,  569,  568,  567,  566,  565,
-      564,  563,  562,  561,  560,  559,  558,  557,  556,  555,
-      554,  553,  550,  549,  548,  547,  546,  545,  366,  544,
-      541,  125,  539,  125,  538,  536,  534,  125,  125,  532,
-      531,  530,  524,  518,  517,  516,  330,  514,  513,  512,
-      511,  510,  509,  508,  507,  506,  505,  504,  503,  502,
-
-      501,  500,  499,  498,  495,  492,  491,  490,  489,  488,
-      289,  487,  486,  125,  485,  482,  479,  477,  475,  125,
-      473,  125,  469,  464,  463,  459,  458,  457,  456,  454,
-      453,  385,  452,  451,  450,  449,  448,  447,  446,  445,
-      444,  443,  442,  441,  440,  439,  438,  435,  434,  433,
-      432,  431,  208,  430,  429,  428,  427,  426,  425,  424,
-      422,  418,  164,  415,  125,  125,  408,  125,  407,  125,
-      403,  396,  386,  385,  384,  383,  382,  381,  380,  115,
-      379,  378,  377,  376,  375,  374,  373,  372,  371,  370,
-      369,  368,  367,  366,  365,  362,  361,  360,  359,  358,
-
-      357,  356,  351,  350,  265,  125,  125,  125,  326,  321,
-      319,  315,  125,  306,  305,  304,  303,  302,  299,  298,
-      297,  296,  295,  294,  293,  292,  291,  288,  287,  286,
-      285,  284,  283,  282,  281,  280,  279,  278,  277,  276,
-      275,  274,  273,  272,  271,  268,  267,  174,  174,  265,
-      164,  238,  233,  125,  125,  222,  124,  125,  217,  216,
-      213,  115,  210,  209,  208,  207,  203,  202,  201,  197,
-      196,  195,  194,  193,  192,  191,  190,  189,  188,  187,
-      186,  185,  184,  182,  183,  181,  180,  179,   83,  178,
-      177,  176,  174,  124,  125,  120,  119,  112,  111,  101,
-
-      100,   85,   81,  899,    9,  899,  899,  899,  899,  899,
-      899,  899,  899,  899,  899,  899,  899,  899,  899,  899,
-      899,  899,  899,  899,  899,  899,  899,  899,  899,  899,
-      899,  899,  899,  899,  899,  899,  899,  899,  899,  899,
-      899,  899,  899,  899,  899,  899,  899,  899,  899,  899,
-      899,  899,  899
-    } ;
-
-static yyconst flex_int16_t yy_chk[1354] =
-    {   0,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    3,   16,
-       16,   16,   16,    3,    3,    3,    3,    3,    7,  161,
-        7,    8,    7,    8,   25,    8,   17,   17,   17,   17,
-       23,   23,   33,   25,   26,   26,   33,   26,   26,   38,
-       33,   23,   38,  161,   32,    3,   60,   16,   20,   20,
-        3,    3,    4,   53,   27,   20,   28,    4,    4,    4,
-
-        4,    4,   20,    7,    7,   20,    8,    8,   27,   27,
-       20,   27,   28,   32,   20,   79,   60,   27,   45,   45,
-       45,   45,   47,  234,   53,  178,  812,   47,   47,    4,
-      178,   79,  234,   28,    4,    4,    5,    5,    5,    5,
-        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
-        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
-        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
-        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
-        5,    5,    5,    5,   21,   21,   31,   55,   44,   44,
-       44,   44,   56,   61,   57,   72,   66,   59,   21,  813,
-
-       54,   21,   31,   54,   54,   63,   21,   31,   63,   55,
-       21,   61,   56,   59,   54,   70,   71,   31,   36,   36,
-      136,   56,   69,  127,   65,   36,   44,   57,   57,   66,
-       57,   57,   36,   70,   59,   36,   72,   63,  136,   58,
-       36,   36,   65,   73,   36,   37,   37,   37,   37,  134,
-       71,   37,   37,   37,   37,   69,   65,   58,   69,  127,
-       62,   37,   37,   37,   37,   37,   37,   51,   64,  118,
-       88,   58,   58,   67,   58,  134,   62,   67,   51,   51,
-       58,   62,  137,  118,   73,   51,   64,   88,  154,   67,
-       64,   62,   51,  814,   64,   51,   77,   77,   77,   77,
-
-       51,  137,  131,  128,   51,   68,  154,   68,   68,   68,
-       68,  106,  131,   68,   68,   68,   68,  121,  121,  121,
-      121,  132,  110,   68,   68,   68,   68,   68,   68,  110,
-      116,  133,  106,  110,  116,  116,  123,  106,  128,  135,
-      138,  123,  123,  139,  132,  141,  140,  143,  145,  146,
-      147,  133,  148,  152,  150,  151,  156,  153,  155,  135,
-      159,  158,  145,  139,  160,  170,  157,  143,  150,  162,
-      163,  166,  168,  211,  211,  138,  135,  140,  153,  146,
-      167,  159,  141,  153,  151,  155,  156,  147,  152,  148,
-      157,  158,  163,  166,  169,  212,  220,  157,  167,  160,
-
-      165,  157,  221,  162,  165,  165,  170,  168,  198,  223,
-      222,  224,  167,  198,  220,  222,  225,  212,  227,  229,
-      169,  232,  230,  235,  240,  236,  237,  239,  241,  242,
-      212,  223,  248,  224,  242,  245,  239,  246,  221,  249,
-      225,  247,  250,  251,  229,  230,  240,  247,  252,  227,
-      232,  254,  255,  235,  236,  237,  245,  256,  230,  257,
-      257,  258,  259,  260,  241,  251,  248,  261,  263,  246,
-      252,  249,  262,  254,  269,  270,  269,  250,  255,  278,
-      256,  308,  259,  258,  310,  309,  270,  309,  311,  278,
-      312,  314,  260,  313,  316,  310,  258,  317,  318,  319,
-
-      262,  261,  323,  324,  263,  320,  325,  329,  334,  319,
-      332,  314,  333,  335,  336,  308,  316,  340,  341,  344,
-      318,  324,  311,  317,  313,  312,  334,  320,  345,  346,
-      348,  387,  363,  392,  393,  394,  336,  395,  399,  398,
-      341,  329,  325,  323,  363,  332,  333,  335,  400,  340,
-      402,  346,  348,  405,  409,  392,  344,  345,  406,  412,
-      400,  414,  395,  398,  417,  394,  416,  421,  387,  393,
-      419,  466,  420,  434,  460,  432,  461,  434,  399,  464,
-      815,  455,  515,  464,  474,  402,  462,  416,  471,  405,
-      476,  409,  481,  406,  420,  412,  414,  432,  461,  419,
-
-      417,  455,  421,  462,  474,  460,  465,  466,  462,  465,
-      465,  483,  481,  484,  471,  493,  476,  519,  515,  493,
-      520,  521,  522,  533,  523,  521,  535,  540,  537,  483,
-      542,  573,  577,  578,  484,  581,  590,  519,  592,  594,
-      626,  597,  599,  641,  631,  643,  646,  648,  674,  679,
-      816,  520,  540,  688,  577,  533,  695,  573,  522,  523,
-      537,  727,  535,  597,  592,  817,  542,  590,  599,  578,
-      594,  679,  626,  818,  819,  641,  581,  631,  695,  674,
-      643,  646,  743,  747,  688,  648,  743,  759,  747,  763,
-      820,  759,  821,  822,  763,  823,  727,  824,  825,  826,
-
-      827,  828,  829,  826,  830,  831,  832,  833,  834,  835,
-      836,  838,  842,  843,  836,  845,  846,  848,  852,  853,
-      855,  856,  857,  858,  859,  860,  861,  862,  863,  864,
-      865,  866,  867,  868,  869,  870,  871,  872,  873,  874,
-      875,  876,  879,  880,  881,  884,  885,  886,  888,  889,
-      891,  892,  893,  894,  895,  896,  897,  898,  900,  900,
-      900,  900,  900,  900,  901,  901,  901,  901,  901,  901,
-      902,  906,  907,  811,  902,  903,  809,  903,  808,  903,
-      904,  904,  807,  904,  904,  904,  905,  905,  905,  905,
-      905,  905,  908,  806,  908,  805,  908,  909,  909,  909,
-
-      909,  909,  909,  910,  910,  804,  910,  803,  910,  911,
-      911,  802,  911,  801,  911,  800,  799,  797,  796,  795,
-      794,  793,  792,  791,  790,  789,  788,  787,  786,  785,
-      784,  782,  781,  780,  779,  778,  777,  776,  775,  774,
-      773,  772,  771,  770,  768,  767,  766,  765,  764,  760,
-      758,  757,  756,  755,  753,  752,  751,  750,  749,  748,
-      742,  741,  740,  739,  737,  736,  735,  734,  733,  732,
-      731,  729,  728,  726,  725,  724,  723,  722,  721,  720,
-      719,  718,  717,  716,  715,  714,  713,  711,  710,  709,
-      708,  707,  706,  705,  704,  703,  702,  701,  700,  699,
-
-      698,  696,  693,  692,  691,  690,  689,  687,  686,  685,
-      683,  682,  681,  678,  677,  676,  675,  672,  671,  668,
-      667,  665,  664,  663,  662,  661,  659,  658,  657,  655,
-      654,  653,  652,  651,  650,  649,  647,  645,  644,  642,
-      640,  639,  638,  637,  635,  634,  633,  632,  630,  629,
-      628,  627,  625,  624,  623,  622,  621,  620,  619,  618,
-      617,  616,  615,  614,  613,  612,  610,  609,  608,  607,
-      606,  605,  604,  603,  602,  601,  600,  598,  596,  595,
-      593,  591,  589,  588,  587,  586,  585,  584,  583,  582,
-      580,  579,  576,  575,  574,  572,  571,  570,  569,  568,
-
-      567,  566,  565,  564,  563,  562,  561,  560,  559,  558,
-      557,  556,  555,  554,  552,  551,  550,  549,  548,  547,
-      546,  545,  544,  543,  541,  539,  538,  536,  534,  532,
-      531,  530,  529,  528,  527,  526,  525,  524,  518,  517,
-      516,  514,  513,  512,  511,  510,  509,  508,  507,  506,
-      505,  504,  503,  502,  501,  500,  499,  498,  497,  496,
-      495,  494,  492,  491,  490,  489,  488,  487,  486,  485,
-      482,  480,  479,  478,  477,  475,  473,  472,  470,  469,
-      468,  467,  463,  459,  458,  457,  456,  454,  453,  452,
-      451,  450,  449,  448,  446,  445,  444,  443,  442,  440,
-
-      438,  437,  436,  435,  433,  431,  430,  429,  428,  427,
-      426,  425,  424,  423,  422,  418,  415,  413,  411,  410,
-      408,  404,  401,  397,  396,  391,  390,  389,  388,  386,
-      384,  383,  382,  381,  380,  379,  378,  377,  376,  375,
-      374,  372,  371,  369,  368,  365,  364,  362,  361,  360,
-      359,  358,  357,  356,  355,  354,  353,  352,  351,  350,
-      347,  343,  342,  339,  338,  337,  328,  327,  326,  322,
-      321,  315,  307,  306,  305,  304,  303,  302,  301,  300,
-      299,  298,  296,  295,  294,  292,  291,  288,  287,  285,
-      284,  283,  282,  280,  279,  277,  276,  275,  274,  273,
-
-      272,  271,  268,  267,  264,  253,  244,  243,  238,  233,
-      231,  228,  226,  217,  216,  215,  214,  213,  210,  209,
-      207,  206,  205,  204,  203,  202,  201,  197,  196,  195,
-      194,  193,  192,  191,  190,  189,  188,  187,  186,  185,
-      184,  183,  181,  180,  179,  177,  176,  173,  172,  171,
-      164,  149,  144,  142,  130,  129,  126,  124,  120,  119,
-      117,  115,  114,  113,  112,  111,  109,  108,  107,  105,
-      104,  103,  102,  101,  100,   99,   98,   97,   96,   94,
-       93,   92,   91,   90,   89,   87,   86,   85,   84,   82,
-       81,   80,   75,   52,   48,   40,   39,   35,   34,   30,
-
-       29,   24,   22,    9,  899,  899,  899,  899,  899,  899,
-      899,  899,  899,  899,  899,  899,  899,  899,  899,  899,
-      899,  899,  899,  899,  899,  899,  899,  899,  899,  899,
-      899,  899,  899,  899,  899,  899,  899,  899,  899,  899,
-      899,  899,  899,  899,  899,  899,  899,  899,  899,  899,
-      899,  899,  899
-    } ;
-
-/* The intent behind this definition is that it'll catch
- * any uses of REJECT which flex missed.
- */
-#define REJECT reject_used_but_not_detected
-#define yymore() yymore_used_but_not_detected
-#define YY_MORE_ADJ 0
-#define YY_RESTORE_YY_MORE_OFFSET
-#line 1 "util/parse-events.l"
-#line 8 "util/parse-events.l"
-#include <errno.h>
-#include "../perf.h"
-#include "parse-events-bison.h"
-#include "parse-events.h"
-
-char *parse_events_get_text(yyscan_t yyscanner);
-YYSTYPE *parse_events_get_lval(yyscan_t yyscanner);
-
-static int __value(YYSTYPE *yylval, char *str, int base, int token)
-{
-	u64 num;
-
-	errno = 0;
-	num = strtoull(str, NULL, base);
-	if (errno)
-		return PE_ERROR;
-
-	yylval->num = num;
-	return token;
-}
-
-static int value(yyscan_t scanner, int base)
-{
-	YYSTYPE *yylval = parse_events_get_lval(scanner);
-	char *text = parse_events_get_text(scanner);
-
-	return __value(yylval, text, base, PE_VALUE);
-}
-
-static int raw(yyscan_t scanner)
-{
-	YYSTYPE *yylval = parse_events_get_lval(scanner);
-	char *text = parse_events_get_text(scanner);
-
-	return __value(yylval, text + 1, 16, PE_RAW);
-}
-
-static int str(yyscan_t scanner, int token)
-{
-	YYSTYPE *yylval = parse_events_get_lval(scanner);
-	char *text = parse_events_get_text(scanner);
-
-	yylval->str = strdup(text);
-	return token;
-}
-
-static int sym(yyscan_t scanner, int type, int config)
-{
-	YYSTYPE *yylval = parse_events_get_lval(scanner);
-
-	yylval->num = (type << 16) + config;
-	return type == PERF_TYPE_HARDWARE ? PE_VALUE_SYM_HW : PE_VALUE_SYM_SW;
-}
-
-static int term(yyscan_t scanner, int type)
-{
-	YYSTYPE *yylval = parse_events_get_lval(scanner);
-
-	yylval->num = type;
-	return PE_TERM;
-}
-
-
-
-
-/* If you add a modifier you need to update check_modifier() */
-#line 1102 "<stdout>"
-
-#define INITIAL 0
-#define mem 1
-#define config 2
-#define event 3
-
-#ifndef YY_NO_UNISTD_H
-/* Special case for "unistd.h", since it is non-ANSI. We include it way
- * down here because we want the user's section 1 to have been scanned first.
- * The user has a chance to override it with an option.
- */
-#include <unistd.h>
-#endif
-
-#ifndef YY_EXTRA_TYPE
-#define YY_EXTRA_TYPE void *
-#endif
-
-/* Holds the entire state of the reentrant scanner. */
-struct yyguts_t
-    {
-
-    /* User-defined. Not touched by flex. */
-    YY_EXTRA_TYPE yyextra_r;
-
-    /* The rest are the same as the globals declared in the non-reentrant scanner. */
-    FILE *yyin_r, *yyout_r;
-    size_t yy_buffer_stack_top; /**< index of top of stack. */
-    size_t yy_buffer_stack_max; /**< capacity of stack. */
-    YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */
-    char yy_hold_char;
-    int yy_n_chars;
-    int yyleng_r;
-    char *yy_c_buf_p;
-    int yy_init;
-    int yy_start;
-    int yy_did_buffer_switch_on_eof;
-    int yy_start_stack_ptr;
-    int yy_start_stack_depth;
-    int *yy_start_stack;
-    yy_state_type yy_last_accepting_state;
-    char* yy_last_accepting_cpos;
-
-    int yylineno_r;
-    int yy_flex_debug_r;
-
-    char *yytext_r;
-    int yy_more_flag;
-    int yy_more_len;
-
-    YYSTYPE * yylval_r;
-
-    }; /* end struct yyguts_t */
-
-static int yy_init_globals (yyscan_t yyscanner );
-
-    /* This must go here because YYSTYPE and YYLTYPE are included
-     * from bison output in section 1.*/
-    #    define yylval yyg->yylval_r
-    
-int parse_events_lex_init (yyscan_t* scanner);
-
-int parse_events_lex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner);
-
-/* Accessor methods to globals.
-   These are made visible to non-reentrant scanners for convenience. */
-
-int parse_events_lex_destroy (yyscan_t yyscanner );
-
-int parse_events_get_debug (yyscan_t yyscanner );
-
-void parse_events_set_debug (int debug_flag ,yyscan_t yyscanner );
-
-YY_EXTRA_TYPE parse_events_get_extra (yyscan_t yyscanner );
-
-void parse_events_set_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );
-
-FILE *parse_events_get_in (yyscan_t yyscanner );
-
-void parse_events_set_in  (FILE * in_str ,yyscan_t yyscanner );
-
-FILE *parse_events_get_out (yyscan_t yyscanner );
-
-void parse_events_set_out  (FILE * out_str ,yyscan_t yyscanner );
-
-int parse_events_get_leng (yyscan_t yyscanner );
-
-char *parse_events_get_text (yyscan_t yyscanner );
-
-int parse_events_get_lineno (yyscan_t yyscanner );
-
-void parse_events_set_lineno (int line_number ,yyscan_t yyscanner );
-
-YYSTYPE * parse_events_get_lval (yyscan_t yyscanner );
-
-void parse_events_set_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );
-
-/* Macros after this point can all be overridden by user definitions in
- * section 1.
- */
-
-#ifndef YY_SKIP_YYWRAP
-#ifdef __cplusplus
-extern "C" int parse_events_wrap (yyscan_t yyscanner );
-#else
-extern int parse_events_wrap (yyscan_t yyscanner );
-#endif
-#endif
-
-    static void yyunput (int c,char *buf_ptr  ,yyscan_t yyscanner);
-    
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner);
-#endif
-
-#ifndef YY_NO_INPUT
-
-#ifdef __cplusplus
-static int yyinput (yyscan_t yyscanner );
-#else
-static int input (yyscan_t yyscanner );
-#endif
-
-#endif
-
-    static void yy_push_state (int new_state ,yyscan_t yyscanner);
-    
-    static void yy_pop_state (yyscan_t yyscanner );
-    
-    static int yy_top_state (yyscan_t yyscanner );
-    
-/* Amount of stuff to slurp up with each read. */
-#ifndef YY_READ_BUF_SIZE
-#ifdef __ia64__
-/* On IA-64, the buffer size is 16k, not 8k */
-#define YY_READ_BUF_SIZE 16384
-#else
-#define YY_READ_BUF_SIZE 8192
-#endif /* __ia64__ */
-#endif
-
-/* Copy whatever the last rule matched to the standard output. */
-#ifndef ECHO
-/* This used to be an fputs(), but since the string might contain NUL's,
- * we now use fwrite().
- */
-#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0)
-#endif
-
-/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
- * is returned in "result".
- */
-#ifndef YY_INPUT
-#define YY_INPUT(buf,result,max_size) \
-	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
-		{ \
-		int c = '*'; \
-		size_t n; \
-		for ( n = 0; n < max_size && \
-			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
-			buf[n] = (char) c; \
-		if ( c == '\n' ) \
-			buf[n++] = (char) c; \
-		if ( c == EOF && ferror( yyin ) ) \
-			YY_FATAL_ERROR( "input in flex scanner failed" ); \
-		result = n; \
-		} \
-	else \
-		{ \
-		errno=0; \
-		while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
-			{ \
-			if( errno != EINTR) \
-				{ \
-				YY_FATAL_ERROR( "input in flex scanner failed" ); \
-				break; \
-				} \
-			errno=0; \
-			clearerr(yyin); \
-			} \
-		}\
-\
-
-#endif
-
-/* No semi-colon after return; correct usage is to write "yyterminate();" -
- * we don't want an extra ';' after the "return" because that will cause
- * some compilers to complain about unreachable statements.
- */
-#ifndef yyterminate
-#define yyterminate() return YY_NULL
-#endif
-
-/* Number of entries by which start-condition stack grows. */
-#ifndef YY_START_STACK_INCR
-#define YY_START_STACK_INCR 25
-#endif
-
-/* Report a fatal error. */
-#ifndef YY_FATAL_ERROR
-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner)
-#endif
-
-/* end tables serialization structures and prototypes */
-
-/* Default declaration of generated scanner - a define so the user can
- * easily add parameters.
- */
-#ifndef YY_DECL
-#define YY_DECL_IS_OURS 1
-
-extern int parse_events_lex \
-               (YYSTYPE * yylval_param ,yyscan_t yyscanner);
-
-#define YY_DECL int parse_events_lex \
-               (YYSTYPE * yylval_param , yyscan_t yyscanner)
-#endif /* !YY_DECL */
-
-/* Code executed at the beginning of each rule, after yytext and yyleng
- * have been set up.
- */
-#ifndef YY_USER_ACTION
-#define YY_USER_ACTION
-#endif
-
-/* Code executed at the end of each rule. */
-#ifndef YY_BREAK
-#define YY_BREAK break;
-#endif
-
-#define YY_RULE_SETUP \
-	YY_USER_ACTION
-
-/** The main scanner function which does all the work.
- */
-YY_DECL
-{
-	register yy_state_type yy_current_state;
-	register char *yy_cp, *yy_bp;
-	register int yy_act;
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
-#line 89 "util/parse-events.l"
-
-
-
-	{
-		int start_token;
-
-		start_token = parse_events_get_extra(yyscanner);
-
-		if (start_token == PE_START_TERMS)
-			BEGIN(config);
-		else if (start_token == PE_START_EVENTS)
-			BEGIN(event);
-
-		if (start_token) {
-			parse_events_set_extra(NULL, yyscanner);
-			return start_token;
-		}
-         }
-
-
-#line 1370 "<stdout>"
-
-    yylval = yylval_param;
-
-	if ( !yyg->yy_init )
-		{
-		yyg->yy_init = 1;
-
-#ifdef YY_USER_INIT
-		YY_USER_INIT;
-#endif
-
-		if ( ! yyg->yy_start )
-			yyg->yy_start = 1;	/* first start state */
-
-		if ( ! yyin )
-			yyin = stdin;
-
-		if ( ! yyout )
-			yyout = stdout;
-
-		if ( ! YY_CURRENT_BUFFER ) {
-			parse_events_ensure_buffer_stack (yyscanner);
-			YY_CURRENT_BUFFER_LVALUE =
-				parse_events__create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
-		}
-
-		parse_events__load_buffer_state(yyscanner );
-		}
-
-	while ( 1 )		/* loops until end-of-file is reached */
-		{
-		yy_cp = yyg->yy_c_buf_p;
-
-		/* Support of yytext. */
-		*yy_cp = yyg->yy_hold_char;
-
-		/* yy_bp points to the position in yy_ch_buf of the start of
-		 * the current run.
-		 */
-		yy_bp = yy_cp;
-
-		yy_current_state = yyg->yy_start;
-yy_match:
-		do
-			{
-			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
-			if ( yy_accept[yy_current_state] )
-				{
-				yyg->yy_last_accepting_state = yy_current_state;
-				yyg->yy_last_accepting_cpos = yy_cp;
-				}
-			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-				{
-				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 900 )
-					yy_c = yy_meta[(unsigned int) yy_c];
-				}
-			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-			++yy_cp;
-			}
-		while ( yy_base[yy_current_state] != 1305 );
-
-yy_find_action:
-		yy_act = yy_accept[yy_current_state];
-		if ( yy_act == 0 )
-			{ /* have to back up */
-			yy_cp = yyg->yy_last_accepting_cpos;
-			yy_current_state = yyg->yy_last_accepting_state;
-			yy_act = yy_accept[yy_current_state];
-			}
-
-		YY_DO_BEFORE_ACTION;
-
-do_action:	/* This label is used only to access EOF actions. */
-
-		switch ( yy_act )
-	{ /* beginning of action switch */
-			case 0: /* must back up */
-			/* undo the effects of YY_DO_BEFORE_ACTION */
-			*yy_cp = yyg->yy_hold_char;
-			yy_cp = yyg->yy_last_accepting_cpos;
-			yy_current_state = yyg->yy_last_accepting_state;
-			goto yy_find_action;
-
-case 1:
-/* rule 1 can match eol */
-YY_RULE_SETUP
-#line 111 "util/parse-events.l"
-{
-			BEGIN(INITIAL); yyless(0);
-		}
-	YY_BREAK
-case 2:
-/* rule 2 can match eol */
-#line 116 "util/parse-events.l"
-case 3:
-/* rule 3 can match eol */
-YY_RULE_SETUP
-#line 116 "util/parse-events.l"
-{
-			str(yyscanner, PE_EVENT_NAME);
-			BEGIN(INITIAL); yyless(0);
-			return PE_EVENT_NAME;
-		}
-	YY_BREAK
-case 4:
-#line 123 "util/parse-events.l"
-case YY_STATE_EOF(event):
-#line 123 "util/parse-events.l"
-{
-			BEGIN(INITIAL); yyless(0);
-		}
-	YY_BREAK
-
-case 5:
-YY_RULE_SETUP
-#line 129 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); }
-	YY_BREAK
-case 6:
-YY_RULE_SETUP
-#line 130 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }
-	YY_BREAK
-case 7:
-YY_RULE_SETUP
-#line 131 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); }
-	YY_BREAK
-case 8:
-YY_RULE_SETUP
-#line 132 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS); }
-	YY_BREAK
-case 9:
-YY_RULE_SETUP
-#line 133 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_REFERENCES); }
-	YY_BREAK
-case 10:
-YY_RULE_SETUP
-#line 134 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_MISSES); }
-	YY_BREAK
-case 11:
-YY_RULE_SETUP
-#line 135 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); }
-	YY_BREAK
-case 12:
-YY_RULE_SETUP
-#line 136 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_MISSES); }
-	YY_BREAK
-case 13:
-YY_RULE_SETUP
-#line 137 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BUS_CYCLES); }
-	YY_BREAK
-case 14:
-YY_RULE_SETUP
-#line 138 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_REF_CPU_CYCLES); }
-	YY_BREAK
-case 15:
-YY_RULE_SETUP
-#line 139 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK); }
-	YY_BREAK
-case 16:
-YY_RULE_SETUP
-#line 140 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_TASK_CLOCK); }
-	YY_BREAK
-case 17:
-YY_RULE_SETUP
-#line 141 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS); }
-	YY_BREAK
-case 18:
-YY_RULE_SETUP
-#line 142 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MIN); }
-	YY_BREAK
-case 19:
-YY_RULE_SETUP
-#line 143 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MAJ); }
-	YY_BREAK
-case 20:
-YY_RULE_SETUP
-#line 144 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES); }
-	YY_BREAK
-case 21:
-YY_RULE_SETUP
-#line 145 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS); }
-	YY_BREAK
-case 22:
-YY_RULE_SETUP
-#line 146 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); }
-	YY_BREAK
-case 23:
-YY_RULE_SETUP
-#line 147 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); }
-	YY_BREAK
-case 24:
-YY_RULE_SETUP
-#line 148 "util/parse-events.l"
-{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); }
-	YY_BREAK
-case 25:
-#line 151 "util/parse-events.l"
-case 26:
-#line 152 "util/parse-events.l"
-case 27:
-#line 153 "util/parse-events.l"
-case 28:
-#line 154 "util/parse-events.l"
-case 29:
-#line 155 "util/parse-events.l"
-case 30:
-#line 156 "util/parse-events.l"
-case 31:
-YY_RULE_SETUP
-#line 156 "util/parse-events.l"
-{ return str(yyscanner, PE_NAME_CACHE_TYPE); }
-	YY_BREAK
-case 32:
-#line 159 "util/parse-events.l"
-case 33:
-#line 160 "util/parse-events.l"
-case 34:
-#line 161 "util/parse-events.l"
-case 35:
-#line 162 "util/parse-events.l"
-case 36:
-#line 163 "util/parse-events.l"
-case 37:
-YY_RULE_SETUP
-#line 163 "util/parse-events.l"
-{ return str(yyscanner, PE_NAME_CACHE_OP_RESULT); }
-	YY_BREAK
-
-case 38:
-YY_RULE_SETUP
-#line 166 "util/parse-events.l"
-{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG); }
-	YY_BREAK
-case 39:
-YY_RULE_SETUP
-#line 167 "util/parse-events.l"
-{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG1); }
-	YY_BREAK
-case 40:
-YY_RULE_SETUP
-#line 168 "util/parse-events.l"
-{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG2); }
-	YY_BREAK
-case 41:
-YY_RULE_SETUP
-#line 169 "util/parse-events.l"
-{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NAME); }
-	YY_BREAK
-case 42:
-YY_RULE_SETUP
-#line 170 "util/parse-events.l"
-{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); }
-	YY_BREAK
-case 43:
-YY_RULE_SETUP
-#line 171 "util/parse-events.l"
-{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); }
-	YY_BREAK
-case 44:
-YY_RULE_SETUP
-#line 172 "util/parse-events.l"
-{ return ','; }
-	YY_BREAK
-case 45:
-YY_RULE_SETUP
-#line 173 "util/parse-events.l"
-{ BEGIN(INITIAL); return '/'; }
-	YY_BREAK
-case 46:
-YY_RULE_SETUP
-#line 174 "util/parse-events.l"
-{ return str(yyscanner, PE_NAME); }
-	YY_BREAK
-
-case 47:
-YY_RULE_SETUP
-#line 177 "util/parse-events.l"
-{ BEGIN(mem); return PE_PREFIX_MEM; }
-	YY_BREAK
-case 48:
-YY_RULE_SETUP
-#line 178 "util/parse-events.l"
-{ return raw(yyscanner); }
-	YY_BREAK
-case 49:
-YY_RULE_SETUP
-#line 179 "util/parse-events.l"
-{ return value(yyscanner, 10); }
-	YY_BREAK
-case 50:
-YY_RULE_SETUP
-#line 180 "util/parse-events.l"
-{ return value(yyscanner, 16); }
-	YY_BREAK
-case 51:
-YY_RULE_SETUP
-#line 182 "util/parse-events.l"
-{ return str(yyscanner, PE_MODIFIER_EVENT); }
-	YY_BREAK
-case 52:
-YY_RULE_SETUP
-#line 183 "util/parse-events.l"
-{ return str(yyscanner, PE_NAME); }
-	YY_BREAK
-case 53:
-YY_RULE_SETUP
-#line 184 "util/parse-events.l"
-{ BEGIN(config); return '/'; }
-	YY_BREAK
-case 54:
-YY_RULE_SETUP
-#line 185 "util/parse-events.l"
-{ return '-'; }
-	YY_BREAK
-case 55:
-YY_RULE_SETUP
-#line 186 "util/parse-events.l"
-{ BEGIN(event); return ','; }
-	YY_BREAK
-case 56:
-YY_RULE_SETUP
-#line 187 "util/parse-events.l"
-{ return ':'; }
-	YY_BREAK
-case 57:
-YY_RULE_SETUP
-#line 188 "util/parse-events.l"
-{ BEGIN(event); return '{'; }
-	YY_BREAK
-case 58:
-YY_RULE_SETUP
-#line 189 "util/parse-events.l"
-{ return '}'; }
-	YY_BREAK
-case 59:
-YY_RULE_SETUP
-#line 190 "util/parse-events.l"
-{ return '='; }
-	YY_BREAK
-case 60:
-/* rule 60 can match eol */
-YY_RULE_SETUP
-#line 191 "util/parse-events.l"
-{ }
-	YY_BREAK
-
-case 61:
-YY_RULE_SETUP
-#line 194 "util/parse-events.l"
-{ return str(yyscanner, PE_MODIFIER_BP); }
-	YY_BREAK
-case 62:
-YY_RULE_SETUP
-#line 195 "util/parse-events.l"
-{ return ':'; }
-	YY_BREAK
-case 63:
-YY_RULE_SETUP
-#line 196 "util/parse-events.l"
-{ return value(yyscanner, 10); }
-	YY_BREAK
-case 64:
-YY_RULE_SETUP
-#line 197 "util/parse-events.l"
-{ return value(yyscanner, 16); }
-	YY_BREAK
-/*
-	 * We need to separate 'mem:' scanner part, in order to get specific
-	 * modifier bits parsed out. Otherwise we would need to handle PE_NAME
-	 * and we'd need to parse it manually. During the escape from <mem>
-	 * state we need to put the escaping char back, so we dont miss it.
-	 */
-case 65:
-YY_RULE_SETUP
-#line 204 "util/parse-events.l"
-{ unput(*yytext); BEGIN(INITIAL); }
-	YY_BREAK
-/*
-	 * We destroy the scanner after reaching EOF,
-	 * but anyway just to be sure get back to INIT state.
-	 */
-case YY_STATE_EOF(mem):
-#line 209 "util/parse-events.l"
-{ BEGIN(INITIAL); }
-	YY_BREAK
-
-case 66:
-YY_RULE_SETUP
-#line 212 "util/parse-events.l"
-ECHO;
-	YY_BREAK
-#line 1781 "<stdout>"
-case YY_STATE_EOF(INITIAL):
-case YY_STATE_EOF(config):
-	yyterminate();
-
-	case YY_END_OF_BUFFER:
-		{
-		/* Amount of text matched not including the EOB char. */
-		int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1;
-
-		/* Undo the effects of YY_DO_BEFORE_ACTION. */
-		*yy_cp = yyg->yy_hold_char;
-		YY_RESTORE_YY_MORE_OFFSET
-
-		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
-			{
-			/* We're scanning a new file or input source.  It's
-			 * possible that this happened because the user
-			 * just pointed yyin at a new source and called
-			 * parse_events_lex().  If so, then we have to assure
-			 * consistency between YY_CURRENT_BUFFER and our
-			 * globals.  Here is the right place to do so, because
-			 * this is the first action (other than possibly a
-			 * back-up) that will match for the new input source.
-			 */
-			yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
-			YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
-			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
-			}
-
-		/* Note that here we test for yy_c_buf_p "<=" to the position
-		 * of the first EOB in the buffer, since yy_c_buf_p will
-		 * already have been incremented past the NUL character
-		 * (since all states make transitions on EOB to the
-		 * end-of-buffer state).  Contrast this with the test
-		 * in input().
-		 */
-		if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
-			{ /* This was really a NUL. */
-			yy_state_type yy_next_state;
-
-			yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text;
-
-			yy_current_state = yy_get_previous_state( yyscanner );
-
-			/* Okay, we're now positioned to make the NUL
-			 * transition.  We couldn't have
-			 * yy_get_previous_state() go ahead and do it
-			 * for us because it doesn't know how to deal
-			 * with the possibility of jamming (and we don't
-			 * want to build jamming into it because then it
-			 * will run more slowly).
-			 */
-
-			yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner);
-
-			yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
-
-			if ( yy_next_state )
-				{
-				/* Consume the NUL. */
-				yy_cp = ++yyg->yy_c_buf_p;
-				yy_current_state = yy_next_state;
-				goto yy_match;
-				}
-
-			else
-				{
-				yy_cp = yyg->yy_c_buf_p;
-				goto yy_find_action;
-				}
-			}
-
-		else switch ( yy_get_next_buffer( yyscanner ) )
-			{
-			case EOB_ACT_END_OF_FILE:
-				{
-				yyg->yy_did_buffer_switch_on_eof = 0;
-
-				if ( parse_events_wrap(yyscanner ) )
-					{
-					/* Note: because we've taken care in
-					 * yy_get_next_buffer() to have set up
-					 * yytext, we can now set up
-					 * yy_c_buf_p so that if some total
-					 * hoser (like flex itself) wants to
-					 * call the scanner after we return the
-					 * YY_NULL, it'll still work - another
-					 * YY_NULL will get returned.
-					 */
-					yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ;
-
-					yy_act = YY_STATE_EOF(YY_START);
-					goto do_action;
-					}
-
-				else
-					{
-					if ( ! yyg->yy_did_buffer_switch_on_eof )
-						YY_NEW_FILE;
-					}
-				break;
-				}
-
-			case EOB_ACT_CONTINUE_SCAN:
-				yyg->yy_c_buf_p =
-					yyg->yytext_ptr + yy_amount_of_matched_text;
-
-				yy_current_state = yy_get_previous_state( yyscanner );
-
-				yy_cp = yyg->yy_c_buf_p;
-				yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
-				goto yy_match;
-
-			case EOB_ACT_LAST_MATCH:
-				yyg->yy_c_buf_p =
-				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars];
-
-				yy_current_state = yy_get_previous_state( yyscanner );
-
-				yy_cp = yyg->yy_c_buf_p;
-				yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
-				goto yy_find_action;
-			}
-		break;
-		}
-
-	default:
-		YY_FATAL_ERROR(
-			"fatal flex scanner internal error--no action found" );
-	} /* end of action switch */
-		} /* end of scanning one token */
-} /* end of parse_events_lex */
-
-/* yy_get_next_buffer - try to read in a new buffer
- *
- * Returns a code representing an action:
- *	EOB_ACT_LAST_MATCH -
- *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
- *	EOB_ACT_END_OF_FILE - end of file
- */
-static int yy_get_next_buffer (yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
-	register char *source = yyg->yytext_ptr;
-	register int number_to_move, i;
-	int ret_val;
-
-	if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] )
-		YY_FATAL_ERROR(
-		"fatal flex scanner internal error--end of buffer missed" );
-
-	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
-		{ /* Don't try to fill the buffer, so this is an EOF. */
-		if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 )
-			{
-			/* We matched a single character, the EOB, so
-			 * treat this as a final EOF.
-			 */
-			return EOB_ACT_END_OF_FILE;
-			}
-
-		else
-			{
-			/* We matched some text prior to the EOB, first
-			 * process it.
-			 */
-			return EOB_ACT_LAST_MATCH;
-			}
-		}
-
-	/* Try to read more data. */
-
-	/* First move last chars to start of buffer. */
-	number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1;
-
-	for ( i = 0; i < number_to_move; ++i )
-		*(dest++) = *(source++);
-
-	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
-		/* don't do the read, it's not guaranteed to return an EOF,
-		 * just force an EOF
-		 */
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0;
-
-	else
-		{
-			int num_to_read =
-			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
-
-		while ( num_to_read <= 0 )
-			{ /* Not enough room in the buffer - grow it. */
-
-			/* just a shorter name for the current buffer */
-			YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
-
-			int yy_c_buf_p_offset =
-				(int) (yyg->yy_c_buf_p - b->yy_ch_buf);
-
-			if ( b->yy_is_our_buffer )
-				{
-				int new_size = b->yy_buf_size * 2;
-
-				if ( new_size <= 0 )
-					b->yy_buf_size += b->yy_buf_size / 8;
-				else
-					b->yy_buf_size *= 2;
-
-				b->yy_ch_buf = (char *)
-					/* Include room in for 2 EOB chars. */
-					parse_events_realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ,yyscanner );
-				}
-			else
-				/* Can't grow it, we don't own it. */
-				b->yy_ch_buf = 0;
-
-			if ( ! b->yy_ch_buf )
-				YY_FATAL_ERROR(
-				"fatal error - scanner input buffer overflow" );
-
-			yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
-
-			num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
-						number_to_move - 1;
-
-			}
-
-		if ( num_to_read > YY_READ_BUF_SIZE )
-			num_to_read = YY_READ_BUF_SIZE;
-
-		/* Read in more data. */
-		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
-			yyg->yy_n_chars, (size_t) num_to_read );
-
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
-		}
-
-	if ( yyg->yy_n_chars == 0 )
-		{
-		if ( number_to_move == YY_MORE_ADJ )
-			{
-			ret_val = EOB_ACT_END_OF_FILE;
-			parse_events_restart(yyin  ,yyscanner);
-			}
-
-		else
-			{
-			ret_val = EOB_ACT_LAST_MATCH;
-			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
-				YY_BUFFER_EOF_PENDING;
-			}
-		}
-
-	else
-		ret_val = EOB_ACT_CONTINUE_SCAN;
-
-	if ((yy_size_t) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
-		/* Extend the array by 50%, plus the number we really need. */
-		yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
-		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) parse_events_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner );
-		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
-			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
-	}
-
-	yyg->yy_n_chars += number_to_move;
-	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR;
-	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
-
-	yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
-
-	return ret_val;
-}
-
-/* yy_get_previous_state - get the state just before the EOB char was reached */
-
-    static yy_state_type yy_get_previous_state (yyscan_t yyscanner)
-{
-	register yy_state_type yy_current_state;
-	register char *yy_cp;
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
-	yy_current_state = yyg->yy_start;
-
-	for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp )
-		{
-		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
-		if ( yy_accept[yy_current_state] )
-			{
-			yyg->yy_last_accepting_state = yy_current_state;
-			yyg->yy_last_accepting_cpos = yy_cp;
-			}
-		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-			{
-			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 900 )
-				yy_c = yy_meta[(unsigned int) yy_c];
-			}
-		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-		}
-
-	return yy_current_state;
-}
-
-/* yy_try_NUL_trans - try to make a transition on the NUL character
- *
- * synopsis
- *	next_state = yy_try_NUL_trans( current_state );
- */
-    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state , yyscan_t yyscanner)
-{
-	register int yy_is_jam;
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */
-	register char *yy_cp = yyg->yy_c_buf_p;
-
-	register YY_CHAR yy_c = 1;
-	if ( yy_accept[yy_current_state] )
-		{
-		yyg->yy_last_accepting_state = yy_current_state;
-		yyg->yy_last_accepting_cpos = yy_cp;
-		}
-	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-		{
-		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 900 )
-			yy_c = yy_meta[(unsigned int) yy_c];
-		}
-	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-	yy_is_jam = (yy_current_state == 899);
-
-	return yy_is_jam ? 0 : yy_current_state;
-}
-
-    static void yyunput (int c, register char * yy_bp , yyscan_t yyscanner)
-{
-	register char *yy_cp;
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
-    yy_cp = yyg->yy_c_buf_p;
-
-	/* undo effects of setting up yytext */
-	*yy_cp = yyg->yy_hold_char;
-
-	if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
-		{ /* need to shift things up to make room */
-		/* +2 for EOB chars. */
-		register int number_to_move = yyg->yy_n_chars + 2;
-		register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
-					YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
-		register char *source =
-				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
-
-		while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
-			*--dest = *--source;
-
-		yy_cp += (int) (dest - source);
-		yy_bp += (int) (dest - source);
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
-			yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
-
-		if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
-			YY_FATAL_ERROR( "flex scanner push-back overflow" );
-		}
-
-	*--yy_cp = (char) c;
-
-	yyg->yytext_ptr = yy_bp;
-	yyg->yy_hold_char = *yy_cp;
-	yyg->yy_c_buf_p = yy_cp;
-}
-
-#ifndef YY_NO_INPUT
-#ifdef __cplusplus
-    static int yyinput (yyscan_t yyscanner)
-#else
-    static int input  (yyscan_t yyscanner)
-#endif
-
-{
-	int c;
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
-	*yyg->yy_c_buf_p = yyg->yy_hold_char;
-
-	if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
-		{
-		/* yy_c_buf_p now points to the character we want to return.
-		 * If this occurs *before* the EOB characters, then it's a
-		 * valid NUL; if not, then we've hit the end of the buffer.
-		 */
-		if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
-			/* This was really a NUL. */
-			*yyg->yy_c_buf_p = '\0';
-
-		else
-			{ /* need more input */
-			int offset = yyg->yy_c_buf_p - yyg->yytext_ptr;
-			++yyg->yy_c_buf_p;
-
-			switch ( yy_get_next_buffer( yyscanner ) )
-				{
-				case EOB_ACT_LAST_MATCH:
-					/* This happens because yy_g_n_b()
-					 * sees that we've accumulated a
-					 * token and flags that we need to
-					 * try matching the token before
-					 * proceeding.  But for input(),
-					 * there's no matching to consider.
-					 * So convert the EOB_ACT_LAST_MATCH
-					 * to EOB_ACT_END_OF_FILE.
-					 */
-
-					/* Reset buffer status. */
-					parse_events_restart(yyin ,yyscanner);
-
-					/*FALLTHROUGH*/
-
-				case EOB_ACT_END_OF_FILE:
-					{
-					if ( parse_events_wrap(yyscanner ) )
-						return EOF;
-
-					if ( ! yyg->yy_did_buffer_switch_on_eof )
-						YY_NEW_FILE;
-#ifdef __cplusplus
-					return yyinput(yyscanner);
-#else
-					return input(yyscanner);
-#endif
-					}
-
-				case EOB_ACT_CONTINUE_SCAN:
-					yyg->yy_c_buf_p = yyg->yytext_ptr + offset;
-					break;
-				}
-			}
-		}
-
-	c = *(unsigned char *) yyg->yy_c_buf_p;	/* cast for 8-bit char's */
-	*yyg->yy_c_buf_p = '\0';	/* preserve yytext */
-	yyg->yy_hold_char = *++yyg->yy_c_buf_p;
-
-	return c;
-}
-#endif	/* ifndef YY_NO_INPUT */
-
-/** Immediately switch to a different input stream.
- * @param input_file A readable stream.
- * @param yyscanner The scanner object.
- * @note This function does not reset the start condition to @c INITIAL .
- */
-    void parse_events_restart  (FILE * input_file , yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
-	if ( ! YY_CURRENT_BUFFER ){
-        parse_events_ensure_buffer_stack (yyscanner);
-		YY_CURRENT_BUFFER_LVALUE =
-            parse_events__create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
-	}
-
-	parse_events__init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner);
-	parse_events__load_buffer_state(yyscanner );
-}
-
-/** Switch to a different input buffer.
- * @param new_buffer The new input buffer.
- * @param yyscanner The scanner object.
- */
-    void parse_events__switch_to_buffer  (YY_BUFFER_STATE  new_buffer , yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
-	/* TODO. We should be able to replace this entire function body
-	 * with
-	 *		parse_events_pop_buffer_state();
-	 *		parse_events_push_buffer_state(new_buffer);
-     */
-	parse_events_ensure_buffer_stack (yyscanner);
-	if ( YY_CURRENT_BUFFER == new_buffer )
-		return;
-
-	if ( YY_CURRENT_BUFFER )
-		{
-		/* Flush out information for old buffer. */
-		*yyg->yy_c_buf_p = yyg->yy_hold_char;
-		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
-		}
-
-	YY_CURRENT_BUFFER_LVALUE = new_buffer;
-	parse_events__load_buffer_state(yyscanner );
-
-	/* We don't actually know whether we did this switch during
-	 * EOF (parse_events_wrap()) processing, but the only time this flag
-	 * is looked at is after parse_events_wrap() is called, so it's safe
-	 * to go ahead and always set it.
-	 */
-	yyg->yy_did_buffer_switch_on_eof = 1;
-}
-
-static void parse_events__load_buffer_state  (yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-	yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
-	yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
-	yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
-	yyg->yy_hold_char = *yyg->yy_c_buf_p;
-}
-
-/** Allocate and initialize an input buffer state.
- * @param file A readable stream.
- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
- * @param yyscanner The scanner object.
- * @return the allocated buffer state.
- */
-    YY_BUFFER_STATE parse_events__create_buffer  (FILE * file, int  size , yyscan_t yyscanner)
-{
-	YY_BUFFER_STATE b;
-    
-	b = (YY_BUFFER_STATE) parse_events_alloc(sizeof( struct yy_buffer_state ) ,yyscanner );
-	if ( ! b )
-		YY_FATAL_ERROR( "out of dynamic memory in parse_events__create_buffer()" );
-
-	b->yy_buf_size = size;
-
-	/* yy_ch_buf has to be 2 characters longer than the size given because
-	 * we need to put in 2 end-of-buffer characters.
-	 */
-	b->yy_ch_buf = (char *) parse_events_alloc(b->yy_buf_size + 2 ,yyscanner );
-	if ( ! b->yy_ch_buf )
-		YY_FATAL_ERROR( "out of dynamic memory in parse_events__create_buffer()" );
-
-	b->yy_is_our_buffer = 1;
-
-	parse_events__init_buffer(b,file ,yyscanner);
-
-	return b;
-}
-
-/** Destroy the buffer.
- * @param b a buffer created with parse_events__create_buffer()
- * @param yyscanner The scanner object.
- */
-    void parse_events__delete_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
-	if ( ! b )
-		return;
-
-	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
-		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
-
-	if ( b->yy_is_our_buffer )
-		parse_events_free((void *) b->yy_ch_buf ,yyscanner );
-
-	parse_events_free((void *) b ,yyscanner );
-}
-
-#ifndef __cplusplus
-extern int isatty (int );
-#endif /* __cplusplus */
-    
-/* Initializes or reinitializes a buffer.
- * This function is sometimes called more than once on the same buffer,
- * such as during a parse_events_restart() or at EOF.
- */
-    static void parse_events__init_buffer  (YY_BUFFER_STATE  b, FILE * file , yyscan_t yyscanner)
-
-{
-	int oerrno = errno;
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
-	parse_events__flush_buffer(b ,yyscanner);
-
-	b->yy_input_file = file;
-	b->yy_fill_buffer = 1;
-
-    /* If b is the current buffer, then parse_events__init_buffer was _probably_
-     * called from parse_events_restart() or through yy_get_next_buffer.
-     * In that case, we don't want to reset the lineno or column.
-     */
-    if (b != YY_CURRENT_BUFFER){
-        b->yy_bs_lineno = 1;
-        b->yy_bs_column = 0;
-    }
-
-        b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-    
-	errno = oerrno;
-}
-
-/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
- * @param yyscanner The scanner object.
- */
-    void parse_events__flush_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-	if ( ! b )
-		return;
-
-	b->yy_n_chars = 0;
-
-	/* We always need two end-of-buffer characters.  The first causes
-	 * a transition to the end-of-buffer state.  The second causes
-	 * a jam in that state.
-	 */
-	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
-	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
-
-	b->yy_buf_pos = &b->yy_ch_buf[0];
-
-	b->yy_at_bol = 1;
-	b->yy_buffer_status = YY_BUFFER_NEW;
-
-	if ( b == YY_CURRENT_BUFFER )
-		parse_events__load_buffer_state(yyscanner );
-}
-
-/** Pushes the new state onto the stack. The new state becomes
- *  the current state. This function will allocate the stack
- *  if necessary.
- *  @param new_buffer The new state.
- *  @param yyscanner The scanner object.
- */
-void parse_events_push_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-	if (new_buffer == NULL)
-		return;
-
-	parse_events_ensure_buffer_stack(yyscanner);
-
-	/* This block is copied from parse_events__switch_to_buffer. */
-	if ( YY_CURRENT_BUFFER )
-		{
-		/* Flush out information for old buffer. */
-		*yyg->yy_c_buf_p = yyg->yy_hold_char;
-		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
-		}
-
-	/* Only push if top exists. Otherwise, replace top. */
-	if (YY_CURRENT_BUFFER)
-		yyg->yy_buffer_stack_top++;
-	YY_CURRENT_BUFFER_LVALUE = new_buffer;
-
-	/* copied from parse_events__switch_to_buffer. */
-	parse_events__load_buffer_state(yyscanner );
-	yyg->yy_did_buffer_switch_on_eof = 1;
-}
-
-/** Removes and deletes the top of the stack, if present.
- *  The next element becomes the new top.
- *  @param yyscanner The scanner object.
- */
-void parse_events_pop_buffer_state (yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-	if (!YY_CURRENT_BUFFER)
-		return;
-
-	parse_events__delete_buffer(YY_CURRENT_BUFFER ,yyscanner);
-	YY_CURRENT_BUFFER_LVALUE = NULL;
-	if (yyg->yy_buffer_stack_top > 0)
-		--yyg->yy_buffer_stack_top;
-
-	if (YY_CURRENT_BUFFER) {
-		parse_events__load_buffer_state(yyscanner );
-		yyg->yy_did_buffer_switch_on_eof = 1;
-	}
-}
-
-/* Allocates the stack if it does not exist.
- *  Guarantees space for at least one push.
- */
-static void parse_events_ensure_buffer_stack (yyscan_t yyscanner)
-{
-	int num_to_alloc;
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
-	if (!yyg->yy_buffer_stack) {
-
-		/* First allocation is just for 2 elements, since we don't know if this
-		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
-		 * immediate realloc on the next call.
-         */
-		num_to_alloc = 1;
-		yyg->yy_buffer_stack = (struct yy_buffer_state**)parse_events_alloc
-								(num_to_alloc * sizeof(struct yy_buffer_state*)
-								, yyscanner);
-		if ( ! yyg->yy_buffer_stack )
-			YY_FATAL_ERROR( "out of dynamic memory in parse_events_ensure_buffer_stack()" );
-								  
-		memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
-				
-		yyg->yy_buffer_stack_max = num_to_alloc;
-		yyg->yy_buffer_stack_top = 0;
-		return;
-	}
-
-	if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){
-
-		/* Increase the buffer to prepare for a possible push. */
-		int grow_size = 8 /* arbitrary grow size */;
-
-		num_to_alloc = yyg->yy_buffer_stack_max + grow_size;
-		yyg->yy_buffer_stack = (struct yy_buffer_state**)parse_events_realloc
-								(yyg->yy_buffer_stack,
-								num_to_alloc * sizeof(struct yy_buffer_state*)
-								, yyscanner);
-		if ( ! yyg->yy_buffer_stack )
-			YY_FATAL_ERROR( "out of dynamic memory in parse_events_ensure_buffer_stack()" );
-
-		/* zero only the new slots.*/
-		memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*));
-		yyg->yy_buffer_stack_max = num_to_alloc;
-	}
-}
-
-/** Setup the input buffer state to scan directly from a user-specified character buffer.
- * @param base the character buffer
- * @param size the size in bytes of the character buffer
- * @param yyscanner The scanner object.
- * @return the newly allocated buffer state object. 
- */
-YY_BUFFER_STATE parse_events__scan_buffer  (char * base, yy_size_t  size , yyscan_t yyscanner)
-{
-	YY_BUFFER_STATE b;
-    
-	if ( size < 2 ||
-	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
-	     base[size-1] != YY_END_OF_BUFFER_CHAR )
-		/* They forgot to leave room for the EOB's. */
-		return 0;
-
-	b = (YY_BUFFER_STATE) parse_events_alloc(sizeof( struct yy_buffer_state ) ,yyscanner );
-	if ( ! b )
-		YY_FATAL_ERROR( "out of dynamic memory in parse_events__scan_buffer()" );
-
-	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
-	b->yy_buf_pos = b->yy_ch_buf = base;
-	b->yy_is_our_buffer = 0;
-	b->yy_input_file = 0;
-	b->yy_n_chars = b->yy_buf_size;
-	b->yy_is_interactive = 0;
-	b->yy_at_bol = 1;
-	b->yy_fill_buffer = 0;
-	b->yy_buffer_status = YY_BUFFER_NEW;
-
-	parse_events__switch_to_buffer(b ,yyscanner );
-
-	return b;
-}
-
-/** Setup the input buffer state to scan a string. The next call to parse_events_lex() will
- * scan from a @e copy of @a str.
- * @param yystr a NUL-terminated string to scan
- * @param yyscanner The scanner object.
- * @return the newly allocated buffer state object.
- * @note If you want to scan bytes that may contain NUL values, then use
- *       parse_events__scan_bytes() instead.
- */
-YY_BUFFER_STATE parse_events__scan_string (yyconst char * yystr , yyscan_t yyscanner)
-{
-    
-	return parse_events__scan_bytes(yystr,strlen(yystr) ,yyscanner);
-}
-
-/** Setup the input buffer state to scan the given bytes. The next call to parse_events_lex() will
- * scan from a @e copy of @a bytes.
- * @param yybytes the byte buffer to scan
- * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
- * @param yyscanner The scanner object.
- * @return the newly allocated buffer state object.
- */
-YY_BUFFER_STATE parse_events__scan_bytes  (yyconst char * yybytes, int  _yybytes_len , yyscan_t yyscanner)
-{
-	YY_BUFFER_STATE b;
-	char *buf;
-	yy_size_t n;
-	int i;
-    
-	/* Get memory for full buffer, including space for trailing EOB's. */
-	n = _yybytes_len + 2;
-	buf = (char *) parse_events_alloc(n ,yyscanner );
-	if ( ! buf )
-		YY_FATAL_ERROR( "out of dynamic memory in parse_events__scan_bytes()" );
-
-	for ( i = 0; i < _yybytes_len; ++i )
-		buf[i] = yybytes[i];
-
-	buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
-
-	b = parse_events__scan_buffer(buf,n ,yyscanner);
-	if ( ! b )
-		YY_FATAL_ERROR( "bad buffer in parse_events__scan_bytes()" );
-
-	/* It's okay to grow etc. this buffer, and we should throw it
-	 * away when we're done.
-	 */
-	b->yy_is_our_buffer = 1;
-
-	return b;
-}
-
-    static void yy_push_state (int  new_state , yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-	if ( yyg->yy_start_stack_ptr >= yyg->yy_start_stack_depth )
-		{
-		yy_size_t new_size;
-
-		yyg->yy_start_stack_depth += YY_START_STACK_INCR;
-		new_size = yyg->yy_start_stack_depth * sizeof( int );
-
-		if ( ! yyg->yy_start_stack )
-			yyg->yy_start_stack = (int *) parse_events_alloc(new_size ,yyscanner );
-
-		else
-			yyg->yy_start_stack = (int *) parse_events_realloc((void *) yyg->yy_start_stack,new_size ,yyscanner );
-
-		if ( ! yyg->yy_start_stack )
-			YY_FATAL_ERROR( "out of memory expanding start-condition stack" );
-		}
-
-	yyg->yy_start_stack[yyg->yy_start_stack_ptr++] = YY_START;
-
-	BEGIN(new_state);
-}
-
-    static void yy_pop_state  (yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-	if ( --yyg->yy_start_stack_ptr < 0 )
-		YY_FATAL_ERROR( "start-condition stack underflow" );
-
-	BEGIN(yyg->yy_start_stack[yyg->yy_start_stack_ptr]);
-}
-
-    static int yy_top_state  (yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-	return yyg->yy_start_stack[yyg->yy_start_stack_ptr - 1];
-}
-
-#ifndef YY_EXIT_FAILURE
-#define YY_EXIT_FAILURE 2
-#endif
-
-static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner)
-{
-    	(void) fprintf( stderr, "%s\n", msg );
-	exit( YY_EXIT_FAILURE );
-}
-
-/* Redefine yyless() so it works in section 3 code. */
-
-#undef yyless
-#define yyless(n) \
-	do \
-		{ \
-		/* Undo effects of setting up yytext. */ \
-        int yyless_macro_arg = (n); \
-        YY_LESS_LINENO(yyless_macro_arg);\
-		yytext[yyleng] = yyg->yy_hold_char; \
-		yyg->yy_c_buf_p = yytext + yyless_macro_arg; \
-		yyg->yy_hold_char = *yyg->yy_c_buf_p; \
-		*yyg->yy_c_buf_p = '\0'; \
-		yyleng = yyless_macro_arg; \
-		} \
-	while ( 0 )
-
-/* Accessor  methods (get/set functions) to struct members. */
-
-/** Get the user-defined data for this scanner.
- * @param yyscanner The scanner object.
- */
-YY_EXTRA_TYPE parse_events_get_extra  (yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-    return yyextra;
-}
-
-/** Get the current line number.
- * @param yyscanner The scanner object.
- */
-int parse_events_get_lineno  (yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-    
-        if (! YY_CURRENT_BUFFER)
-            return 0;
-    
-    return yylineno;
-}
-
-/** Get the current column number.
- * @param yyscanner The scanner object.
- */
-int parse_events_get_column  (yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-    
-        if (! YY_CURRENT_BUFFER)
-            return 0;
-    
-    return yycolumn;
-}
-
-/** Get the input stream.
- * @param yyscanner The scanner object.
- */
-FILE *parse_events_get_in  (yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-    return yyin;
-}
-
-/** Get the output stream.
- * @param yyscanner The scanner object.
- */
-FILE *parse_events_get_out  (yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-    return yyout;
-}
-
-/** Get the length of the current token.
- * @param yyscanner The scanner object.
- */
-int parse_events_get_leng  (yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-    return yyleng;
-}
-
-/** Get the current token.
- * @param yyscanner The scanner object.
- */
-
-char *parse_events_get_text  (yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-    return yytext;
-}
-
-/** Set the user-defined data. This data is never touched by the scanner.
- * @param user_defined The data to be associated with this scanner.
- * @param yyscanner The scanner object.
- */
-void parse_events_set_extra (YY_EXTRA_TYPE  user_defined , yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-    yyextra = user_defined ;
-}
-
-/** Set the current line number.
- * @param line_number
- * @param yyscanner The scanner object.
- */
-void parse_events_set_lineno (int  line_number , yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
-        /* lineno is only valid if an input buffer exists. */
-        if (! YY_CURRENT_BUFFER )
-           yy_fatal_error( "parse_events_set_lineno called with no buffer" , yyscanner); 
-    
-    yylineno = line_number;
-}
-
-/** Set the current column.
- * @param line_number
- * @param yyscanner The scanner object.
- */
-void parse_events_set_column (int  column_no , yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
-        /* column is only valid if an input buffer exists. */
-        if (! YY_CURRENT_BUFFER )
-           yy_fatal_error( "parse_events_set_column called with no buffer" , yyscanner); 
-    
-    yycolumn = column_no;
-}
-
-/** Set the input stream. This does not discard the current
- * input buffer.
- * @param in_str A readable stream.
- * @param yyscanner The scanner object.
- * @see parse_events__switch_to_buffer
- */
-void parse_events_set_in (FILE *  in_str , yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-    yyin = in_str ;
-}
-
-void parse_events_set_out (FILE *  out_str , yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-    yyout = out_str ;
-}
-
-int parse_events_get_debug  (yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-    return yy_flex_debug;
-}
-
-void parse_events_set_debug (int  bdebug , yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-    yy_flex_debug = bdebug ;
-}
-
-/* Accessor methods for yylval and yylloc */
-
-YYSTYPE * parse_events_get_lval  (yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-    return yylval;
-}
-
-void parse_events_set_lval (YYSTYPE *  yylval_param , yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-    yylval = yylval_param;
-}
-
-/* User-visible API */
-
-/* parse_events_lex_init is special because it creates the scanner itself, so it is
- * the ONLY reentrant function that doesn't take the scanner as the last argument.
- * That's why we explicitly handle the declaration, instead of using our macros.
- */
-
-int parse_events_lex_init(yyscan_t* ptr_yy_globals)
-
-{
-    if (ptr_yy_globals == NULL){
-        errno = EINVAL;
-        return 1;
-    }
-
-    *ptr_yy_globals = (yyscan_t) parse_events_alloc ( sizeof( struct yyguts_t ), NULL );
-
-    if (*ptr_yy_globals == NULL){
-        errno = ENOMEM;
-        return 1;
-    }
-
-    /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */
-    memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
-
-    return yy_init_globals ( *ptr_yy_globals );
-}
-
-/* parse_events_lex_init_extra has the same functionality as parse_events_lex_init, but follows the
- * convention of taking the scanner as the last argument. Note however, that
- * this is a *pointer* to a scanner, as it will be allocated by this call (and
- * is the reason, too, why this function also must handle its own declaration).
- * The user defined value in the first argument will be available to parse_events_alloc in
- * the yyextra field.
- */
-
-int parse_events_lex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals )
-
-{
-    struct yyguts_t dummy_yyguts;
-
-    parse_events_set_extra (yy_user_defined, &dummy_yyguts);
-
-    if (ptr_yy_globals == NULL){
-        errno = EINVAL;
-        return 1;
-    }
-	
-    *ptr_yy_globals = (yyscan_t) parse_events_alloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
-	
-    if (*ptr_yy_globals == NULL){
-        errno = ENOMEM;
-        return 1;
-    }
-    
-    /* By setting to 0xAA, we expose bugs in
-    yy_init_globals. Leave at 0x00 for releases. */
-    memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
-    
-    parse_events_set_extra (yy_user_defined, *ptr_yy_globals);
-    
-    return yy_init_globals ( *ptr_yy_globals );
-}
-
-static int yy_init_globals (yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-    /* Initialization is the same as for the non-reentrant scanner.
-     * This function is called from parse_events_lex_destroy(), so don't allocate here.
-     */
-
-    yyg->yy_buffer_stack = 0;
-    yyg->yy_buffer_stack_top = 0;
-    yyg->yy_buffer_stack_max = 0;
-    yyg->yy_c_buf_p = (char *) 0;
-    yyg->yy_init = 0;
-    yyg->yy_start = 0;
-
-    yyg->yy_start_stack_ptr = 0;
-    yyg->yy_start_stack_depth = 0;
-    yyg->yy_start_stack =  NULL;
-
-/* Defined in main.c */
-#ifdef YY_STDINIT
-    yyin = stdin;
-    yyout = stdout;
-#else
-    yyin = (FILE *) 0;
-    yyout = (FILE *) 0;
-#endif
-
-    /* For future reference: Set errno on error, since we are called by
-     * parse_events_lex_init()
-     */
-    return 0;
-}
-
-/* parse_events_lex_destroy is for both reentrant and non-reentrant scanners. */
-int parse_events_lex_destroy  (yyscan_t yyscanner)
-{
-    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
-    /* Pop the buffer stack, destroying each element. */
-	while(YY_CURRENT_BUFFER){
-		parse_events__delete_buffer(YY_CURRENT_BUFFER ,yyscanner );
-		YY_CURRENT_BUFFER_LVALUE = NULL;
-		parse_events_pop_buffer_state(yyscanner);
-	}
-
-	/* Destroy the stack itself. */
-	parse_events_free(yyg->yy_buffer_stack ,yyscanner);
-	yyg->yy_buffer_stack = NULL;
-
-    /* Destroy the start condition stack. */
-        parse_events_free(yyg->yy_start_stack ,yyscanner );
-        yyg->yy_start_stack = NULL;
-
-    /* Reset the globals. This is important in a non-reentrant scanner so the next time
-     * parse_events_lex() is called, initialization will occur. */
-    yy_init_globals( yyscanner);
-
-    /* Destroy the main struct (reentrant only). */
-    parse_events_free ( yyscanner , yyscanner );
-    yyscanner = NULL;
-    return 0;
-}
-
-/*
- * Internal utility routines.
- */
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner)
-{
-	register int i;
-	for ( i = 0; i < n; ++i )
-		s1[i] = s2[i];
-}
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner)
-{
-	register int n;
-	for ( n = 0; s[n]; ++n )
-		;
-
-	return n;
-}
-#endif
-
-void *parse_events_alloc (yy_size_t  size , yyscan_t yyscanner)
-{
-	return (void *) malloc( size );
-}
-
-void *parse_events_realloc  (void * ptr, yy_size_t  size , yyscan_t yyscanner)
-{
-	/* The cast to (char *) in the following accommodates both
-	 * implementations that use char* generic pointers, and those
-	 * that use void* generic pointers.  It works with the latter
-	 * because both ANSI C and C++ allow castless assignment from
-	 * any pointer type to void*, and deal with argument conversions
-	 * as though doing an assignment.
-	 */
-	return (void *) realloc( (char *) ptr, size );
-}
-
-void parse_events_free (void * ptr , yyscan_t yyscanner)
-{
-	free( (char *) ptr );	/* see parse_events_realloc() for (char *) cast */
-}
-
-#define YYTABLES_NAME "yytables"
-
-#line 212 "util/parse-events.l"
-
-
-
-int parse_events_wrap(void *scanner __maybe_unused)
-{
-	return 1;
-}
-
diff --git a/src/tools/perf/util/parse-events-flex.h b/src/tools/perf/util/parse-events-flex.h
deleted file mode 100644
index a8d2a36..0000000
--- a/src/tools/perf/util/parse-events-flex.h
+++ /dev/null
@@ -1,353 +0,0 @@
-#ifndef parse_events_HEADER_H
-#define parse_events_HEADER_H 1
-#define parse_events_IN_HEADER 1
-
-#line 6 "util/parse-events-flex.h"
-
-#define  YY_INT_ALIGNED short int
-
-/* A lexical scanner generated by flex */
-
-#define FLEX_SCANNER
-#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 35
-#if YY_FLEX_SUBMINOR_VERSION > 0
-#define FLEX_BETA
-#endif
-
-/* First, we deal with  platform-specific or compiler-specific issues. */
-
-/* begin standard C headers. */
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <stdlib.h>
-
-/* end standard C headers. */
-
-/* flex integer type definitions */
-
-#ifndef FLEXINT_H
-#define FLEXINT_H
-
-/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
-
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-
-/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
- * if you want the limit (max/min) macros for int types. 
- */
-#ifndef __STDC_LIMIT_MACROS
-#define __STDC_LIMIT_MACROS 1
-#endif
-
-#include <inttypes.h>
-typedef int8_t flex_int8_t;
-typedef uint8_t flex_uint8_t;
-typedef int16_t flex_int16_t;
-typedef uint16_t flex_uint16_t;
-typedef int32_t flex_int32_t;
-typedef uint32_t flex_uint32_t;
-#else
-typedef signed char flex_int8_t;
-typedef short int flex_int16_t;
-typedef int flex_int32_t;
-typedef unsigned char flex_uint8_t; 
-typedef unsigned short int flex_uint16_t;
-typedef unsigned int flex_uint32_t;
-
-/* Limits of integral types. */
-#ifndef INT8_MIN
-#define INT8_MIN               (-128)
-#endif
-#ifndef INT16_MIN
-#define INT16_MIN              (-32767-1)
-#endif
-#ifndef INT32_MIN
-#define INT32_MIN              (-2147483647-1)
-#endif
-#ifndef INT8_MAX
-#define INT8_MAX               (127)
-#endif
-#ifndef INT16_MAX
-#define INT16_MAX              (32767)
-#endif
-#ifndef INT32_MAX
-#define INT32_MAX              (2147483647)
-#endif
-#ifndef UINT8_MAX
-#define UINT8_MAX              (255U)
-#endif
-#ifndef UINT16_MAX
-#define UINT16_MAX             (65535U)
-#endif
-#ifndef UINT32_MAX
-#define UINT32_MAX             (4294967295U)
-#endif
-
-#endif /* ! C99 */
-
-#endif /* ! FLEXINT_H */
-
-#ifdef __cplusplus
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else	/* ! __cplusplus */
-
-/* C99 requires __STDC__ to be defined as 1. */
-#if defined (__STDC__)
-
-#define YY_USE_CONST
-
-#endif	/* defined (__STDC__) */
-#endif	/* ! __cplusplus */
-
-#ifdef YY_USE_CONST
-#define yyconst const
-#else
-#define yyconst
-#endif
-
-/* An opaque pointer. */
-#ifndef YY_TYPEDEF_YY_SCANNER_T
-#define YY_TYPEDEF_YY_SCANNER_T
-typedef void* yyscan_t;
-#endif
-
-/* For convenience, these vars (plus the bison vars far below)
-   are macros in the reentrant scanner. */
-#define yyin yyg->yyin_r
-#define yyout yyg->yyout_r
-#define yyextra yyg->yyextra_r
-#define yyleng yyg->yyleng_r
-#define yytext yyg->yytext_r
-#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)
-#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)
-#define yy_flex_debug yyg->yy_flex_debug_r
-
-/* Size of default input buffer. */
-#ifndef YY_BUF_SIZE
-#ifdef __ia64__
-/* On IA-64, the buffer size is 16k, not 8k.
- * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
- * Ditto for the __ia64__ case accordingly.
- */
-#define YY_BUF_SIZE 32768
-#else
-#define YY_BUF_SIZE 16384
-#endif /* __ia64__ */
-#endif
-
-#ifndef YY_TYPEDEF_YY_BUFFER_STATE
-#define YY_TYPEDEF_YY_BUFFER_STATE
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-#endif
-
-#ifndef YY_TYPEDEF_YY_SIZE_T
-#define YY_TYPEDEF_YY_SIZE_T
-typedef size_t yy_size_t;
-#endif
-
-#ifndef YY_STRUCT_YY_BUFFER_STATE
-#define YY_STRUCT_YY_BUFFER_STATE
-struct yy_buffer_state
-	{
-	FILE *yy_input_file;
-
-	char *yy_ch_buf;		/* input buffer */
-	char *yy_buf_pos;		/* current position in input buffer */
-
-	/* Size of input buffer in bytes, not including room for EOB
-	 * characters.
-	 */
-	yy_size_t yy_buf_size;
-
-	/* Number of characters read into yy_ch_buf, not including EOB
-	 * characters.
-	 */
-	int yy_n_chars;
-
-	/* Whether we "own" the buffer - i.e., we know we created it,
-	 * and can realloc() it to grow it, and should free() it to
-	 * delete it.
-	 */
-	int yy_is_our_buffer;
-
-	/* Whether this is an "interactive" input source; if so, and
-	 * if we're using stdio for input, then we want to use getc()
-	 * instead of fread(), to make sure we stop fetching input after
-	 * each newline.
-	 */
-	int yy_is_interactive;
-
-	/* Whether we're considered to be at the beginning of a line.
-	 * If so, '^' rules will be active on the next match, otherwise
-	 * not.
-	 */
-	int yy_at_bol;
-
-    int yy_bs_lineno; /**< The line count. */
-    int yy_bs_column; /**< The column count. */
-    
-	/* Whether to try to fill the input buffer when we reach the
-	 * end of it.
-	 */
-	int yy_fill_buffer;
-
-	int yy_buffer_status;
-
-	};
-#endif /* !YY_STRUCT_YY_BUFFER_STATE */
-
-void parse_events_restart (FILE *input_file ,yyscan_t yyscanner );
-void parse_events__switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
-YY_BUFFER_STATE parse_events__create_buffer (FILE *file,int size ,yyscan_t yyscanner );
-void parse_events__delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
-void parse_events__flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
-void parse_events_push_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
-void parse_events_pop_buffer_state (yyscan_t yyscanner );
-
-YY_BUFFER_STATE parse_events__scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );
-YY_BUFFER_STATE parse_events__scan_string (yyconst char *yy_str ,yyscan_t yyscanner );
-YY_BUFFER_STATE parse_events__scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner );
-
-void *parse_events_alloc (yy_size_t ,yyscan_t yyscanner );
-void *parse_events_realloc (void *,yy_size_t ,yyscan_t yyscanner );
-void parse_events_free (void * ,yyscan_t yyscanner );
-
-/* Begin user sect3 */
-
-#define yytext_ptr yytext_r
-
-#ifdef YY_HEADER_EXPORT_START_CONDITIONS
-#define INITIAL 0
-#define mem 1
-#define config 2
-#define event 3
-
-#endif
-
-#ifndef YY_NO_UNISTD_H
-/* Special case for "unistd.h", since it is non-ANSI. We include it way
- * down here because we want the user's section 1 to have been scanned first.
- * The user has a chance to override it with an option.
- */
-#include <unistd.h>
-#endif
-
-#ifndef YY_EXTRA_TYPE
-#define YY_EXTRA_TYPE void *
-#endif
-
-int parse_events_lex_init (yyscan_t* scanner);
-
-int parse_events_lex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner);
-
-/* Accessor methods to globals.
-   These are made visible to non-reentrant scanners for convenience. */
-
-int parse_events_lex_destroy (yyscan_t yyscanner );
-
-int parse_events_get_debug (yyscan_t yyscanner );
-
-void parse_events_set_debug (int debug_flag ,yyscan_t yyscanner );
-
-YY_EXTRA_TYPE parse_events_get_extra (yyscan_t yyscanner );
-
-void parse_events_set_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );
-
-FILE *parse_events_get_in (yyscan_t yyscanner );
-
-void parse_events_set_in  (FILE * in_str ,yyscan_t yyscanner );
-
-FILE *parse_events_get_out (yyscan_t yyscanner );
-
-void parse_events_set_out  (FILE * out_str ,yyscan_t yyscanner );
-
-int parse_events_get_leng (yyscan_t yyscanner );
-
-char *parse_events_get_text (yyscan_t yyscanner );
-
-int parse_events_get_lineno (yyscan_t yyscanner );
-
-void parse_events_set_lineno (int line_number ,yyscan_t yyscanner );
-
-YYSTYPE * parse_events_get_lval (yyscan_t yyscanner );
-
-void parse_events_set_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );
-
-/* Macros after this point can all be overridden by user definitions in
- * section 1.
- */
-
-#ifndef YY_SKIP_YYWRAP
-#ifdef __cplusplus
-extern "C" int parse_events_wrap (yyscan_t yyscanner );
-#else
-extern int parse_events_wrap (yyscan_t yyscanner );
-#endif
-#endif
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner);
-#endif
-
-#ifndef YY_NO_INPUT
-
-#endif
-
-/* Amount of stuff to slurp up with each read. */
-#ifndef YY_READ_BUF_SIZE
-#ifdef __ia64__
-/* On IA-64, the buffer size is 16k, not 8k */
-#define YY_READ_BUF_SIZE 16384
-#else
-#define YY_READ_BUF_SIZE 8192
-#endif /* __ia64__ */
-#endif
-
-/* Number of entries by which start-condition stack grows. */
-#ifndef YY_START_STACK_INCR
-#define YY_START_STACK_INCR 25
-#endif
-
-/* Default declaration of generated scanner - a define so the user can
- * easily add parameters.
- */
-#ifndef YY_DECL
-#define YY_DECL_IS_OURS 1
-
-extern int parse_events_lex \
-               (YYSTYPE * yylval_param ,yyscan_t yyscanner);
-
-#define YY_DECL int parse_events_lex \
-               (YYSTYPE * yylval_param , yyscan_t yyscanner)
-#endif /* !YY_DECL */
-
-/* yy_get_previous_state - get the state just before the EOB char was reached */
-
-#undef YY_NEW_FILE
-#undef YY_FLUSH_BUFFER
-#undef yy_set_bol
-#undef yy_new_buffer
-#undef yy_set_interactive
-#undef YY_DO_BEFORE_ACTION
-
-#ifdef YY_DECL_IS_OURS
-#undef YY_DECL_IS_OURS
-#undef YY_DECL
-#endif
-
-#line 212 "util/parse-events.l"
-
-
-#line 352 "util/parse-events-flex.h"
-#undef parse_events_IN_HEADER
-#endif /* parse_events_HEADER_H */
diff --git a/src/tools/perf/util/parse-events.c b/src/tools/perf/util/parse-events.c
deleted file mode 100644
index 9812531..0000000
--- a/src/tools/perf/util/parse-events.c
+++ /dev/null
@@ -1,1330 +0,0 @@
-#include <linux/hw_breakpoint.h>
-#include "util.h"
-#include "../perf.h"
-#include "evlist.h"
-#include "evsel.h"
-#include "parse-options.h"
-#include "parse-events.h"
-#include "exec_cmd.h"
-#include "linux/string.h"
-#include "symbol.h"
-#include "cache.h"
-#include "header.h"
-#include <lk/debugfs.h>
-#include "parse-events-bison.h"
-#define YY_EXTRA_TYPE int
-#include "parse-events-flex.h"
-#include "pmu.h"
-#include "thread_map.h"
-
-#define MAX_NAME_LEN 100
-
-struct event_symbol {
-	const char	*symbol;
-	const char	*alias;
-};
-
-#ifdef PARSER_DEBUG
-extern int parse_events_debug;
-#endif
-int parse_events_parse(void *data, void *scanner);
-
-static struct event_symbol event_symbols_hw[PERF_COUNT_HW_MAX] = {
-	[PERF_COUNT_HW_CPU_CYCLES] = {
-		.symbol = "cpu-cycles",
-		.alias  = "cycles",
-	},
-	[PERF_COUNT_HW_INSTRUCTIONS] = {
-		.symbol = "instructions",
-		.alias  = "",
-	},
-	[PERF_COUNT_HW_CACHE_REFERENCES] = {
-		.symbol = "cache-references",
-		.alias  = "",
-	},
-	[PERF_COUNT_HW_CACHE_MISSES] = {
-		.symbol = "cache-misses",
-		.alias  = "",
-	},
-	[PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = {
-		.symbol = "branch-instructions",
-		.alias  = "branches",
-	},
-	[PERF_COUNT_HW_BRANCH_MISSES] = {
-		.symbol = "branch-misses",
-		.alias  = "",
-	},
-	[PERF_COUNT_HW_BUS_CYCLES] = {
-		.symbol = "bus-cycles",
-		.alias  = "",
-	},
-	[PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = {
-		.symbol = "stalled-cycles-frontend",
-		.alias  = "idle-cycles-frontend",
-	},
-	[PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = {
-		.symbol = "stalled-cycles-backend",
-		.alias  = "idle-cycles-backend",
-	},
-	[PERF_COUNT_HW_REF_CPU_CYCLES] = {
-		.symbol = "ref-cycles",
-		.alias  = "",
-	},
-};
-
-static struct event_symbol event_symbols_sw[PERF_COUNT_SW_MAX] = {
-	[PERF_COUNT_SW_CPU_CLOCK] = {
-		.symbol = "cpu-clock",
-		.alias  = "",
-	},
-	[PERF_COUNT_SW_TASK_CLOCK] = {
-		.symbol = "task-clock",
-		.alias  = "",
-	},
-	[PERF_COUNT_SW_PAGE_FAULTS] = {
-		.symbol = "page-faults",
-		.alias  = "faults",
-	},
-	[PERF_COUNT_SW_CONTEXT_SWITCHES] = {
-		.symbol = "context-switches",
-		.alias  = "cs",
-	},
-	[PERF_COUNT_SW_CPU_MIGRATIONS] = {
-		.symbol = "cpu-migrations",
-		.alias  = "migrations",
-	},
-	[PERF_COUNT_SW_PAGE_FAULTS_MIN] = {
-		.symbol = "minor-faults",
-		.alias  = "",
-	},
-	[PERF_COUNT_SW_PAGE_FAULTS_MAJ] = {
-		.symbol = "major-faults",
-		.alias  = "",
-	},
-	[PERF_COUNT_SW_ALIGNMENT_FAULTS] = {
-		.symbol = "alignment-faults",
-		.alias  = "",
-	},
-	[PERF_COUNT_SW_EMULATION_FAULTS] = {
-		.symbol = "emulation-faults",
-		.alias  = "",
-	},
-	[PERF_COUNT_SW_DUMMY] = {
-		.symbol = "dummy",
-		.alias  = "",
-	},
-};
-
-#define __PERF_EVENT_FIELD(config, name) \
-	((config & PERF_EVENT_##name##_MASK) >> PERF_EVENT_##name##_SHIFT)
-
-#define PERF_EVENT_RAW(config)		__PERF_EVENT_FIELD(config, RAW)
-#define PERF_EVENT_CONFIG(config)	__PERF_EVENT_FIELD(config, CONFIG)
-#define PERF_EVENT_TYPE(config)		__PERF_EVENT_FIELD(config, TYPE)
-#define PERF_EVENT_ID(config)		__PERF_EVENT_FIELD(config, EVENT)
-
-#define for_each_subsystem(sys_dir, sys_dirent, sys_next)	       \
-	while (!readdir_r(sys_dir, &sys_dirent, &sys_next) && sys_next)	       \
-	if (sys_dirent.d_type == DT_DIR &&				       \
-	   (strcmp(sys_dirent.d_name, ".")) &&				       \
-	   (strcmp(sys_dirent.d_name, "..")))
-
-static int tp_event_has_id(struct dirent *sys_dir, struct dirent *evt_dir)
-{
-	char evt_path[MAXPATHLEN];
-	int fd;
-
-	snprintf(evt_path, MAXPATHLEN, "%s/%s/%s/id", tracing_events_path,
-			sys_dir->d_name, evt_dir->d_name);
-	fd = open(evt_path, O_RDONLY);
-	if (fd < 0)
-		return -EINVAL;
-	close(fd);
-
-	return 0;
-}
-
-#define for_each_event(sys_dirent, evt_dir, evt_dirent, evt_next)	       \
-	while (!readdir_r(evt_dir, &evt_dirent, &evt_next) && evt_next)        \
-	if (evt_dirent.d_type == DT_DIR &&				       \
-	   (strcmp(evt_dirent.d_name, ".")) &&				       \
-	   (strcmp(evt_dirent.d_name, "..")) &&				       \
-	   (!tp_event_has_id(&sys_dirent, &evt_dirent)))
-
-#define MAX_EVENT_LENGTH 512
-
-
-struct tracepoint_path *tracepoint_id_to_path(u64 config)
-{
-	struct tracepoint_path *path = NULL;
-	DIR *sys_dir, *evt_dir;
-	struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent;
-	char id_buf[24];
-	int fd;
-	u64 id;
-	char evt_path[MAXPATHLEN];
-	char dir_path[MAXPATHLEN];
-
-	if (debugfs_valid_mountpoint(tracing_events_path))
-		return NULL;
-
-	sys_dir = opendir(tracing_events_path);
-	if (!sys_dir)
-		return NULL;
-
-	for_each_subsystem(sys_dir, sys_dirent, sys_next) {
-
-		snprintf(dir_path, MAXPATHLEN, "%s/%s", tracing_events_path,
-			 sys_dirent.d_name);
-		evt_dir = opendir(dir_path);
-		if (!evt_dir)
-			continue;
-
-		for_each_event(sys_dirent, evt_dir, evt_dirent, evt_next) {
-
-			snprintf(evt_path, MAXPATHLEN, "%s/%s/id", dir_path,
-				 evt_dirent.d_name);
-			fd = open(evt_path, O_RDONLY);
-			if (fd < 0)
-				continue;
-			if (read(fd, id_buf, sizeof(id_buf)) < 0) {
-				close(fd);
-				continue;
-			}
-			close(fd);
-			id = atoll(id_buf);
-			if (id == config) {
-				closedir(evt_dir);
-				closedir(sys_dir);
-				path = zalloc(sizeof(*path));
-				path->system = malloc(MAX_EVENT_LENGTH);
-				if (!path->system) {
-					free(path);
-					return NULL;
-				}
-				path->name = malloc(MAX_EVENT_LENGTH);
-				if (!path->name) {
-					free(path->system);
-					free(path);
-					return NULL;
-				}
-				strncpy(path->system, sys_dirent.d_name,
-					MAX_EVENT_LENGTH);
-				strncpy(path->name, evt_dirent.d_name,
-					MAX_EVENT_LENGTH);
-				return path;
-			}
-		}
-		closedir(evt_dir);
-	}
-
-	closedir(sys_dir);
-	return NULL;
-}
-
-struct tracepoint_path *tracepoint_name_to_path(const char *name)
-{
-	struct tracepoint_path *path = zalloc(sizeof(*path));
-	char *str = strchr(name, ':');
-
-	if (path == NULL || str == NULL) {
-		free(path);
-		return NULL;
-	}
-
-	path->system = strndup(name, str - name);
-	path->name = strdup(str+1);
-
-	if (path->system == NULL || path->name == NULL) {
-		free(path->system);
-		free(path->name);
-		free(path);
-		path = NULL;
-	}
-
-	return path;
-}
-
-const char *event_type(int type)
-{
-	switch (type) {
-	case PERF_TYPE_HARDWARE:
-		return "hardware";
-
-	case PERF_TYPE_SOFTWARE:
-		return "software";
-
-	case PERF_TYPE_TRACEPOINT:
-		return "tracepoint";
-
-	case PERF_TYPE_HW_CACHE:
-		return "hardware-cache";
-
-	default:
-		break;
-	}
-
-	return "unknown";
-}
-
-
-
-static int __add_event(struct list_head *list, int *idx,
-		       struct perf_event_attr *attr,
-		       char *name, struct cpu_map *cpus)
-{
-	struct perf_evsel *evsel;
-
-	event_attr_init(attr);
-
-	evsel = perf_evsel__new(attr, (*idx)++);
-	if (!evsel)
-		return -ENOMEM;
-
-	evsel->cpus = cpus;
-	if (name)
-		evsel->name = strdup(name);
-	list_add_tail(&evsel->node, list);
-	return 0;
-}
-
-static int add_event(struct list_head *list, int *idx,
-		     struct perf_event_attr *attr, char *name)
-{
-	return __add_event(list, idx, attr, name, NULL);
-}
-
-static int parse_aliases(char *str, const char *names[][PERF_EVSEL__MAX_ALIASES], int size)
-{
-	int i, j;
-	int n, longest = -1;
-
-	for (i = 0; i < size; i++) {
-		for (j = 0; j < PERF_EVSEL__MAX_ALIASES && names[i][j]; j++) {
-			n = strlen(names[i][j]);
-			if (n > longest && !strncasecmp(str, names[i][j], n))
-				longest = n;
-		}
-		if (longest > 0)
-			return i;
-	}
-
-	return -1;
-}
-
-int parse_events_add_cache(struct list_head *list, int *idx,
-			   char *type, char *op_result1, char *op_result2)
-{
-	struct perf_event_attr attr;
-	char name[MAX_NAME_LEN];
-	int cache_type = -1, cache_op = -1, cache_result = -1;
-	char *op_result[2] = { op_result1, op_result2 };
-	int i, n;
-
-	/*
-	 * No fallback - if we cannot get a clear cache type
-	 * then bail out:
-	 */
-	cache_type = parse_aliases(type, perf_evsel__hw_cache,
-				   PERF_COUNT_HW_CACHE_MAX);
-	if (cache_type == -1)
-		return -EINVAL;
-
-	n = snprintf(name, MAX_NAME_LEN, "%s", type);
-
-	for (i = 0; (i < 2) && (op_result[i]); i++) {
-		char *str = op_result[i];
-
-		n += snprintf(name + n, MAX_NAME_LEN - n, "-%s", str);
-
-		if (cache_op == -1) {
-			cache_op = parse_aliases(str, perf_evsel__hw_cache_op,
-						 PERF_COUNT_HW_CACHE_OP_MAX);
-			if (cache_op >= 0) {
-				if (!perf_evsel__is_cache_op_valid(cache_type, cache_op))
-					return -EINVAL;
-				continue;
-			}
-		}
-
-		if (cache_result == -1) {
-			cache_result = parse_aliases(str, perf_evsel__hw_cache_result,
-						     PERF_COUNT_HW_CACHE_RESULT_MAX);
-			if (cache_result >= 0)
-				continue;
-		}
-	}
-
-	/*
-	 * Fall back to reads:
-	 */
-	if (cache_op == -1)
-		cache_op = PERF_COUNT_HW_CACHE_OP_READ;
-
-	/*
-	 * Fall back to accesses:
-	 */
-	if (cache_result == -1)
-		cache_result = PERF_COUNT_HW_CACHE_RESULT_ACCESS;
-
-	memset(&attr, 0, sizeof(attr));
-	attr.config = cache_type | (cache_op << 8) | (cache_result << 16);
-	attr.type = PERF_TYPE_HW_CACHE;
-	return add_event(list, idx, &attr, name);
-}
-
-static int add_tracepoint(struct list_head *list, int *idx,
-			  char *sys_name, char *evt_name)
-{
-	struct perf_evsel *evsel;
-
-	evsel = perf_evsel__newtp(sys_name, evt_name, (*idx)++);
-	if (!evsel)
-		return -ENOMEM;
-
-	list_add_tail(&evsel->node, list);
-
-	return 0;
-}
-
-static int add_tracepoint_multi_event(struct list_head *list, int *idx,
-				      char *sys_name, char *evt_name)
-{
-	char evt_path[MAXPATHLEN];
-	struct dirent *evt_ent;
-	DIR *evt_dir;
-	int ret = 0;
-
-	snprintf(evt_path, MAXPATHLEN, "%s/%s", tracing_events_path, sys_name);
-	evt_dir = opendir(evt_path);
-	if (!evt_dir) {
-		perror("Can't open event dir");
-		return -1;
-	}
-
-	while (!ret && (evt_ent = readdir(evt_dir))) {
-		if (!strcmp(evt_ent->d_name, ".")
-		    || !strcmp(evt_ent->d_name, "..")
-		    || !strcmp(evt_ent->d_name, "enable")
-		    || !strcmp(evt_ent->d_name, "filter"))
-			continue;
-
-		if (!strglobmatch(evt_ent->d_name, evt_name))
-			continue;
-
-		ret = add_tracepoint(list, idx, sys_name, evt_ent->d_name);
-	}
-
-	closedir(evt_dir);
-	return ret;
-}
-
-static int add_tracepoint_event(struct list_head *list, int *idx,
-				char *sys_name, char *evt_name)
-{
-	return strpbrk(evt_name, "*?") ?
-	       add_tracepoint_multi_event(list, idx, sys_name, evt_name) :
-	       add_tracepoint(list, idx, sys_name, evt_name);
-}
-
-static int add_tracepoint_multi_sys(struct list_head *list, int *idx,
-				    char *sys_name, char *evt_name)
-{
-	struct dirent *events_ent;
-	DIR *events_dir;
-	int ret = 0;
-
-	events_dir = opendir(tracing_events_path);
-	if (!events_dir) {
-		perror("Can't open event dir");
-		return -1;
-	}
-
-	while (!ret && (events_ent = readdir(events_dir))) {
-		if (!strcmp(events_ent->d_name, ".")
-		    || !strcmp(events_ent->d_name, "..")
-		    || !strcmp(events_ent->d_name, "enable")
-		    || !strcmp(events_ent->d_name, "header_event")
-		    || !strcmp(events_ent->d_name, "header_page"))
-			continue;
-
-		if (!strglobmatch(events_ent->d_name, sys_name))
-			continue;
-
-		ret = add_tracepoint_event(list, idx, events_ent->d_name,
-					   evt_name);
-	}
-
-	closedir(events_dir);
-	return ret;
-}
-
-int parse_events_add_tracepoint(struct list_head *list, int *idx,
-				char *sys, char *event)
-{
-	int ret;
-
-	ret = debugfs_valid_mountpoint(tracing_events_path);
-	if (ret)
-		return ret;
-
-	if (strpbrk(sys, "*?"))
-		return add_tracepoint_multi_sys(list, idx, sys, event);
-	else
-		return add_tracepoint_event(list, idx, sys, event);
-}
-
-static int
-parse_breakpoint_type(const char *type, struct perf_event_attr *attr)
-{
-	int i;
-
-	for (i = 0; i < 3; i++) {
-		if (!type || !type[i])
-			break;
-
-#define CHECK_SET_TYPE(bit)		\
-do {					\
-	if (attr->bp_type & bit)	\
-		return -EINVAL;		\
-	else				\
-		attr->bp_type |= bit;	\
-} while (0)
-
-		switch (type[i]) {
-		case 'r':
-			CHECK_SET_TYPE(HW_BREAKPOINT_R);
-			break;
-		case 'w':
-			CHECK_SET_TYPE(HW_BREAKPOINT_W);
-			break;
-		case 'x':
-			CHECK_SET_TYPE(HW_BREAKPOINT_X);
-			break;
-		default:
-			return -EINVAL;
-		}
-	}
-
-#undef CHECK_SET_TYPE
-
-	if (!attr->bp_type) /* Default */
-		attr->bp_type = HW_BREAKPOINT_R | HW_BREAKPOINT_W;
-
-	return 0;
-}
-
-int parse_events_add_breakpoint(struct list_head *list, int *idx,
-				void *ptr, char *type)
-{
-	struct perf_event_attr attr;
-
-	memset(&attr, 0, sizeof(attr));
-	attr.bp_addr = (unsigned long) ptr;
-
-	if (parse_breakpoint_type(type, &attr))
-		return -EINVAL;
-
-	/*
-	 * We should find a nice way to override the access length
-	 * Provide some defaults for now
-	 */
-	if (attr.bp_type == HW_BREAKPOINT_X)
-		attr.bp_len = sizeof(long);
-	else
-		attr.bp_len = HW_BREAKPOINT_LEN_4;
-
-	attr.type = PERF_TYPE_BREAKPOINT;
-	attr.sample_period = 1;
-
-	return add_event(list, idx, &attr, NULL);
-}
-
-static int config_term(struct perf_event_attr *attr,
-		       struct parse_events_term *term)
-{
-#define CHECK_TYPE_VAL(type)					\
-do {								\
-	if (PARSE_EVENTS__TERM_TYPE_ ## type != term->type_val)	\
-		return -EINVAL;					\
-} while (0)
-
-	switch (term->type_term) {
-	case PARSE_EVENTS__TERM_TYPE_CONFIG:
-		CHECK_TYPE_VAL(NUM);
-		attr->config = term->val.num;
-		break;
-	case PARSE_EVENTS__TERM_TYPE_CONFIG1:
-		CHECK_TYPE_VAL(NUM);
-		attr->config1 = term->val.num;
-		break;
-	case PARSE_EVENTS__TERM_TYPE_CONFIG2:
-		CHECK_TYPE_VAL(NUM);
-		attr->config2 = term->val.num;
-		break;
-	case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
-		CHECK_TYPE_VAL(NUM);
-		attr->sample_period = term->val.num;
-		break;
-	case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE:
-		/*
-		 * TODO uncomment when the field is available
-		 * attr->branch_sample_type = term->val.num;
-		 */
-		break;
-	case PARSE_EVENTS__TERM_TYPE_NAME:
-		CHECK_TYPE_VAL(STR);
-		break;
-	default:
-		return -EINVAL;
-	}
-
-	return 0;
-#undef CHECK_TYPE_VAL
-}
-
-static int config_attr(struct perf_event_attr *attr,
-		       struct list_head *head, int fail)
-{
-	struct parse_events_term *term;
-
-	list_for_each_entry(term, head, list)
-		if (config_term(attr, term) && fail)
-			return -EINVAL;
-
-	return 0;
-}
-
-int parse_events_add_numeric(struct list_head *list, int *idx,
-			     u32 type, u64 config,
-			     struct list_head *head_config)
-{
-	struct perf_event_attr attr;
-
-	memset(&attr, 0, sizeof(attr));
-	attr.type = type;
-	attr.config = config;
-
-	if (head_config &&
-	    config_attr(&attr, head_config, 1))
-		return -EINVAL;
-
-	return add_event(list, idx, &attr, NULL);
-}
-
-static int parse_events__is_name_term(struct parse_events_term *term)
-{
-	return term->type_term == PARSE_EVENTS__TERM_TYPE_NAME;
-}
-
-static char *pmu_event_name(struct list_head *head_terms)
-{
-	struct parse_events_term *term;
-
-	list_for_each_entry(term, head_terms, list)
-		if (parse_events__is_name_term(term))
-			return term->val.str;
-
-	return NULL;
-}
-
-int parse_events_add_pmu(struct list_head *list, int *idx,
-			 char *name, struct list_head *head_config)
-{
-	struct perf_event_attr attr;
-	struct perf_pmu *pmu;
-
-	pmu = perf_pmu__find(name);
-	if (!pmu)
-		return -EINVAL;
-
-	memset(&attr, 0, sizeof(attr));
-
-	if (perf_pmu__check_alias(pmu, head_config))
-		return -EINVAL;
-
-	/*
-	 * Configure hardcoded terms first, no need to check
-	 * return value when called with fail == 0 ;)
-	 */
-	config_attr(&attr, head_config, 0);
-
-	if (perf_pmu__config(pmu, &attr, head_config))
-		return -EINVAL;
-
-	return __add_event(list, idx, &attr, pmu_event_name(head_config),
-			   pmu->cpus);
-}
-
-int parse_events__modifier_group(struct list_head *list,
-				 char *event_mod)
-{
-	return parse_events__modifier_event(list, event_mod, true);
-}
-
-void parse_events__set_leader(char *name, struct list_head *list)
-{
-	struct perf_evsel *leader;
-
-	__perf_evlist__set_leader(list);
-	leader = list_entry(list->next, struct perf_evsel, node);
-	leader->group_name = name ? strdup(name) : NULL;
-}
-
-/* list_event is assumed to point to malloc'ed memory */
-void parse_events_update_lists(struct list_head *list_event,
-			       struct list_head *list_all)
-{
-	/*
-	 * Called for single event definition. Update the
-	 * 'all event' list, and reinit the 'single event'
-	 * list, for next event definition.
-	 */
-	list_splice_tail(list_event, list_all);
-	free(list_event);
-}
-
-struct event_modifier {
-	int eu;
-	int ek;
-	int eh;
-	int eH;
-	int eG;
-	int precise;
-	int exclude_GH;
-	int sample_read;
-	int pinned;
-};
-
-static int get_event_modifier(struct event_modifier *mod, char *str,
-			       struct perf_evsel *evsel)
-{
-	int eu = evsel ? evsel->attr.exclude_user : 0;
-	int ek = evsel ? evsel->attr.exclude_kernel : 0;
-	int eh = evsel ? evsel->attr.exclude_hv : 0;
-	int eH = evsel ? evsel->attr.exclude_host : 0;
-	int eG = evsel ? evsel->attr.exclude_guest : 0;
-	int precise = evsel ? evsel->attr.precise_ip : 0;
-	int sample_read = 0;
-	int pinned = evsel ? evsel->attr.pinned : 0;
-
-	int exclude = eu | ek | eh;
-	int exclude_GH = evsel ? evsel->exclude_GH : 0;
-
-	memset(mod, 0, sizeof(*mod));
-
-	while (*str) {
-		if (*str == 'u') {
-			if (!exclude)
-				exclude = eu = ek = eh = 1;
-			eu = 0;
-		} else if (*str == 'k') {
-			if (!exclude)
-				exclude = eu = ek = eh = 1;
-			ek = 0;
-		} else if (*str == 'h') {
-			if (!exclude)
-				exclude = eu = ek = eh = 1;
-			eh = 0;
-		} else if (*str == 'G') {
-			if (!exclude_GH)
-				exclude_GH = eG = eH = 1;
-			eG = 0;
-		} else if (*str == 'H') {
-			if (!exclude_GH)
-				exclude_GH = eG = eH = 1;
-			eH = 0;
-		} else if (*str == 'p') {
-			precise++;
-			/* use of precise requires exclude_guest */
-			if (!exclude_GH)
-				eG = 1;
-		} else if (*str == 'S') {
-			sample_read = 1;
-		} else if (*str == 'D') {
-			pinned = 1;
-		} else
-			break;
-
-		++str;
-	}
-
-	/*
-	 * precise ip:
-	 *
-	 *  0 - SAMPLE_IP can have arbitrary skid
-	 *  1 - SAMPLE_IP must have constant skid
-	 *  2 - SAMPLE_IP requested to have 0 skid
-	 *  3 - SAMPLE_IP must have 0 skid
-	 *
-	 *  See also PERF_RECORD_MISC_EXACT_IP
-	 */
-	if (precise > 3)
-		return -EINVAL;
-
-	mod->eu = eu;
-	mod->ek = ek;
-	mod->eh = eh;
-	mod->eH = eH;
-	mod->eG = eG;
-	mod->precise = precise;
-	mod->exclude_GH = exclude_GH;
-	mod->sample_read = sample_read;
-	mod->pinned = pinned;
-
-	return 0;
-}
-
-/*
- * Basic modifier sanity check to validate it contains only one
- * instance of any modifier (apart from 'p') present.
- */
-static int check_modifier(char *str)
-{
-	char *p = str;
-
-	/* The sizeof includes 0 byte as well. */
-	if (strlen(str) > (sizeof("ukhGHpppSD") - 1))
-		return -1;
-
-	while (*p) {
-		if (*p != 'p' && strchr(p + 1, *p))
-			return -1;
-		p++;
-	}
-
-	return 0;
-}
-
-int parse_events__modifier_event(struct list_head *list, char *str, bool add)
-{
-	struct perf_evsel *evsel;
-	struct event_modifier mod;
-
-	if (str == NULL)
-		return 0;
-
-	if (check_modifier(str))
-		return -EINVAL;
-
-	if (!add && get_event_modifier(&mod, str, NULL))
-		return -EINVAL;
-
-	list_for_each_entry(evsel, list, node) {
-
-		if (add && get_event_modifier(&mod, str, evsel))
-			return -EINVAL;
-
-		evsel->attr.exclude_user   = mod.eu;
-		evsel->attr.exclude_kernel = mod.ek;
-		evsel->attr.exclude_hv     = mod.eh;
-		evsel->attr.precise_ip     = mod.precise;
-		evsel->attr.exclude_host   = mod.eH;
-		evsel->attr.exclude_guest  = mod.eG;
-		evsel->exclude_GH          = mod.exclude_GH;
-		evsel->sample_read         = mod.sample_read;
-
-		if (perf_evsel__is_group_leader(evsel))
-			evsel->attr.pinned = mod.pinned;
-	}
-
-	return 0;
-}
-
-int parse_events_name(struct list_head *list, char *name)
-{
-	struct perf_evsel *evsel;
-
-	list_for_each_entry(evsel, list, node) {
-		if (!evsel->name)
-			evsel->name = strdup(name);
-	}
-
-	return 0;
-}
-
-static int parse_events__scanner(const char *str, void *data, int start_token);
-
-static int parse_events_fixup(int ret, const char *str, void *data,
-			      int start_token)
-{
-	char *o = strdup(str);
-	char *s = NULL;
-	char *t = o;
-	char *p;
-	int len = 0;
-
-	if (!o)
-		return ret;
-	while ((p = strsep(&t, ",")) != NULL) {
-		if (s)
-			str_append(&s, &len, ",");
-		str_append(&s, &len, "cpu/");
-		str_append(&s, &len, p);
-		str_append(&s, &len, "/");
-	}
-	free(o);
-	if (!s)
-		return -ENOMEM;
-	return parse_events__scanner(s, data, start_token);
-}
-
-static int parse_events__scanner(const char *str, void *data, int start_token)
-{
-	YY_BUFFER_STATE buffer;
-	void *scanner;
-	int ret;
-
-	ret = parse_events_lex_init_extra(start_token, &scanner);
-	if (ret)
-		return ret;
-
-	buffer = parse_events__scan_string(str, scanner);
-
-#ifdef PARSER_DEBUG
-	parse_events_debug = 1;
-#endif
-	ret = parse_events_parse(data, scanner);
-
-	parse_events__flush_buffer(buffer, scanner);
-	parse_events__delete_buffer(buffer, scanner);
-	parse_events_lex_destroy(scanner);
-	if (ret && !strchr(str, '/'))
-		ret = parse_events_fixup(ret, str, data, start_token);
-	return ret;
-}
-
-/*
- * parse event config string, return a list of event terms.
- */
-int parse_events_terms(struct list_head *terms, const char *str)
-{
-	struct parse_events_terms data = {
-		.terms = NULL,
-	};
-	int ret;
-
-	ret = parse_events__scanner(str, &data, PE_START_TERMS);
-	if (!ret) {
-		list_splice(data.terms, terms);
-		free(data.terms);
-		return 0;
-	}
-
-	if (data.terms)
-		parse_events__free_terms(data.terms);
-	return ret;
-}
-
-int parse_events(struct perf_evlist *evlist, const char *str)
-{
-	struct parse_events_evlist data = {
-		.list = LIST_HEAD_INIT(data.list),
-		.idx  = evlist->nr_entries,
-	};
-	int ret;
-
-	ret = parse_events__scanner(str, &data, PE_START_EVENTS);
-	if (!ret) {
-		int entries = data.idx - evlist->nr_entries;
-		perf_evlist__splice_list_tail(evlist, &data.list, entries);
-		evlist->nr_groups += data.nr_groups;
-		return 0;
-	}
-
-	/*
-	 * There are 2 users - builtin-record and builtin-test objects.
-	 * Both call perf_evlist__delete in case of error, so we dont
-	 * need to bother.
-	 */
-	return ret;
-}
-
-int parse_events_option(const struct option *opt, const char *str,
-			int unset __maybe_unused)
-{
-	struct perf_evlist *evlist = *(struct perf_evlist **)opt->value;
-	int ret = parse_events(evlist, str);
-
-	if (ret) {
-		fprintf(stderr, "invalid or unsupported event: '%s'\n", str);
-		fprintf(stderr, "Run 'perf list' for a list of valid events\n");
-	}
-	return ret;
-}
-
-int parse_filter(const struct option *opt, const char *str,
-		 int unset __maybe_unused)
-{
-	struct perf_evlist *evlist = *(struct perf_evlist **)opt->value;
-	struct perf_evsel *last = NULL;
-
-	if (evlist->nr_entries > 0)
-		last = perf_evlist__last(evlist);
-
-	if (last == NULL || last->attr.type != PERF_TYPE_TRACEPOINT) {
-		fprintf(stderr,
-			"-F option should follow a -e tracepoint option\n");
-		return -1;
-	}
-
-	last->filter = strdup(str);
-	if (last->filter == NULL) {
-		fprintf(stderr, "not enough memory to hold filter string\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-static const char * const event_type_descriptors[] = {
-	"Hardware event",
-	"Software event",
-	"Tracepoint event",
-	"Hardware cache event",
-	"Raw hardware event descriptor",
-	"Hardware breakpoint",
-};
-
-/*
- * Print the events from <debugfs_mount_point>/tracing/events
- */
-
-void print_tracepoint_events(const char *subsys_glob, const char *event_glob,
-			     bool name_only)
-{
-	DIR *sys_dir, *evt_dir;
-	struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent;
-	char evt_path[MAXPATHLEN];
-	char dir_path[MAXPATHLEN];
-
-	if (debugfs_valid_mountpoint(tracing_events_path))
-		return;
-
-	sys_dir = opendir(tracing_events_path);
-	if (!sys_dir)
-		return;
-
-	for_each_subsystem(sys_dir, sys_dirent, sys_next) {
-		if (subsys_glob != NULL && 
-		    !strglobmatch(sys_dirent.d_name, subsys_glob))
-			continue;
-
-		snprintf(dir_path, MAXPATHLEN, "%s/%s", tracing_events_path,
-			 sys_dirent.d_name);
-		evt_dir = opendir(dir_path);
-		if (!evt_dir)
-			continue;
-
-		for_each_event(sys_dirent, evt_dir, evt_dirent, evt_next) {
-			if (event_glob != NULL && 
-			    !strglobmatch(evt_dirent.d_name, event_glob))
-				continue;
-
-			if (name_only) {
-				printf("%s:%s ", sys_dirent.d_name, evt_dirent.d_name);
-				continue;
-			}
-
-			snprintf(evt_path, MAXPATHLEN, "%s:%s",
-				 sys_dirent.d_name, evt_dirent.d_name);
-			printf("  %-50s [%s]\n", evt_path,
-				event_type_descriptors[PERF_TYPE_TRACEPOINT]);
-		}
-		closedir(evt_dir);
-	}
-	closedir(sys_dir);
-}
-
-/*
- * Check whether event is in <debugfs_mount_point>/tracing/events
- */
-
-int is_valid_tracepoint(const char *event_string)
-{
-	DIR *sys_dir, *evt_dir;
-	struct dirent *sys_next, *evt_next, sys_dirent, evt_dirent;
-	char evt_path[MAXPATHLEN];
-	char dir_path[MAXPATHLEN];
-
-	if (debugfs_valid_mountpoint(tracing_events_path))
-		return 0;
-
-	sys_dir = opendir(tracing_events_path);
-	if (!sys_dir)
-		return 0;
-
-	for_each_subsystem(sys_dir, sys_dirent, sys_next) {
-
-		snprintf(dir_path, MAXPATHLEN, "%s/%s", tracing_events_path,
-			 sys_dirent.d_name);
-		evt_dir = opendir(dir_path);
-		if (!evt_dir)
-			continue;
-
-		for_each_event(sys_dirent, evt_dir, evt_dirent, evt_next) {
-			snprintf(evt_path, MAXPATHLEN, "%s:%s",
-				 sys_dirent.d_name, evt_dirent.d_name);
-			if (!strcmp(evt_path, event_string)) {
-				closedir(evt_dir);
-				closedir(sys_dir);
-				return 1;
-			}
-		}
-		closedir(evt_dir);
-	}
-	closedir(sys_dir);
-	return 0;
-}
-
-static bool is_event_supported(u8 type, unsigned config)
-{
-	bool ret = true;
-	struct perf_evsel *evsel;
-	struct perf_event_attr attr = {
-		.type = type,
-		.config = config,
-		.disabled = 1,
-		.exclude_kernel = 1,
-	};
-	struct {
-		struct thread_map map;
-		int threads[1];
-	} tmap = {
-		.map.nr	 = 1,
-		.threads = { 0 },
-	};
-
-	evsel = perf_evsel__new(&attr, 0);
-	if (evsel) {
-		ret = perf_evsel__open(evsel, NULL, &tmap.map) >= 0;
-		perf_evsel__delete(evsel);
-	}
-
-	return ret;
-}
-
-static void __print_events_type(u8 type, struct event_symbol *syms,
-				unsigned max)
-{
-	char name[64];
-	unsigned i;
-
-	for (i = 0; i < max ; i++, syms++) {
-		if (!is_event_supported(type, i))
-			continue;
-
-		if (strlen(syms->alias))
-			snprintf(name, sizeof(name),  "%s OR %s",
-				 syms->symbol, syms->alias);
-		else
-			snprintf(name, sizeof(name), "%s", syms->symbol);
-
-		printf("  %-50s [%s]\n", name, event_type_descriptors[type]);
-	}
-}
-
-void print_events_type(u8 type)
-{
-	if (type == PERF_TYPE_SOFTWARE)
-		__print_events_type(type, event_symbols_sw, PERF_COUNT_SW_MAX);
-	else
-		__print_events_type(type, event_symbols_hw, PERF_COUNT_HW_MAX);
-}
-
-int print_hwcache_events(const char *event_glob, bool name_only)
-{
-	unsigned int type, op, i, printed = 0;
-	char name[64];
-
-	for (type = 0; type < PERF_COUNT_HW_CACHE_MAX; type++) {
-		for (op = 0; op < PERF_COUNT_HW_CACHE_OP_MAX; op++) {
-			/* skip invalid cache type */
-			if (!perf_evsel__is_cache_op_valid(type, op))
-				continue;
-
-			for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
-				__perf_evsel__hw_cache_type_op_res_name(type, op, i,
-									name, sizeof(name));
-				if (event_glob != NULL && !strglobmatch(name, event_glob))
-					continue;
-
-				if (!is_event_supported(PERF_TYPE_HW_CACHE,
-							type | (op << 8) | (i << 16)))
-					continue;
-
-				if (name_only)
-					printf("%s ", name);
-				else
-					printf("  %-50s [%s]\n", name,
-					       event_type_descriptors[PERF_TYPE_HW_CACHE]);
-				++printed;
-			}
-		}
-	}
-
-	if (printed)
-		printf("\n");
-	return printed;
-}
-
-static void print_symbol_events(const char *event_glob, unsigned type,
-				struct event_symbol *syms, unsigned max,
-				bool name_only)
-{
-	unsigned i, printed = 0;
-	char name[MAX_NAME_LEN];
-
-	for (i = 0; i < max; i++, syms++) {
-
-		if (event_glob != NULL && 
-		    !(strglobmatch(syms->symbol, event_glob) ||
-		      (syms->alias && strglobmatch(syms->alias, event_glob))))
-			continue;
-
-		if (!is_event_supported(type, i))
-			continue;
-
-		if (name_only) {
-			printf("%s ", syms->symbol);
-			continue;
-		}
-
-		if (strlen(syms->alias))
-			snprintf(name, MAX_NAME_LEN, "%s OR %s", syms->symbol, syms->alias);
-		else
-			strncpy(name, syms->symbol, MAX_NAME_LEN);
-
-		printf("  %-50s [%s]\n", name, event_type_descriptors[type]);
-
-		printed++;
-	}
-
-	if (printed)
-		printf("\n");
-}
-
-/*
- * Print the help text for the event symbols:
- */
-void print_events(const char *event_glob, bool name_only)
-{
-	if (!name_only) {
-		printf("\n");
-		printf("List of pre-defined events (to be used in -e):\n");
-	}
-
-	print_symbol_events(event_glob, PERF_TYPE_HARDWARE,
-			    event_symbols_hw, PERF_COUNT_HW_MAX, name_only);
-
-	print_symbol_events(event_glob, PERF_TYPE_SOFTWARE,
-			    event_symbols_sw, PERF_COUNT_SW_MAX, name_only);
-
-	print_hwcache_events(event_glob, name_only);
-
-	print_pmu_events(event_glob, name_only);
-
-	if (event_glob != NULL)
-		return;
-
-	if (!name_only) {
-		printf("  %-50s [%s]\n",
-		       "rNNN",
-		       event_type_descriptors[PERF_TYPE_RAW]);
-		printf("  %-50s [%s]\n",
-		       "cpu/t1=v1[,t2=v2,t3 ...]/modifier",
-		       event_type_descriptors[PERF_TYPE_RAW]);
-		printf("   (see 'man perf-list' on how to encode it)\n");
-		printf("\n");
-
-		printf("  %-50s [%s]\n",
-		       "mem:<addr>[:access]",
-			event_type_descriptors[PERF_TYPE_BREAKPOINT]);
-		printf("\n");
-	}
-
-	print_tracepoint_events(NULL, NULL, name_only);
-}
-
-int parse_events__is_hardcoded_term(struct parse_events_term *term)
-{
-	return term->type_term != PARSE_EVENTS__TERM_TYPE_USER;
-}
-
-static int new_term(struct parse_events_term **_term, int type_val,
-		    int type_term, char *config,
-		    char *str, u64 num)
-{
-	struct parse_events_term *term;
-
-	term = zalloc(sizeof(*term));
-	if (!term)
-		return -ENOMEM;
-
-	INIT_LIST_HEAD(&term->list);
-	term->type_val  = type_val;
-	term->type_term = type_term;
-	term->config = config;
-
-	switch (type_val) {
-	case PARSE_EVENTS__TERM_TYPE_NUM:
-		term->val.num = num;
-		break;
-	case PARSE_EVENTS__TERM_TYPE_STR:
-		term->val.str = str;
-		break;
-	default:
-		free(term);
-		return -EINVAL;
-	}
-
-	*_term = term;
-	return 0;
-}
-
-int parse_events_term__num(struct parse_events_term **term,
-			   int type_term, char *config, u64 num)
-{
-	return new_term(term, PARSE_EVENTS__TERM_TYPE_NUM, type_term,
-			config, NULL, num);
-}
-
-int parse_events_term__str(struct parse_events_term **term,
-			   int type_term, char *config, char *str)
-{
-	return new_term(term, PARSE_EVENTS__TERM_TYPE_STR, type_term,
-			config, str, 0);
-}
-
-int parse_events_term__sym_hw(struct parse_events_term **term,
-			      char *config, unsigned idx)
-{
-	struct event_symbol *sym;
-
-	BUG_ON(idx >= PERF_COUNT_HW_MAX);
-	sym = &event_symbols_hw[idx];
-
-	if (config)
-		return new_term(term, PARSE_EVENTS__TERM_TYPE_STR,
-				PARSE_EVENTS__TERM_TYPE_USER, config,
-				(char *) sym->symbol, 0);
-	else
-		return new_term(term, PARSE_EVENTS__TERM_TYPE_STR,
-				PARSE_EVENTS__TERM_TYPE_USER,
-				(char *) "event", (char *) sym->symbol, 0);
-}
-
-int parse_events_term__clone(struct parse_events_term **new,
-			     struct parse_events_term *term)
-{
-	return new_term(new, term->type_val, term->type_term, term->config,
-			term->val.str, term->val.num);
-}
-
-void parse_events__free_terms(struct list_head *terms)
-{
-	struct parse_events_term *term, *h;
-
-	list_for_each_entry_safe(term, h, terms, list)
-		free(term);
-}
diff --git a/src/tools/perf/util/parse-events.h b/src/tools/perf/util/parse-events.h
deleted file mode 100644
index f1cb4c4..0000000
--- a/src/tools/perf/util/parse-events.h
+++ /dev/null
@@ -1,113 +0,0 @@
-#ifndef __PERF_PARSE_EVENTS_H
-#define __PERF_PARSE_EVENTS_H
-/*
- * Parse symbolic events/counts passed in as options:
- */
-
-#include <linux/list.h>
-#include <stdbool.h>
-#include "types.h"
-#include <linux/perf_event.h>
-#include "types.h"
-
-struct list_head;
-struct perf_evsel;
-struct perf_evlist;
-
-struct option;
-
-struct tracepoint_path {
-	char *system;
-	char *name;
-	struct tracepoint_path *next;
-};
-
-extern struct tracepoint_path *tracepoint_id_to_path(u64 config);
-extern struct tracepoint_path *tracepoint_name_to_path(const char *name);
-extern bool have_tracepoints(struct list_head *evlist);
-
-const char *event_type(int type);
-
-extern int parse_events_option(const struct option *opt, const char *str,
-			       int unset);
-extern int parse_events(struct perf_evlist *evlist, const char *str);
-extern int parse_events_terms(struct list_head *terms, const char *str);
-extern int parse_filter(const struct option *opt, const char *str, int unset);
-
-#define EVENTS_HELP_MAX (128*1024)
-
-enum {
-	PARSE_EVENTS__TERM_TYPE_NUM,
-	PARSE_EVENTS__TERM_TYPE_STR,
-};
-
-enum {
-	PARSE_EVENTS__TERM_TYPE_USER,
-	PARSE_EVENTS__TERM_TYPE_CONFIG,
-	PARSE_EVENTS__TERM_TYPE_CONFIG1,
-	PARSE_EVENTS__TERM_TYPE_CONFIG2,
-	PARSE_EVENTS__TERM_TYPE_NAME,
-	PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD,
-	PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE,
-};
-
-struct parse_events_term {
-	char *config;
-	union {
-		char *str;
-		u64  num;
-	} val;
-	int type_val;
-	int type_term;
-	struct list_head list;
-};
-
-struct parse_events_evlist {
-	struct list_head list;
-	int idx;
-	int nr_groups;
-};
-
-struct parse_events_terms {
-	struct list_head *terms;
-};
-
-int parse_events__is_hardcoded_term(struct parse_events_term *term);
-int parse_events_term__num(struct parse_events_term **_term,
-			   int type_term, char *config, u64 num);
-int parse_events_term__str(struct parse_events_term **_term,
-			   int type_term, char *config, char *str);
-int parse_events_term__sym_hw(struct parse_events_term **term,
-			      char *config, unsigned idx);
-int parse_events_term__clone(struct parse_events_term **new,
-			     struct parse_events_term *term);
-void parse_events__free_terms(struct list_head *terms);
-int parse_events__modifier_event(struct list_head *list, char *str, bool add);
-int parse_events__modifier_group(struct list_head *list, char *event_mod);
-int parse_events_name(struct list_head *list, char *name);
-int parse_events_add_tracepoint(struct list_head *list, int *idx,
-				char *sys, char *event);
-int parse_events_add_numeric(struct list_head *list, int *idx,
-			     u32 type, u64 config,
-			     struct list_head *head_config);
-int parse_events_add_cache(struct list_head *list, int *idx,
-			   char *type, char *op_result1, char *op_result2);
-int parse_events_add_breakpoint(struct list_head *list, int *idx,
-				void *ptr, char *type);
-int parse_events_add_pmu(struct list_head *list, int *idx,
-			 char *pmu , struct list_head *head_config);
-void parse_events__set_leader(char *name, struct list_head *list);
-void parse_events_update_lists(struct list_head *list_event,
-			       struct list_head *list_all);
-void parse_events_error(void *data, void *scanner, char const *msg);
-
-void print_events(const char *event_glob, bool name_only);
-void print_events_type(u8 type);
-void print_tracepoint_events(const char *subsys_glob, const char *event_glob,
-			     bool name_only);
-int print_hwcache_events(const char *event_glob, bool name_only);
-extern int is_valid_tracepoint(const char *event_string);
-
-extern int valid_debugfs_mount(const char *debugfs);
-
-#endif /* __PERF_PARSE_EVENTS_H */
diff --git a/src/tools/perf/util/parse-events.l b/src/tools/perf/util/parse-events.l
deleted file mode 100644
index 91346b7..0000000
--- a/src/tools/perf/util/parse-events.l
+++ /dev/null
@@ -1,217 +0,0 @@
-
-%option reentrant
-%option bison-bridge
-%option prefix="parse_events_"
-%option stack
-
-%{
-#include <errno.h>
-#include "../perf.h"
-#include "parse-events-bison.h"
-#include "parse-events.h"
-
-char *parse_events_get_text(yyscan_t yyscanner);
-YYSTYPE *parse_events_get_lval(yyscan_t yyscanner);
-
-static int __value(YYSTYPE *yylval, char *str, int base, int token)
-{
-	u64 num;
-
-	errno = 0;
-	num = strtoull(str, NULL, base);
-	if (errno)
-		return PE_ERROR;
-
-	yylval->num = num;
-	return token;
-}
-
-static int value(yyscan_t scanner, int base)
-{
-	YYSTYPE *yylval = parse_events_get_lval(scanner);
-	char *text = parse_events_get_text(scanner);
-
-	return __value(yylval, text, base, PE_VALUE);
-}
-
-static int raw(yyscan_t scanner)
-{
-	YYSTYPE *yylval = parse_events_get_lval(scanner);
-	char *text = parse_events_get_text(scanner);
-
-	return __value(yylval, text + 1, 16, PE_RAW);
-}
-
-static int str(yyscan_t scanner, int token)
-{
-	YYSTYPE *yylval = parse_events_get_lval(scanner);
-	char *text = parse_events_get_text(scanner);
-
-	yylval->str = strdup(text);
-	return token;
-}
-
-static int sym(yyscan_t scanner, int type, int config)
-{
-	YYSTYPE *yylval = parse_events_get_lval(scanner);
-
-	yylval->num = (type << 16) + config;
-	return type == PERF_TYPE_HARDWARE ? PE_VALUE_SYM_HW : PE_VALUE_SYM_SW;
-}
-
-static int term(yyscan_t scanner, int type)
-{
-	YYSTYPE *yylval = parse_events_get_lval(scanner);
-
-	yylval->num = type;
-	return PE_TERM;
-}
-
-%}
-
-%x mem
-%s config
-%x event
-
-group		[^,{}/]*[{][^}]*[}][^,{}/]*
-event_pmu	[^,{}/]+[/][^/]*[/][^,{}/]*
-event		[^,{}/]+
-
-num_dec		[0-9]+
-num_hex		0x[a-fA-F0-9]+
-num_raw_hex	[a-fA-F0-9]+
-name		[a-zA-Z_*?][a-zA-Z0-9_*?]*
-name_minus	[a-zA-Z_*?][a-zA-Z0-9\-_*?]*
-/* If you add a modifier you need to update check_modifier() */
-modifier_event	[ukhpGHSD]+
-modifier_bp	[rwx]{1,3}
-
-%%
-
-%{
-	{
-		int start_token;
-
-		start_token = parse_events_get_extra(yyscanner);
-
-		if (start_token == PE_START_TERMS)
-			BEGIN(config);
-		else if (start_token == PE_START_EVENTS)
-			BEGIN(event);
-
-		if (start_token) {
-			parse_events_set_extra(NULL, yyscanner);
-			return start_token;
-		}
-         }
-%}
-
-<event>{
-
-{group}		{
-			BEGIN(INITIAL); yyless(0);
-		}
-
-{event_pmu}	|
-{event}		{
-			str(yyscanner, PE_EVENT_NAME);
-			BEGIN(INITIAL); yyless(0);
-			return PE_EVENT_NAME;
-		}
-
-.		|
-<<EOF>>		{
-			BEGIN(INITIAL); yyless(0);
-		}
-
-}
-
-cpu-cycles|cycles				{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES); }
-stalled-cycles-frontend|idle-cycles-frontend	{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND); }
-stalled-cycles-backend|idle-cycles-backend	{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND); }
-instructions					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS); }
-cache-references				{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_REFERENCES); }
-cache-misses					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_MISSES); }
-branch-instructions|branches			{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS); }
-branch-misses					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_MISSES); }
-bus-cycles					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BUS_CYCLES); }
-ref-cycles					{ return sym(yyscanner, PERF_TYPE_HARDWARE, PERF_COUNT_HW_REF_CPU_CYCLES); }
-cpu-clock					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK); }
-task-clock					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_TASK_CLOCK); }
-page-faults|faults				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS); }
-minor-faults					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MIN); }
-major-faults					{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MAJ); }
-context-switches|cs				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES); }
-cpu-migrations|migrations			{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS); }
-alignment-faults				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); }
-emulation-faults				{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); }
-dummy						{ return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); }
-
-L1-dcache|l1-d|l1d|L1-data		|
-L1-icache|l1-i|l1i|L1-instruction	|
-LLC|L2					|
-dTLB|d-tlb|Data-TLB			|
-iTLB|i-tlb|Instruction-TLB		|
-branch|branches|bpu|btb|bpc		|
-node					{ return str(yyscanner, PE_NAME_CACHE_TYPE); }
-
-load|loads|read				|
-store|stores|write			|
-prefetch|prefetches			|
-speculative-read|speculative-load	|
-refs|Reference|ops|access		|
-misses|miss				{ return str(yyscanner, PE_NAME_CACHE_OP_RESULT); }
-
-<config>{
-config			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG); }
-config1			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG1); }
-config2			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG2); }
-name			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NAME); }
-period			{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); }
-branch_type		{ return term(yyscanner, PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); }
-,			{ return ','; }
-"/"			{ BEGIN(INITIAL); return '/'; }
-{name_minus}		{ return str(yyscanner, PE_NAME); }
-}
-
-mem:			{ BEGIN(mem); return PE_PREFIX_MEM; }
-r{num_raw_hex}		{ return raw(yyscanner); }
-{num_dec}		{ return value(yyscanner, 10); }
-{num_hex}		{ return value(yyscanner, 16); }
-
-{modifier_event}	{ return str(yyscanner, PE_MODIFIER_EVENT); }
-{name}			{ return str(yyscanner, PE_NAME); }
-"/"			{ BEGIN(config); return '/'; }
--			{ return '-'; }
-,			{ BEGIN(event); return ','; }
-:			{ return ':'; }
-"{"			{ BEGIN(event); return '{'; }
-"}"			{ return '}'; }
-=			{ return '='; }
-\n			{ }
-
-<mem>{
-{modifier_bp}		{ return str(yyscanner, PE_MODIFIER_BP); }
-:			{ return ':'; }
-{num_dec}		{ return value(yyscanner, 10); }
-{num_hex}		{ return value(yyscanner, 16); }
-	/*
-	 * We need to separate 'mem:' scanner part, in order to get specific
-	 * modifier bits parsed out. Otherwise we would need to handle PE_NAME
-	 * and we'd need to parse it manually. During the escape from <mem>
-	 * state we need to put the escaping char back, so we dont miss it.
-	 */
-.			{ unput(*yytext); BEGIN(INITIAL); }
-	/*
-	 * We destroy the scanner after reaching EOF,
-	 * but anyway just to be sure get back to INIT state.
-	 */
-<<EOF>>			{ BEGIN(INITIAL); }
-}
-
-%%
-
-int parse_events_wrap(void *scanner __maybe_unused)
-{
-	return 1;
-}
diff --git a/src/tools/perf/util/parse-events.y b/src/tools/perf/util/parse-events.y
deleted file mode 100644
index 4eb67ec..0000000
--- a/src/tools/perf/util/parse-events.y
+++ /dev/null
@@ -1,442 +0,0 @@
-%pure-parser
-%parse-param {void *_data}
-%parse-param {void *scanner}
-%lex-param {void* scanner}
-
-%{
-
-#define YYDEBUG 1
-
-#include <linux/compiler.h>
-#include <linux/list.h>
-#include "types.h"
-#include "util.h"
-#include "parse-events.h"
-#include "parse-events-bison.h"
-
-extern int parse_events_lex (YYSTYPE* lvalp, void* scanner);
-
-#define ABORT_ON(val) \
-do { \
-	if (val) \
-		YYABORT; \
-} while (0)
-
-#define ALLOC_LIST(list) \
-do { \
-	list = malloc(sizeof(*list)); \
-	ABORT_ON(!list);              \
-	INIT_LIST_HEAD(list);         \
-} while (0)
-
-static inc_group_count(struct list_head *list,
-		       struct parse_events_evlist *data)
-{
-	/* Count groups only have more than 1 members */
-	if (!list_is_last(list->next, list))
-		data->nr_groups++;
-}
-
-%}
-
-%token PE_START_EVENTS PE_START_TERMS
-%token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_RAW PE_TERM
-%token PE_EVENT_NAME
-%token PE_NAME
-%token PE_MODIFIER_EVENT PE_MODIFIER_BP
-%token PE_NAME_CACHE_TYPE PE_NAME_CACHE_OP_RESULT
-%token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP
-%token PE_ERROR
-%type <num> PE_VALUE
-%type <num> PE_VALUE_SYM_HW
-%type <num> PE_VALUE_SYM_SW
-%type <num> PE_RAW
-%type <num> PE_TERM
-%type <str> PE_NAME
-%type <str> PE_NAME_CACHE_TYPE
-%type <str> PE_NAME_CACHE_OP_RESULT
-%type <str> PE_MODIFIER_EVENT
-%type <str> PE_MODIFIER_BP
-%type <str> PE_EVENT_NAME
-%type <num> value_sym
-%type <head> event_config
-%type <term> event_term
-%type <head> event_pmu
-%type <head> event_legacy_symbol
-%type <head> event_legacy_cache
-%type <head> event_legacy_mem
-%type <head> event_legacy_tracepoint
-%type <head> event_legacy_numeric
-%type <head> event_legacy_raw
-%type <head> event_def
-%type <head> event_mod
-%type <head> event_name
-%type <head> event
-%type <head> events
-%type <head> group_def
-%type <head> group
-%type <head> groups
-
-%union
-{
-	char *str;
-	u64 num;
-	struct list_head *head;
-	struct parse_events_term *term;
-}
-%%
-
-start:
-PE_START_EVENTS start_events
-|
-PE_START_TERMS  start_terms
-
-start_events: groups
-{
-	struct parse_events_evlist *data = _data;
-
-	parse_events_update_lists($1, &data->list);
-}
-
-groups:
-groups ',' group
-{
-	struct list_head *list  = $1;
-	struct list_head *group = $3;
-
-	parse_events_update_lists(group, list);
-	$$ = list;
-}
-|
-groups ',' event
-{
-	struct list_head *list  = $1;
-	struct list_head *event = $3;
-
-	parse_events_update_lists(event, list);
-	$$ = list;
-}
-|
-group
-|
-event
-
-group:
-group_def ':' PE_MODIFIER_EVENT
-{
-	struct list_head *list = $1;
-
-	ABORT_ON(parse_events__modifier_group(list, $3));
-	$$ = list;
-}
-|
-group_def
-
-group_def:
-PE_NAME '{' events '}'
-{
-	struct list_head *list = $3;
-
-	inc_group_count(list, _data);
-	parse_events__set_leader($1, list);
-	$$ = list;
-}
-|
-'{' events '}'
-{
-	struct list_head *list = $2;
-
-	inc_group_count(list, _data);
-	parse_events__set_leader(NULL, list);
-	$$ = list;
-}
-
-events:
-events ',' event
-{
-	struct list_head *event = $3;
-	struct list_head *list  = $1;
-
-	parse_events_update_lists(event, list);
-	$$ = list;
-}
-|
-event
-
-event: event_mod
-
-event_mod:
-event_name PE_MODIFIER_EVENT
-{
-	struct list_head *list = $1;
-
-	/*
-	 * Apply modifier on all events added by single event definition
-	 * (there could be more events added for multiple tracepoint
-	 * definitions via '*?'.
-	 */
-	ABORT_ON(parse_events__modifier_event(list, $2, false));
-	$$ = list;
-}
-|
-event_name
-
-event_name:
-PE_EVENT_NAME event_def
-{
-	ABORT_ON(parse_events_name($2, $1));
-	free($1);
-	$$ = $2;
-}
-|
-event_def
-
-event_def: event_pmu |
-	   event_legacy_symbol |
-	   event_legacy_cache sep_dc |
-	   event_legacy_mem |
-	   event_legacy_tracepoint sep_dc |
-	   event_legacy_numeric sep_dc |
-	   event_legacy_raw sep_dc
-
-event_pmu:
-PE_NAME '/' event_config '/'
-{
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_pmu(list, &data->idx, $1, $3));
-	parse_events__free_terms($3);
-	$$ = list;
-}
-
-value_sym:
-PE_VALUE_SYM_HW
-|
-PE_VALUE_SYM_SW
-
-event_legacy_symbol:
-value_sym '/' event_config '/'
-{
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-	int type = $1 >> 16;
-	int config = $1 & 255;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_numeric(list, &data->idx,
-					  type, config, $3));
-	parse_events__free_terms($3);
-	$$ = list;
-}
-|
-value_sym sep_slash_dc
-{
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-	int type = $1 >> 16;
-	int config = $1 & 255;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_numeric(list, &data->idx,
-					  type, config, NULL));
-	$$ = list;
-}
-
-event_legacy_cache:
-PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT '-' PE_NAME_CACHE_OP_RESULT
-{
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_cache(list, &data->idx, $1, $3, $5));
-	$$ = list;
-}
-|
-PE_NAME_CACHE_TYPE '-' PE_NAME_CACHE_OP_RESULT
-{
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_cache(list, &data->idx, $1, $3, NULL));
-	$$ = list;
-}
-|
-PE_NAME_CACHE_TYPE
-{
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_cache(list, &data->idx, $1, NULL, NULL));
-	$$ = list;
-}
-
-event_legacy_mem:
-PE_PREFIX_MEM PE_VALUE ':' PE_MODIFIER_BP sep_dc
-{
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
-					     (void *) $2, $4));
-	$$ = list;
-}
-|
-PE_PREFIX_MEM PE_VALUE sep_dc
-{
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_breakpoint(list, &data->idx,
-					     (void *) $2, NULL));
-	$$ = list;
-}
-
-event_legacy_tracepoint:
-PE_NAME ':' PE_NAME
-{
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_tracepoint(list, &data->idx, $1, $3));
-	$$ = list;
-}
-
-event_legacy_numeric:
-PE_VALUE ':' PE_VALUE
-{
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_numeric(list, &data->idx, (u32)$1, $3, NULL));
-	$$ = list;
-}
-
-event_legacy_raw:
-PE_RAW
-{
-	struct parse_events_evlist *data = _data;
-	struct list_head *list;
-
-	ALLOC_LIST(list);
-	ABORT_ON(parse_events_add_numeric(list, &data->idx,
-					  PERF_TYPE_RAW, $1, NULL));
-	$$ = list;
-}
-
-start_terms: event_config
-{
-	struct parse_events_terms *data = _data;
-	data->terms = $1;
-}
-
-event_config:
-event_config ',' event_term
-{
-	struct list_head *head = $1;
-	struct parse_events_term *term = $3;
-
-	ABORT_ON(!head);
-	list_add_tail(&term->list, head);
-	$$ = $1;
-}
-|
-event_term
-{
-	struct list_head *head = malloc(sizeof(*head));
-	struct parse_events_term *term = $1;
-
-	ABORT_ON(!head);
-	INIT_LIST_HEAD(head);
-	list_add_tail(&term->list, head);
-	$$ = head;
-}
-
-event_term:
-PE_NAME '=' PE_NAME
-{
-	struct parse_events_term *term;
-
-	ABORT_ON(parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER,
-					$1, $3));
-	$$ = term;
-}
-|
-PE_NAME '=' PE_VALUE
-{
-	struct parse_events_term *term;
-
-	ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
-					$1, $3));
-	$$ = term;
-}
-|
-PE_NAME '=' PE_VALUE_SYM_HW
-{
-	struct parse_events_term *term;
-	int config = $3 & 255;
-
-	ABORT_ON(parse_events_term__sym_hw(&term, $1, config));
-	$$ = term;
-}
-|
-PE_NAME
-{
-	struct parse_events_term *term;
-
-	ABORT_ON(parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
-					$1, 1));
-	$$ = term;
-}
-|
-PE_VALUE_SYM_HW
-{
-	struct parse_events_term *term;
-	int config = $1 & 255;
-
-	ABORT_ON(parse_events_term__sym_hw(&term, NULL, config));
-	$$ = term;
-}
-|
-PE_TERM '=' PE_NAME
-{
-	struct parse_events_term *term;
-
-	ABORT_ON(parse_events_term__str(&term, (int)$1, NULL, $3));
-	$$ = term;
-}
-|
-PE_TERM '=' PE_VALUE
-{
-	struct parse_events_term *term;
-
-	ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3));
-	$$ = term;
-}
-|
-PE_TERM
-{
-	struct parse_events_term *term;
-
-	ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1));
-	$$ = term;
-}
-
-sep_dc: ':' |
-
-sep_slash_dc: '/' | ':' |
-
-%%
-
-void parse_events_error(void *data __maybe_unused, void *scanner __maybe_unused,
-			char const *msg __maybe_unused)
-{
-}
diff --git a/src/tools/perf/util/parse-options.c b/src/tools/perf/util/parse-options.c
deleted file mode 100644
index 2bc9e70..0000000
--- a/src/tools/perf/util/parse-options.c
+++ /dev/null
@@ -1,589 +0,0 @@
-#include "util.h"
-#include "parse-options.h"
-#include "cache.h"
-#include "header.h"
-
-#define OPT_SHORT 1
-#define OPT_UNSET 2
-
-static int opterror(const struct option *opt, const char *reason, int flags)
-{
-	if (flags & OPT_SHORT)
-		return error("switch `%c' %s", opt->short_name, reason);
-	if (flags & OPT_UNSET)
-		return error("option `no-%s' %s", opt->long_name, reason);
-	return error("option `%s' %s", opt->long_name, reason);
-}
-
-static int get_arg(struct parse_opt_ctx_t *p, const struct option *opt,
-		   int flags, const char **arg)
-{
-	if (p->opt) {
-		*arg = p->opt;
-		p->opt = NULL;
-	} else if ((opt->flags & PARSE_OPT_LASTARG_DEFAULT) && (p->argc == 1 ||
-		    **(p->argv + 1) == '-')) {
-		*arg = (const char *)opt->defval;
-	} else if (p->argc > 1) {
-		p->argc--;
-		*arg = *++p->argv;
-	} else
-		return opterror(opt, "requires a value", flags);
-	return 0;
-}
-
-static int get_value(struct parse_opt_ctx_t *p,
-		     const struct option *opt, int flags)
-{
-	const char *s, *arg = NULL;
-	const int unset = flags & OPT_UNSET;
-
-	if (unset && p->opt)
-		return opterror(opt, "takes no value", flags);
-	if (unset && (opt->flags & PARSE_OPT_NONEG))
-		return opterror(opt, "isn't available", flags);
-
-	if (!(flags & OPT_SHORT) && p->opt) {
-		switch (opt->type) {
-		case OPTION_CALLBACK:
-			if (!(opt->flags & PARSE_OPT_NOARG))
-				break;
-			/* FALLTHROUGH */
-		case OPTION_BOOLEAN:
-		case OPTION_INCR:
-		case OPTION_BIT:
-		case OPTION_SET_UINT:
-		case OPTION_SET_PTR:
-			return opterror(opt, "takes no value", flags);
-		case OPTION_END:
-		case OPTION_ARGUMENT:
-		case OPTION_GROUP:
-		case OPTION_STRING:
-		case OPTION_INTEGER:
-		case OPTION_UINTEGER:
-		case OPTION_LONG:
-		case OPTION_U64:
-		default:
-			break;
-		}
-	}
-
-	switch (opt->type) {
-	case OPTION_BIT:
-		if (unset)
-			*(int *)opt->value &= ~opt->defval;
-		else
-			*(int *)opt->value |= opt->defval;
-		return 0;
-
-	case OPTION_BOOLEAN:
-		*(bool *)opt->value = unset ? false : true;
-		return 0;
-
-	case OPTION_INCR:
-		*(int *)opt->value = unset ? 0 : *(int *)opt->value + 1;
-		return 0;
-
-	case OPTION_SET_UINT:
-		*(unsigned int *)opt->value = unset ? 0 : opt->defval;
-		return 0;
-
-	case OPTION_SET_PTR:
-		*(void **)opt->value = unset ? NULL : (void *)opt->defval;
-		return 0;
-
-	case OPTION_STRING:
-		if (unset)
-			*(const char **)opt->value = NULL;
-		else if (opt->flags & PARSE_OPT_OPTARG && !p->opt)
-			*(const char **)opt->value = (const char *)opt->defval;
-		else
-			return get_arg(p, opt, flags, (const char **)opt->value);
-		return 0;
-
-	case OPTION_CALLBACK:
-		if (unset)
-			return (*opt->callback)(opt, NULL, 1) ? (-1) : 0;
-		if (opt->flags & PARSE_OPT_NOARG)
-			return (*opt->callback)(opt, NULL, 0) ? (-1) : 0;
-		if (opt->flags & PARSE_OPT_OPTARG && !p->opt)
-			return (*opt->callback)(opt, NULL, 0) ? (-1) : 0;
-		if (get_arg(p, opt, flags, &arg))
-			return -1;
-		return (*opt->callback)(opt, arg, 0) ? (-1) : 0;
-
-	case OPTION_INTEGER:
-		if (unset) {
-			*(int *)opt->value = 0;
-			return 0;
-		}
-		if (opt->flags & PARSE_OPT_OPTARG && !p->opt) {
-			*(int *)opt->value = opt->defval;
-			return 0;
-		}
-		if (get_arg(p, opt, flags, &arg))
-			return -1;
-		*(int *)opt->value = strtol(arg, (char **)&s, 10);
-		if (*s)
-			return opterror(opt, "expects a numerical value", flags);
-		return 0;
-
-	case OPTION_UINTEGER:
-		if (unset) {
-			*(unsigned int *)opt->value = 0;
-			return 0;
-		}
-		if (opt->flags & PARSE_OPT_OPTARG && !p->opt) {
-			*(unsigned int *)opt->value = opt->defval;
-			return 0;
-		}
-		if (get_arg(p, opt, flags, &arg))
-			return -1;
-		*(unsigned int *)opt->value = strtol(arg, (char **)&s, 10);
-		if (*s)
-			return opterror(opt, "expects a numerical value", flags);
-		return 0;
-
-	case OPTION_LONG:
-		if (unset) {
-			*(long *)opt->value = 0;
-			return 0;
-		}
-		if (opt->flags & PARSE_OPT_OPTARG && !p->opt) {
-			*(long *)opt->value = opt->defval;
-			return 0;
-		}
-		if (get_arg(p, opt, flags, &arg))
-			return -1;
-		*(long *)opt->value = strtol(arg, (char **)&s, 10);
-		if (*s)
-			return opterror(opt, "expects a numerical value", flags);
-		return 0;
-
-	case OPTION_U64:
-		if (unset) {
-			*(u64 *)opt->value = 0;
-			return 0;
-		}
-		if (opt->flags & PARSE_OPT_OPTARG && !p->opt) {
-			*(u64 *)opt->value = opt->defval;
-			return 0;
-		}
-		if (get_arg(p, opt, flags, &arg))
-			return -1;
-		*(u64 *)opt->value = strtoull(arg, (char **)&s, 10);
-		if (*s)
-			return opterror(opt, "expects a numerical value", flags);
-		return 0;
-
-	case OPTION_END:
-	case OPTION_ARGUMENT:
-	case OPTION_GROUP:
-	default:
-		die("should not happen, someone must be hit on the forehead");
-	}
-}
-
-static int parse_short_opt(struct parse_opt_ctx_t *p, const struct option *options)
-{
-	for (; options->type != OPTION_END; options++) {
-		if (options->short_name == *p->opt) {
-			p->opt = p->opt[1] ? p->opt + 1 : NULL;
-			return get_value(p, options, OPT_SHORT);
-		}
-	}
-	return -2;
-}
-
-static int parse_long_opt(struct parse_opt_ctx_t *p, const char *arg,
-                          const struct option *options)
-{
-	const char *arg_end = strchr(arg, '=');
-	const struct option *abbrev_option = NULL, *ambiguous_option = NULL;
-	int abbrev_flags = 0, ambiguous_flags = 0;
-
-	if (!arg_end)
-		arg_end = arg + strlen(arg);
-
-	for (; options->type != OPTION_END; options++) {
-		const char *rest;
-		int flags = 0;
-
-		if (!options->long_name)
-			continue;
-
-		rest = skip_prefix(arg, options->long_name);
-		if (options->type == OPTION_ARGUMENT) {
-			if (!rest)
-				continue;
-			if (*rest == '=')
-				return opterror(options, "takes no value", flags);
-			if (*rest)
-				continue;
-			p->out[p->cpidx++] = arg - 2;
-			return 0;
-		}
-		if (!rest) {
-			/* abbreviated? */
-			if (!strncmp(options->long_name, arg, arg_end - arg)) {
-is_abbreviated:
-				if (abbrev_option) {
-					/*
-					 * If this is abbreviated, it is
-					 * ambiguous. So when there is no
-					 * exact match later, we need to
-					 * error out.
-					 */
-					ambiguous_option = abbrev_option;
-					ambiguous_flags = abbrev_flags;
-				}
-				if (!(flags & OPT_UNSET) && *arg_end)
-					p->opt = arg_end + 1;
-				abbrev_option = options;
-				abbrev_flags = flags;
-				continue;
-			}
-			/* negated and abbreviated very much? */
-			if (!prefixcmp("no-", arg)) {
-				flags |= OPT_UNSET;
-				goto is_abbreviated;
-			}
-			/* negated? */
-			if (strncmp(arg, "no-", 3))
-				continue;
-			flags |= OPT_UNSET;
-			rest = skip_prefix(arg + 3, options->long_name);
-			/* abbreviated and negated? */
-			if (!rest && !prefixcmp(options->long_name, arg + 3))
-				goto is_abbreviated;
-			if (!rest)
-				continue;
-		}
-		if (*rest) {
-			if (*rest != '=')
-				continue;
-			p->opt = rest + 1;
-		}
-		return get_value(p, options, flags);
-	}
-
-	if (ambiguous_option)
-		return error("Ambiguous option: %s "
-			"(could be --%s%s or --%s%s)",
-			arg,
-			(ambiguous_flags & OPT_UNSET) ?  "no-" : "",
-			ambiguous_option->long_name,
-			(abbrev_flags & OPT_UNSET) ?  "no-" : "",
-			abbrev_option->long_name);
-	if (abbrev_option)
-		return get_value(p, abbrev_option, abbrev_flags);
-	return -2;
-}
-
-static void check_typos(const char *arg, const struct option *options)
-{
-	if (strlen(arg) < 3)
-		return;
-
-	if (!prefixcmp(arg, "no-")) {
-		error ("did you mean `--%s` (with two dashes ?)", arg);
-		exit(129);
-	}
-
-	for (; options->type != OPTION_END; options++) {
-		if (!options->long_name)
-			continue;
-		if (!prefixcmp(options->long_name, arg)) {
-			error ("did you mean `--%s` (with two dashes ?)", arg);
-			exit(129);
-		}
-	}
-}
-
-void parse_options_start(struct parse_opt_ctx_t *ctx,
-			 int argc, const char **argv, int flags)
-{
-	memset(ctx, 0, sizeof(*ctx));
-	ctx->argc = argc - 1;
-	ctx->argv = argv + 1;
-	ctx->out  = argv;
-	ctx->cpidx = ((flags & PARSE_OPT_KEEP_ARGV0) != 0);
-	ctx->flags = flags;
-	if ((flags & PARSE_OPT_KEEP_UNKNOWN) &&
-	    (flags & PARSE_OPT_STOP_AT_NON_OPTION))
-		die("STOP_AT_NON_OPTION and KEEP_UNKNOWN don't go together");
-}
-
-static int usage_with_options_internal(const char * const *,
-				       const struct option *, int);
-
-int parse_options_step(struct parse_opt_ctx_t *ctx,
-		       const struct option *options,
-		       const char * const usagestr[])
-{
-	int internal_help = !(ctx->flags & PARSE_OPT_NO_INTERNAL_HELP);
-
-	/* we must reset ->opt, unknown short option leave it dangling */
-	ctx->opt = NULL;
-
-	for (; ctx->argc; ctx->argc--, ctx->argv++) {
-		const char *arg = ctx->argv[0];
-
-		if (*arg != '-' || !arg[1]) {
-			if (ctx->flags & PARSE_OPT_STOP_AT_NON_OPTION)
-				break;
-			ctx->out[ctx->cpidx++] = ctx->argv[0];
-			continue;
-		}
-
-		if (arg[1] != '-') {
-			ctx->opt = arg + 1;
-			if (internal_help && *ctx->opt == 'h')
-				return parse_options_usage(usagestr, options);
-			switch (parse_short_opt(ctx, options)) {
-			case -1:
-				return parse_options_usage(usagestr, options);
-			case -2:
-				goto unknown;
-			default:
-				break;
-			}
-			if (ctx->opt)
-				check_typos(arg + 1, options);
-			while (ctx->opt) {
-				if (internal_help && *ctx->opt == 'h')
-					return parse_options_usage(usagestr, options);
-				switch (parse_short_opt(ctx, options)) {
-				case -1:
-					return parse_options_usage(usagestr, options);
-				case -2:
-					/* fake a short option thing to hide the fact that we may have
-					 * started to parse aggregated stuff
-					 *
-					 * This is leaky, too bad.
-					 */
-					ctx->argv[0] = strdup(ctx->opt - 1);
-					*(char *)ctx->argv[0] = '-';
-					goto unknown;
-				default:
-					break;
-				}
-			}
-			continue;
-		}
-
-		if (!arg[2]) { /* "--" */
-			if (!(ctx->flags & PARSE_OPT_KEEP_DASHDASH)) {
-				ctx->argc--;
-				ctx->argv++;
-			}
-			break;
-		}
-
-		if (internal_help && !strcmp(arg + 2, "help-all"))
-			return usage_with_options_internal(usagestr, options, 1);
-		if (internal_help && !strcmp(arg + 2, "help"))
-			return parse_options_usage(usagestr, options);
-		if (!strcmp(arg + 2, "list-opts"))
-			return PARSE_OPT_LIST;
-		switch (parse_long_opt(ctx, arg + 2, options)) {
-		case -1:
-			return parse_options_usage(usagestr, options);
-		case -2:
-			goto unknown;
-		default:
-			break;
-		}
-		continue;
-unknown:
-		if (!(ctx->flags & PARSE_OPT_KEEP_UNKNOWN))
-			return PARSE_OPT_UNKNOWN;
-		ctx->out[ctx->cpidx++] = ctx->argv[0];
-		ctx->opt = NULL;
-	}
-	return PARSE_OPT_DONE;
-}
-
-int parse_options_end(struct parse_opt_ctx_t *ctx)
-{
-	memmove(ctx->out + ctx->cpidx, ctx->argv, ctx->argc * sizeof(*ctx->out));
-	ctx->out[ctx->cpidx + ctx->argc] = NULL;
-	return ctx->cpidx + ctx->argc;
-}
-
-int parse_options(int argc, const char **argv, const struct option *options,
-		  const char * const usagestr[], int flags)
-{
-	struct parse_opt_ctx_t ctx;
-
-	perf_header__set_cmdline(argc, argv);
-
-	parse_options_start(&ctx, argc, argv, flags);
-	switch (parse_options_step(&ctx, options, usagestr)) {
-	case PARSE_OPT_HELP:
-		exit(129);
-	case PARSE_OPT_DONE:
-		break;
-	case PARSE_OPT_LIST:
-		while (options->type != OPTION_END) {
-			printf("--%s ", options->long_name);
-			options++;
-		}
-		exit(130);
-	default: /* PARSE_OPT_UNKNOWN */
-		if (ctx.argv[0][1] == '-') {
-			error("unknown option `%s'", ctx.argv[0] + 2);
-		} else {
-			error("unknown switch `%c'", *ctx.opt);
-		}
-		usage_with_options(usagestr, options);
-	}
-
-	return parse_options_end(&ctx);
-}
-
-#define USAGE_OPTS_WIDTH 24
-#define USAGE_GAP         2
-
-int usage_with_options_internal(const char * const *usagestr,
-				const struct option *opts, int full)
-{
-	if (!usagestr)
-		return PARSE_OPT_HELP;
-
-	fprintf(stderr, "\n usage: %s\n", *usagestr++);
-	while (*usagestr && **usagestr)
-		fprintf(stderr, "    or: %s\n", *usagestr++);
-	while (*usagestr) {
-		fprintf(stderr, "%s%s\n",
-				**usagestr ? "    " : "",
-				*usagestr);
-		usagestr++;
-	}
-
-	if (opts->type != OPTION_GROUP)
-		fputc('\n', stderr);
-
-	for (; opts->type != OPTION_END; opts++) {
-		size_t pos;
-		int pad;
-
-		if (opts->type == OPTION_GROUP) {
-			fputc('\n', stderr);
-			if (*opts->help)
-				fprintf(stderr, "%s\n", opts->help);
-			continue;
-		}
-		if (!full && (opts->flags & PARSE_OPT_HIDDEN))
-			continue;
-
-		pos = fprintf(stderr, "    ");
-		if (opts->short_name)
-			pos += fprintf(stderr, "-%c", opts->short_name);
-		else
-			pos += fprintf(stderr, "    ");
-
-		if (opts->long_name && opts->short_name)
-			pos += fprintf(stderr, ", ");
-		if (opts->long_name)
-			pos += fprintf(stderr, "--%s", opts->long_name);
-
-		switch (opts->type) {
-		case OPTION_ARGUMENT:
-			break;
-		case OPTION_LONG:
-		case OPTION_U64:
-		case OPTION_INTEGER:
-		case OPTION_UINTEGER:
-			if (opts->flags & PARSE_OPT_OPTARG)
-				if (opts->long_name)
-					pos += fprintf(stderr, "[=<n>]");
-				else
-					pos += fprintf(stderr, "[<n>]");
-			else
-				pos += fprintf(stderr, " <n>");
-			break;
-		case OPTION_CALLBACK:
-			if (opts->flags & PARSE_OPT_NOARG)
-				break;
-			/* FALLTHROUGH */
-		case OPTION_STRING:
-			if (opts->argh) {
-				if (opts->flags & PARSE_OPT_OPTARG)
-					if (opts->long_name)
-						pos += fprintf(stderr, "[=<%s>]", opts->argh);
-					else
-						pos += fprintf(stderr, "[<%s>]", opts->argh);
-				else
-					pos += fprintf(stderr, " <%s>", opts->argh);
-			} else {
-				if (opts->flags & PARSE_OPT_OPTARG)
-					if (opts->long_name)
-						pos += fprintf(stderr, "[=...]");
-					else
-						pos += fprintf(stderr, "[...]");
-				else
-					pos += fprintf(stderr, " ...");
-			}
-			break;
-		default: /* OPTION_{BIT,BOOLEAN,SET_UINT,SET_PTR} */
-		case OPTION_END:
-		case OPTION_GROUP:
-		case OPTION_BIT:
-		case OPTION_BOOLEAN:
-		case OPTION_INCR:
-		case OPTION_SET_UINT:
-		case OPTION_SET_PTR:
-			break;
-		}
-
-		if (pos <= USAGE_OPTS_WIDTH)
-			pad = USAGE_OPTS_WIDTH - pos;
-		else {
-			fputc('\n', stderr);
-			pad = USAGE_OPTS_WIDTH;
-		}
-		fprintf(stderr, "%*s%s\n", pad + USAGE_GAP, "", opts->help);
-	}
-	fputc('\n', stderr);
-
-	return PARSE_OPT_HELP;
-}
-
-void usage_with_options(const char * const *usagestr,
-			const struct option *opts)
-{
-	exit_browser(false);
-	usage_with_options_internal(usagestr, opts, 0);
-	exit(129);
-}
-
-int parse_options_usage(const char * const *usagestr,
-			const struct option *opts)
-{
-	return usage_with_options_internal(usagestr, opts, 0);
-}
-
-
-int parse_opt_verbosity_cb(const struct option *opt,
-			   const char *arg __maybe_unused,
-			   int unset)
-{
-	int *target = opt->value;
-
-	if (unset)
-		/* --no-quiet, --no-verbose */
-		*target = 0;
-	else if (opt->short_name == 'v') {
-		if (*target >= 0)
-			(*target)++;
-		else
-			*target = 1;
-	} else {
-		if (*target <= 0)
-			(*target)--;
-		else
-			*target = -1;
-	}
-	return 0;
-}
diff --git a/src/tools/perf/util/parse-options.h b/src/tools/perf/util/parse-options.h
deleted file mode 100644
index 7bb5999..0000000
--- a/src/tools/perf/util/parse-options.h
+++ /dev/null
@@ -1,193 +0,0 @@
-#ifndef __PERF_PARSE_OPTIONS_H
-#define __PERF_PARSE_OPTIONS_H
-
-#include <linux/kernel.h>
-#include <stdbool.h>
-
-enum parse_opt_type {
-	/* special types */
-	OPTION_END,
-	OPTION_ARGUMENT,
-	OPTION_GROUP,
-	/* options with no arguments */
-	OPTION_BIT,
-	OPTION_BOOLEAN,
-	OPTION_INCR,
-	OPTION_SET_UINT,
-	OPTION_SET_PTR,
-	/* options with arguments (usually) */
-	OPTION_STRING,
-	OPTION_INTEGER,
-	OPTION_LONG,
-	OPTION_CALLBACK,
-	OPTION_U64,
-	OPTION_UINTEGER,
-};
-
-enum parse_opt_flags {
-	PARSE_OPT_KEEP_DASHDASH = 1,
-	PARSE_OPT_STOP_AT_NON_OPTION = 2,
-	PARSE_OPT_KEEP_ARGV0 = 4,
-	PARSE_OPT_KEEP_UNKNOWN = 8,
-	PARSE_OPT_NO_INTERNAL_HELP = 16,
-};
-
-enum parse_opt_option_flags {
-	PARSE_OPT_OPTARG  = 1,
-	PARSE_OPT_NOARG   = 2,
-	PARSE_OPT_NONEG   = 4,
-	PARSE_OPT_HIDDEN  = 8,
-	PARSE_OPT_LASTARG_DEFAULT = 16,
-};
-
-struct option;
-typedef int parse_opt_cb(const struct option *, const char *arg, int unset);
-
-/*
- * `type`::
- *   holds the type of the option, you must have an OPTION_END last in your
- *   array.
- *
- * `short_name`::
- *   the character to use as a short option name, '\0' if none.
- *
- * `long_name`::
- *   the long option name, without the leading dashes, NULL if none.
- *
- * `value`::
- *   stores pointers to the values to be filled.
- *
- * `argh`::
- *   token to explain the kind of argument this option wants. Keep it
- *   homogenous across the repository.
- *
- * `help`::
- *   the short help associated to what the option does.
- *   Must never be NULL (except for OPTION_END).
- *   OPTION_GROUP uses this pointer to store the group header.
- *
- * `flags`::
- *   mask of parse_opt_option_flags.
- *   PARSE_OPT_OPTARG: says that the argument is optionnal (not for BOOLEANs)
- *   PARSE_OPT_NOARG: says that this option takes no argument, for CALLBACKs
- *   PARSE_OPT_NONEG: says that this option cannot be negated
- *   PARSE_OPT_HIDDEN this option is skipped in the default usage, showed in
- *                    the long one.
- *
- * `callback`::
- *   pointer to the callback to use for OPTION_CALLBACK.
- *
- * `defval`::
- *   default value to fill (*->value) with for PARSE_OPT_OPTARG.
- *   OPTION_{BIT,SET_UINT,SET_PTR} store the {mask,integer,pointer} to put in
- *   the value when met.
- *   CALLBACKS can use it like they want.
- */
-struct option {
-	enum parse_opt_type type;
-	int short_name;
-	const char *long_name;
-	void *value;
-	const char *argh;
-	const char *help;
-
-	int flags;
-	parse_opt_cb *callback;
-	intptr_t defval;
-};
-
-#define check_vtype(v, type) ( BUILD_BUG_ON_ZERO(!__builtin_types_compatible_p(typeof(v), type)) + v )
-
-#define OPT_END()                   { .type = OPTION_END }
-#define OPT_ARGUMENT(l, h)          { .type = OPTION_ARGUMENT, .long_name = (l), .help = (h) }
-#define OPT_GROUP(h)                { .type = OPTION_GROUP, .help = (h) }
-#define OPT_BIT(s, l, v, h, b)      { .type = OPTION_BIT, .short_name = (s), .long_name = (l), .value = check_vtype(v, int *), .help = (h), .defval = (b) }
-#define OPT_BOOLEAN(s, l, v, h)     { .type = OPTION_BOOLEAN, .short_name = (s), .long_name = (l), .value = check_vtype(v, bool *), .help = (h) }
-#define OPT_INCR(s, l, v, h)        { .type = OPTION_INCR, .short_name = (s), .long_name = (l), .value = check_vtype(v, int *), .help = (h) }
-#define OPT_SET_UINT(s, l, v, h, i)  { .type = OPTION_SET_UINT, .short_name = (s), .long_name = (l), .value = check_vtype(v, unsigned int *), .help = (h), .defval = (i) }
-#define OPT_SET_PTR(s, l, v, h, p)  { .type = OPTION_SET_PTR, .short_name = (s), .long_name = (l), .value = (v), .help = (h), .defval = (p) }
-#define OPT_INTEGER(s, l, v, h)     { .type = OPTION_INTEGER, .short_name = (s), .long_name = (l), .value = check_vtype(v, int *), .help = (h) }
-#define OPT_UINTEGER(s, l, v, h)    { .type = OPTION_UINTEGER, .short_name = (s), .long_name = (l), .value = check_vtype(v, unsigned int *), .help = (h) }
-#define OPT_LONG(s, l, v, h)        { .type = OPTION_LONG, .short_name = (s), .long_name = (l), .value = check_vtype(v, long *), .help = (h) }
-#define OPT_U64(s, l, v, h)         { .type = OPTION_U64, .short_name = (s), .long_name = (l), .value = check_vtype(v, u64 *), .help = (h) }
-#define OPT_STRING(s, l, v, a, h)   { .type = OPTION_STRING,  .short_name = (s), .long_name = (l), .value = check_vtype(v, const char **), (a), .help = (h) }
-#define OPT_DATE(s, l, v, h) \
-	{ .type = OPTION_CALLBACK, .short_name = (s), .long_name = (l), .value = (v), .argh = "time", .help = (h), .callback = parse_opt_approxidate_cb }
-#define OPT_CALLBACK(s, l, v, a, h, f) \
-	{ .type = OPTION_CALLBACK, .short_name = (s), .long_name = (l), .value = (v), (a), .help = (h), .callback = (f) }
-#define OPT_CALLBACK_NOOPT(s, l, v, a, h, f) \
-	{ .type = OPTION_CALLBACK, .short_name = (s), .long_name = (l), .value = (v), (a), .help = (h), .callback = (f), .flags = PARSE_OPT_NOARG }
-#define OPT_CALLBACK_DEFAULT(s, l, v, a, h, f, d) \
-	{ .type = OPTION_CALLBACK, .short_name = (s), .long_name = (l), .value = (v), (a), .help = (h), .callback = (f), .defval = (intptr_t)d, .flags = PARSE_OPT_LASTARG_DEFAULT }
-#define OPT_CALLBACK_DEFAULT_NOOPT(s, l, v, a, h, f, d) \
-	{ .type = OPTION_CALLBACK, .short_name = (s), .long_name = (l),\
-	.value = (v), (a), .help = (h), .callback = (f), .defval = (intptr_t)d,\
-	.flags = PARSE_OPT_LASTARG_DEFAULT | PARSE_OPT_NOARG}
-
-/* parse_options() will filter out the processed options and leave the
- * non-option argments in argv[].
- * Returns the number of arguments left in argv[].
- */
-extern int parse_options(int argc, const char **argv,
-                         const struct option *options,
-                         const char * const usagestr[], int flags);
-
-extern NORETURN void usage_with_options(const char * const *usagestr,
-                                        const struct option *options);
-
-/*----- incremantal advanced APIs -----*/
-
-enum {
-	PARSE_OPT_HELP = -1,
-	PARSE_OPT_DONE,
-	PARSE_OPT_LIST,
-	PARSE_OPT_UNKNOWN,
-};
-
-/*
- * It's okay for the caller to consume argv/argc in the usual way.
- * Other fields of that structure are private to parse-options and should not
- * be modified in any way.
- */
-struct parse_opt_ctx_t {
-	const char **argv;
-	const char **out;
-	int argc, cpidx;
-	const char *opt;
-	int flags;
-};
-
-extern int parse_options_usage(const char * const *usagestr,
-			       const struct option *opts);
-
-extern void parse_options_start(struct parse_opt_ctx_t *ctx,
-				int argc, const char **argv, int flags);
-
-extern int parse_options_step(struct parse_opt_ctx_t *ctx,
-			      const struct option *options,
-			      const char * const usagestr[]);
-
-extern int parse_options_end(struct parse_opt_ctx_t *ctx);
-
-
-/*----- some often used options -----*/
-extern int parse_opt_abbrev_cb(const struct option *, const char *, int);
-extern int parse_opt_approxidate_cb(const struct option *, const char *, int);
-extern int parse_opt_verbosity_cb(const struct option *, const char *, int);
-
-#define OPT__VERBOSE(var)  OPT_BOOLEAN('v', "verbose", (var), "be verbose")
-#define OPT__QUIET(var)    OPT_BOOLEAN('q', "quiet",   (var), "be quiet")
-#define OPT__VERBOSITY(var) \
-	{ OPTION_CALLBACK, 'v', "verbose", (var), NULL, "be more verbose", \
-	  PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 }, \
-	{ OPTION_CALLBACK, 'q', "quiet", (var), NULL, "be more quiet", \
-	  PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 }
-#define OPT__DRY_RUN(var)  OPT_BOOLEAN('n', "dry-run", (var), "dry run")
-#define OPT__ABBREV(var)  \
-	{ OPTION_CALLBACK, 0, "abbrev", (var), "n", \
-	  "use <n> digits to display SHA-1s", \
-	  PARSE_OPT_OPTARG, &parse_opt_abbrev_cb, 0 }
-
-extern const char *parse_options_fix_filename(const char *prefix, const char *file);
-
-#endif /* __PERF_PARSE_OPTIONS_H */
diff --git a/src/tools/perf/util/path.c b/src/tools/perf/util/path.c
deleted file mode 100644
index a8c4954..0000000
--- a/src/tools/perf/util/path.c
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * I'm tired of doing "vsnprintf()" etc just to open a
- * file, so here's a "return static buffer with printf"
- * interface for paths.
- *
- * It's obviously not thread-safe. Sue me. But it's quite
- * useful for doing things like
- *
- *   f = open(mkpath("%s/%s.perf", base, name), O_RDONLY);
- *
- * which is what it's designed for.
- */
-#include "cache.h"
-
-static char bad_path[] = "/bad-path/";
-/*
- * Two hacks:
- */
-
-static const char *get_perf_dir(void)
-{
-	return ".";
-}
-
-#ifndef HAVE_STRLCPY
-size_t strlcpy(char *dest, const char *src, size_t size)
-{
-	size_t ret = strlen(src);
-
-	if (size) {
-		size_t len = (ret >= size) ? size - 1 : ret;
-		memcpy(dest, src, len);
-		dest[len] = '\0';
-	}
-	return ret;
-}
-#endif
-
-static char *get_pathname(void)
-{
-	static char pathname_array[4][PATH_MAX];
-	static int idx;
-
-	return pathname_array[3 & ++idx];
-}
-
-static char *cleanup_path(char *path)
-{
-	/* Clean it up */
-	if (!memcmp(path, "./", 2)) {
-		path += 2;
-		while (*path == '/')
-			path++;
-	}
-	return path;
-}
-
-static char *perf_vsnpath(char *buf, size_t n, const char *fmt, va_list args)
-{
-	const char *perf_dir = get_perf_dir();
-	size_t len;
-
-	len = strlen(perf_dir);
-	if (n < len + 1)
-		goto bad;
-	memcpy(buf, perf_dir, len);
-	if (len && !is_dir_sep(perf_dir[len-1]))
-		buf[len++] = '/';
-	len += vsnprintf(buf + len, n - len, fmt, args);
-	if (len >= n)
-		goto bad;
-	return cleanup_path(buf);
-bad:
-	strlcpy(buf, bad_path, n);
-	return buf;
-}
-
-char *perf_pathdup(const char *fmt, ...)
-{
-	char path[PATH_MAX];
-	va_list args;
-	va_start(args, fmt);
-	(void)perf_vsnpath(path, sizeof(path), fmt, args);
-	va_end(args);
-	return xstrdup(path);
-}
-
-char *mkpath(const char *fmt, ...)
-{
-	va_list args;
-	unsigned len;
-	char *pathname = get_pathname();
-
-	va_start(args, fmt);
-	len = vsnprintf(pathname, PATH_MAX, fmt, args);
-	va_end(args);
-	if (len >= PATH_MAX)
-		return bad_path;
-	return cleanup_path(pathname);
-}
-
-char *perf_path(const char *fmt, ...)
-{
-	const char *perf_dir = get_perf_dir();
-	char *pathname = get_pathname();
-	va_list args;
-	unsigned len;
-
-	len = strlen(perf_dir);
-	if (len > PATH_MAX-100)
-		return bad_path;
-	memcpy(pathname, perf_dir, len);
-	if (len && perf_dir[len-1] != '/')
-		pathname[len++] = '/';
-	va_start(args, fmt);
-	len += vsnprintf(pathname + len, PATH_MAX - len, fmt, args);
-	va_end(args);
-	if (len >= PATH_MAX)
-		return bad_path;
-	return cleanup_path(pathname);
-}
-
-/* strip arbitrary amount of directory separators at end of path */
-static inline int chomp_trailing_dir_sep(const char *path, int len)
-{
-	while (len && is_dir_sep(path[len - 1]))
-		len--;
-	return len;
-}
-
-/*
- * If path ends with suffix (complete path components), returns the
- * part before suffix (sans trailing directory separators).
- * Otherwise returns NULL.
- */
-char *strip_path_suffix(const char *path, const char *suffix)
-{
-	int path_len = strlen(path), suffix_len = strlen(suffix);
-
-	while (suffix_len) {
-		if (!path_len)
-			return NULL;
-
-		if (is_dir_sep(path[path_len - 1])) {
-			if (!is_dir_sep(suffix[suffix_len - 1]))
-				return NULL;
-			path_len = chomp_trailing_dir_sep(path, path_len);
-			suffix_len = chomp_trailing_dir_sep(suffix, suffix_len);
-		}
-		else if (path[--path_len] != suffix[--suffix_len])
-			return NULL;
-	}
-
-	if (path_len && !is_dir_sep(path[path_len - 1]))
-		return NULL;
-	return strndup(path, chomp_trailing_dir_sep(path, path_len));
-}
diff --git a/src/tools/perf/util/perf_regs.h b/src/tools/perf/util/perf_regs.h
deleted file mode 100644
index 5a4f2b6..0000000
--- a/src/tools/perf/util/perf_regs.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef __PERF_REGS_H
-#define __PERF_REGS_H
-
-#ifdef HAVE_PERF_REGS
-#include <perf_regs.h>
-#else
-#define PERF_REGS_MASK	0
-
-static inline const char *perf_reg_name(int id __maybe_unused)
-{
-	return NULL;
-}
-#endif /* HAVE_PERF_REGS */
-#endif /* __PERF_REGS_H */
diff --git a/src/tools/perf/util/pmu-bison.c b/src/tools/perf/util/pmu-bison.c
deleted file mode 100644
index 8c546b4..0000000
--- a/src/tools/perf/util/pmu-bison.c
+++ /dev/null
@@ -1,1704 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.5.  */
-
-/* Bison implementation for Yacc-like parsers in C
-   
-      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
-   
-   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 3 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/>.  */
-
-/* As a special exception, you may create a larger work that contains
-   part or all of the Bison parser skeleton and distribute that work
-   under terms of your choice, so long as that work isn't itself a
-   parser generator using the skeleton or a modified version thereof
-   as a parser skeleton.  Alternatively, if you modify or redistribute
-   the parser skeleton itself, you may (at your option) remove this
-   special exception, which will cause the skeleton and the resulting
-   Bison output files to be licensed under the GNU General Public
-   License without this special exception.
-   
-   This special exception was added by the Free Software Foundation in
-   version 2.2 of Bison.  */
-
-/* C LALR(1) parser skeleton written by Richard Stallman, by
-   simplifying the original so-called "semantic" parser.  */
-
-/* All symbols defined below should begin with yy or YY, to avoid
-   infringing on user name space.  This should be done even for local
-   variables, as they might otherwise be expanded by user macros.
-   There are some unavoidable exceptions within include files to
-   define necessary library symbols; they are noted "INFRINGES ON
-   USER NAME SPACE" below.  */
-
-/* Identify Bison output.  */
-#define YYBISON 1
-
-/* Bison version.  */
-#define YYBISON_VERSION "2.5"
-
-/* Skeleton name.  */
-#define YYSKELETON_NAME "yacc.c"
-
-/* Pure parsers.  */
-#define YYPURE 0
-
-/* Push parsers.  */
-#define YYPUSH 0
-
-/* Pull parsers.  */
-#define YYPULL 1
-
-/* Using locations.  */
-#define YYLSP_NEEDED 0
-
-/* Substitute the variable and function names.  */
-#define yyparse         perf_pmu_parse
-#define yylex           perf_pmu_lex
-#define yyerror         perf_pmu_error
-#define yylval          perf_pmu_lval
-#define yychar          perf_pmu_char
-#define yydebug         perf_pmu_debug
-#define yynerrs         perf_pmu_nerrs
-
-
-/* Copy the first part of user declarations.  */
-
-/* Line 268 of yacc.c  */
-#line 5 "util/pmu.y"
-
-
-#include <linux/compiler.h>
-#include <linux/list.h>
-#include <linux/bitmap.h>
-#include <string.h>
-#include "pmu.h"
-
-extern int perf_pmu_lex (void);
-
-#define ABORT_ON(val) \
-do { \
-        if (val) \
-                YYABORT; \
-} while (0)
-
-
-
-/* Line 268 of yacc.c  */
-#line 98 "util/pmu-bison.c"
-
-/* Enabling traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
-
-/* Enabling verbose error messages.  */
-#ifdef YYERROR_VERBOSE
-# undef YYERROR_VERBOSE
-# define YYERROR_VERBOSE 1
-#else
-# define YYERROR_VERBOSE 0
-#endif
-
-/* Enabling the token table.  */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE 0
-#endif
-
-
-/* Tokens.  */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-     PP_CONFIG = 258,
-     PP_CONFIG1 = 259,
-     PP_CONFIG2 = 260,
-     PP_VALUE = 261,
-     PP_ERROR = 262
-   };
-#endif
-
-
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-{
-
-/* Line 293 of yacc.c  */
-#line 30 "util/pmu.y"
-
-	unsigned long num;
-	DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS);
-
-
-
-/* Line 293 of yacc.c  */
-#line 148 "util/pmu-bison.c"
-} YYSTYPE;
-# define YYSTYPE_IS_TRIVIAL 1
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-#endif
-
-
-/* Copy the second part of user declarations.  */
-
-
-/* Line 343 of yacc.c  */
-#line 160 "util/pmu-bison.c"
-
-#ifdef short
-# undef short
-#endif
-
-#ifdef YYTYPE_UINT8
-typedef YYTYPE_UINT8 yytype_uint8;
-#else
-typedef unsigned char yytype_uint8;
-#endif
-
-#ifdef YYTYPE_INT8
-typedef YYTYPE_INT8 yytype_int8;
-#elif (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-typedef signed char yytype_int8;
-#else
-typedef short int yytype_int8;
-#endif
-
-#ifdef YYTYPE_UINT16
-typedef YYTYPE_UINT16 yytype_uint16;
-#else
-typedef unsigned short int yytype_uint16;
-#endif
-
-#ifdef YYTYPE_INT16
-typedef YYTYPE_INT16 yytype_int16;
-#else
-typedef short int yytype_int16;
-#endif
-
-#ifndef YYSIZE_T
-# ifdef __SIZE_TYPE__
-#  define YYSIZE_T __SIZE_TYPE__
-# elif defined size_t
-#  define YYSIZE_T size_t
-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
-#  define YYSIZE_T size_t
-# else
-#  define YYSIZE_T unsigned int
-# endif
-#endif
-
-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
-
-#ifndef YY_
-# if defined YYENABLE_NLS && YYENABLE_NLS
-#  if ENABLE_NLS
-#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
-#   define YY_(msgid) dgettext ("bison-runtime", msgid)
-#  endif
-# endif
-# ifndef YY_
-#  define YY_(msgid) msgid
-# endif
-#endif
-
-/* Suppress unused-variable warnings by "using" E.  */
-#if ! defined lint || defined __GNUC__
-# define YYUSE(e) ((void) (e))
-#else
-# define YYUSE(e) /* empty */
-#endif
-
-/* Identity function, used to suppress warnings about constant conditions.  */
-#ifndef lint
-# define YYID(n) (n)
-#else
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static int
-YYID (int yyi)
-#else
-static int
-YYID (yyi)
-    int yyi;
-#endif
-{
-  return yyi;
-}
-#endif
-
-#if ! defined yyoverflow || YYERROR_VERBOSE
-
-/* The parser invokes alloca or malloc; define the necessary symbols.  */
-
-# ifdef YYSTACK_USE_ALLOCA
-#  if YYSTACK_USE_ALLOCA
-#   ifdef __GNUC__
-#    define YYSTACK_ALLOC __builtin_alloca
-#   elif defined __BUILTIN_VA_ARG_INCR
-#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
-#   elif defined _AIX
-#    define YYSTACK_ALLOC __alloca
-#   elif defined _MSC_VER
-#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
-#    define alloca _alloca
-#   else
-#    define YYSTACK_ALLOC alloca
-#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-#     ifndef EXIT_SUCCESS
-#      define EXIT_SUCCESS 0
-#     endif
-#    endif
-#   endif
-#  endif
-# endif
-
-# ifdef YYSTACK_ALLOC
-   /* Pacify GCC's `empty if-body' warning.  */
-#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
-#  ifndef YYSTACK_ALLOC_MAXIMUM
-    /* The OS might guarantee only one guard page at the bottom of the stack,
-       and a page size can be as small as 4096 bytes.  So we cannot safely
-       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
-       to allow for a few compiler-allocated temporary stack slots.  */
-#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
-#  endif
-# else
-#  define YYSTACK_ALLOC YYMALLOC
-#  define YYSTACK_FREE YYFREE
-#  ifndef YYSTACK_ALLOC_MAXIMUM
-#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
-#  endif
-#  if (defined __cplusplus && ! defined EXIT_SUCCESS \
-       && ! ((defined YYMALLOC || defined malloc) \
-	     && (defined YYFREE || defined free)))
-#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-#   ifndef EXIT_SUCCESS
-#    define EXIT_SUCCESS 0
-#   endif
-#  endif
-#  ifndef YYMALLOC
-#   define YYMALLOC malloc
-#   if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
-#   endif
-#  endif
-#  ifndef YYFREE
-#   define YYFREE free
-#   if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-void free (void *); /* INFRINGES ON USER NAME SPACE */
-#   endif
-#  endif
-# endif
-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
-
-
-#if (! defined yyoverflow \
-     && (! defined __cplusplus \
-	 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
-
-/* A type that is properly aligned for any stack member.  */
-union yyalloc
-{
-  yytype_int16 yyss_alloc;
-  YYSTYPE yyvs_alloc;
-};
-
-/* The size of the maximum gap between one aligned stack and the next.  */
-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
-
-/* The size of an array large to enough to hold all stacks, each with
-   N elements.  */
-# define YYSTACK_BYTES(N) \
-     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
-      + YYSTACK_GAP_MAXIMUM)
-
-# define YYCOPY_NEEDED 1
-
-/* Relocate STACK from its old location to the new one.  The
-   local variables YYSIZE and YYSTACKSIZE give the old and new number of
-   elements in the stack, and YYPTR gives the new location of the
-   stack.  Advance YYPTR to a properly aligned location for the next
-   stack.  */
-# define YYSTACK_RELOCATE(Stack_alloc, Stack)				\
-    do									\
-      {									\
-	YYSIZE_T yynewbytes;						\
-	YYCOPY (&yyptr->Stack_alloc, Stack, yysize);			\
-	Stack = &yyptr->Stack_alloc;					\
-	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
-	yyptr += yynewbytes / sizeof (*yyptr);				\
-      }									\
-    while (YYID (0))
-
-#endif
-
-#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
-/* Copy COUNT objects from FROM to TO.  The source and destination do
-   not overlap.  */
-# ifndef YYCOPY
-#  if defined __GNUC__ && 1 < __GNUC__
-#   define YYCOPY(To, From, Count) \
-      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-#  else
-#   define YYCOPY(To, From, Count)		\
-      do					\
-	{					\
-	  YYSIZE_T yyi;				\
-	  for (yyi = 0; yyi < (Count); yyi++)	\
-	    (To)[yyi] = (From)[yyi];		\
-	}					\
-      while (YYID (0))
-#  endif
-# endif
-#endif /* !YYCOPY_NEEDED */
-
-/* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  9
-/* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   17
-
-/* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  11
-/* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  5
-/* YYNRULES -- Number of rules.  */
-#define YYNRULES  10
-/* YYNRULES -- Number of states.  */
-#define YYNSTATES  20
-
-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
-#define YYUNDEFTOK  2
-#define YYMAXUTOK   262
-
-#define YYTRANSLATE(YYX)						\
-  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-
-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
-static const yytype_uint8 yytranslate[] =
-{
-       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     9,    10,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     8,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
-       5,     6,     7
-};
-
-#if YYDEBUG
-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
-   YYRHS.  */
-static const yytype_uint8 yyprhs[] =
-{
-       0,     0,     3,     6,     8,    12,    16,    20,    24,    26,
-      30
-};
-
-/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
-static const yytype_int8 yyrhs[] =
-{
-      12,     0,    -1,    12,    13,    -1,    13,    -1,     3,     8,
-      14,    -1,     4,     8,    14,    -1,     5,     8,    14,    -1,
-      14,     9,    15,    -1,    15,    -1,     6,    10,     6,    -1,
-       6,    -1
-};
-
-/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
-static const yytype_uint8 yyrline[] =
-{
-       0,    38,    38,    40,    43,    50,    57,    65,    70,    76,
-      81
-};
-#endif
-
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
-static const char *const yytname[] =
-{
-  "$end", "error", "$undefined", "PP_CONFIG", "PP_CONFIG1", "PP_CONFIG2",
-  "PP_VALUE", "PP_ERROR", "':'", "','", "'-'", "$accept", "format",
-  "format_term", "bits", "bit_term", 0
-};
-#endif
-
-# ifdef YYPRINT
-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
-   token YYLEX-NUM.  */
-static const yytype_uint16 yytoknum[] =
-{
-       0,   256,   257,   258,   259,   260,   261,   262,    58,    44,
-      45
-};
-# endif
-
-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const yytype_uint8 yyr1[] =
-{
-       0,    11,    12,    12,    13,    13,    13,    14,    14,    15,
-      15
-};
-
-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
-static const yytype_uint8 yyr2[] =
-{
-       0,     2,     2,     1,     3,     3,     3,     3,     1,     3,
-       1
-};
-
-/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
-   Performed when YYTABLE doesn't specify something else to do.  Zero
-   means the default is an error.  */
-static const yytype_uint8 yydefact[] =
-{
-       0,     0,     0,     0,     0,     3,     0,     0,     0,     1,
-       2,    10,     4,     8,     5,     6,     0,     0,     9,     7
-};
-
-/* YYDEFGOTO[NTERM-NUM].  */
-static const yytype_int8 yydefgoto[] =
-{
-      -1,     4,     5,    12,    13
-};
-
-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-   STATE-NUM.  */
-#define YYPACT_NINF -7
-static const yytype_int8 yypact[] =
-{
-       3,     1,     2,     4,     0,    -7,     5,     5,     5,    -7,
-      -7,     6,     8,    -7,     8,     8,     7,     5,    -7,    -7
-};
-
-/* YYPGOTO[NTERM-NUM].  */
-static const yytype_int8 yypgoto[] =
-{
-      -7,    -7,    10,    -6,    -2
-};
-
-/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
-   positive, shift that token.  If negative, reduce the rule which
-   number is the opposite.  If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -1
-static const yytype_uint8 yytable[] =
-{
-       9,    14,    15,     1,     2,     3,     1,     2,     3,     6,
-       7,    11,     8,    18,    10,    19,    16,    17
-};
-
-#define yypact_value_is_default(yystate) \
-  ((yystate) == (-7))
-
-#define yytable_value_is_error(yytable_value) \
-  YYID (0)
-
-static const yytype_uint8 yycheck[] =
-{
-       0,     7,     8,     3,     4,     5,     3,     4,     5,     8,
-       8,     6,     8,     6,     4,    17,    10,     9
-};
-
-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-   symbol of state STATE-NUM.  */
-static const yytype_uint8 yystos[] =
-{
-       0,     3,     4,     5,    12,    13,     8,     8,     8,     0,
-      13,     6,    14,    15,    14,    14,    10,     9,     6,    15
-};
-
-#define yyerrok		(yyerrstatus = 0)
-#define yyclearin	(yychar = YYEMPTY)
-#define YYEMPTY		(-2)
-#define YYEOF		0
-
-#define YYACCEPT	goto yyacceptlab
-#define YYABORT		goto yyabortlab
-#define YYERROR		goto yyerrorlab
-
-
-/* Like YYERROR except do call yyerror.  This remains here temporarily
-   to ease the transition to the new meaning of YYERROR, for GCC.
-   Once GCC version 2 has supplanted version 1, this can go.  However,
-   YYFAIL appears to be in use.  Nevertheless, it is formally deprecated
-   in Bison 2.4.2's NEWS entry, where a plan to phase it out is
-   discussed.  */
-
-#define YYFAIL		goto yyerrlab
-#if defined YYFAIL
-  /* This is here to suppress warnings from the GCC cpp's
-     -Wunused-macros.  Normally we don't worry about that warning, but
-     some users do, and we want to make it easy for users to remove
-     YYFAIL uses, which will produce warnings from Bison 2.5.  */
-#endif
-
-#define YYRECOVERING()  (!!yyerrstatus)
-
-#define YYBACKUP(Token, Value)					\
-do								\
-  if (yychar == YYEMPTY && yylen == 1)				\
-    {								\
-      yychar = (Token);						\
-      yylval = (Value);						\
-      YYPOPSTACK (1);						\
-      goto yybackup;						\
-    }								\
-  else								\
-    {								\
-      yyerror (format, name, YY_("syntax error: cannot back up")); \
-      YYERROR;							\
-    }								\
-while (YYID (0))
-
-
-#define YYTERROR	1
-#define YYERRCODE	256
-
-
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-   If N is 0, then set CURRENT to the empty location which ends
-   the previous symbol: RHS[0] (always defined).  */
-
-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N)				\
-    do									\
-      if (YYID (N))                                                    \
-	{								\
-	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
-	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
-	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
-	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
-	}								\
-      else								\
-	{								\
-	  (Current).first_line   = (Current).last_line   =		\
-	    YYRHSLOC (Rhs, 0).last_line;				\
-	  (Current).first_column = (Current).last_column =		\
-	    YYRHSLOC (Rhs, 0).last_column;				\
-	}								\
-    while (YYID (0))
-#endif
-
-
-/* This macro is provided for backward compatibility. */
-
-#ifndef YY_LOCATION_PRINT
-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-#endif
-
-
-/* YYLEX -- calling `yylex' with the right arguments.  */
-
-#ifdef YYLEX_PARAM
-# define YYLEX yylex (YYLEX_PARAM)
-#else
-# define YYLEX yylex ()
-#endif
-
-/* Enable debugging if requested.  */
-#if YYDEBUG
-
-# ifndef YYFPRINTF
-#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
-#  define YYFPRINTF fprintf
-# endif
-
-# define YYDPRINTF(Args)			\
-do {						\
-  if (yydebug)					\
-    YYFPRINTF Args;				\
-} while (YYID (0))
-
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
-do {									  \
-  if (yydebug)								  \
-    {									  \
-      YYFPRINTF (stderr, "%s ", Title);					  \
-      yy_symbol_print (stderr,						  \
-		  Type, Value, format, name); \
-      YYFPRINTF (stderr, "\n");						  \
-    }									  \
-} while (YYID (0))
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
-
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static void
-yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, struct list_head *format, char *name)
-#else
-static void
-yy_symbol_value_print (yyoutput, yytype, yyvaluep, format, name)
-    FILE *yyoutput;
-    int yytype;
-    YYSTYPE const * const yyvaluep;
-    struct list_head *format;
-    char *name;
-#endif
-{
-  if (!yyvaluep)
-    return;
-  YYUSE (format);
-  YYUSE (name);
-# ifdef YYPRINT
-  if (yytype < YYNTOKENS)
-    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# else
-  YYUSE (yyoutput);
-# endif
-  switch (yytype)
-    {
-      default:
-	break;
-    }
-}
-
-
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static void
-yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, struct list_head *format, char *name)
-#else
-static void
-yy_symbol_print (yyoutput, yytype, yyvaluep, format, name)
-    FILE *yyoutput;
-    int yytype;
-    YYSTYPE const * const yyvaluep;
-    struct list_head *format;
-    char *name;
-#endif
-{
-  if (yytype < YYNTOKENS)
-    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
-  else
-    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-
-  yy_symbol_value_print (yyoutput, yytype, yyvaluep, format, name);
-  YYFPRINTF (yyoutput, ")");
-}
-
-/*------------------------------------------------------------------.
-| yy_stack_print -- Print the state stack from its BOTTOM up to its |
-| TOP (included).                                                   |
-`------------------------------------------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static void
-yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
-#else
-static void
-yy_stack_print (yybottom, yytop)
-    yytype_int16 *yybottom;
-    yytype_int16 *yytop;
-#endif
-{
-  YYFPRINTF (stderr, "Stack now");
-  for (; yybottom <= yytop; yybottom++)
-    {
-      int yybot = *yybottom;
-      YYFPRINTF (stderr, " %d", yybot);
-    }
-  YYFPRINTF (stderr, "\n");
-}
-
-# define YY_STACK_PRINT(Bottom, Top)				\
-do {								\
-  if (yydebug)							\
-    yy_stack_print ((Bottom), (Top));				\
-} while (YYID (0))
-
-
-/*------------------------------------------------.
-| Report that the YYRULE is going to be reduced.  |
-`------------------------------------------------*/
-
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static void
-yy_reduce_print (YYSTYPE *yyvsp, int yyrule, struct list_head *format, char *name)
-#else
-static void
-yy_reduce_print (yyvsp, yyrule, format, name)
-    YYSTYPE *yyvsp;
-    int yyrule;
-    struct list_head *format;
-    char *name;
-#endif
-{
-  int yynrhs = yyr2[yyrule];
-  int yyi;
-  unsigned long int yylno = yyrline[yyrule];
-  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
-	     yyrule - 1, yylno);
-  /* The symbols being reduced.  */
-  for (yyi = 0; yyi < yynrhs; yyi++)
-    {
-      YYFPRINTF (stderr, "   $%d = ", yyi + 1);
-      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
-		       &(yyvsp[(yyi + 1) - (yynrhs)])
-		       		       , format, name);
-      YYFPRINTF (stderr, "\n");
-    }
-}
-
-# define YY_REDUCE_PRINT(Rule)		\
-do {					\
-  if (yydebug)				\
-    yy_reduce_print (yyvsp, Rule, format, name); \
-} while (YYID (0))
-
-/* Nonzero means print parse trace.  It is left uninitialized so that
-   multiple parsers can coexist.  */
-int yydebug;
-#else /* !YYDEBUG */
-# define YYDPRINTF(Args)
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-# define YY_STACK_PRINT(Bottom, Top)
-# define YY_REDUCE_PRINT(Rule)
-#endif /* !YYDEBUG */
-
-
-/* YYINITDEPTH -- initial size of the parser's stacks.  */
-#ifndef	YYINITDEPTH
-# define YYINITDEPTH 200
-#endif
-
-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
-   if the built-in stack extension method is used).
-
-   Do not make this value too large; the results are undefined if
-   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
-   evaluated with infinite-precision integer arithmetic.  */
-
-#ifndef YYMAXDEPTH
-# define YYMAXDEPTH 10000
-#endif
-
-
-#if YYERROR_VERBOSE
-
-# ifndef yystrlen
-#  if defined __GLIBC__ && defined _STRING_H
-#   define yystrlen strlen
-#  else
-/* Return the length of YYSTR.  */
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static YYSIZE_T
-yystrlen (const char *yystr)
-#else
-static YYSIZE_T
-yystrlen (yystr)
-    const char *yystr;
-#endif
-{
-  YYSIZE_T yylen;
-  for (yylen = 0; yystr[yylen]; yylen++)
-    continue;
-  return yylen;
-}
-#  endif
-# endif
-
-# ifndef yystpcpy
-#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-#   define yystpcpy stpcpy
-#  else
-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
-   YYDEST.  */
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static char *
-yystpcpy (char *yydest, const char *yysrc)
-#else
-static char *
-yystpcpy (yydest, yysrc)
-    char *yydest;
-    const char *yysrc;
-#endif
-{
-  char *yyd = yydest;
-  const char *yys = yysrc;
-
-  while ((*yyd++ = *yys++) != '\0')
-    continue;
-
-  return yyd - 1;
-}
-#  endif
-# endif
-
-# ifndef yytnamerr
-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
-   quotes and backslashes, so that it's suitable for yyerror.  The
-   heuristic is that double-quoting is unnecessary unless the string
-   contains an apostrophe, a comma, or backslash (other than
-   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
-   null, do not copy; instead, return the length of what the result
-   would have been.  */
-static YYSIZE_T
-yytnamerr (char *yyres, const char *yystr)
-{
-  if (*yystr == '"')
-    {
-      YYSIZE_T yyn = 0;
-      char const *yyp = yystr;
-
-      for (;;)
-	switch (*++yyp)
-	  {
-	  case '\'':
-	  case ',':
-	    goto do_not_strip_quotes;
-
-	  case '\\':
-	    if (*++yyp != '\\')
-	      goto do_not_strip_quotes;
-	    /* Fall through.  */
-	  default:
-	    if (yyres)
-	      yyres[yyn] = *yyp;
-	    yyn++;
-	    break;
-
-	  case '"':
-	    if (yyres)
-	      yyres[yyn] = '\0';
-	    return yyn;
-	  }
-    do_not_strip_quotes: ;
-    }
-
-  if (! yyres)
-    return yystrlen (yystr);
-
-  return yystpcpy (yyres, yystr) - yyres;
-}
-# endif
-
-/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
-   about the unexpected token YYTOKEN for the state stack whose top is
-   YYSSP.
-
-   Return 0 if *YYMSG was successfully written.  Return 1 if *YYMSG is
-   not large enough to hold the message.  In that case, also set
-   *YYMSG_ALLOC to the required number of bytes.  Return 2 if the
-   required number of bytes is too large to store.  */
-static int
-yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
-                yytype_int16 *yyssp, int yytoken)
-{
-  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]);
-  YYSIZE_T yysize = yysize0;
-  YYSIZE_T yysize1;
-  enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
-  /* Internationalized format string. */
-  const char *yyformat = 0;
-  /* Arguments of yyformat. */
-  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-  /* Number of reported tokens (one for the "unexpected", one per
-     "expected"). */
-  int yycount = 0;
-
-  /* There are many possibilities here to consider:
-     - Assume YYFAIL is not used.  It's too flawed to consider.  See
-       <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
-       for details.  YYERROR is fine as it does not invoke this
-       function.
-     - If this state is a consistent state with a default action, then
-       the only way this function was invoked is if the default action
-       is an error action.  In that case, don't check for expected
-       tokens because there are none.
-     - The only way there can be no lookahead present (in yychar) is if
-       this state is a consistent state with a default action.  Thus,
-       detecting the absence of a lookahead is sufficient to determine
-       that there is no unexpected or expected token to report.  In that
-       case, just report a simple "syntax error".
-     - Don't assume there isn't a lookahead just because this state is a
-       consistent state with a default action.  There might have been a
-       previous inconsistent state, consistent state with a non-default
-       action, or user semantic action that manipulated yychar.
-     - Of course, the expected token list depends on states to have
-       correct lookahead information, and it depends on the parser not
-       to perform extra reductions after fetching a lookahead from the
-       scanner and before detecting a syntax error.  Thus, state merging
-       (from LALR or IELR) and default reductions corrupt the expected
-       token list.  However, the list is correct for canonical LR with
-       one exception: it will still contain any token that will not be
-       accepted due to an error action in a later state.
-  */
-  if (yytoken != YYEMPTY)
-    {
-      int yyn = yypact[*yyssp];
-      yyarg[yycount++] = yytname[yytoken];
-      if (!yypact_value_is_default (yyn))
-        {
-          /* Start YYX at -YYN if negative to avoid negative indexes in
-             YYCHECK.  In other words, skip the first -YYN actions for
-             this state because they are default actions.  */
-          int yyxbegin = yyn < 0 ? -yyn : 0;
-          /* Stay within bounds of both yycheck and yytname.  */
-          int yychecklim = YYLAST - yyn + 1;
-          int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-          int yyx;
-
-          for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-            if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
-                && !yytable_value_is_error (yytable[yyx + yyn]))
-              {
-                if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-                  {
-                    yycount = 1;
-                    yysize = yysize0;
-                    break;
-                  }
-                yyarg[yycount++] = yytname[yyx];
-                yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-                if (! (yysize <= yysize1
-                       && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-                  return 2;
-                yysize = yysize1;
-              }
-        }
-    }
-
-  switch (yycount)
-    {
-# define YYCASE_(N, S)                      \
-      case N:                               \
-        yyformat = S;                       \
-      break
-      YYCASE_(0, YY_("syntax error"));
-      YYCASE_(1, YY_("syntax error, unexpected %s"));
-      YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
-      YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
-      YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
-      YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
-# undef YYCASE_
-    }
-
-  yysize1 = yysize + yystrlen (yyformat);
-  if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-    return 2;
-  yysize = yysize1;
-
-  if (*yymsg_alloc < yysize)
-    {
-      *yymsg_alloc = 2 * yysize;
-      if (! (yysize <= *yymsg_alloc
-             && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
-        *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
-      return 1;
-    }
-
-  /* Avoid sprintf, as that infringes on the user's name space.
-     Don't have undefined behavior even if the translation
-     produced a string with the wrong number of "%s"s.  */
-  {
-    char *yyp = *yymsg;
-    int yyi = 0;
-    while ((*yyp = *yyformat) != '\0')
-      if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
-        {
-          yyp += yytnamerr (yyp, yyarg[yyi++]);
-          yyformat += 2;
-        }
-      else
-        {
-          yyp++;
-          yyformat++;
-        }
-  }
-  return 0;
-}
-#endif /* YYERROR_VERBOSE */
-
-/*-----------------------------------------------.
-| Release the memory associated to this symbol.  |
-`-----------------------------------------------*/
-
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static void
-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, struct list_head *format, char *name)
-#else
-static void
-yydestruct (yymsg, yytype, yyvaluep, format, name)
-    const char *yymsg;
-    int yytype;
-    YYSTYPE *yyvaluep;
-    struct list_head *format;
-    char *name;
-#endif
-{
-  YYUSE (yyvaluep);
-  YYUSE (format);
-  YYUSE (name);
-
-  if (!yymsg)
-    yymsg = "Deleting";
-  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-
-  switch (yytype)
-    {
-
-      default:
-	break;
-    }
-}
-
-
-/* Prevent warnings from -Wmissing-prototypes.  */
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void *YYPARSE_PARAM);
-#else
-int yyparse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
-int yyparse (struct list_head *format, char *name);
-#else
-int yyparse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
-
-
-/* The lookahead symbol.  */
-int yychar;
-
-/* The semantic value of the lookahead symbol.  */
-YYSTYPE yylval;
-
-/* Number of syntax errors so far.  */
-int yynerrs;
-
-
-/*----------.
-| yyparse.  |
-`----------*/
-
-#ifdef YYPARSE_PARAM
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void *YYPARSE_PARAM)
-#else
-int
-yyparse (YYPARSE_PARAM)
-    void *YYPARSE_PARAM;
-#endif
-#else /* ! YYPARSE_PARAM */
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (struct list_head *format, char *name)
-#else
-int
-yyparse (format, name)
-    struct list_head *format;
-    char *name;
-#endif
-#endif
-{
-    int yystate;
-    /* Number of tokens to shift before error messages enabled.  */
-    int yyerrstatus;
-
-    /* The stacks and their tools:
-       `yyss': related to states.
-       `yyvs': related to semantic values.
-
-       Refer to the stacks thru separate pointers, to allow yyoverflow
-       to reallocate them elsewhere.  */
-
-    /* The state stack.  */
-    yytype_int16 yyssa[YYINITDEPTH];
-    yytype_int16 *yyss;
-    yytype_int16 *yyssp;
-
-    /* The semantic value stack.  */
-    YYSTYPE yyvsa[YYINITDEPTH];
-    YYSTYPE *yyvs;
-    YYSTYPE *yyvsp;
-
-    YYSIZE_T yystacksize;
-
-  int yyn;
-  int yyresult;
-  /* Lookahead token as an internal (translated) token number.  */
-  int yytoken;
-  /* The variables used to return semantic value and location from the
-     action routines.  */
-  YYSTYPE yyval;
-
-#if YYERROR_VERBOSE
-  /* Buffer for error messages, and its allocated size.  */
-  char yymsgbuf[128];
-  char *yymsg = yymsgbuf;
-  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
-#endif
-
-#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
-
-  /* The number of symbols on the RHS of the reduced rule.
-     Keep to zero when no symbol should be popped.  */
-  int yylen = 0;
-
-  yytoken = 0;
-  yyss = yyssa;
-  yyvs = yyvsa;
-  yystacksize = YYINITDEPTH;
-
-  YYDPRINTF ((stderr, "Starting parse\n"));
-
-  yystate = 0;
-  yyerrstatus = 0;
-  yynerrs = 0;
-  yychar = YYEMPTY; /* Cause a token to be read.  */
-
-  /* Initialize stack pointers.
-     Waste one element of value and location stack
-     so that they stay on the same level as the state stack.
-     The wasted elements are never initialized.  */
-  yyssp = yyss;
-  yyvsp = yyvs;
-
-  goto yysetstate;
-
-/*------------------------------------------------------------.
-| yynewstate -- Push a new state, which is found in yystate.  |
-`------------------------------------------------------------*/
- yynewstate:
-  /* In all cases, when you get here, the value and location stacks
-     have just been pushed.  So pushing a state here evens the stacks.  */
-  yyssp++;
-
- yysetstate:
-  *yyssp = yystate;
-
-  if (yyss + yystacksize - 1 <= yyssp)
-    {
-      /* Get the current used size of the three stacks, in elements.  */
-      YYSIZE_T yysize = yyssp - yyss + 1;
-
-#ifdef yyoverflow
-      {
-	/* Give user a chance to reallocate the stack.  Use copies of
-	   these so that the &'s don't force the real ones into
-	   memory.  */
-	YYSTYPE *yyvs1 = yyvs;
-	yytype_int16 *yyss1 = yyss;
-
-	/* Each stack pointer address is followed by the size of the
-	   data in use in that stack, in bytes.  This used to be a
-	   conditional around just the two extra args, but that might
-	   be undefined if yyoverflow is a macro.  */
-	yyoverflow (YY_("memory exhausted"),
-		    &yyss1, yysize * sizeof (*yyssp),
-		    &yyvs1, yysize * sizeof (*yyvsp),
-		    &yystacksize);
-
-	yyss = yyss1;
-	yyvs = yyvs1;
-      }
-#else /* no yyoverflow */
-# ifndef YYSTACK_RELOCATE
-      goto yyexhaustedlab;
-# else
-      /* Extend the stack our own way.  */
-      if (YYMAXDEPTH <= yystacksize)
-	goto yyexhaustedlab;
-      yystacksize *= 2;
-      if (YYMAXDEPTH < yystacksize)
-	yystacksize = YYMAXDEPTH;
-
-      {
-	yytype_int16 *yyss1 = yyss;
-	union yyalloc *yyptr =
-	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
-	if (! yyptr)
-	  goto yyexhaustedlab;
-	YYSTACK_RELOCATE (yyss_alloc, yyss);
-	YYSTACK_RELOCATE (yyvs_alloc, yyvs);
-#  undef YYSTACK_RELOCATE
-	if (yyss1 != yyssa)
-	  YYSTACK_FREE (yyss1);
-      }
-# endif
-#endif /* no yyoverflow */
-
-      yyssp = yyss + yysize - 1;
-      yyvsp = yyvs + yysize - 1;
-
-      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
-		  (unsigned long int) yystacksize));
-
-      if (yyss + yystacksize - 1 <= yyssp)
-	YYABORT;
-    }
-
-  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-
-  if (yystate == YYFINAL)
-    YYACCEPT;
-
-  goto yybackup;
-
-/*-----------.
-| yybackup.  |
-`-----------*/
-yybackup:
-
-  /* Do appropriate processing given the current state.  Read a
-     lookahead token if we need one and don't already have one.  */
-
-  /* First try to decide what to do without reference to lookahead token.  */
-  yyn = yypact[yystate];
-  if (yypact_value_is_default (yyn))
-    goto yydefault;
-
-  /* Not known => get a lookahead token if don't already have one.  */
-
-  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
-  if (yychar == YYEMPTY)
-    {
-      YYDPRINTF ((stderr, "Reading a token: "));
-      yychar = YYLEX;
-    }
-
-  if (yychar <= YYEOF)
-    {
-      yychar = yytoken = YYEOF;
-      YYDPRINTF ((stderr, "Now at end of input.\n"));
-    }
-  else
-    {
-      yytoken = YYTRANSLATE (yychar);
-      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
-    }
-
-  /* If the proper action on seeing token YYTOKEN is to reduce or to
-     detect an error, take that action.  */
-  yyn += yytoken;
-  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
-    goto yydefault;
-  yyn = yytable[yyn];
-  if (yyn <= 0)
-    {
-      if (yytable_value_is_error (yyn))
-        goto yyerrlab;
-      yyn = -yyn;
-      goto yyreduce;
-    }
-
-  /* Count tokens shifted since error; after three, turn off error
-     status.  */
-  if (yyerrstatus)
-    yyerrstatus--;
-
-  /* Shift the lookahead token.  */
-  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-
-  /* Discard the shifted token.  */
-  yychar = YYEMPTY;
-
-  yystate = yyn;
-  *++yyvsp = yylval;
-
-  goto yynewstate;
-
-
-/*-----------------------------------------------------------.
-| yydefault -- do the default action for the current state.  |
-`-----------------------------------------------------------*/
-yydefault:
-  yyn = yydefact[yystate];
-  if (yyn == 0)
-    goto yyerrlab;
-  goto yyreduce;
-
-
-/*-----------------------------.
-| yyreduce -- Do a reduction.  |
-`-----------------------------*/
-yyreduce:
-  /* yyn is the number of a rule to reduce with.  */
-  yylen = yyr2[yyn];
-
-  /* If YYLEN is nonzero, implement the default value of the action:
-     `$$ = $1'.
-
-     Otherwise, the following line sets YYVAL to garbage.
-     This behavior is undocumented and Bison
-     users should not rely upon it.  Assigning to YYVAL
-     unconditionally makes the parser a bit smaller, and it avoids a
-     GCC warning that YYVAL may be used uninitialized.  */
-  yyval = yyvsp[1-yylen];
-
-
-  YY_REDUCE_PRINT (yyn);
-  switch (yyn)
-    {
-        case 4:
-
-/* Line 1806 of yacc.c  */
-#line 44 "util/pmu.y"
-    {
-	ABORT_ON(perf_pmu__new_format(format, name,
-				      PERF_PMU_FORMAT_VALUE_CONFIG,
-				      (yyvsp[(3) - (3)].bits)));
-}
-    break;
-
-  case 5:
-
-/* Line 1806 of yacc.c  */
-#line 51 "util/pmu.y"
-    {
-	ABORT_ON(perf_pmu__new_format(format, name,
-				      PERF_PMU_FORMAT_VALUE_CONFIG1,
-				      (yyvsp[(3) - (3)].bits)));
-}
-    break;
-
-  case 6:
-
-/* Line 1806 of yacc.c  */
-#line 58 "util/pmu.y"
-    {
-	ABORT_ON(perf_pmu__new_format(format, name,
-				      PERF_PMU_FORMAT_VALUE_CONFIG2,
-				      (yyvsp[(3) - (3)].bits)));
-}
-    break;
-
-  case 7:
-
-/* Line 1806 of yacc.c  */
-#line 66 "util/pmu.y"
-    {
-	bitmap_or((yyval.bits), (yyvsp[(1) - (3)].bits), (yyvsp[(3) - (3)].bits), 64);
-}
-    break;
-
-  case 8:
-
-/* Line 1806 of yacc.c  */
-#line 71 "util/pmu.y"
-    {
-	memcpy((yyval.bits), (yyvsp[(1) - (1)].bits), sizeof((yyvsp[(1) - (1)].bits)));
-}
-    break;
-
-  case 9:
-
-/* Line 1806 of yacc.c  */
-#line 77 "util/pmu.y"
-    {
-	perf_pmu__set_format((yyval.bits), (yyvsp[(1) - (3)].num), (yyvsp[(3) - (3)].num));
-}
-    break;
-
-  case 10:
-
-/* Line 1806 of yacc.c  */
-#line 82 "util/pmu.y"
-    {
-	perf_pmu__set_format((yyval.bits), (yyvsp[(1) - (1)].num), 0);
-}
-    break;
-
-
-
-/* Line 1806 of yacc.c  */
-#line 1466 "util/pmu-bison.c"
-      default: break;
-    }
-  /* User semantic actions sometimes alter yychar, and that requires
-     that yytoken be updated with the new translation.  We take the
-     approach of translating immediately before every use of yytoken.
-     One alternative is translating here after every semantic action,
-     but that translation would be missed if the semantic action invokes
-     YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
-     if it invokes YYBACKUP.  In the case of YYABORT or YYACCEPT, an
-     incorrect destructor might then be invoked immediately.  In the
-     case of YYERROR or YYBACKUP, subsequent parser actions might lead
-     to an incorrect destructor call or verbose syntax error message
-     before the lookahead is translated.  */
-  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
-
-  YYPOPSTACK (yylen);
-  yylen = 0;
-  YY_STACK_PRINT (yyss, yyssp);
-
-  *++yyvsp = yyval;
-
-  /* Now `shift' the result of the reduction.  Determine what state
-     that goes to, based on the state we popped back to and the rule
-     number reduced by.  */
-
-  yyn = yyr1[yyn];
-
-  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
-  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
-    yystate = yytable[yystate];
-  else
-    yystate = yydefgoto[yyn - YYNTOKENS];
-
-  goto yynewstate;
-
-
-/*------------------------------------.
-| yyerrlab -- here on detecting error |
-`------------------------------------*/
-yyerrlab:
-  /* Make sure we have latest lookahead translation.  See comments at
-     user semantic actions for why this is necessary.  */
-  yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
-
-  /* If not already recovering from an error, report this error.  */
-  if (!yyerrstatus)
-    {
-      ++yynerrs;
-#if ! YYERROR_VERBOSE
-      yyerror (format, name, YY_("syntax error"));
-#else
-# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
-                                        yyssp, yytoken)
-      {
-        char const *yymsgp = YY_("syntax error");
-        int yysyntax_error_status;
-        yysyntax_error_status = YYSYNTAX_ERROR;
-        if (yysyntax_error_status == 0)
-          yymsgp = yymsg;
-        else if (yysyntax_error_status == 1)
-          {
-            if (yymsg != yymsgbuf)
-              YYSTACK_FREE (yymsg);
-            yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
-            if (!yymsg)
-              {
-                yymsg = yymsgbuf;
-                yymsg_alloc = sizeof yymsgbuf;
-                yysyntax_error_status = 2;
-              }
-            else
-              {
-                yysyntax_error_status = YYSYNTAX_ERROR;
-                yymsgp = yymsg;
-              }
-          }
-        yyerror (format, name, yymsgp);
-        if (yysyntax_error_status == 2)
-          goto yyexhaustedlab;
-      }
-# undef YYSYNTAX_ERROR
-#endif
-    }
-
-
-
-  if (yyerrstatus == 3)
-    {
-      /* If just tried and failed to reuse lookahead token after an
-	 error, discard it.  */
-
-      if (yychar <= YYEOF)
-	{
-	  /* Return failure if at end of input.  */
-	  if (yychar == YYEOF)
-	    YYABORT;
-	}
-      else
-	{
-	  yydestruct ("Error: discarding",
-		      yytoken, &yylval, format, name);
-	  yychar = YYEMPTY;
-	}
-    }
-
-  /* Else will try to reuse lookahead token after shifting the error
-     token.  */
-  goto yyerrlab1;
-
-
-/*---------------------------------------------------.
-| yyerrorlab -- error raised explicitly by YYERROR.  |
-`---------------------------------------------------*/
-yyerrorlab:
-
-  /* Pacify compilers like GCC when the user code never invokes
-     YYERROR and the label yyerrorlab therefore never appears in user
-     code.  */
-  if (/*CONSTCOND*/ 0)
-     goto yyerrorlab;
-
-  /* Do not reclaim the symbols of the rule which action triggered
-     this YYERROR.  */
-  YYPOPSTACK (yylen);
-  yylen = 0;
-  YY_STACK_PRINT (yyss, yyssp);
-  yystate = *yyssp;
-  goto yyerrlab1;
-
-
-/*-------------------------------------------------------------.
-| yyerrlab1 -- common code for both syntax error and YYERROR.  |
-`-------------------------------------------------------------*/
-yyerrlab1:
-  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
-
-  for (;;)
-    {
-      yyn = yypact[yystate];
-      if (!yypact_value_is_default (yyn))
-	{
-	  yyn += YYTERROR;
-	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
-	    {
-	      yyn = yytable[yyn];
-	      if (0 < yyn)
-		break;
-	    }
-	}
-
-      /* Pop the current state because it cannot handle the error token.  */
-      if (yyssp == yyss)
-	YYABORT;
-
-
-      yydestruct ("Error: popping",
-		  yystos[yystate], yyvsp, format, name);
-      YYPOPSTACK (1);
-      yystate = *yyssp;
-      YY_STACK_PRINT (yyss, yyssp);
-    }
-
-  *++yyvsp = yylval;
-
-
-  /* Shift the error token.  */
-  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
-
-  yystate = yyn;
-  goto yynewstate;
-
-
-/*-------------------------------------.
-| yyacceptlab -- YYACCEPT comes here.  |
-`-------------------------------------*/
-yyacceptlab:
-  yyresult = 0;
-  goto yyreturn;
-
-/*-----------------------------------.
-| yyabortlab -- YYABORT comes here.  |
-`-----------------------------------*/
-yyabortlab:
-  yyresult = 1;
-  goto yyreturn;
-
-#if !defined(yyoverflow) || YYERROR_VERBOSE
-/*-------------------------------------------------.
-| yyexhaustedlab -- memory exhaustion comes here.  |
-`-------------------------------------------------*/
-yyexhaustedlab:
-  yyerror (format, name, YY_("memory exhausted"));
-  yyresult = 2;
-  /* Fall through.  */
-#endif
-
-yyreturn:
-  if (yychar != YYEMPTY)
-    {
-      /* Make sure we have latest lookahead translation.  See comments at
-         user semantic actions for why this is necessary.  */
-      yytoken = YYTRANSLATE (yychar);
-      yydestruct ("Cleanup: discarding lookahead",
-                  yytoken, &yylval, format, name);
-    }
-  /* Do not reclaim the symbols of the rule which action triggered
-     this YYABORT or YYACCEPT.  */
-  YYPOPSTACK (yylen);
-  YY_STACK_PRINT (yyss, yyssp);
-  while (yyssp != yyss)
-    {
-      yydestruct ("Cleanup: popping",
-		  yystos[*yyssp], yyvsp, format, name);
-      YYPOPSTACK (1);
-    }
-#ifndef yyoverflow
-  if (yyss != yyssa)
-    YYSTACK_FREE (yyss);
-#endif
-#if YYERROR_VERBOSE
-  if (yymsg != yymsgbuf)
-    YYSTACK_FREE (yymsg);
-#endif
-  /* Make sure YYID is used.  */
-  return YYID (yyresult);
-}
-
-
-
-/* Line 2067 of yacc.c  */
-#line 86 "util/pmu.y"
-
-
-void perf_pmu_error(struct list_head *list __maybe_unused,
-		    char *name __maybe_unused,
-		    char const *msg __maybe_unused)
-{
-}
-
diff --git a/src/tools/perf/util/pmu-bison.h b/src/tools/perf/util/pmu-bison.h
deleted file mode 100644
index 9ab6909..0000000
--- a/src/tools/perf/util/pmu-bison.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* A Bison parser, made by GNU Bison 2.5.  */
-
-/* Bison interface for Yacc-like parsers in C
-   
-      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
-   
-   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 3 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/>.  */
-
-/* As a special exception, you may create a larger work that contains
-   part or all of the Bison parser skeleton and distribute that work
-   under terms of your choice, so long as that work isn't itself a
-   parser generator using the skeleton or a modified version thereof
-   as a parser skeleton.  Alternatively, if you modify or redistribute
-   the parser skeleton itself, you may (at your option) remove this
-   special exception, which will cause the skeleton and the resulting
-   Bison output files to be licensed under the GNU General Public
-   License without this special exception.
-   
-   This special exception was added by the Free Software Foundation in
-   version 2.2 of Bison.  */
-
-
-/* Tokens.  */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-     PP_CONFIG = 258,
-     PP_CONFIG1 = 259,
-     PP_CONFIG2 = 260,
-     PP_VALUE = 261,
-     PP_ERROR = 262
-   };
-#endif
-
-
-
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
-{
-
-/* Line 2068 of yacc.c  */
-#line 30 "util/pmu.y"
-
-	unsigned long num;
-	DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS);
-
-
-
-/* Line 2068 of yacc.c  */
-#line 64 "util/pmu-bison.h"
-} YYSTYPE;
-# define YYSTYPE_IS_TRIVIAL 1
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-#endif
-
-extern YYSTYPE perf_pmu_lval;
-
-
diff --git a/src/tools/perf/util/pmu-flex.c b/src/tools/perf/util/pmu-flex.c
deleted file mode 100644
index 4f608e8..0000000
--- a/src/tools/perf/util/pmu-flex.c
+++ /dev/null
@@ -1,1835 +0,0 @@
-
-#line 3 "<stdout>"
-
-#define  YY_INT_ALIGNED short int
-
-/* A lexical scanner generated by flex */
-
-#define yy_create_buffer perf_pmu__create_buffer
-#define yy_delete_buffer perf_pmu__delete_buffer
-#define yy_flex_debug perf_pmu__flex_debug
-#define yy_init_buffer perf_pmu__init_buffer
-#define yy_flush_buffer perf_pmu__flush_buffer
-#define yy_load_buffer_state perf_pmu__load_buffer_state
-#define yy_switch_to_buffer perf_pmu__switch_to_buffer
-#define yyin perf_pmu_in
-#define yyleng perf_pmu_leng
-#define yylex perf_pmu_lex
-#define yylineno perf_pmu_lineno
-#define yyout perf_pmu_out
-#define yyrestart perf_pmu_restart
-#define yytext perf_pmu_text
-#define yywrap perf_pmu_wrap
-#define yyalloc perf_pmu_alloc
-#define yyrealloc perf_pmu_realloc
-#define yyfree perf_pmu_free
-
-#define FLEX_SCANNER
-#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 35
-#if YY_FLEX_SUBMINOR_VERSION > 0
-#define FLEX_BETA
-#endif
-
-/* First, we deal with  platform-specific or compiler-specific issues. */
-
-/* begin standard C headers. */
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <stdlib.h>
-
-/* end standard C headers. */
-
-/* flex integer type definitions */
-
-#ifndef FLEXINT_H
-#define FLEXINT_H
-
-/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
-
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-
-/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
- * if you want the limit (max/min) macros for int types. 
- */
-#ifndef __STDC_LIMIT_MACROS
-#define __STDC_LIMIT_MACROS 1
-#endif
-
-#include <inttypes.h>
-typedef int8_t flex_int8_t;
-typedef uint8_t flex_uint8_t;
-typedef int16_t flex_int16_t;
-typedef uint16_t flex_uint16_t;
-typedef int32_t flex_int32_t;
-typedef uint32_t flex_uint32_t;
-#else
-typedef signed char flex_int8_t;
-typedef short int flex_int16_t;
-typedef int flex_int32_t;
-typedef unsigned char flex_uint8_t; 
-typedef unsigned short int flex_uint16_t;
-typedef unsigned int flex_uint32_t;
-
-/* Limits of integral types. */
-#ifndef INT8_MIN
-#define INT8_MIN               (-128)
-#endif
-#ifndef INT16_MIN
-#define INT16_MIN              (-32767-1)
-#endif
-#ifndef INT32_MIN
-#define INT32_MIN              (-2147483647-1)
-#endif
-#ifndef INT8_MAX
-#define INT8_MAX               (127)
-#endif
-#ifndef INT16_MAX
-#define INT16_MAX              (32767)
-#endif
-#ifndef INT32_MAX
-#define INT32_MAX              (2147483647)
-#endif
-#ifndef UINT8_MAX
-#define UINT8_MAX              (255U)
-#endif
-#ifndef UINT16_MAX
-#define UINT16_MAX             (65535U)
-#endif
-#ifndef UINT32_MAX
-#define UINT32_MAX             (4294967295U)
-#endif
-
-#endif /* ! C99 */
-
-#endif /* ! FLEXINT_H */
-
-#ifdef __cplusplus
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else	/* ! __cplusplus */
-
-/* C99 requires __STDC__ to be defined as 1. */
-#if defined (__STDC__)
-
-#define YY_USE_CONST
-
-#endif	/* defined (__STDC__) */
-#endif	/* ! __cplusplus */
-
-#ifdef YY_USE_CONST
-#define yyconst const
-#else
-#define yyconst
-#endif
-
-/* Returned upon end-of-file. */
-#define YY_NULL 0
-
-/* Promotes a possibly negative, possibly signed char to an unsigned
- * integer for use as an array index.  If the signed char is negative,
- * we want to instead treat it as an 8-bit unsigned char, hence the
- * double cast.
- */
-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
-
-/* Enter a start condition.  This macro really ought to take a parameter,
- * but we do it the disgusting crufty way forced on us by the ()-less
- * definition of BEGIN.
- */
-#define BEGIN (yy_start) = 1 + 2 *
-
-/* Translate the current start state into a value that can be later handed
- * to BEGIN to return to the state.  The YYSTATE alias is for lex
- * compatibility.
- */
-#define YY_START (((yy_start) - 1) / 2)
-#define YYSTATE YY_START
-
-/* Action number for EOF rule of a given start state. */
-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
-
-/* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE perf_pmu_restart(perf_pmu_in  )
-
-#define YY_END_OF_BUFFER_CHAR 0
-
-/* Size of default input buffer. */
-#ifndef YY_BUF_SIZE
-#ifdef __ia64__
-/* On IA-64, the buffer size is 16k, not 8k.
- * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
- * Ditto for the __ia64__ case accordingly.
- */
-#define YY_BUF_SIZE 32768
-#else
-#define YY_BUF_SIZE 16384
-#endif /* __ia64__ */
-#endif
-
-/* The state buf must be large enough to hold one state per character in the main buffer.
- */
-#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
-
-#ifndef YY_TYPEDEF_YY_BUFFER_STATE
-#define YY_TYPEDEF_YY_BUFFER_STATE
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-#endif
-
-extern int perf_pmu_leng;
-
-extern FILE *perf_pmu_in, *perf_pmu_out;
-
-#define EOB_ACT_CONTINUE_SCAN 0
-#define EOB_ACT_END_OF_FILE 1
-#define EOB_ACT_LAST_MATCH 2
-
-    #define YY_LESS_LINENO(n)
-    
-/* Return all but the first "n" matched characters back to the input stream. */
-#define yyless(n) \
-	do \
-		{ \
-		/* Undo effects of setting up perf_pmu_text. */ \
-        int yyless_macro_arg = (n); \
-        YY_LESS_LINENO(yyless_macro_arg);\
-		*yy_cp = (yy_hold_char); \
-		YY_RESTORE_YY_MORE_OFFSET \
-		(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
-		YY_DO_BEFORE_ACTION; /* set up perf_pmu_text again */ \
-		} \
-	while ( 0 )
-
-#define unput(c) yyunput( c, (yytext_ptr)  )
-
-#ifndef YY_TYPEDEF_YY_SIZE_T
-#define YY_TYPEDEF_YY_SIZE_T
-typedef size_t yy_size_t;
-#endif
-
-#ifndef YY_STRUCT_YY_BUFFER_STATE
-#define YY_STRUCT_YY_BUFFER_STATE
-struct yy_buffer_state
-	{
-	FILE *yy_input_file;
-
-	char *yy_ch_buf;		/* input buffer */
-	char *yy_buf_pos;		/* current position in input buffer */
-
-	/* Size of input buffer in bytes, not including room for EOB
-	 * characters.
-	 */
-	yy_size_t yy_buf_size;
-
-	/* Number of characters read into yy_ch_buf, not including EOB
-	 * characters.
-	 */
-	int yy_n_chars;
-
-	/* Whether we "own" the buffer - i.e., we know we created it,
-	 * and can realloc() it to grow it, and should free() it to
-	 * delete it.
-	 */
-	int yy_is_our_buffer;
-
-	/* Whether this is an "interactive" input source; if so, and
-	 * if we're using stdio for input, then we want to use getc()
-	 * instead of fread(), to make sure we stop fetching input after
-	 * each newline.
-	 */
-	int yy_is_interactive;
-
-	/* Whether we're considered to be at the beginning of a line.
-	 * If so, '^' rules will be active on the next match, otherwise
-	 * not.
-	 */
-	int yy_at_bol;
-
-    int yy_bs_lineno; /**< The line count. */
-    int yy_bs_column; /**< The column count. */
-    
-	/* Whether to try to fill the input buffer when we reach the
-	 * end of it.
-	 */
-	int yy_fill_buffer;
-
-	int yy_buffer_status;
-
-#define YY_BUFFER_NEW 0
-#define YY_BUFFER_NORMAL 1
-	/* When an EOF's been seen but there's still some text to process
-	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
-	 * shouldn't try reading from the input source any more.  We might
-	 * still have a bunch of tokens to match, though, because of
-	 * possible backing-up.
-	 *
-	 * When we actually see the EOF, we change the status to "new"
-	 * (via perf_pmu_restart()), so that the user can continue scanning by
-	 * just pointing perf_pmu_in at a new input file.
-	 */
-#define YY_BUFFER_EOF_PENDING 2
-
-	};
-#endif /* !YY_STRUCT_YY_BUFFER_STATE */
-
-/* Stack of input buffers. */
-static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
-static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
-static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
-
-/* We provide macros for accessing buffer states in case in the
- * future we want to put the buffer states in a more general
- * "scanner state".
- *
- * Returns the top of the stack, or NULL.
- */
-#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
-                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
-                          : NULL)
-
-/* Same as previous macro, but useful when we know that the buffer stack is not
- * NULL or when we need an lvalue. For internal use only.
- */
-#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
-
-/* yy_hold_char holds the character lost when perf_pmu_text is formed. */
-static char yy_hold_char;
-static int yy_n_chars;		/* number of characters read into yy_ch_buf */
-int perf_pmu_leng;
-
-/* Points to current character in buffer. */
-static char *yy_c_buf_p = (char *) 0;
-static int yy_init = 0;		/* whether we need to initialize */
-static int yy_start = 0;	/* start state number */
-
-/* Flag which is used to allow perf_pmu_wrap()'s to do buffer switches
- * instead of setting up a fresh perf_pmu_in.  A bit of a hack ...
- */
-static int yy_did_buffer_switch_on_eof;
-
-void perf_pmu_restart (FILE *input_file  );
-void perf_pmu__switch_to_buffer (YY_BUFFER_STATE new_buffer  );
-YY_BUFFER_STATE perf_pmu__create_buffer (FILE *file,int size  );
-void perf_pmu__delete_buffer (YY_BUFFER_STATE b  );
-void perf_pmu__flush_buffer (YY_BUFFER_STATE b  );
-void perf_pmu_push_buffer_state (YY_BUFFER_STATE new_buffer  );
-void perf_pmu_pop_buffer_state (void );
-
-static void perf_pmu_ensure_buffer_stack (void );
-static void perf_pmu__load_buffer_state (void );
-static void perf_pmu__init_buffer (YY_BUFFER_STATE b,FILE *file  );
-
-#define YY_FLUSH_BUFFER perf_pmu__flush_buffer(YY_CURRENT_BUFFER )
-
-YY_BUFFER_STATE perf_pmu__scan_buffer (char *base,yy_size_t size  );
-YY_BUFFER_STATE perf_pmu__scan_string (yyconst char *yy_str  );
-YY_BUFFER_STATE perf_pmu__scan_bytes (yyconst char *bytes,int len  );
-
-void *perf_pmu_alloc (yy_size_t  );
-void *perf_pmu_realloc (void *,yy_size_t  );
-void perf_pmu_free (void *  );
-
-#define yy_new_buffer perf_pmu__create_buffer
-
-#define yy_set_interactive(is_interactive) \
-	{ \
-	if ( ! YY_CURRENT_BUFFER ){ \
-        perf_pmu_ensure_buffer_stack (); \
-		YY_CURRENT_BUFFER_LVALUE =    \
-            perf_pmu__create_buffer(perf_pmu_in,YY_BUF_SIZE ); \
-	} \
-	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
-	}
-
-#define yy_set_bol(at_bol) \
-	{ \
-	if ( ! YY_CURRENT_BUFFER ){\
-        perf_pmu_ensure_buffer_stack (); \
-		YY_CURRENT_BUFFER_LVALUE =    \
-            perf_pmu__create_buffer(perf_pmu_in,YY_BUF_SIZE ); \
-	} \
-	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
-	}
-
-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
-
-/* Begin user sect3 */
-
-typedef unsigned char YY_CHAR;
-
-FILE *perf_pmu_in = (FILE *) 0, *perf_pmu_out = (FILE *) 0;
-
-typedef int yy_state_type;
-
-extern int perf_pmu_lineno;
-
-int perf_pmu_lineno = 1;
-
-extern char *perf_pmu_text;
-#define yytext_ptr perf_pmu_text
-
-static yy_state_type yy_get_previous_state (void );
-static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
-static int yy_get_next_buffer (void );
-static void yy_fatal_error (yyconst char msg[]  );
-
-/* Done after the current pattern has been matched and before the
- * corresponding action - sets up perf_pmu_text.
- */
-#define YY_DO_BEFORE_ACTION \
-	(yytext_ptr) = yy_bp; \
-	perf_pmu_leng = (size_t) (yy_cp - yy_bp); \
-	(yy_hold_char) = *yy_cp; \
-	*yy_cp = '\0'; \
-	(yy_c_buf_p) = yy_cp;
-
-#define YY_NUM_RULES 10
-#define YY_END_OF_BUFFER 11
-/* This struct is not used in this scanner,
-   but its presence is necessary. */
-struct yy_trans_info
-	{
-	flex_int32_t yy_verify;
-	flex_int32_t yy_nxt;
-	};
-static yyconst flex_int16_t yy_accept[20] =
-    {   0,
-        0,    0,   11,    8,    9,    7,    5,    1,    6,    8,
-        1,    0,    0,    0,    0,    2,    3,    4,    0
-    } ;
-
-static yyconst flex_int32_t yy_ec[256] =
-    {   0,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    2,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    3,    4,    1,    1,    5,    6,    7,
-        5,    5,    5,    5,    5,    5,    5,    8,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    9,    1,
-
-        1,   10,   11,    1,   12,    1,    1,    1,    1,   13,
-       14,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1
-    } ;
-
-static yyconst flex_int32_t yy_meta[15] =
-    {   0,
-        1,    1,    1,    1,    2,    2,    2,    1,    1,    1,
-        1,    1,    1,    1
-    } ;
-
-static yyconst flex_int16_t yy_base[21] =
-    {   0,
-        0,    0,   23,   24,   24,   24,   24,    0,   24,    8,
-        0,    8,   10,    7,    7,    9,   24,   24,   24,   15
-    } ;
-
-static yyconst flex_int16_t yy_def[21] =
-    {   0,
-       19,    1,   19,   19,   19,   19,   19,   20,   19,   19,
-       20,   19,   19,   19,   19,   19,   19,   19,    0,   19
-    } ;
-
-static yyconst flex_int16_t yy_nxt[39] =
-    {   0,
-        4,    5,    6,    7,    8,    8,    8,    9,   10,    4,
-        4,    4,    4,    4,   17,   18,   11,   16,   15,   14,
-       13,   12,   19,    3,   19,   19,   19,   19,   19,   19,
-       19,   19,   19,   19,   19,   19,   19,   19
-    } ;
-
-static yyconst flex_int16_t yy_chk[39] =
-    {   0,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,   16,   16,   20,   15,   14,   13,
-       12,   10,    3,   19,   19,   19,   19,   19,   19,   19,
-       19,   19,   19,   19,   19,   19,   19,   19
-    } ;
-
-static yy_state_type yy_last_accepting_state;
-static char *yy_last_accepting_cpos;
-
-extern int perf_pmu__flex_debug;
-int perf_pmu__flex_debug = 0;
-
-/* The intent behind this definition is that it'll catch
- * any uses of REJECT which flex missed.
- */
-#define REJECT reject_used_but_not_detected
-#define yymore() yymore_used_but_not_detected
-#define YY_MORE_ADJ 0
-#define YY_RESTORE_YY_MORE_OFFSET
-char *perf_pmu_text;
-#line 1 "util/pmu.l"
-#line 4 "util/pmu.l"
-#include <stdlib.h>
-#include <linux/bitops.h>
-#include "pmu.h"
-#include "pmu-bison.h"
-
-static int value(int base)
-{
-	long num;
-
-	errno = 0;
-	num = strtoul(perf_pmu_text, NULL, base);
-	if (errno)
-		return PP_ERROR;
-
-	perf_pmu_lval.num = num;
-	return PP_VALUE;
-}
-
-#line 506 "<stdout>"
-
-#define INITIAL 0
-
-#ifndef YY_NO_UNISTD_H
-/* Special case for "unistd.h", since it is non-ANSI. We include it way
- * down here because we want the user's section 1 to have been scanned first.
- * The user has a chance to override it with an option.
- */
-#include <unistd.h>
-#endif
-
-#ifndef YY_EXTRA_TYPE
-#define YY_EXTRA_TYPE void *
-#endif
-
-static int yy_init_globals (void );
-
-/* Accessor methods to globals.
-   These are made visible to non-reentrant scanners for convenience. */
-
-int perf_pmu_lex_destroy (void );
-
-int perf_pmu_get_debug (void );
-
-void perf_pmu_set_debug (int debug_flag  );
-
-YY_EXTRA_TYPE perf_pmu_get_extra (void );
-
-void perf_pmu_set_extra (YY_EXTRA_TYPE user_defined  );
-
-FILE *perf_pmu_get_in (void );
-
-void perf_pmu_set_in  (FILE * in_str  );
-
-FILE *perf_pmu_get_out (void );
-
-void perf_pmu_set_out  (FILE * out_str  );
-
-int perf_pmu_get_leng (void );
-
-char *perf_pmu_get_text (void );
-
-int perf_pmu_get_lineno (void );
-
-void perf_pmu_set_lineno (int line_number  );
-
-/* Macros after this point can all be overridden by user definitions in
- * section 1.
- */
-
-#ifndef YY_SKIP_YYWRAP
-#ifdef __cplusplus
-extern "C" int perf_pmu_wrap (void );
-#else
-extern int perf_pmu_wrap (void );
-#endif
-#endif
-
-    static void yyunput (int c,char *buf_ptr  );
-    
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char *,yyconst char *,int );
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * );
-#endif
-
-#ifndef YY_NO_INPUT
-
-#ifdef __cplusplus
-static int yyinput (void );
-#else
-static int input (void );
-#endif
-
-#endif
-
-/* Amount of stuff to slurp up with each read. */
-#ifndef YY_READ_BUF_SIZE
-#ifdef __ia64__
-/* On IA-64, the buffer size is 16k, not 8k */
-#define YY_READ_BUF_SIZE 16384
-#else
-#define YY_READ_BUF_SIZE 8192
-#endif /* __ia64__ */
-#endif
-
-/* Copy whatever the last rule matched to the standard output. */
-#ifndef ECHO
-/* This used to be an fputs(), but since the string might contain NUL's,
- * we now use fwrite().
- */
-#define ECHO do { if (fwrite( perf_pmu_text, perf_pmu_leng, 1, perf_pmu_out )) {} } while (0)
-#endif
-
-/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
- * is returned in "result".
- */
-#ifndef YY_INPUT
-#define YY_INPUT(buf,result,max_size) \
-	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
-		{ \
-		int c = '*'; \
-		size_t n; \
-		for ( n = 0; n < max_size && \
-			     (c = getc( perf_pmu_in )) != EOF && c != '\n'; ++n ) \
-			buf[n] = (char) c; \
-		if ( c == '\n' ) \
-			buf[n++] = (char) c; \
-		if ( c == EOF && ferror( perf_pmu_in ) ) \
-			YY_FATAL_ERROR( "input in flex scanner failed" ); \
-		result = n; \
-		} \
-	else \
-		{ \
-		errno=0; \
-		while ( (result = fread(buf, 1, max_size, perf_pmu_in))==0 && ferror(perf_pmu_in)) \
-			{ \
-			if( errno != EINTR) \
-				{ \
-				YY_FATAL_ERROR( "input in flex scanner failed" ); \
-				break; \
-				} \
-			errno=0; \
-			clearerr(perf_pmu_in); \
-			} \
-		}\
-\
-
-#endif
-
-/* No semi-colon after return; correct usage is to write "yyterminate();" -
- * we don't want an extra ';' after the "return" because that will cause
- * some compilers to complain about unreachable statements.
- */
-#ifndef yyterminate
-#define yyterminate() return YY_NULL
-#endif
-
-/* Number of entries by which start-condition stack grows. */
-#ifndef YY_START_STACK_INCR
-#define YY_START_STACK_INCR 25
-#endif
-
-/* Report a fatal error. */
-#ifndef YY_FATAL_ERROR
-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
-#endif
-
-/* end tables serialization structures and prototypes */
-
-/* Default declaration of generated scanner - a define so the user can
- * easily add parameters.
- */
-#ifndef YY_DECL
-#define YY_DECL_IS_OURS 1
-
-extern int perf_pmu_lex (void);
-
-#define YY_DECL int perf_pmu_lex (void)
-#endif /* !YY_DECL */
-
-/* Code executed at the beginning of each rule, after perf_pmu_text and perf_pmu_leng
- * have been set up.
- */
-#ifndef YY_USER_ACTION
-#define YY_USER_ACTION
-#endif
-
-/* Code executed at the end of each rule. */
-#ifndef YY_BREAK
-#define YY_BREAK break;
-#endif
-
-#define YY_RULE_SETUP \
-	YY_USER_ACTION
-
-/** The main scanner function which does all the work.
- */
-YY_DECL
-{
-	register yy_state_type yy_current_state;
-	register char *yy_cp, *yy_bp;
-	register int yy_act;
-    
-#line 26 "util/pmu.l"
-
-
-#line 696 "<stdout>"
-
-	if ( !(yy_init) )
-		{
-		(yy_init) = 1;
-
-#ifdef YY_USER_INIT
-		YY_USER_INIT;
-#endif
-
-		if ( ! (yy_start) )
-			(yy_start) = 1;	/* first start state */
-
-		if ( ! perf_pmu_in )
-			perf_pmu_in = stdin;
-
-		if ( ! perf_pmu_out )
-			perf_pmu_out = stdout;
-
-		if ( ! YY_CURRENT_BUFFER ) {
-			perf_pmu_ensure_buffer_stack ();
-			YY_CURRENT_BUFFER_LVALUE =
-				perf_pmu__create_buffer(perf_pmu_in,YY_BUF_SIZE );
-		}
-
-		perf_pmu__load_buffer_state( );
-		}
-
-	while ( 1 )		/* loops until end-of-file is reached */
-		{
-		yy_cp = (yy_c_buf_p);
-
-		/* Support of perf_pmu_text. */
-		*yy_cp = (yy_hold_char);
-
-		/* yy_bp points to the position in yy_ch_buf of the start of
-		 * the current run.
-		 */
-		yy_bp = yy_cp;
-
-		yy_current_state = (yy_start);
-yy_match:
-		do
-			{
-			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
-			if ( yy_accept[yy_current_state] )
-				{
-				(yy_last_accepting_state) = yy_current_state;
-				(yy_last_accepting_cpos) = yy_cp;
-				}
-			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-				{
-				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 20 )
-					yy_c = yy_meta[(unsigned int) yy_c];
-				}
-			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-			++yy_cp;
-			}
-		while ( yy_base[yy_current_state] != 24 );
-
-yy_find_action:
-		yy_act = yy_accept[yy_current_state];
-		if ( yy_act == 0 )
-			{ /* have to back up */
-			yy_cp = (yy_last_accepting_cpos);
-			yy_current_state = (yy_last_accepting_state);
-			yy_act = yy_accept[yy_current_state];
-			}
-
-		YY_DO_BEFORE_ACTION;
-
-do_action:	/* This label is used only to access EOF actions. */
-
-		switch ( yy_act )
-	{ /* beginning of action switch */
-			case 0: /* must back up */
-			/* undo the effects of YY_DO_BEFORE_ACTION */
-			*yy_cp = (yy_hold_char);
-			yy_cp = (yy_last_accepting_cpos);
-			yy_current_state = (yy_last_accepting_state);
-			goto yy_find_action;
-
-case 1:
-YY_RULE_SETUP
-#line 28 "util/pmu.l"
-{ return value(10); }
-	YY_BREAK
-case 2:
-YY_RULE_SETUP
-#line 29 "util/pmu.l"
-{ return PP_CONFIG; }
-	YY_BREAK
-case 3:
-YY_RULE_SETUP
-#line 30 "util/pmu.l"
-{ return PP_CONFIG1; }
-	YY_BREAK
-case 4:
-YY_RULE_SETUP
-#line 31 "util/pmu.l"
-{ return PP_CONFIG2; }
-	YY_BREAK
-case 5:
-YY_RULE_SETUP
-#line 32 "util/pmu.l"
-{ return '-'; }
-	YY_BREAK
-case 6:
-YY_RULE_SETUP
-#line 33 "util/pmu.l"
-{ return ':'; }
-	YY_BREAK
-case 7:
-YY_RULE_SETUP
-#line 34 "util/pmu.l"
-{ return ','; }
-	YY_BREAK
-case 8:
-YY_RULE_SETUP
-#line 35 "util/pmu.l"
-{ ; }
-	YY_BREAK
-case 9:
-/* rule 9 can match eol */
-YY_RULE_SETUP
-#line 36 "util/pmu.l"
-{ ; }
-	YY_BREAK
-case 10:
-YY_RULE_SETUP
-#line 38 "util/pmu.l"
-ECHO;
-	YY_BREAK
-#line 830 "<stdout>"
-case YY_STATE_EOF(INITIAL):
-	yyterminate();
-
-	case YY_END_OF_BUFFER:
-		{
-		/* Amount of text matched not including the EOB char. */
-		int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
-
-		/* Undo the effects of YY_DO_BEFORE_ACTION. */
-		*yy_cp = (yy_hold_char);
-		YY_RESTORE_YY_MORE_OFFSET
-
-		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
-			{
-			/* We're scanning a new file or input source.  It's
-			 * possible that this happened because the user
-			 * just pointed perf_pmu_in at a new source and called
-			 * perf_pmu_lex().  If so, then we have to assure
-			 * consistency between YY_CURRENT_BUFFER and our
-			 * globals.  Here is the right place to do so, because
-			 * this is the first action (other than possibly a
-			 * back-up) that will match for the new input source.
-			 */
-			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
-			YY_CURRENT_BUFFER_LVALUE->yy_input_file = perf_pmu_in;
-			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
-			}
-
-		/* Note that here we test for yy_c_buf_p "<=" to the position
-		 * of the first EOB in the buffer, since yy_c_buf_p will
-		 * already have been incremented past the NUL character
-		 * (since all states make transitions on EOB to the
-		 * end-of-buffer state).  Contrast this with the test
-		 * in input().
-		 */
-		if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
-			{ /* This was really a NUL. */
-			yy_state_type yy_next_state;
-
-			(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
-
-			yy_current_state = yy_get_previous_state(  );
-
-			/* Okay, we're now positioned to make the NUL
-			 * transition.  We couldn't have
-			 * yy_get_previous_state() go ahead and do it
-			 * for us because it doesn't know how to deal
-			 * with the possibility of jamming (and we don't
-			 * want to build jamming into it because then it
-			 * will run more slowly).
-			 */
-
-			yy_next_state = yy_try_NUL_trans( yy_current_state );
-
-			yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-
-			if ( yy_next_state )
-				{
-				/* Consume the NUL. */
-				yy_cp = ++(yy_c_buf_p);
-				yy_current_state = yy_next_state;
-				goto yy_match;
-				}
-
-			else
-				{
-				yy_cp = (yy_c_buf_p);
-				goto yy_find_action;
-				}
-			}
-
-		else switch ( yy_get_next_buffer(  ) )
-			{
-			case EOB_ACT_END_OF_FILE:
-				{
-				(yy_did_buffer_switch_on_eof) = 0;
-
-				if ( perf_pmu_wrap( ) )
-					{
-					/* Note: because we've taken care in
-					 * yy_get_next_buffer() to have set up
-					 * perf_pmu_text, we can now set up
-					 * yy_c_buf_p so that if some total
-					 * hoser (like flex itself) wants to
-					 * call the scanner after we return the
-					 * YY_NULL, it'll still work - another
-					 * YY_NULL will get returned.
-					 */
-					(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
-
-					yy_act = YY_STATE_EOF(YY_START);
-					goto do_action;
-					}
-
-				else
-					{
-					if ( ! (yy_did_buffer_switch_on_eof) )
-						YY_NEW_FILE;
-					}
-				break;
-				}
-
-			case EOB_ACT_CONTINUE_SCAN:
-				(yy_c_buf_p) =
-					(yytext_ptr) + yy_amount_of_matched_text;
-
-				yy_current_state = yy_get_previous_state(  );
-
-				yy_cp = (yy_c_buf_p);
-				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-				goto yy_match;
-
-			case EOB_ACT_LAST_MATCH:
-				(yy_c_buf_p) =
-				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
-
-				yy_current_state = yy_get_previous_state(  );
-
-				yy_cp = (yy_c_buf_p);
-				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-				goto yy_find_action;
-			}
-		break;
-		}
-
-	default:
-		YY_FATAL_ERROR(
-			"fatal flex scanner internal error--no action found" );
-	} /* end of action switch */
-		} /* end of scanning one token */
-} /* end of perf_pmu_lex */
-
-/* yy_get_next_buffer - try to read in a new buffer
- *
- * Returns a code representing an action:
- *	EOB_ACT_LAST_MATCH -
- *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
- *	EOB_ACT_END_OF_FILE - end of file
- */
-static int yy_get_next_buffer (void)
-{
-    	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
-	register char *source = (yytext_ptr);
-	register int number_to_move, i;
-	int ret_val;
-
-	if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
-		YY_FATAL_ERROR(
-		"fatal flex scanner internal error--end of buffer missed" );
-
-	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
-		{ /* Don't try to fill the buffer, so this is an EOF. */
-		if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
-			{
-			/* We matched a single character, the EOB, so
-			 * treat this as a final EOF.
-			 */
-			return EOB_ACT_END_OF_FILE;
-			}
-
-		else
-			{
-			/* We matched some text prior to the EOB, first
-			 * process it.
-			 */
-			return EOB_ACT_LAST_MATCH;
-			}
-		}
-
-	/* Try to read more data. */
-
-	/* First move last chars to start of buffer. */
-	number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
-
-	for ( i = 0; i < number_to_move; ++i )
-		*(dest++) = *(source++);
-
-	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
-		/* don't do the read, it's not guaranteed to return an EOF,
-		 * just force an EOF
-		 */
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
-
-	else
-		{
-			int num_to_read =
-			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
-
-		while ( num_to_read <= 0 )
-			{ /* Not enough room in the buffer - grow it. */
-
-			/* just a shorter name for the current buffer */
-			YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
-
-			int yy_c_buf_p_offset =
-				(int) ((yy_c_buf_p) - b->yy_ch_buf);
-
-			if ( b->yy_is_our_buffer )
-				{
-				int new_size = b->yy_buf_size * 2;
-
-				if ( new_size <= 0 )
-					b->yy_buf_size += b->yy_buf_size / 8;
-				else
-					b->yy_buf_size *= 2;
-
-				b->yy_ch_buf = (char *)
-					/* Include room in for 2 EOB chars. */
-					perf_pmu_realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2  );
-				}
-			else
-				/* Can't grow it, we don't own it. */
-				b->yy_ch_buf = 0;
-
-			if ( ! b->yy_ch_buf )
-				YY_FATAL_ERROR(
-				"fatal error - scanner input buffer overflow" );
-
-			(yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
-
-			num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
-						number_to_move - 1;
-
-			}
-
-		if ( num_to_read > YY_READ_BUF_SIZE )
-			num_to_read = YY_READ_BUF_SIZE;
-
-		/* Read in more data. */
-		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
-			(yy_n_chars), (size_t) num_to_read );
-
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
-		}
-
-	if ( (yy_n_chars) == 0 )
-		{
-		if ( number_to_move == YY_MORE_ADJ )
-			{
-			ret_val = EOB_ACT_END_OF_FILE;
-			perf_pmu_restart(perf_pmu_in  );
-			}
-
-		else
-			{
-			ret_val = EOB_ACT_LAST_MATCH;
-			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
-				YY_BUFFER_EOF_PENDING;
-			}
-		}
-
-	else
-		ret_val = EOB_ACT_CONTINUE_SCAN;
-
-	if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
-		/* Extend the array by 50%, plus the number we really need. */
-		yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
-		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) perf_pmu_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size  );
-		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
-			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
-	}
-
-	(yy_n_chars) += number_to_move;
-	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
-	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
-
-	(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
-
-	return ret_val;
-}
-
-/* yy_get_previous_state - get the state just before the EOB char was reached */
-
-    static yy_state_type yy_get_previous_state (void)
-{
-	register yy_state_type yy_current_state;
-	register char *yy_cp;
-    
-	yy_current_state = (yy_start);
-
-	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
-		{
-		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
-		if ( yy_accept[yy_current_state] )
-			{
-			(yy_last_accepting_state) = yy_current_state;
-			(yy_last_accepting_cpos) = yy_cp;
-			}
-		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-			{
-			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 20 )
-				yy_c = yy_meta[(unsigned int) yy_c];
-			}
-		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-		}
-
-	return yy_current_state;
-}
-
-/* yy_try_NUL_trans - try to make a transition on the NUL character
- *
- * synopsis
- *	next_state = yy_try_NUL_trans( current_state );
- */
-    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
-{
-	register int yy_is_jam;
-    	register char *yy_cp = (yy_c_buf_p);
-
-	register YY_CHAR yy_c = 1;
-	if ( yy_accept[yy_current_state] )
-		{
-		(yy_last_accepting_state) = yy_current_state;
-		(yy_last_accepting_cpos) = yy_cp;
-		}
-	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-		{
-		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 20 )
-			yy_c = yy_meta[(unsigned int) yy_c];
-		}
-	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-	yy_is_jam = (yy_current_state == 19);
-
-	return yy_is_jam ? 0 : yy_current_state;
-}
-
-    static void yyunput (int c, register char * yy_bp )
-{
-	register char *yy_cp;
-    
-    yy_cp = (yy_c_buf_p);
-
-	/* undo effects of setting up perf_pmu_text */
-	*yy_cp = (yy_hold_char);
-
-	if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
-		{ /* need to shift things up to make room */
-		/* +2 for EOB chars. */
-		register int number_to_move = (yy_n_chars) + 2;
-		register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
-					YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
-		register char *source =
-				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
-
-		while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
-			*--dest = *--source;
-
-		yy_cp += (int) (dest - source);
-		yy_bp += (int) (dest - source);
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
-			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
-
-		if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
-			YY_FATAL_ERROR( "flex scanner push-back overflow" );
-		}
-
-	*--yy_cp = (char) c;
-
-	(yytext_ptr) = yy_bp;
-	(yy_hold_char) = *yy_cp;
-	(yy_c_buf_p) = yy_cp;
-}
-
-#ifndef YY_NO_INPUT
-#ifdef __cplusplus
-    static int yyinput (void)
-#else
-    static int input  (void)
-#endif
-
-{
-	int c;
-    
-	*(yy_c_buf_p) = (yy_hold_char);
-
-	if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
-		{
-		/* yy_c_buf_p now points to the character we want to return.
-		 * If this occurs *before* the EOB characters, then it's a
-		 * valid NUL; if not, then we've hit the end of the buffer.
-		 */
-		if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
-			/* This was really a NUL. */
-			*(yy_c_buf_p) = '\0';
-
-		else
-			{ /* need more input */
-			int offset = (yy_c_buf_p) - (yytext_ptr);
-			++(yy_c_buf_p);
-
-			switch ( yy_get_next_buffer(  ) )
-				{
-				case EOB_ACT_LAST_MATCH:
-					/* This happens because yy_g_n_b()
-					 * sees that we've accumulated a
-					 * token and flags that we need to
-					 * try matching the token before
-					 * proceeding.  But for input(),
-					 * there's no matching to consider.
-					 * So convert the EOB_ACT_LAST_MATCH
-					 * to EOB_ACT_END_OF_FILE.
-					 */
-
-					/* Reset buffer status. */
-					perf_pmu_restart(perf_pmu_in );
-
-					/*FALLTHROUGH*/
-
-				case EOB_ACT_END_OF_FILE:
-					{
-					if ( perf_pmu_wrap( ) )
-						return EOF;
-
-					if ( ! (yy_did_buffer_switch_on_eof) )
-						YY_NEW_FILE;
-#ifdef __cplusplus
-					return yyinput();
-#else
-					return input();
-#endif
-					}
-
-				case EOB_ACT_CONTINUE_SCAN:
-					(yy_c_buf_p) = (yytext_ptr) + offset;
-					break;
-				}
-			}
-		}
-
-	c = *(unsigned char *) (yy_c_buf_p);	/* cast for 8-bit char's */
-	*(yy_c_buf_p) = '\0';	/* preserve perf_pmu_text */
-	(yy_hold_char) = *++(yy_c_buf_p);
-
-	return c;
-}
-#endif	/* ifndef YY_NO_INPUT */
-
-/** Immediately switch to a different input stream.
- * @param input_file A readable stream.
- * 
- * @note This function does not reset the start condition to @c INITIAL .
- */
-    void perf_pmu_restart  (FILE * input_file )
-{
-    
-	if ( ! YY_CURRENT_BUFFER ){
-        perf_pmu_ensure_buffer_stack ();
-		YY_CURRENT_BUFFER_LVALUE =
-            perf_pmu__create_buffer(perf_pmu_in,YY_BUF_SIZE );
-	}
-
-	perf_pmu__init_buffer(YY_CURRENT_BUFFER,input_file );
-	perf_pmu__load_buffer_state( );
-}
-
-/** Switch to a different input buffer.
- * @param new_buffer The new input buffer.
- * 
- */
-    void perf_pmu__switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
-{
-    
-	/* TODO. We should be able to replace this entire function body
-	 * with
-	 *		perf_pmu_pop_buffer_state();
-	 *		perf_pmu_push_buffer_state(new_buffer);
-     */
-	perf_pmu_ensure_buffer_stack ();
-	if ( YY_CURRENT_BUFFER == new_buffer )
-		return;
-
-	if ( YY_CURRENT_BUFFER )
-		{
-		/* Flush out information for old buffer. */
-		*(yy_c_buf_p) = (yy_hold_char);
-		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
-		}
-
-	YY_CURRENT_BUFFER_LVALUE = new_buffer;
-	perf_pmu__load_buffer_state( );
-
-	/* We don't actually know whether we did this switch during
-	 * EOF (perf_pmu_wrap()) processing, but the only time this flag
-	 * is looked at is after perf_pmu_wrap() is called, so it's safe
-	 * to go ahead and always set it.
-	 */
-	(yy_did_buffer_switch_on_eof) = 1;
-}
-
-static void perf_pmu__load_buffer_state  (void)
-{
-    	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
-	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
-	perf_pmu_in = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
-	(yy_hold_char) = *(yy_c_buf_p);
-}
-
-/** Allocate and initialize an input buffer state.
- * @param file A readable stream.
- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
- * 
- * @return the allocated buffer state.
- */
-    YY_BUFFER_STATE perf_pmu__create_buffer  (FILE * file, int  size )
-{
-	YY_BUFFER_STATE b;
-    
-	b = (YY_BUFFER_STATE) perf_pmu_alloc(sizeof( struct yy_buffer_state )  );
-	if ( ! b )
-		YY_FATAL_ERROR( "out of dynamic memory in perf_pmu__create_buffer()" );
-
-	b->yy_buf_size = size;
-
-	/* yy_ch_buf has to be 2 characters longer than the size given because
-	 * we need to put in 2 end-of-buffer characters.
-	 */
-	b->yy_ch_buf = (char *) perf_pmu_alloc(b->yy_buf_size + 2  );
-	if ( ! b->yy_ch_buf )
-		YY_FATAL_ERROR( "out of dynamic memory in perf_pmu__create_buffer()" );
-
-	b->yy_is_our_buffer = 1;
-
-	perf_pmu__init_buffer(b,file );
-
-	return b;
-}
-
-/** Destroy the buffer.
- * @param b a buffer created with perf_pmu__create_buffer()
- * 
- */
-    void perf_pmu__delete_buffer (YY_BUFFER_STATE  b )
-{
-    
-	if ( ! b )
-		return;
-
-	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
-		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
-
-	if ( b->yy_is_our_buffer )
-		perf_pmu_free((void *) b->yy_ch_buf  );
-
-	perf_pmu_free((void *) b  );
-}
-
-#ifndef __cplusplus
-extern int isatty (int );
-#endif /* __cplusplus */
-    
-/* Initializes or reinitializes a buffer.
- * This function is sometimes called more than once on the same buffer,
- * such as during a perf_pmu_restart() or at EOF.
- */
-    static void perf_pmu__init_buffer  (YY_BUFFER_STATE  b, FILE * file )
-
-{
-	int oerrno = errno;
-    
-	perf_pmu__flush_buffer(b );
-
-	b->yy_input_file = file;
-	b->yy_fill_buffer = 1;
-
-    /* If b is the current buffer, then perf_pmu__init_buffer was _probably_
-     * called from perf_pmu_restart() or through yy_get_next_buffer.
-     * In that case, we don't want to reset the lineno or column.
-     */
-    if (b != YY_CURRENT_BUFFER){
-        b->yy_bs_lineno = 1;
-        b->yy_bs_column = 0;
-    }
-
-        b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-    
-	errno = oerrno;
-}
-
-/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
- * 
- */
-    void perf_pmu__flush_buffer (YY_BUFFER_STATE  b )
-{
-    	if ( ! b )
-		return;
-
-	b->yy_n_chars = 0;
-
-	/* We always need two end-of-buffer characters.  The first causes
-	 * a transition to the end-of-buffer state.  The second causes
-	 * a jam in that state.
-	 */
-	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
-	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
-
-	b->yy_buf_pos = &b->yy_ch_buf[0];
-
-	b->yy_at_bol = 1;
-	b->yy_buffer_status = YY_BUFFER_NEW;
-
-	if ( b == YY_CURRENT_BUFFER )
-		perf_pmu__load_buffer_state( );
-}
-
-/** Pushes the new state onto the stack. The new state becomes
- *  the current state. This function will allocate the stack
- *  if necessary.
- *  @param new_buffer The new state.
- *  
- */
-void perf_pmu_push_buffer_state (YY_BUFFER_STATE new_buffer )
-{
-    	if (new_buffer == NULL)
-		return;
-
-	perf_pmu_ensure_buffer_stack();
-
-	/* This block is copied from perf_pmu__switch_to_buffer. */
-	if ( YY_CURRENT_BUFFER )
-		{
-		/* Flush out information for old buffer. */
-		*(yy_c_buf_p) = (yy_hold_char);
-		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
-		}
-
-	/* Only push if top exists. Otherwise, replace top. */
-	if (YY_CURRENT_BUFFER)
-		(yy_buffer_stack_top)++;
-	YY_CURRENT_BUFFER_LVALUE = new_buffer;
-
-	/* copied from perf_pmu__switch_to_buffer. */
-	perf_pmu__load_buffer_state( );
-	(yy_did_buffer_switch_on_eof) = 1;
-}
-
-/** Removes and deletes the top of the stack, if present.
- *  The next element becomes the new top.
- *  
- */
-void perf_pmu_pop_buffer_state (void)
-{
-    	if (!YY_CURRENT_BUFFER)
-		return;
-
-	perf_pmu__delete_buffer(YY_CURRENT_BUFFER );
-	YY_CURRENT_BUFFER_LVALUE = NULL;
-	if ((yy_buffer_stack_top) > 0)
-		--(yy_buffer_stack_top);
-
-	if (YY_CURRENT_BUFFER) {
-		perf_pmu__load_buffer_state( );
-		(yy_did_buffer_switch_on_eof) = 1;
-	}
-}
-
-/* Allocates the stack if it does not exist.
- *  Guarantees space for at least one push.
- */
-static void perf_pmu_ensure_buffer_stack (void)
-{
-	int num_to_alloc;
-    
-	if (!(yy_buffer_stack)) {
-
-		/* First allocation is just for 2 elements, since we don't know if this
-		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
-		 * immediate realloc on the next call.
-         */
-		num_to_alloc = 1;
-		(yy_buffer_stack) = (struct yy_buffer_state**)perf_pmu_alloc
-								(num_to_alloc * sizeof(struct yy_buffer_state*)
-								);
-		if ( ! (yy_buffer_stack) )
-			YY_FATAL_ERROR( "out of dynamic memory in perf_pmu_ensure_buffer_stack()" );
-								  
-		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
-				
-		(yy_buffer_stack_max) = num_to_alloc;
-		(yy_buffer_stack_top) = 0;
-		return;
-	}
-
-	if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
-
-		/* Increase the buffer to prepare for a possible push. */
-		int grow_size = 8 /* arbitrary grow size */;
-
-		num_to_alloc = (yy_buffer_stack_max) + grow_size;
-		(yy_buffer_stack) = (struct yy_buffer_state**)perf_pmu_realloc
-								((yy_buffer_stack),
-								num_to_alloc * sizeof(struct yy_buffer_state*)
-								);
-		if ( ! (yy_buffer_stack) )
-			YY_FATAL_ERROR( "out of dynamic memory in perf_pmu_ensure_buffer_stack()" );
-
-		/* zero only the new slots.*/
-		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
-		(yy_buffer_stack_max) = num_to_alloc;
-	}
-}
-
-/** Setup the input buffer state to scan directly from a user-specified character buffer.
- * @param base the character buffer
- * @param size the size in bytes of the character buffer
- * 
- * @return the newly allocated buffer state object. 
- */
-YY_BUFFER_STATE perf_pmu__scan_buffer  (char * base, yy_size_t  size )
-{
-	YY_BUFFER_STATE b;
-    
-	if ( size < 2 ||
-	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
-	     base[size-1] != YY_END_OF_BUFFER_CHAR )
-		/* They forgot to leave room for the EOB's. */
-		return 0;
-
-	b = (YY_BUFFER_STATE) perf_pmu_alloc(sizeof( struct yy_buffer_state )  );
-	if ( ! b )
-		YY_FATAL_ERROR( "out of dynamic memory in perf_pmu__scan_buffer()" );
-
-	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
-	b->yy_buf_pos = b->yy_ch_buf = base;
-	b->yy_is_our_buffer = 0;
-	b->yy_input_file = 0;
-	b->yy_n_chars = b->yy_buf_size;
-	b->yy_is_interactive = 0;
-	b->yy_at_bol = 1;
-	b->yy_fill_buffer = 0;
-	b->yy_buffer_status = YY_BUFFER_NEW;
-
-	perf_pmu__switch_to_buffer(b  );
-
-	return b;
-}
-
-/** Setup the input buffer state to scan a string. The next call to perf_pmu_lex() will
- * scan from a @e copy of @a str.
- * @param yystr a NUL-terminated string to scan
- * 
- * @return the newly allocated buffer state object.
- * @note If you want to scan bytes that may contain NUL values, then use
- *       perf_pmu__scan_bytes() instead.
- */
-YY_BUFFER_STATE perf_pmu__scan_string (yyconst char * yystr )
-{
-    
-	return perf_pmu__scan_bytes(yystr,strlen(yystr) );
-}
-
-/** Setup the input buffer state to scan the given bytes. The next call to perf_pmu_lex() will
- * scan from a @e copy of @a bytes.
- * @param yybytes the byte buffer to scan
- * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
- * 
- * @return the newly allocated buffer state object.
- */
-YY_BUFFER_STATE perf_pmu__scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
-{
-	YY_BUFFER_STATE b;
-	char *buf;
-	yy_size_t n;
-	int i;
-    
-	/* Get memory for full buffer, including space for trailing EOB's. */
-	n = _yybytes_len + 2;
-	buf = (char *) perf_pmu_alloc(n  );
-	if ( ! buf )
-		YY_FATAL_ERROR( "out of dynamic memory in perf_pmu__scan_bytes()" );
-
-	for ( i = 0; i < _yybytes_len; ++i )
-		buf[i] = yybytes[i];
-
-	buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
-
-	b = perf_pmu__scan_buffer(buf,n );
-	if ( ! b )
-		YY_FATAL_ERROR( "bad buffer in perf_pmu__scan_bytes()" );
-
-	/* It's okay to grow etc. this buffer, and we should throw it
-	 * away when we're done.
-	 */
-	b->yy_is_our_buffer = 1;
-
-	return b;
-}
-
-#ifndef YY_EXIT_FAILURE
-#define YY_EXIT_FAILURE 2
-#endif
-
-static void yy_fatal_error (yyconst char* msg )
-{
-    	(void) fprintf( stderr, "%s\n", msg );
-	exit( YY_EXIT_FAILURE );
-}
-
-/* Redefine yyless() so it works in section 3 code. */
-
-#undef yyless
-#define yyless(n) \
-	do \
-		{ \
-		/* Undo effects of setting up perf_pmu_text. */ \
-        int yyless_macro_arg = (n); \
-        YY_LESS_LINENO(yyless_macro_arg);\
-		perf_pmu_text[perf_pmu_leng] = (yy_hold_char); \
-		(yy_c_buf_p) = perf_pmu_text + yyless_macro_arg; \
-		(yy_hold_char) = *(yy_c_buf_p); \
-		*(yy_c_buf_p) = '\0'; \
-		perf_pmu_leng = yyless_macro_arg; \
-		} \
-	while ( 0 )
-
-/* Accessor  methods (get/set functions) to struct members. */
-
-/** Get the current line number.
- * 
- */
-int perf_pmu_get_lineno  (void)
-{
-        
-    return perf_pmu_lineno;
-}
-
-/** Get the input stream.
- * 
- */
-FILE *perf_pmu_get_in  (void)
-{
-        return perf_pmu_in;
-}
-
-/** Get the output stream.
- * 
- */
-FILE *perf_pmu_get_out  (void)
-{
-        return perf_pmu_out;
-}
-
-/** Get the length of the current token.
- * 
- */
-int perf_pmu_get_leng  (void)
-{
-        return perf_pmu_leng;
-}
-
-/** Get the current token.
- * 
- */
-
-char *perf_pmu_get_text  (void)
-{
-        return perf_pmu_text;
-}
-
-/** Set the current line number.
- * @param line_number
- * 
- */
-void perf_pmu_set_lineno (int  line_number )
-{
-    
-    perf_pmu_lineno = line_number;
-}
-
-/** Set the input stream. This does not discard the current
- * input buffer.
- * @param in_str A readable stream.
- * 
- * @see perf_pmu__switch_to_buffer
- */
-void perf_pmu_set_in (FILE *  in_str )
-{
-        perf_pmu_in = in_str ;
-}
-
-void perf_pmu_set_out (FILE *  out_str )
-{
-        perf_pmu_out = out_str ;
-}
-
-int perf_pmu_get_debug  (void)
-{
-        return perf_pmu__flex_debug;
-}
-
-void perf_pmu_set_debug (int  bdebug )
-{
-        perf_pmu__flex_debug = bdebug ;
-}
-
-static int yy_init_globals (void)
-{
-        /* Initialization is the same as for the non-reentrant scanner.
-     * This function is called from perf_pmu_lex_destroy(), so don't allocate here.
-     */
-
-    (yy_buffer_stack) = 0;
-    (yy_buffer_stack_top) = 0;
-    (yy_buffer_stack_max) = 0;
-    (yy_c_buf_p) = (char *) 0;
-    (yy_init) = 0;
-    (yy_start) = 0;
-
-/* Defined in main.c */
-#ifdef YY_STDINIT
-    perf_pmu_in = stdin;
-    perf_pmu_out = stdout;
-#else
-    perf_pmu_in = (FILE *) 0;
-    perf_pmu_out = (FILE *) 0;
-#endif
-
-    /* For future reference: Set errno on error, since we are called by
-     * perf_pmu_lex_init()
-     */
-    return 0;
-}
-
-/* perf_pmu_lex_destroy is for both reentrant and non-reentrant scanners. */
-int perf_pmu_lex_destroy  (void)
-{
-    
-    /* Pop the buffer stack, destroying each element. */
-	while(YY_CURRENT_BUFFER){
-		perf_pmu__delete_buffer(YY_CURRENT_BUFFER  );
-		YY_CURRENT_BUFFER_LVALUE = NULL;
-		perf_pmu_pop_buffer_state();
-	}
-
-	/* Destroy the stack itself. */
-	perf_pmu_free((yy_buffer_stack) );
-	(yy_buffer_stack) = NULL;
-
-    /* Reset the globals. This is important in a non-reentrant scanner so the next time
-     * perf_pmu_lex() is called, initialization will occur. */
-    yy_init_globals( );
-
-    return 0;
-}
-
-/*
- * Internal utility routines.
- */
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
-{
-	register int i;
-	for ( i = 0; i < n; ++i )
-		s1[i] = s2[i];
-}
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * s )
-{
-	register int n;
-	for ( n = 0; s[n]; ++n )
-		;
-
-	return n;
-}
-#endif
-
-void *perf_pmu_alloc (yy_size_t  size )
-{
-	return (void *) malloc( size );
-}
-
-void *perf_pmu_realloc  (void * ptr, yy_size_t  size )
-{
-	/* The cast to (char *) in the following accommodates both
-	 * implementations that use char* generic pointers, and those
-	 * that use void* generic pointers.  It works with the latter
-	 * because both ANSI C and C++ allow castless assignment from
-	 * any pointer type to void*, and deal with argument conversions
-	 * as though doing an assignment.
-	 */
-	return (void *) realloc( (char *) ptr, size );
-}
-
-void perf_pmu_free (void * ptr )
-{
-	free( (char *) ptr );	/* see perf_pmu_realloc() for (char *) cast */
-}
-
-#define YYTABLES_NAME "yytables"
-
-#line 38 "util/pmu.l"
-
-
-
-int perf_pmu_wrap(void)
-{
-	return 1;
-}
-
diff --git a/src/tools/perf/util/pmu.c b/src/tools/perf/util/pmu.c
deleted file mode 100644
index bc9d806..0000000
--- a/src/tools/perf/util/pmu.c
+++ /dev/null
@@ -1,639 +0,0 @@
-#include <linux/list.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <dirent.h>
-#include "sysfs.h"
-#include "util.h"
-#include "pmu.h"
-#include "parse-events.h"
-#include "cpumap.h"
-
-struct perf_pmu_alias {
-	char *name;
-	struct list_head terms;
-	struct list_head list;
-};
-
-struct perf_pmu_format {
-	char *name;
-	int value;
-	DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS);
-	struct list_head list;
-};
-
-#define EVENT_SOURCE_DEVICE_PATH "/bus/event_source/devices/"
-
-int perf_pmu_parse(struct list_head *list, char *name);
-extern FILE *perf_pmu_in;
-
-static LIST_HEAD(pmus);
-
-/*
- * Parse & process all the sysfs attributes located under
- * the directory specified in 'dir' parameter.
- */
-int perf_pmu__format_parse(char *dir, struct list_head *head)
-{
-	struct dirent *evt_ent;
-	DIR *format_dir;
-	int ret = 0;
-
-	format_dir = opendir(dir);
-	if (!format_dir)
-		return -EINVAL;
-
-	while (!ret && (evt_ent = readdir(format_dir))) {
-		char path[PATH_MAX];
-		char *name = evt_ent->d_name;
-		FILE *file;
-
-		if (!strcmp(name, ".") || !strcmp(name, ".."))
-			continue;
-
-		snprintf(path, PATH_MAX, "%s/%s", dir, name);
-
-		ret = -EINVAL;
-		file = fopen(path, "r");
-		if (!file)
-			break;
-
-		perf_pmu_in = file;
-		ret = perf_pmu_parse(head, name);
-		fclose(file);
-	}
-
-	closedir(format_dir);
-	return ret;
-}
-
-/*
- * Reading/parsing the default pmu format definition, which should be
- * located at:
- * /sys/bus/event_source/devices/<dev>/format as sysfs group attributes.
- */
-static int pmu_format(const char *name, struct list_head *format)
-{
-	struct stat st;
-	char path[PATH_MAX];
-	const char *sysfs;
-
-	sysfs = sysfs_find_mountpoint();
-	if (!sysfs)
-		return -1;
-
-	snprintf(path, PATH_MAX,
-		 "%s" EVENT_SOURCE_DEVICE_PATH "%s/format", sysfs, name);
-
-	if (stat(path, &st) < 0)
-		return 0;	/* no error if format does not exist */
-
-	if (perf_pmu__format_parse(path, format))
-		return -1;
-
-	return 0;
-}
-
-static int perf_pmu__new_alias(struct list_head *list, char *name, FILE *file)
-{
-	struct perf_pmu_alias *alias;
-	char buf[256];
-	int ret;
-
-	ret = fread(buf, 1, sizeof(buf), file);
-	if (ret == 0)
-		return -EINVAL;
-	buf[ret] = 0;
-
-	alias = malloc(sizeof(*alias));
-	if (!alias)
-		return -ENOMEM;
-
-	INIT_LIST_HEAD(&alias->terms);
-	ret = parse_events_terms(&alias->terms, buf);
-	if (ret) {
-		free(alias);
-		return ret;
-	}
-
-	alias->name = strdup(name);
-	list_add_tail(&alias->list, list);
-	return 0;
-}
-
-/*
- * Process all the sysfs attributes located under the directory
- * specified in 'dir' parameter.
- */
-static int pmu_aliases_parse(char *dir, struct list_head *head)
-{
-	struct dirent *evt_ent;
-	DIR *event_dir;
-	int ret = 0;
-
-	event_dir = opendir(dir);
-	if (!event_dir)
-		return -EINVAL;
-
-	while (!ret && (evt_ent = readdir(event_dir))) {
-		char path[PATH_MAX];
-		char *name = evt_ent->d_name;
-		FILE *file;
-
-		if (!strcmp(name, ".") || !strcmp(name, ".."))
-			continue;
-
-		snprintf(path, PATH_MAX, "%s/%s", dir, name);
-
-		ret = -EINVAL;
-		file = fopen(path, "r");
-		if (!file)
-			break;
-		ret = perf_pmu__new_alias(head, name, file);
-		fclose(file);
-	}
-
-	closedir(event_dir);
-	return ret;
-}
-
-/*
- * Reading the pmu event aliases definition, which should be located at:
- * /sys/bus/event_source/devices/<dev>/events as sysfs group attributes.
- */
-static int pmu_aliases(const char *name, struct list_head *head)
-{
-	struct stat st;
-	char path[PATH_MAX];
-	const char *sysfs;
-
-	sysfs = sysfs_find_mountpoint();
-	if (!sysfs)
-		return -1;
-
-	snprintf(path, PATH_MAX,
-		 "%s/bus/event_source/devices/%s/events", sysfs, name);
-
-	if (stat(path, &st) < 0)
-		return 0;	 /* no error if 'events' does not exist */
-
-	if (pmu_aliases_parse(path, head))
-		return -1;
-
-	return 0;
-}
-
-static int pmu_alias_terms(struct perf_pmu_alias *alias,
-			   struct list_head *terms)
-{
-	struct parse_events_term *term, *clone;
-	LIST_HEAD(list);
-	int ret;
-
-	list_for_each_entry(term, &alias->terms, list) {
-		ret = parse_events_term__clone(&clone, term);
-		if (ret) {
-			parse_events__free_terms(&list);
-			return ret;
-		}
-		list_add_tail(&clone->list, &list);
-	}
-	list_splice(&list, terms);
-	return 0;
-}
-
-/*
- * Reading/parsing the default pmu type value, which should be
- * located at:
- * /sys/bus/event_source/devices/<dev>/type as sysfs attribute.
- */
-static int pmu_type(const char *name, __u32 *type)
-{
-	struct stat st;
-	char path[PATH_MAX];
-	const char *sysfs;
-	FILE *file;
-	int ret = 0;
-
-	sysfs = sysfs_find_mountpoint();
-	if (!sysfs)
-		return -1;
-
-	snprintf(path, PATH_MAX,
-		 "%s" EVENT_SOURCE_DEVICE_PATH "%s/type", sysfs, name);
-
-	if (stat(path, &st) < 0)
-		return -1;
-
-	file = fopen(path, "r");
-	if (!file)
-		return -EINVAL;
-
-	if (1 != fscanf(file, "%u", type))
-		ret = -1;
-
-	fclose(file);
-	return ret;
-}
-
-/* Add all pmus in sysfs to pmu list: */
-static void pmu_read_sysfs(void)
-{
-	char path[PATH_MAX];
-	const char *sysfs;
-	DIR *dir;
-	struct dirent *dent;
-
-	sysfs = sysfs_find_mountpoint();
-	if (!sysfs)
-		return;
-
-	snprintf(path, PATH_MAX,
-		 "%s" EVENT_SOURCE_DEVICE_PATH, sysfs);
-
-	dir = opendir(path);
-	if (!dir)
-		return;
-
-	while ((dent = readdir(dir))) {
-		if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, ".."))
-			continue;
-		/* add to static LIST_HEAD(pmus): */
-		perf_pmu__find(dent->d_name);
-	}
-
-	closedir(dir);
-}
-
-static struct cpu_map *pmu_cpumask(const char *name)
-{
-	struct stat st;
-	char path[PATH_MAX];
-	const char *sysfs;
-	FILE *file;
-	struct cpu_map *cpus;
-
-	sysfs = sysfs_find_mountpoint();
-	if (!sysfs)
-		return NULL;
-
-	snprintf(path, PATH_MAX,
-		 "%s/bus/event_source/devices/%s/cpumask", sysfs, name);
-
-	if (stat(path, &st) < 0)
-		return NULL;
-
-	file = fopen(path, "r");
-	if (!file)
-		return NULL;
-
-	cpus = cpu_map__read(file);
-	fclose(file);
-	return cpus;
-}
-
-static struct perf_pmu *pmu_lookup(const char *name)
-{
-	struct perf_pmu *pmu;
-	LIST_HEAD(format);
-	LIST_HEAD(aliases);
-	__u32 type;
-
-	/*
-	 * The pmu data we store & need consists of the pmu
-	 * type value and format definitions. Load both right
-	 * now.
-	 */
-	if (pmu_format(name, &format))
-		return NULL;
-
-	if (pmu_aliases(name, &aliases))
-		return NULL;
-
-	if (pmu_type(name, &type))
-		return NULL;
-
-	pmu = zalloc(sizeof(*pmu));
-	if (!pmu)
-		return NULL;
-
-	pmu->cpus = pmu_cpumask(name);
-
-	INIT_LIST_HEAD(&pmu->format);
-	INIT_LIST_HEAD(&pmu->aliases);
-	list_splice(&format, &pmu->format);
-	list_splice(&aliases, &pmu->aliases);
-	pmu->name = strdup(name);
-	pmu->type = type;
-	list_add_tail(&pmu->list, &pmus);
-	return pmu;
-}
-
-static struct perf_pmu *pmu_find(const char *name)
-{
-	struct perf_pmu *pmu;
-
-	list_for_each_entry(pmu, &pmus, list)
-		if (!strcmp(pmu->name, name))
-			return pmu;
-
-	return NULL;
-}
-
-struct perf_pmu *perf_pmu__scan(struct perf_pmu *pmu)
-{
-	/*
-	 * pmu iterator: If pmu is NULL, we start at the begin,
-	 * otherwise return the next pmu. Returns NULL on end.
-	 */
-	if (!pmu) {
-		pmu_read_sysfs();
-		pmu = list_prepare_entry(pmu, &pmus, list);
-	}
-	list_for_each_entry_continue(pmu, &pmus, list)
-		return pmu;
-	return NULL;
-}
-
-struct perf_pmu *perf_pmu__find(const char *name)
-{
-	struct perf_pmu *pmu;
-
-	/*
-	 * Once PMU is loaded it stays in the list,
-	 * so we keep us from multiple reading/parsing
-	 * the pmu format definitions.
-	 */
-	pmu = pmu_find(name);
-	if (pmu)
-		return pmu;
-
-	return pmu_lookup(name);
-}
-
-static struct perf_pmu_format *
-pmu_find_format(struct list_head *formats, char *name)
-{
-	struct perf_pmu_format *format;
-
-	list_for_each_entry(format, formats, list)
-		if (!strcmp(format->name, name))
-			return format;
-
-	return NULL;
-}
-
-/*
- * Returns value based on the format definition (format parameter)
- * and unformated value (value parameter).
- *
- * TODO maybe optimize a little ;)
- */
-static __u64 pmu_format_value(unsigned long *format, __u64 value)
-{
-	unsigned long fbit, vbit;
-	__u64 v = 0;
-
-	for (fbit = 0, vbit = 0; fbit < PERF_PMU_FORMAT_BITS; fbit++) {
-
-		if (!test_bit(fbit, format))
-			continue;
-
-		if (!(value & (1llu << vbit++)))
-			continue;
-
-		v |= (1llu << fbit);
-	}
-
-	return v;
-}
-
-/*
- * Setup one of config[12] attr members based on the
- * user input data - temr parameter.
- */
-static int pmu_config_term(struct list_head *formats,
-			   struct perf_event_attr *attr,
-			   struct parse_events_term *term)
-{
-	struct perf_pmu_format *format;
-	__u64 *vp;
-
-	/*
-	 * Support only for hardcoded and numnerial terms.
-	 * Hardcoded terms should be already in, so nothing
-	 * to be done for them.
-	 */
-	if (parse_events__is_hardcoded_term(term))
-		return 0;
-
-	if (term->type_val != PARSE_EVENTS__TERM_TYPE_NUM)
-		return -EINVAL;
-
-	format = pmu_find_format(formats, term->config);
-	if (!format)
-		return -EINVAL;
-
-	switch (format->value) {
-	case PERF_PMU_FORMAT_VALUE_CONFIG:
-		vp = &attr->config;
-		break;
-	case PERF_PMU_FORMAT_VALUE_CONFIG1:
-		vp = &attr->config1;
-		break;
-	case PERF_PMU_FORMAT_VALUE_CONFIG2:
-		vp = &attr->config2;
-		break;
-	default:
-		return -EINVAL;
-	}
-
-	/*
-	 * XXX If we ever decide to go with string values for
-	 * non-hardcoded terms, here's the place to translate
-	 * them into value.
-	 */
-	*vp |= pmu_format_value(format->bits, term->val.num);
-	return 0;
-}
-
-int perf_pmu__config_terms(struct list_head *formats,
-			   struct perf_event_attr *attr,
-			   struct list_head *head_terms)
-{
-	struct parse_events_term *term;
-
-	list_for_each_entry(term, head_terms, list)
-		if (pmu_config_term(formats, attr, term))
-			return -EINVAL;
-
-	return 0;
-}
-
-/*
- * Configures event's 'attr' parameter based on the:
- * 1) users input - specified in terms parameter
- * 2) pmu format definitions - specified by pmu parameter
- */
-int perf_pmu__config(struct perf_pmu *pmu, struct perf_event_attr *attr,
-		     struct list_head *head_terms)
-{
-	attr->type = pmu->type;
-	return perf_pmu__config_terms(&pmu->format, attr, head_terms);
-}
-
-static struct perf_pmu_alias *pmu_find_alias(struct perf_pmu *pmu,
-					     struct parse_events_term *term)
-{
-	struct perf_pmu_alias *alias;
-	char *name;
-
-	if (parse_events__is_hardcoded_term(term))
-		return NULL;
-
-	if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM) {
-		if (term->val.num != 1)
-			return NULL;
-		if (pmu_find_format(&pmu->format, term->config))
-			return NULL;
-		name = term->config;
-	} else if (term->type_val == PARSE_EVENTS__TERM_TYPE_STR) {
-		if (strcasecmp(term->config, "event"))
-			return NULL;
-		name = term->val.str;
-	} else {
-		return NULL;
-	}
-
-	list_for_each_entry(alias, &pmu->aliases, list) {
-		if (!strcasecmp(alias->name, name))
-			return alias;
-	}
-	return NULL;
-}
-
-/*
- * Find alias in the terms list and replace it with the terms
- * defined for the alias
- */
-int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms)
-{
-	struct parse_events_term *term, *h;
-	struct perf_pmu_alias *alias;
-	int ret;
-
-	list_for_each_entry_safe(term, h, head_terms, list) {
-		alias = pmu_find_alias(pmu, term);
-		if (!alias)
-			continue;
-		ret = pmu_alias_terms(alias, &term->list);
-		if (ret)
-			return ret;
-		list_del(&term->list);
-		free(term);
-	}
-	return 0;
-}
-
-int perf_pmu__new_format(struct list_head *list, char *name,
-			 int config, unsigned long *bits)
-{
-	struct perf_pmu_format *format;
-
-	format = zalloc(sizeof(*format));
-	if (!format)
-		return -ENOMEM;
-
-	format->name = strdup(name);
-	format->value = config;
-	memcpy(format->bits, bits, sizeof(format->bits));
-
-	list_add_tail(&format->list, list);
-	return 0;
-}
-
-void perf_pmu__set_format(unsigned long *bits, long from, long to)
-{
-	long b;
-
-	if (!to)
-		to = from;
-
-	memset(bits, 0, BITS_TO_BYTES(PERF_PMU_FORMAT_BITS));
-	for (b = from; b <= to; b++)
-		set_bit(b, bits);
-}
-
-static char *format_alias(char *buf, int len, struct perf_pmu *pmu,
-			  struct perf_pmu_alias *alias)
-{
-	snprintf(buf, len, "%s/%s/", pmu->name, alias->name);
-	return buf;
-}
-
-static char *format_alias_or(char *buf, int len, struct perf_pmu *pmu,
-			     struct perf_pmu_alias *alias)
-{
-	snprintf(buf, len, "%s OR %s/%s/", alias->name, pmu->name, alias->name);
-	return buf;
-}
-
-static int cmp_string(const void *a, const void *b)
-{
-	const char * const *as = a;
-	const char * const *bs = b;
-	return strcmp(*as, *bs);
-}
-
-void print_pmu_events(const char *event_glob, bool name_only)
-{
-	struct perf_pmu *pmu;
-	struct perf_pmu_alias *alias;
-	char buf[1024];
-	int printed = 0;
-	int len, j;
-	char **aliases;
-
-	pmu = NULL;
-	len = 0;
-	while ((pmu = perf_pmu__scan(pmu)) != NULL)
-		list_for_each_entry(alias, &pmu->aliases, list)
-			len++;
-	aliases = malloc(sizeof(char *) * len);
-	if (!aliases)
-		return;
-	pmu = NULL;
-	j = 0;
-	while ((pmu = perf_pmu__scan(pmu)) != NULL)
-		list_for_each_entry(alias, &pmu->aliases, list) {
-			char *name = format_alias(buf, sizeof(buf), pmu, alias);
-			bool is_cpu = !strcmp(pmu->name, "cpu");
-
-			if (event_glob != NULL &&
-			    !(strglobmatch(name, event_glob) ||
-			      (!is_cpu && strglobmatch(alias->name,
-						       event_glob))))
-				continue;
-			aliases[j] = name;
-			if (is_cpu && !name_only)
-				aliases[j] = format_alias_or(buf, sizeof(buf),
-							      pmu, alias);
-			aliases[j] = strdup(aliases[j]);
-			j++;
-		}
-	len = j;
-	qsort(aliases, len, sizeof(char *), cmp_string);
-	for (j = 0; j < len; j++) {
-		if (name_only) {
-			printf("%s ", aliases[j]);
-			continue;
-		}
-		printf("  %-50s [Kernel PMU event]\n", aliases[j]);
-		free(aliases[j]);
-		printed++;
-	}
-	if (printed)
-		printf("\n");
-	free(aliases);
-}
diff --git a/src/tools/perf/util/pmu.h b/src/tools/perf/util/pmu.h
deleted file mode 100644
index 6b2cbe2..0000000
--- a/src/tools/perf/util/pmu.h
+++ /dev/null
@@ -1,47 +0,0 @@
-#ifndef __PMU_H
-#define __PMU_H
-
-#include <linux/bitops.h>
-#include <linux/perf_event.h>
-#include <stdbool.h>
-
-enum {
-	PERF_PMU_FORMAT_VALUE_CONFIG,
-	PERF_PMU_FORMAT_VALUE_CONFIG1,
-	PERF_PMU_FORMAT_VALUE_CONFIG2,
-};
-
-#define PERF_PMU_FORMAT_BITS 64
-
-struct perf_pmu {
-	char *name;
-	__u32 type;
-	struct cpu_map *cpus;
-	struct list_head format;
-	struct list_head aliases;
-	struct list_head list;
-};
-
-struct perf_pmu *perf_pmu__find(const char *name);
-int perf_pmu__config(struct perf_pmu *pmu, struct perf_event_attr *attr,
-		     struct list_head *head_terms);
-int perf_pmu__config_terms(struct list_head *formats,
-			   struct perf_event_attr *attr,
-			   struct list_head *head_terms);
-int perf_pmu__check_alias(struct perf_pmu *pmu, struct list_head *head_terms);
-struct list_head *perf_pmu__alias(struct perf_pmu *pmu,
-				  struct list_head *head_terms);
-int perf_pmu_wrap(void);
-void perf_pmu_error(struct list_head *list, char *name, char const *msg);
-
-int perf_pmu__new_format(struct list_head *list, char *name,
-			 int config, unsigned long *bits);
-void perf_pmu__set_format(unsigned long *bits, long from, long to);
-int perf_pmu__format_parse(char *dir, struct list_head *head);
-
-struct perf_pmu *perf_pmu__scan(struct perf_pmu *pmu);
-
-void print_pmu_events(const char *event_glob, bool name_only);
-
-int perf_pmu__test(void);
-#endif /* __PMU_H */
diff --git a/src/tools/perf/util/pmu.l b/src/tools/perf/util/pmu.l
deleted file mode 100644
index a15d9fb..0000000
--- a/src/tools/perf/util/pmu.l
+++ /dev/null
@@ -1,43 +0,0 @@
-%option prefix="perf_pmu_"
-
-%{
-#include <stdlib.h>
-#include <linux/bitops.h>
-#include "pmu.h"
-#include "pmu-bison.h"
-
-static int value(int base)
-{
-	long num;
-
-	errno = 0;
-	num = strtoul(perf_pmu_text, NULL, base);
-	if (errno)
-		return PP_ERROR;
-
-	perf_pmu_lval.num = num;
-	return PP_VALUE;
-}
-
-%}
-
-num_dec         [0-9]+
-
-%%
-
-{num_dec}	{ return value(10); }
-config		{ return PP_CONFIG; }
-config1		{ return PP_CONFIG1; }
-config2		{ return PP_CONFIG2; }
--		{ return '-'; }
-:		{ return ':'; }
-,		{ return ','; }
-.		{ ; }
-\n		{ ; }
-
-%%
-
-int perf_pmu_wrap(void)
-{
-	return 1;
-}
diff --git a/src/tools/perf/util/pmu.y b/src/tools/perf/util/pmu.y
deleted file mode 100644
index bfd7e85..0000000
--- a/src/tools/perf/util/pmu.y
+++ /dev/null
@@ -1,92 +0,0 @@
-
-%parse-param {struct list_head *format}
-%parse-param {char *name}
-
-%{
-
-#include <linux/compiler.h>
-#include <linux/list.h>
-#include <linux/bitmap.h>
-#include <string.h>
-#include "pmu.h"
-
-extern int perf_pmu_lex (void);
-
-#define ABORT_ON(val) \
-do { \
-        if (val) \
-                YYABORT; \
-} while (0)
-
-%}
-
-%token PP_CONFIG PP_CONFIG1 PP_CONFIG2
-%token PP_VALUE PP_ERROR
-%type <num> PP_VALUE
-%type <bits> bit_term
-%type <bits> bits
-
-%union
-{
-	unsigned long num;
-	DECLARE_BITMAP(bits, PERF_PMU_FORMAT_BITS);
-}
-
-%%
-
-format:
-format format_term
-|
-format_term
-
-format_term:
-PP_CONFIG ':' bits
-{
-	ABORT_ON(perf_pmu__new_format(format, name,
-				      PERF_PMU_FORMAT_VALUE_CONFIG,
-				      $3));
-}
-|
-PP_CONFIG1 ':' bits
-{
-	ABORT_ON(perf_pmu__new_format(format, name,
-				      PERF_PMU_FORMAT_VALUE_CONFIG1,
-				      $3));
-}
-|
-PP_CONFIG2 ':' bits
-{
-	ABORT_ON(perf_pmu__new_format(format, name,
-				      PERF_PMU_FORMAT_VALUE_CONFIG2,
-				      $3));
-}
-
-bits:
-bits ',' bit_term
-{
-	bitmap_or($$, $1, $3, 64);
-}
-|
-bit_term
-{
-	memcpy($$, $1, sizeof($1));
-}
-
-bit_term:
-PP_VALUE '-' PP_VALUE
-{
-	perf_pmu__set_format($$, $1, $3);
-}
-|
-PP_VALUE
-{
-	perf_pmu__set_format($$, $1, 0);
-}
-
-%%
-
-void perf_pmu_error(struct list_head *list __maybe_unused,
-		    char *name __maybe_unused,
-		    char const *msg __maybe_unused)
-{
-}
diff --git a/src/tools/perf/util/probe-event.c b/src/tools/perf/util/probe-event.c
deleted file mode 100644
index aa04bf9..0000000
--- a/src/tools/perf/util/probe-event.c
+++ /dev/null
@@ -1,2374 +0,0 @@
-/*
- * probe-event.c : perf-probe definition to probe_events format converter
- *
- * Written by Masami Hiramatsu <mhiramat@redhat.com>
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#include <sys/utsname.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <limits.h>
-#include <elf.h>
-
-#include "util.h"
-#include "event.h"
-#include "strlist.h"
-#include "debug.h"
-#include "cache.h"
-#include "color.h"
-#include "symbol.h"
-#include "thread.h"
-#include <lk/debugfs.h>
-#include "trace-event.h"	/* For __maybe_unused */
-#include "probe-event.h"
-#include "probe-finder.h"
-#include "session.h"
-
-#define MAX_CMDLEN 256
-#define MAX_PROBE_ARGS 128
-#define PERFPROBE_GROUP "probe"
-
-bool probe_event_dry_run;	/* Dry run flag */
-
-#define semantic_error(msg ...) pr_err("Semantic error :" msg)
-
-/* If there is no space to write, returns -E2BIG. */
-static int e_snprintf(char *str, size_t size, const char *format, ...)
-	__attribute__((format(printf, 3, 4)));
-
-static int e_snprintf(char *str, size_t size, const char *format, ...)
-{
-	int ret;
-	va_list ap;
-	va_start(ap, format);
-	ret = vsnprintf(str, size, format, ap);
-	va_end(ap);
-	if (ret >= (int)size)
-		ret = -E2BIG;
-	return ret;
-}
-
-static char *synthesize_perf_probe_point(struct perf_probe_point *pp);
-static int convert_name_to_addr(struct perf_probe_event *pev,
-				const char *exec);
-static struct machine machine;
-
-/* Initialize symbol maps and path of vmlinux/modules */
-static int init_vmlinux(void)
-{
-	int ret;
-
-	symbol_conf.sort_by_name = true;
-	if (symbol_conf.vmlinux_name == NULL)
-		symbol_conf.try_vmlinux_path = true;
-	else
-		pr_debug("Use vmlinux: %s\n", symbol_conf.vmlinux_name);
-	ret = symbol__init();
-	if (ret < 0) {
-		pr_debug("Failed to init symbol map.\n");
-		goto out;
-	}
-
-	ret = machine__init(&machine, "", HOST_KERNEL_ID);
-	if (ret < 0)
-		goto out;
-
-	if (machine__create_kernel_maps(&machine) < 0) {
-		pr_debug("machine__create_kernel_maps() failed.\n");
-		goto out;
-	}
-out:
-	if (ret < 0)
-		pr_warning("Failed to init vmlinux path.\n");
-	return ret;
-}
-
-static struct symbol *__find_kernel_function_by_name(const char *name,
-						     struct map **mapp)
-{
-	return machine__find_kernel_function_by_name(&machine, name, mapp,
-						     NULL);
-}
-
-static struct map *kernel_get_module_map(const char *module)
-{
-	struct rb_node *nd;
-	struct map_groups *grp = &machine.kmaps;
-
-	/* A file path -- this is an offline module */
-	if (module && strchr(module, '/'))
-		return machine__new_module(&machine, 0, module);
-
-	if (!module)
-		module = "kernel";
-
-	for (nd = rb_first(&grp->maps[MAP__FUNCTION]); nd; nd = rb_next(nd)) {
-		struct map *pos = rb_entry(nd, struct map, rb_node);
-		if (strncmp(pos->dso->short_name + 1, module,
-			    pos->dso->short_name_len - 2) == 0) {
-			return pos;
-		}
-	}
-	return NULL;
-}
-
-static struct dso *kernel_get_module_dso(const char *module)
-{
-	struct dso *dso;
-	struct map *map;
-	const char *vmlinux_name;
-
-	if (module) {
-		list_for_each_entry(dso, &machine.kernel_dsos, node) {
-			if (strncmp(dso->short_name + 1, module,
-				    dso->short_name_len - 2) == 0)
-				goto found;
-		}
-		pr_debug("Failed to find module %s.\n", module);
-		return NULL;
-	}
-
-	map = machine.vmlinux_maps[MAP__FUNCTION];
-	dso = map->dso;
-
-	vmlinux_name = symbol_conf.vmlinux_name;
-	if (vmlinux_name) {
-		if (dso__load_vmlinux(dso, map, vmlinux_name, NULL) <= 0)
-			return NULL;
-	} else {
-		if (dso__load_vmlinux_path(dso, map, NULL) <= 0) {
-			pr_debug("Failed to load kernel map.\n");
-			return NULL;
-		}
-	}
-found:
-	return dso;
-}
-
-const char *kernel_get_module_path(const char *module)
-{
-	struct dso *dso = kernel_get_module_dso(module);
-	return (dso) ? dso->long_name : NULL;
-}
-
-static int init_user_exec(void)
-{
-	int ret = 0;
-
-	symbol_conf.try_vmlinux_path = false;
-	symbol_conf.sort_by_name = true;
-	ret = symbol__init();
-
-	if (ret < 0)
-		pr_debug("Failed to init symbol map.\n");
-
-	return ret;
-}
-
-static int convert_to_perf_probe_point(struct probe_trace_point *tp,
-					struct perf_probe_point *pp)
-{
-	pp->function = strdup(tp->symbol);
-
-	if (pp->function == NULL)
-		return -ENOMEM;
-
-	pp->offset = tp->offset;
-	pp->retprobe = tp->retprobe;
-
-	return 0;
-}
-
-#ifdef DWARF_SUPPORT
-/* Open new debuginfo of given module */
-static struct debuginfo *open_debuginfo(const char *module)
-{
-	const char *path;
-
-	/* A file path -- this is an offline module */
-	if (module && strchr(module, '/'))
-		path = module;
-	else {
-		path = kernel_get_module_path(module);
-
-		if (!path) {
-			pr_err("Failed to find path of %s module.\n",
-			       module ?: "kernel");
-			return NULL;
-		}
-	}
-	return debuginfo__new(path);
-}
-
-/*
- * Convert trace point to probe point with debuginfo
- * Currently only handles kprobes.
- */
-static int kprobe_convert_to_perf_probe(struct probe_trace_point *tp,
-					struct perf_probe_point *pp)
-{
-	struct symbol *sym;
-	struct map *map;
-	u64 addr;
-	int ret = -ENOENT;
-	struct debuginfo *dinfo;
-
-	sym = __find_kernel_function_by_name(tp->symbol, &map);
-	if (sym) {
-		addr = map->unmap_ip(map, sym->start + tp->offset);
-		pr_debug("try to find %s+%ld@%" PRIx64 "\n", tp->symbol,
-			 tp->offset, addr);
-
-		dinfo = debuginfo__new_online_kernel(addr);
-		if (dinfo) {
-			ret = debuginfo__find_probe_point(dinfo,
-						 (unsigned long)addr, pp);
-			debuginfo__delete(dinfo);
-		} else {
-			pr_debug("Failed to open debuginfo at 0x%" PRIx64 "\n",
-				 addr);
-			ret = -ENOENT;
-		}
-	}
-	if (ret <= 0) {
-		pr_debug("Failed to find corresponding probes from "
-			 "debuginfo. Use kprobe event information.\n");
-		return convert_to_perf_probe_point(tp, pp);
-	}
-	pp->retprobe = tp->retprobe;
-
-	return 0;
-}
-
-static int add_module_to_probe_trace_events(struct probe_trace_event *tevs,
-					    int ntevs, const char *module)
-{
-	int i, ret = 0;
-	char *tmp;
-
-	if (!module)
-		return 0;
-
-	tmp = strrchr(module, '/');
-	if (tmp) {
-		/* This is a module path -- get the module name */
-		module = strdup(tmp + 1);
-		if (!module)
-			return -ENOMEM;
-		tmp = strchr(module, '.');
-		if (tmp)
-			*tmp = '\0';
-		tmp = (char *)module;	/* For free() */
-	}
-
-	for (i = 0; i < ntevs; i++) {
-		tevs[i].point.module = strdup(module);
-		if (!tevs[i].point.module) {
-			ret = -ENOMEM;
-			break;
-		}
-	}
-
-	if (tmp)
-		free(tmp);
-
-	return ret;
-}
-
-/* Try to find perf_probe_event with debuginfo */
-static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
-					  struct probe_trace_event **tevs,
-					  int max_tevs, const char *target)
-{
-	bool need_dwarf = perf_probe_event_need_dwarf(pev);
-	struct debuginfo *dinfo;
-	int ntevs, ret = 0;
-
-	if (pev->uprobes) {
-		if (need_dwarf) {
-			pr_warning("Debuginfo-analysis is not yet supported"
-					" with -x/--exec option.\n");
-			return -ENOSYS;
-		}
-		return convert_name_to_addr(pev, target);
-	}
-
-	dinfo = open_debuginfo(target);
-
-	if (!dinfo) {
-		if (need_dwarf) {
-			pr_warning("Failed to open debuginfo file.\n");
-			return -ENOENT;
-		}
-		pr_debug("Could not open debuginfo. Try to use symbols.\n");
-		return 0;
-	}
-
-	/* Searching trace events corresponding to a probe event */
-	ntevs = debuginfo__find_trace_events(dinfo, pev, tevs, max_tevs);
-
-	debuginfo__delete(dinfo);
-
-	if (ntevs > 0) {	/* Succeeded to find trace events */
-		pr_debug("find %d probe_trace_events.\n", ntevs);
-		if (target)
-			ret = add_module_to_probe_trace_events(*tevs, ntevs,
-							       target);
-		return ret < 0 ? ret : ntevs;
-	}
-
-	if (ntevs == 0)	{	/* No error but failed to find probe point. */
-		pr_warning("Probe point '%s' not found.\n",
-			   synthesize_perf_probe_point(&pev->point));
-		return -ENOENT;
-	}
-	/* Error path : ntevs < 0 */
-	pr_debug("An error occurred in debuginfo analysis (%d).\n", ntevs);
-	if (ntevs == -EBADF) {
-		pr_warning("Warning: No dwarf info found in the vmlinux - "
-			"please rebuild kernel with CONFIG_DEBUG_INFO=y.\n");
-		if (!need_dwarf) {
-			pr_debug("Trying to use symbols.\n");
-			return 0;
-		}
-	}
-	return ntevs;
-}
-
-/*
- * Find a src file from a DWARF tag path. Prepend optional source path prefix
- * and chop off leading directories that do not exist. Result is passed back as
- * a newly allocated path on success.
- * Return 0 if file was found and readable, -errno otherwise.
- */
-static int get_real_path(const char *raw_path, const char *comp_dir,
-			 char **new_path)
-{
-	const char *prefix = symbol_conf.source_prefix;
-
-	if (!prefix) {
-		if (raw_path[0] != '/' && comp_dir)
-			/* If not an absolute path, try to use comp_dir */
-			prefix = comp_dir;
-		else {
-			if (access(raw_path, R_OK) == 0) {
-				*new_path = strdup(raw_path);
-				return 0;
-			} else
-				return -errno;
-		}
-	}
-
-	*new_path = malloc((strlen(prefix) + strlen(raw_path) + 2));
-	if (!*new_path)
-		return -ENOMEM;
-
-	for (;;) {
-		sprintf(*new_path, "%s/%s", prefix, raw_path);
-
-		if (access(*new_path, R_OK) == 0)
-			return 0;
-
-		if (!symbol_conf.source_prefix)
-			/* In case of searching comp_dir, don't retry */
-			return -errno;
-
-		switch (errno) {
-		case ENAMETOOLONG:
-		case ENOENT:
-		case EROFS:
-		case EFAULT:
-			raw_path = strchr(++raw_path, '/');
-			if (!raw_path) {
-				free(*new_path);
-				*new_path = NULL;
-				return -ENOENT;
-			}
-			continue;
-
-		default:
-			free(*new_path);
-			*new_path = NULL;
-			return -errno;
-		}
-	}
-}
-
-#define LINEBUF_SIZE 256
-#define NR_ADDITIONAL_LINES 2
-
-static int __show_one_line(FILE *fp, int l, bool skip, bool show_num)
-{
-	char buf[LINEBUF_SIZE];
-	const char *color = show_num ? "" : PERF_COLOR_BLUE;
-	const char *prefix = NULL;
-
-	do {
-		if (fgets(buf, LINEBUF_SIZE, fp) == NULL)
-			goto error;
-		if (skip)
-			continue;
-		if (!prefix) {
-			prefix = show_num ? "%7d  " : "         ";
-			color_fprintf(stdout, color, prefix, l);
-		}
-		color_fprintf(stdout, color, "%s", buf);
-
-	} while (strchr(buf, '\n') == NULL);
-
-	return 1;
-error:
-	if (ferror(fp)) {
-		pr_warning("File read error: %s\n", strerror(errno));
-		return -1;
-	}
-	return 0;
-}
-
-static int _show_one_line(FILE *fp, int l, bool skip, bool show_num)
-{
-	int rv = __show_one_line(fp, l, skip, show_num);
-	if (rv == 0) {
-		pr_warning("Source file is shorter than expected.\n");
-		rv = -1;
-	}
-	return rv;
-}
-
-#define show_one_line_with_num(f,l)	_show_one_line(f,l,false,true)
-#define show_one_line(f,l)		_show_one_line(f,l,false,false)
-#define skip_one_line(f,l)		_show_one_line(f,l,true,false)
-#define show_one_line_or_eof(f,l)	__show_one_line(f,l,false,false)
-
-/*
- * Show line-range always requires debuginfo to find source file and
- * line number.
- */
-int show_line_range(struct line_range *lr, const char *module)
-{
-	int l = 1;
-	struct line_node *ln;
-	struct debuginfo *dinfo;
-	FILE *fp;
-	int ret;
-	char *tmp;
-
-	/* Search a line range */
-	ret = init_vmlinux();
-	if (ret < 0)
-		return ret;
-
-	dinfo = open_debuginfo(module);
-	if (!dinfo) {
-		pr_warning("Failed to open debuginfo file.\n");
-		return -ENOENT;
-	}
-
-	ret = debuginfo__find_line_range(dinfo, lr);
-	debuginfo__delete(dinfo);
-	if (ret == 0) {
-		pr_warning("Specified source line is not found.\n");
-		return -ENOENT;
-	} else if (ret < 0) {
-		pr_warning("Debuginfo analysis failed. (%d)\n", ret);
-		return ret;
-	}
-
-	/* Convert source file path */
-	tmp = lr->path;
-	ret = get_real_path(tmp, lr->comp_dir, &lr->path);
-	free(tmp);	/* Free old path */
-	if (ret < 0) {
-		pr_warning("Failed to find source file. (%d)\n", ret);
-		return ret;
-	}
-
-	setup_pager();
-
-	if (lr->function)
-		fprintf(stdout, "<%s@%s:%d>\n", lr->function, lr->path,
-			lr->start - lr->offset);
-	else
-		fprintf(stdout, "<%s:%d>\n", lr->path, lr->start);
-
-	fp = fopen(lr->path, "r");
-	if (fp == NULL) {
-		pr_warning("Failed to open %s: %s\n", lr->path,
-			   strerror(errno));
-		return -errno;
-	}
-	/* Skip to starting line number */
-	while (l < lr->start) {
-		ret = skip_one_line(fp, l++);
-		if (ret < 0)
-			goto end;
-	}
-
-	list_for_each_entry(ln, &lr->line_list, list) {
-		for (; ln->line > l; l++) {
-			ret = show_one_line(fp, l - lr->offset);
-			if (ret < 0)
-				goto end;
-		}
-		ret = show_one_line_with_num(fp, l++ - lr->offset);
-		if (ret < 0)
-			goto end;
-	}
-
-	if (lr->end == INT_MAX)
-		lr->end = l + NR_ADDITIONAL_LINES;
-	while (l <= lr->end) {
-		ret = show_one_line_or_eof(fp, l++ - lr->offset);
-		if (ret <= 0)
-			break;
-	}
-end:
-	fclose(fp);
-	return ret;
-}
-
-static int show_available_vars_at(struct debuginfo *dinfo,
-				  struct perf_probe_event *pev,
-				  int max_vls, struct strfilter *_filter,
-				  bool externs)
-{
-	char *buf;
-	int ret, i, nvars;
-	struct str_node *node;
-	struct variable_list *vls = NULL, *vl;
-	const char *var;
-
-	buf = synthesize_perf_probe_point(&pev->point);
-	if (!buf)
-		return -EINVAL;
-	pr_debug("Searching variables at %s\n", buf);
-
-	ret = debuginfo__find_available_vars_at(dinfo, pev, &vls,
-						max_vls, externs);
-	if (ret <= 0) {
-		pr_err("Failed to find variables at %s (%d)\n", buf, ret);
-		goto end;
-	}
-	/* Some variables are found */
-	fprintf(stdout, "Available variables at %s\n", buf);
-	for (i = 0; i < ret; i++) {
-		vl = &vls[i];
-		/*
-		 * A probe point might be converted to
-		 * several trace points.
-		 */
-		fprintf(stdout, "\t@<%s+%lu>\n", vl->point.symbol,
-			vl->point.offset);
-		free(vl->point.symbol);
-		nvars = 0;
-		if (vl->vars) {
-			strlist__for_each(node, vl->vars) {
-				var = strchr(node->s, '\t') + 1;
-				if (strfilter__compare(_filter, var)) {
-					fprintf(stdout, "\t\t%s\n", node->s);
-					nvars++;
-				}
-			}
-			strlist__delete(vl->vars);
-		}
-		if (nvars == 0)
-			fprintf(stdout, "\t\t(No matched variables)\n");
-	}
-	free(vls);
-end:
-	free(buf);
-	return ret;
-}
-
-/* Show available variables on given probe point */
-int show_available_vars(struct perf_probe_event *pevs, int npevs,
-			int max_vls, const char *module,
-			struct strfilter *_filter, bool externs)
-{
-	int i, ret = 0;
-	struct debuginfo *dinfo;
-
-	ret = init_vmlinux();
-	if (ret < 0)
-		return ret;
-
-	dinfo = open_debuginfo(module);
-	if (!dinfo) {
-		pr_warning("Failed to open debuginfo file.\n");
-		return -ENOENT;
-	}
-
-	setup_pager();
-
-	for (i = 0; i < npevs && ret >= 0; i++)
-		ret = show_available_vars_at(dinfo, &pevs[i], max_vls, _filter,
-					     externs);
-
-	debuginfo__delete(dinfo);
-	return ret;
-}
-
-#else	/* !DWARF_SUPPORT */
-
-static int kprobe_convert_to_perf_probe(struct probe_trace_point *tp,
-					struct perf_probe_point *pp)
-{
-	struct symbol *sym;
-
-	sym = __find_kernel_function_by_name(tp->symbol, NULL);
-	if (!sym) {
-		pr_err("Failed to find symbol %s in kernel.\n", tp->symbol);
-		return -ENOENT;
-	}
-
-	return convert_to_perf_probe_point(tp, pp);
-}
-
-static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
-				struct probe_trace_event **tevs __maybe_unused,
-				int max_tevs __maybe_unused, const char *target)
-{
-	if (perf_probe_event_need_dwarf(pev)) {
-		pr_warning("Debuginfo-analysis is not supported.\n");
-		return -ENOSYS;
-	}
-
-	if (pev->uprobes)
-		return convert_name_to_addr(pev, target);
-
-	return 0;
-}
-
-int show_line_range(struct line_range *lr __maybe_unused,
-		    const char *module __maybe_unused)
-{
-	pr_warning("Debuginfo-analysis is not supported.\n");
-	return -ENOSYS;
-}
-
-int show_available_vars(struct perf_probe_event *pevs __maybe_unused,
-			int npevs __maybe_unused, int max_vls __maybe_unused,
-			const char *module __maybe_unused,
-			struct strfilter *filter __maybe_unused,
-			bool externs __maybe_unused)
-{
-	pr_warning("Debuginfo-analysis is not supported.\n");
-	return -ENOSYS;
-}
-#endif
-
-static int parse_line_num(char **ptr, int *val, const char *what)
-{
-	const char *start = *ptr;
-
-	errno = 0;
-	*val = strtol(*ptr, ptr, 0);
-	if (errno || *ptr == start) {
-		semantic_error("'%s' is not a valid number.\n", what);
-		return -EINVAL;
-	}
-	return 0;
-}
-
-/*
- * Stuff 'lr' according to the line range described by 'arg'.
- * The line range syntax is described by:
- *
- *         SRC[:SLN[+NUM|-ELN]]
- *         FNC[@SRC][:SLN[+NUM|-ELN]]
- */
-int parse_line_range_desc(const char *arg, struct line_range *lr)
-{
-	char *range, *file, *name = strdup(arg);
-	int err;
-
-	if (!name)
-		return -ENOMEM;
-
-	lr->start = 0;
-	lr->end = INT_MAX;
-
-	range = strchr(name, ':');
-	if (range) {
-		*range++ = '\0';
-
-		err = parse_line_num(&range, &lr->start, "start line");
-		if (err)
-			goto err;
-
-		if (*range == '+' || *range == '-') {
-			const char c = *range++;
-
-			err = parse_line_num(&range, &lr->end, "end line");
-			if (err)
-				goto err;
-
-			if (c == '+') {
-				lr->end += lr->start;
-				/*
-				 * Adjust the number of lines here.
-				 * If the number of lines == 1, the
-				 * the end of line should be equal to
-				 * the start of line.
-				 */
-				lr->end--;
-			}
-		}
-
-		pr_debug("Line range is %d to %d\n", lr->start, lr->end);
-
-		err = -EINVAL;
-		if (lr->start > lr->end) {
-			semantic_error("Start line must be smaller"
-				       " than end line.\n");
-			goto err;
-		}
-		if (*range != '\0') {
-			semantic_error("Tailing with invalid str '%s'.\n", range);
-			goto err;
-		}
-	}
-
-	file = strchr(name, '@');
-	if (file) {
-		*file = '\0';
-		lr->file = strdup(++file);
-		if (lr->file == NULL) {
-			err = -ENOMEM;
-			goto err;
-		}
-		lr->function = name;
-	} else if (strchr(name, '.'))
-		lr->file = name;
-	else
-		lr->function = name;
-
-	return 0;
-err:
-	free(name);
-	return err;
-}
-
-/* Check the name is good for event/group */
-static bool check_event_name(const char *name)
-{
-	if (!isalpha(*name) && *name != '_')
-		return false;
-	while (*++name != '\0') {
-		if (!isalpha(*name) && !isdigit(*name) && *name != '_')
-			return false;
-	}
-	return true;
-}
-
-/* Parse probepoint definition. */
-static int parse_perf_probe_point(char *arg, struct perf_probe_event *pev)
-{
-	struct perf_probe_point *pp = &pev->point;
-	char *ptr, *tmp;
-	char c, nc = 0;
-	/*
-	 * <Syntax>
-	 * perf probe [EVENT=]SRC[:LN|;PTN]
-	 * perf probe [EVENT=]FUNC[@SRC][+OFFS|%return|:LN|;PAT]
-	 *
-	 * TODO:Group name support
-	 */
-
-	ptr = strpbrk(arg, ";=@+%");
-	if (ptr && *ptr == '=') {	/* Event name */
-		*ptr = '\0';
-		tmp = ptr + 1;
-		if (strchr(arg, ':')) {
-			semantic_error("Group name is not supported yet.\n");
-			return -ENOTSUP;
-		}
-		if (!check_event_name(arg)) {
-			semantic_error("%s is bad for event name -it must "
-				       "follow C symbol-naming rule.\n", arg);
-			return -EINVAL;
-		}
-		pev->event = strdup(arg);
-		if (pev->event == NULL)
-			return -ENOMEM;
-		pev->group = NULL;
-		arg = tmp;
-	}
-
-	ptr = strpbrk(arg, ";:+@%");
-	if (ptr) {
-		nc = *ptr;
-		*ptr++ = '\0';
-	}
-
-	tmp = strdup(arg);
-	if (tmp == NULL)
-		return -ENOMEM;
-
-	/* Check arg is function or file and copy it */
-	if (strchr(tmp, '.'))	/* File */
-		pp->file = tmp;
-	else			/* Function */
-		pp->function = tmp;
-
-	/* Parse other options */
-	while (ptr) {
-		arg = ptr;
-		c = nc;
-		if (c == ';') {	/* Lazy pattern must be the last part */
-			pp->lazy_line = strdup(arg);
-			if (pp->lazy_line == NULL)
-				return -ENOMEM;
-			break;
-		}
-		ptr = strpbrk(arg, ";:+@%");
-		if (ptr) {
-			nc = *ptr;
-			*ptr++ = '\0';
-		}
-		switch (c) {
-		case ':':	/* Line number */
-			pp->line = strtoul(arg, &tmp, 0);
-			if (*tmp != '\0') {
-				semantic_error("There is non-digit char"
-					       " in line number.\n");
-				return -EINVAL;
-			}
-			break;
-		case '+':	/* Byte offset from a symbol */
-			pp->offset = strtoul(arg, &tmp, 0);
-			if (*tmp != '\0') {
-				semantic_error("There is non-digit character"
-						" in offset.\n");
-				return -EINVAL;
-			}
-			break;
-		case '@':	/* File name */
-			if (pp->file) {
-				semantic_error("SRC@SRC is not allowed.\n");
-				return -EINVAL;
-			}
-			pp->file = strdup(arg);
-			if (pp->file == NULL)
-				return -ENOMEM;
-			break;
-		case '%':	/* Probe places */
-			if (strcmp(arg, "return") == 0) {
-				pp->retprobe = 1;
-			} else {	/* Others not supported yet */
-				semantic_error("%%%s is not supported.\n", arg);
-				return -ENOTSUP;
-			}
-			break;
-		default:	/* Buggy case */
-			pr_err("This program has a bug at %s:%d.\n",
-				__FILE__, __LINE__);
-			return -ENOTSUP;
-			break;
-		}
-	}
-
-	/* Exclusion check */
-	if (pp->lazy_line && pp->line) {
-		semantic_error("Lazy pattern can't be used with"
-			       " line number.\n");
-		return -EINVAL;
-	}
-
-	if (pp->lazy_line && pp->offset) {
-		semantic_error("Lazy pattern can't be used with offset.\n");
-		return -EINVAL;
-	}
-
-	if (pp->line && pp->offset) {
-		semantic_error("Offset can't be used with line number.\n");
-		return -EINVAL;
-	}
-
-	if (!pp->line && !pp->lazy_line && pp->file && !pp->function) {
-		semantic_error("File always requires line number or "
-			       "lazy pattern.\n");
-		return -EINVAL;
-	}
-
-	if (pp->offset && !pp->function) {
-		semantic_error("Offset requires an entry function.\n");
-		return -EINVAL;
-	}
-
-	if (pp->retprobe && !pp->function) {
-		semantic_error("Return probe requires an entry function.\n");
-		return -EINVAL;
-	}
-
-	if ((pp->offset || pp->line || pp->lazy_line) && pp->retprobe) {
-		semantic_error("Offset/Line/Lazy pattern can't be used with "
-			       "return probe.\n");
-		return -EINVAL;
-	}
-
-	pr_debug("symbol:%s file:%s line:%d offset:%lu return:%d lazy:%s\n",
-		 pp->function, pp->file, pp->line, pp->offset, pp->retprobe,
-		 pp->lazy_line);
-	return 0;
-}
-
-/* Parse perf-probe event argument */
-static int parse_perf_probe_arg(char *str, struct perf_probe_arg *arg)
-{
-	char *tmp, *goodname;
-	struct perf_probe_arg_field **fieldp;
-
-	pr_debug("parsing arg: %s into ", str);
-
-	tmp = strchr(str, '=');
-	if (tmp) {
-		arg->name = strndup(str, tmp - str);
-		if (arg->name == NULL)
-			return -ENOMEM;
-		pr_debug("name:%s ", arg->name);
-		str = tmp + 1;
-	}
-
-	tmp = strchr(str, ':');
-	if (tmp) {	/* Type setting */
-		*tmp = '\0';
-		arg->type = strdup(tmp + 1);
-		if (arg->type == NULL)
-			return -ENOMEM;
-		pr_debug("type:%s ", arg->type);
-	}
-
-	tmp = strpbrk(str, "-.[");
-	if (!is_c_varname(str) || !tmp) {
-		/* A variable, register, symbol or special value */
-		arg->var = strdup(str);
-		if (arg->var == NULL)
-			return -ENOMEM;
-		pr_debug("%s\n", arg->var);
-		return 0;
-	}
-
-	/* Structure fields or array element */
-	arg->var = strndup(str, tmp - str);
-	if (arg->var == NULL)
-		return -ENOMEM;
-	goodname = arg->var;
-	pr_debug("%s, ", arg->var);
-	fieldp = &arg->field;
-
-	do {
-		*fieldp = zalloc(sizeof(struct perf_probe_arg_field));
-		if (*fieldp == NULL)
-			return -ENOMEM;
-		if (*tmp == '[') {	/* Array */
-			str = tmp;
-			(*fieldp)->index = strtol(str + 1, &tmp, 0);
-			(*fieldp)->ref = true;
-			if (*tmp != ']' || tmp == str + 1) {
-				semantic_error("Array index must be a"
-						" number.\n");
-				return -EINVAL;
-			}
-			tmp++;
-			if (*tmp == '\0')
-				tmp = NULL;
-		} else {		/* Structure */
-			if (*tmp == '.') {
-				str = tmp + 1;
-				(*fieldp)->ref = false;
-			} else if (tmp[1] == '>') {
-				str = tmp + 2;
-				(*fieldp)->ref = true;
-			} else {
-				semantic_error("Argument parse error: %s\n",
-					       str);
-				return -EINVAL;
-			}
-			tmp = strpbrk(str, "-.[");
-		}
-		if (tmp) {
-			(*fieldp)->name = strndup(str, tmp - str);
-			if ((*fieldp)->name == NULL)
-				return -ENOMEM;
-			if (*str != '[')
-				goodname = (*fieldp)->name;
-			pr_debug("%s(%d), ", (*fieldp)->name, (*fieldp)->ref);
-			fieldp = &(*fieldp)->next;
-		}
-	} while (tmp);
-	(*fieldp)->name = strdup(str);
-	if ((*fieldp)->name == NULL)
-		return -ENOMEM;
-	if (*str != '[')
-		goodname = (*fieldp)->name;
-	pr_debug("%s(%d)\n", (*fieldp)->name, (*fieldp)->ref);
-
-	/* If no name is specified, set the last field name (not array index)*/
-	if (!arg->name) {
-		arg->name = strdup(goodname);
-		if (arg->name == NULL)
-			return -ENOMEM;
-	}
-	return 0;
-}
-
-/* Parse perf-probe event command */
-int parse_perf_probe_command(const char *cmd, struct perf_probe_event *pev)
-{
-	char **argv;
-	int argc, i, ret = 0;
-
-	argv = argv_split(cmd, &argc);
-	if (!argv) {
-		pr_debug("Failed to split arguments.\n");
-		return -ENOMEM;
-	}
-	if (argc - 1 > MAX_PROBE_ARGS) {
-		semantic_error("Too many probe arguments (%d).\n", argc - 1);
-		ret = -ERANGE;
-		goto out;
-	}
-	/* Parse probe point */
-	ret = parse_perf_probe_point(argv[0], pev);
-	if (ret < 0)
-		goto out;
-
-	/* Copy arguments and ensure return probe has no C argument */
-	pev->nargs = argc - 1;
-	pev->args = zalloc(sizeof(struct perf_probe_arg) * pev->nargs);
-	if (pev->args == NULL) {
-		ret = -ENOMEM;
-		goto out;
-	}
-	for (i = 0; i < pev->nargs && ret >= 0; i++) {
-		ret = parse_perf_probe_arg(argv[i + 1], &pev->args[i]);
-		if (ret >= 0 &&
-		    is_c_varname(pev->args[i].var) && pev->point.retprobe) {
-			semantic_error("You can't specify local variable for"
-				       " kretprobe.\n");
-			ret = -EINVAL;
-		}
-	}
-out:
-	argv_free(argv);
-
-	return ret;
-}
-
-/* Return true if this perf_probe_event requires debuginfo */
-bool perf_probe_event_need_dwarf(struct perf_probe_event *pev)
-{
-	int i;
-
-	if (pev->point.file || pev->point.line || pev->point.lazy_line)
-		return true;
-
-	for (i = 0; i < pev->nargs; i++)
-		if (is_c_varname(pev->args[i].var))
-			return true;
-
-	return false;
-}
-
-/* Parse probe_events event into struct probe_point */
-static int parse_probe_trace_command(const char *cmd,
-				     struct probe_trace_event *tev)
-{
-	struct probe_trace_point *tp = &tev->point;
-	char pr;
-	char *p;
-	char *argv0_str = NULL, *fmt, *fmt1_str, *fmt2_str, *fmt3_str;
-	int ret, i, argc;
-	char **argv;
-
-	pr_debug("Parsing probe_events: %s\n", cmd);
-	argv = argv_split(cmd, &argc);
-	if (!argv) {
-		pr_debug("Failed to split arguments.\n");
-		return -ENOMEM;
-	}
-	if (argc < 2) {
-		semantic_error("Too few probe arguments.\n");
-		ret = -ERANGE;
-		goto out;
-	}
-
-	/* Scan event and group name. */
-	argv0_str = strdup(argv[0]);
-	if (argv0_str == NULL) {
-		ret = -ENOMEM;
-		goto out;
-	}
-	fmt1_str = strtok_r(argv0_str, ":", &fmt);
-	fmt2_str = strtok_r(NULL, "/", &fmt);
-	fmt3_str = strtok_r(NULL, " \t", &fmt);
-	if (fmt1_str == NULL || strlen(fmt1_str) != 1 || fmt2_str == NULL
-	    || fmt3_str == NULL) {
-		semantic_error("Failed to parse event name: %s\n", argv[0]);
-		ret = -EINVAL;
-		goto out;
-	}
-	pr = fmt1_str[0];
-	tev->group = strdup(fmt2_str);
-	tev->event = strdup(fmt3_str);
-	if (tev->group == NULL || tev->event == NULL) {
-		ret = -ENOMEM;
-		goto out;
-	}
-	pr_debug("Group:%s Event:%s probe:%c\n", tev->group, tev->event, pr);
-
-	tp->retprobe = (pr == 'r');
-
-	/* Scan module name(if there), function name and offset */
-	p = strchr(argv[1], ':');
-	if (p) {
-		tp->module = strndup(argv[1], p - argv[1]);
-		p++;
-	} else
-		p = argv[1];
-	fmt1_str = strtok_r(p, "+", &fmt);
-	tp->symbol = strdup(fmt1_str);
-	if (tp->symbol == NULL) {
-		ret = -ENOMEM;
-		goto out;
-	}
-	fmt2_str = strtok_r(NULL, "", &fmt);
-	if (fmt2_str == NULL)
-		tp->offset = 0;
-	else
-		tp->offset = strtoul(fmt2_str, NULL, 10);
-
-	tev->nargs = argc - 2;
-	tev->args = zalloc(sizeof(struct probe_trace_arg) * tev->nargs);
-	if (tev->args == NULL) {
-		ret = -ENOMEM;
-		goto out;
-	}
-	for (i = 0; i < tev->nargs; i++) {
-		p = strchr(argv[i + 2], '=');
-		if (p)	/* We don't need which register is assigned. */
-			*p++ = '\0';
-		else
-			p = argv[i + 2];
-		tev->args[i].name = strdup(argv[i + 2]);
-		/* TODO: parse regs and offset */
-		tev->args[i].value = strdup(p);
-		if (tev->args[i].name == NULL || tev->args[i].value == NULL) {
-			ret = -ENOMEM;
-			goto out;
-		}
-	}
-	ret = 0;
-out:
-	free(argv0_str);
-	argv_free(argv);
-	return ret;
-}
-
-/* Compose only probe arg */
-int synthesize_perf_probe_arg(struct perf_probe_arg *pa, char *buf, size_t len)
-{
-	struct perf_probe_arg_field *field = pa->field;
-	int ret;
-	char *tmp = buf;
-
-	if (pa->name && pa->var)
-		ret = e_snprintf(tmp, len, "%s=%s", pa->name, pa->var);
-	else
-		ret = e_snprintf(tmp, len, "%s", pa->name ? pa->name : pa->var);
-	if (ret <= 0)
-		goto error;
-	tmp += ret;
-	len -= ret;
-
-	while (field) {
-		if (field->name[0] == '[')
-			ret = e_snprintf(tmp, len, "%s", field->name);
-		else
-			ret = e_snprintf(tmp, len, "%s%s",
-					 field->ref ? "->" : ".", field->name);
-		if (ret <= 0)
-			goto error;
-		tmp += ret;
-		len -= ret;
-		field = field->next;
-	}
-
-	if (pa->type) {
-		ret = e_snprintf(tmp, len, ":%s", pa->type);
-		if (ret <= 0)
-			goto error;
-		tmp += ret;
-		len -= ret;
-	}
-
-	return tmp - buf;
-error:
-	pr_debug("Failed to synthesize perf probe argument: %s\n",
-		 strerror(-ret));
-	return ret;
-}
-
-/* Compose only probe point (not argument) */
-static char *synthesize_perf_probe_point(struct perf_probe_point *pp)
-{
-	char *buf, *tmp;
-	char offs[32] = "", line[32] = "", file[32] = "";
-	int ret, len;
-
-	buf = zalloc(MAX_CMDLEN);
-	if (buf == NULL) {
-		ret = -ENOMEM;
-		goto error;
-	}
-	if (pp->offset) {
-		ret = e_snprintf(offs, 32, "+%lu", pp->offset);
-		if (ret <= 0)
-			goto error;
-	}
-	if (pp->line) {
-		ret = e_snprintf(line, 32, ":%d", pp->line);
-		if (ret <= 0)
-			goto error;
-	}
-	if (pp->file) {
-		tmp = pp->file;
-		len = strlen(tmp);
-		if (len > 30) {
-			tmp = strchr(pp->file + len - 30, '/');
-			tmp = tmp ? tmp + 1 : pp->file + len - 30;
-		}
-		ret = e_snprintf(file, 32, "@%s", tmp);
-		if (ret <= 0)
-			goto error;
-	}
-
-	if (pp->function)
-		ret = e_snprintf(buf, MAX_CMDLEN, "%s%s%s%s%s", pp->function,
-				 offs, pp->retprobe ? "%return" : "", line,
-				 file);
-	else
-		ret = e_snprintf(buf, MAX_CMDLEN, "%s%s", file, line);
-	if (ret <= 0)
-		goto error;
-
-	return buf;
-error:
-	pr_debug("Failed to synthesize perf probe point: %s\n",
-		 strerror(-ret));
-	if (buf)
-		free(buf);
-	return NULL;
-}
-
-#if 0
-char *synthesize_perf_probe_command(struct perf_probe_event *pev)
-{
-	char *buf;
-	int i, len, ret;
-
-	buf = synthesize_perf_probe_point(&pev->point);
-	if (!buf)
-		return NULL;
-
-	len = strlen(buf);
-	for (i = 0; i < pev->nargs; i++) {
-		ret = e_snprintf(&buf[len], MAX_CMDLEN - len, " %s",
-				 pev->args[i].name);
-		if (ret <= 0) {
-			free(buf);
-			return NULL;
-		}
-		len += ret;
-	}
-
-	return buf;
-}
-#endif
-
-static int __synthesize_probe_trace_arg_ref(struct probe_trace_arg_ref *ref,
-					     char **buf, size_t *buflen,
-					     int depth)
-{
-	int ret;
-	if (ref->next) {
-		depth = __synthesize_probe_trace_arg_ref(ref->next, buf,
-							 buflen, depth + 1);
-		if (depth < 0)
-			goto out;
-	}
-
-	ret = e_snprintf(*buf, *buflen, "%+ld(", ref->offset);
-	if (ret < 0)
-		depth = ret;
-	else {
-		*buf += ret;
-		*buflen -= ret;
-	}
-out:
-	return depth;
-
-}
-
-static int synthesize_probe_trace_arg(struct probe_trace_arg *arg,
-				       char *buf, size_t buflen)
-{
-	struct probe_trace_arg_ref *ref = arg->ref;
-	int ret, depth = 0;
-	char *tmp = buf;
-
-	/* Argument name or separator */
-	if (arg->name)
-		ret = e_snprintf(buf, buflen, " %s=", arg->name);
-	else
-		ret = e_snprintf(buf, buflen, " ");
-	if (ret < 0)
-		return ret;
-	buf += ret;
-	buflen -= ret;
-
-	/* Special case: @XXX */
-	if (arg->value[0] == '@' && arg->ref)
-			ref = ref->next;
-
-	/* Dereferencing arguments */
-	if (ref) {
-		depth = __synthesize_probe_trace_arg_ref(ref, &buf,
-							  &buflen, 1);
-		if (depth < 0)
-			return depth;
-	}
-
-	/* Print argument value */
-	if (arg->value[0] == '@' && arg->ref)
-		ret = e_snprintf(buf, buflen, "%s%+ld", arg->value,
-				 arg->ref->offset);
-	else
-		ret = e_snprintf(buf, buflen, "%s", arg->value);
-	if (ret < 0)
-		return ret;
-	buf += ret;
-	buflen -= ret;
-
-	/* Closing */
-	while (depth--) {
-		ret = e_snprintf(buf, buflen, ")");
-		if (ret < 0)
-			return ret;
-		buf += ret;
-		buflen -= ret;
-	}
-	/* Print argument type */
-	if (arg->type) {
-		ret = e_snprintf(buf, buflen, ":%s", arg->type);
-		if (ret <= 0)
-			return ret;
-		buf += ret;
-	}
-
-	return buf - tmp;
-}
-
-char *synthesize_probe_trace_command(struct probe_trace_event *tev)
-{
-	struct probe_trace_point *tp = &tev->point;
-	char *buf;
-	int i, len, ret;
-
-	buf = zalloc(MAX_CMDLEN);
-	if (buf == NULL)
-		return NULL;
-
-	if (tev->uprobes)
-		len = e_snprintf(buf, MAX_CMDLEN, "%c:%s/%s %s:%s",
-				 tp->retprobe ? 'r' : 'p',
-				 tev->group, tev->event,
-				 tp->module, tp->symbol);
-	else
-		len = e_snprintf(buf, MAX_CMDLEN, "%c:%s/%s %s%s%s+%lu",
-				 tp->retprobe ? 'r' : 'p',
-				 tev->group, tev->event,
-				 tp->module ?: "", tp->module ? ":" : "",
-				 tp->symbol, tp->offset);
-
-	if (len <= 0)
-		goto error;
-
-	for (i = 0; i < tev->nargs; i++) {
-		ret = synthesize_probe_trace_arg(&tev->args[i], buf + len,
-						  MAX_CMDLEN - len);
-		if (ret <= 0)
-			goto error;
-		len += ret;
-	}
-
-	return buf;
-error:
-	free(buf);
-	return NULL;
-}
-
-static int convert_to_perf_probe_event(struct probe_trace_event *tev,
-			       struct perf_probe_event *pev, bool is_kprobe)
-{
-	char buf[64] = "";
-	int i, ret;
-
-	/* Convert event/group name */
-	pev->event = strdup(tev->event);
-	pev->group = strdup(tev->group);
-	if (pev->event == NULL || pev->group == NULL)
-		return -ENOMEM;
-
-	/* Convert trace_point to probe_point */
-	if (is_kprobe)
-		ret = kprobe_convert_to_perf_probe(&tev->point, &pev->point);
-	else
-		ret = convert_to_perf_probe_point(&tev->point, &pev->point);
-
-	if (ret < 0)
-		return ret;
-
-	/* Convert trace_arg to probe_arg */
-	pev->nargs = tev->nargs;
-	pev->args = zalloc(sizeof(struct perf_probe_arg) * pev->nargs);
-	if (pev->args == NULL)
-		return -ENOMEM;
-	for (i = 0; i < tev->nargs && ret >= 0; i++) {
-		if (tev->args[i].name)
-			pev->args[i].name = strdup(tev->args[i].name);
-		else {
-			ret = synthesize_probe_trace_arg(&tev->args[i],
-							  buf, 64);
-			pev->args[i].name = strdup(buf);
-		}
-		if (pev->args[i].name == NULL && ret >= 0)
-			ret = -ENOMEM;
-	}
-
-	if (ret < 0)
-		clear_perf_probe_event(pev);
-
-	return ret;
-}
-
-void clear_perf_probe_event(struct perf_probe_event *pev)
-{
-	struct perf_probe_point *pp = &pev->point;
-	struct perf_probe_arg_field *field, *next;
-	int i;
-
-	if (pev->event)
-		free(pev->event);
-	if (pev->group)
-		free(pev->group);
-	if (pp->file)
-		free(pp->file);
-	if (pp->function)
-		free(pp->function);
-	if (pp->lazy_line)
-		free(pp->lazy_line);
-	for (i = 0; i < pev->nargs; i++) {
-		if (pev->args[i].name)
-			free(pev->args[i].name);
-		if (pev->args[i].var)
-			free(pev->args[i].var);
-		if (pev->args[i].type)
-			free(pev->args[i].type);
-		field = pev->args[i].field;
-		while (field) {
-			next = field->next;
-			if (field->name)
-				free(field->name);
-			free(field);
-			field = next;
-		}
-	}
-	if (pev->args)
-		free(pev->args);
-	memset(pev, 0, sizeof(*pev));
-}
-
-static void clear_probe_trace_event(struct probe_trace_event *tev)
-{
-	struct probe_trace_arg_ref *ref, *next;
-	int i;
-
-	if (tev->event)
-		free(tev->event);
-	if (tev->group)
-		free(tev->group);
-	if (tev->point.symbol)
-		free(tev->point.symbol);
-	if (tev->point.module)
-		free(tev->point.module);
-	for (i = 0; i < tev->nargs; i++) {
-		if (tev->args[i].name)
-			free(tev->args[i].name);
-		if (tev->args[i].value)
-			free(tev->args[i].value);
-		if (tev->args[i].type)
-			free(tev->args[i].type);
-		ref = tev->args[i].ref;
-		while (ref) {
-			next = ref->next;
-			free(ref);
-			ref = next;
-		}
-	}
-	if (tev->args)
-		free(tev->args);
-	memset(tev, 0, sizeof(*tev));
-}
-
-static void print_warn_msg(const char *file, bool is_kprobe)
-{
-
-	if (errno == ENOENT) {
-		const char *config;
-
-		if (!is_kprobe)
-			config = "CONFIG_UPROBE_EVENTS";
-		else
-			config = "CONFIG_KPROBE_EVENTS";
-
-		pr_warning("%s file does not exist - please rebuild kernel"
-				" with %s.\n", file, config);
-	} else
-		pr_warning("Failed to open %s file: %s\n", file,
-				strerror(errno));
-}
-
-static int open_probe_events(const char *trace_file, bool readwrite,
-				bool is_kprobe)
-{
-	char buf[PATH_MAX];
-	const char *__debugfs;
-	int ret;
-
-	__debugfs = debugfs_find_mountpoint();
-	if (__debugfs == NULL) {
-		pr_warning("Debugfs is not mounted.\n");
-		return -ENOENT;
-	}
-
-	ret = e_snprintf(buf, PATH_MAX, "%s/%s", __debugfs, trace_file);
-	if (ret >= 0) {
-		pr_debug("Opening %s write=%d\n", buf, readwrite);
-		if (readwrite && !probe_event_dry_run)
-			ret = open(buf, O_RDWR, O_APPEND);
-		else
-			ret = open(buf, O_RDONLY, 0);
-
-		if (ret < 0)
-			print_warn_msg(buf, is_kprobe);
-	}
-	return ret;
-}
-
-static int open_kprobe_events(bool readwrite)
-{
-	return open_probe_events("tracing/kprobe_events", readwrite, true);
-}
-
-static int open_uprobe_events(bool readwrite)
-{
-	return open_probe_events("tracing/uprobe_events", readwrite, false);
-}
-
-/* Get raw string list of current kprobe_events  or uprobe_events */
-static struct strlist *get_probe_trace_command_rawlist(int fd)
-{
-	int ret, idx;
-	FILE *fp;
-	char buf[MAX_CMDLEN];
-	char *p;
-	struct strlist *sl;
-
-	sl = strlist__new(true, NULL);
-
-	fp = fdopen(dup(fd), "r");
-	while (!feof(fp)) {
-		p = fgets(buf, MAX_CMDLEN, fp);
-		if (!p)
-			break;
-
-		idx = strlen(p) - 1;
-		if (p[idx] == '\n')
-			p[idx] = '\0';
-		ret = strlist__add(sl, buf);
-		if (ret < 0) {
-			pr_debug("strlist__add failed: %s\n", strerror(-ret));
-			strlist__delete(sl);
-			return NULL;
-		}
-	}
-	fclose(fp);
-
-	return sl;
-}
-
-/* Show an event */
-static int show_perf_probe_event(struct perf_probe_event *pev)
-{
-	int i, ret;
-	char buf[128];
-	char *place;
-
-	/* Synthesize only event probe point */
-	place = synthesize_perf_probe_point(&pev->point);
-	if (!place)
-		return -EINVAL;
-
-	ret = e_snprintf(buf, 128, "%s:%s", pev->group, pev->event);
-	if (ret < 0)
-		return ret;
-
-	printf("  %-20s (on %s", buf, place);
-
-	if (pev->nargs > 0) {
-		printf(" with");
-		for (i = 0; i < pev->nargs; i++) {
-			ret = synthesize_perf_probe_arg(&pev->args[i],
-							buf, 128);
-			if (ret < 0)
-				break;
-			printf(" %s", buf);
-		}
-	}
-	printf(")\n");
-	free(place);
-	return ret;
-}
-
-static int __show_perf_probe_events(int fd, bool is_kprobe)
-{
-	int ret = 0;
-	struct probe_trace_event tev;
-	struct perf_probe_event pev;
-	struct strlist *rawlist;
-	struct str_node *ent;
-
-	memset(&tev, 0, sizeof(tev));
-	memset(&pev, 0, sizeof(pev));
-
-	rawlist = get_probe_trace_command_rawlist(fd);
-	if (!rawlist)
-		return -ENOENT;
-
-	strlist__for_each(ent, rawlist) {
-		ret = parse_probe_trace_command(ent->s, &tev);
-		if (ret >= 0) {
-			ret = convert_to_perf_probe_event(&tev, &pev,
-								is_kprobe);
-			if (ret >= 0)
-				ret = show_perf_probe_event(&pev);
-		}
-		clear_perf_probe_event(&pev);
-		clear_probe_trace_event(&tev);
-		if (ret < 0)
-			break;
-	}
-	strlist__delete(rawlist);
-
-	return ret;
-}
-
-/* List up current perf-probe events */
-int show_perf_probe_events(void)
-{
-	int fd, ret;
-
-	setup_pager();
-	fd = open_kprobe_events(false);
-
-	if (fd < 0)
-		return fd;
-
-	ret = init_vmlinux();
-	if (ret < 0)
-		return ret;
-
-	ret = __show_perf_probe_events(fd, true);
-	close(fd);
-
-	fd = open_uprobe_events(false);
-	if (fd >= 0) {
-		ret = __show_perf_probe_events(fd, false);
-		close(fd);
-	}
-
-	return ret;
-}
-
-/* Get current perf-probe event names */
-static struct strlist *get_probe_trace_event_names(int fd, bool include_group)
-{
-	char buf[128];
-	struct strlist *sl, *rawlist;
-	struct str_node *ent;
-	struct probe_trace_event tev;
-	int ret = 0;
-
-	memset(&tev, 0, sizeof(tev));
-	rawlist = get_probe_trace_command_rawlist(fd);
-	sl = strlist__new(true, NULL);
-	strlist__for_each(ent, rawlist) {
-		ret = parse_probe_trace_command(ent->s, &tev);
-		if (ret < 0)
-			break;
-		if (include_group) {
-			ret = e_snprintf(buf, 128, "%s:%s", tev.group,
-					tev.event);
-			if (ret >= 0)
-				ret = strlist__add(sl, buf);
-		} else
-			ret = strlist__add(sl, tev.event);
-		clear_probe_trace_event(&tev);
-		if (ret < 0)
-			break;
-	}
-	strlist__delete(rawlist);
-
-	if (ret < 0) {
-		strlist__delete(sl);
-		return NULL;
-	}
-	return sl;
-}
-
-static int write_probe_trace_event(int fd, struct probe_trace_event *tev)
-{
-	int ret = 0;
-	char *buf = synthesize_probe_trace_command(tev);
-
-	if (!buf) {
-		pr_debug("Failed to synthesize probe trace event.\n");
-		return -EINVAL;
-	}
-
-	pr_debug("Writing event: %s\n", buf);
-	if (!probe_event_dry_run) {
-		ret = write(fd, buf, strlen(buf));
-		if (ret <= 0)
-			pr_warning("Failed to write event: %s\n",
-				   strerror(errno));
-	}
-	free(buf);
-	return ret;
-}
-
-static int get_new_event_name(char *buf, size_t len, const char *base,
-			      struct strlist *namelist, bool allow_suffix)
-{
-	int i, ret;
-
-	/* Try no suffix */
-	ret = e_snprintf(buf, len, "%s", base);
-	if (ret < 0) {
-		pr_debug("snprintf() failed: %s\n", strerror(-ret));
-		return ret;
-	}
-	if (!strlist__has_entry(namelist, buf))
-		return 0;
-
-	if (!allow_suffix) {
-		pr_warning("Error: event \"%s\" already exists. "
-			   "(Use -f to force duplicates.)\n", base);
-		return -EEXIST;
-	}
-
-	/* Try to add suffix */
-	for (i = 1; i < MAX_EVENT_INDEX; i++) {
-		ret = e_snprintf(buf, len, "%s_%d", base, i);
-		if (ret < 0) {
-			pr_debug("snprintf() failed: %s\n", strerror(-ret));
-			return ret;
-		}
-		if (!strlist__has_entry(namelist, buf))
-			break;
-	}
-	if (i == MAX_EVENT_INDEX) {
-		pr_warning("Too many events are on the same function.\n");
-		ret = -ERANGE;
-	}
-
-	return ret;
-}
-
-static int __add_probe_trace_events(struct perf_probe_event *pev,
-				     struct probe_trace_event *tevs,
-				     int ntevs, bool allow_suffix)
-{
-	int i, fd, ret;
-	struct probe_trace_event *tev = NULL;
-	char buf[64];
-	const char *event, *group;
-	struct strlist *namelist;
-
-	if (pev->uprobes)
-		fd = open_uprobe_events(true);
-	else
-		fd = open_kprobe_events(true);
-
-	if (fd < 0)
-		return fd;
-	/* Get current event names */
-	namelist = get_probe_trace_event_names(fd, false);
-	if (!namelist) {
-		pr_debug("Failed to get current event list.\n");
-		return -EIO;
-	}
-
-	ret = 0;
-	printf("Added new event%s\n", (ntevs > 1) ? "s:" : ":");
-	for (i = 0; i < ntevs; i++) {
-		tev = &tevs[i];
-		if (pev->event)
-			event = pev->event;
-		else
-			if (pev->point.function)
-				event = pev->point.function;
-			else
-				event = tev->point.symbol;
-		if (pev->group)
-			group = pev->group;
-		else
-			group = PERFPROBE_GROUP;
-
-		/* Get an unused new event name */
-		ret = get_new_event_name(buf, 64, event,
-					 namelist, allow_suffix);
-		if (ret < 0)
-			break;
-		event = buf;
-
-		tev->event = strdup(event);
-		tev->group = strdup(group);
-		if (tev->event == NULL || tev->group == NULL) {
-			ret = -ENOMEM;
-			break;
-		}
-		ret = write_probe_trace_event(fd, tev);
-		if (ret < 0)
-			break;
-		/* Add added event name to namelist */
-		strlist__add(namelist, event);
-
-		/* Trick here - save current event/group */
-		event = pev->event;
-		group = pev->group;
-		pev->event = tev->event;
-		pev->group = tev->group;
-		show_perf_probe_event(pev);
-		/* Trick here - restore current event/group */
-		pev->event = (char *)event;
-		pev->group = (char *)group;
-
-		/*
-		 * Probes after the first probe which comes from same
-		 * user input are always allowed to add suffix, because
-		 * there might be several addresses corresponding to
-		 * one code line.
-		 */
-		allow_suffix = true;
-	}
-
-	if (ret >= 0) {
-		/* Show how to use the event. */
-		printf("\nYou can now use it in all perf tools, such as:\n\n");
-		printf("\tperf record -e %s:%s -aR sleep 1\n\n", tev->group,
-			 tev->event);
-	}
-
-	strlist__delete(namelist);
-	close(fd);
-	return ret;
-}
-
-static int convert_to_probe_trace_events(struct perf_probe_event *pev,
-					  struct probe_trace_event **tevs,
-					  int max_tevs, const char *target)
-{
-	struct symbol *sym;
-	int ret = 0, i;
-	struct probe_trace_event *tev;
-
-	/* Convert perf_probe_event with debuginfo */
-	ret = try_to_find_probe_trace_events(pev, tevs, max_tevs, target);
-	if (ret != 0)
-		return ret;	/* Found in debuginfo or got an error */
-
-	/* Allocate trace event buffer */
-	tev = *tevs = zalloc(sizeof(struct probe_trace_event));
-	if (tev == NULL)
-		return -ENOMEM;
-
-	/* Copy parameters */
-	tev->point.symbol = strdup(pev->point.function);
-	if (tev->point.symbol == NULL) {
-		ret = -ENOMEM;
-		goto error;
-	}
-
-	if (target) {
-		tev->point.module = strdup(target);
-		if (tev->point.module == NULL) {
-			ret = -ENOMEM;
-			goto error;
-		}
-	}
-
-	tev->point.offset = pev->point.offset;
-	tev->point.retprobe = pev->point.retprobe;
-	tev->nargs = pev->nargs;
-	tev->uprobes = pev->uprobes;
-
-	if (tev->nargs) {
-		tev->args = zalloc(sizeof(struct probe_trace_arg)
-				   * tev->nargs);
-		if (tev->args == NULL) {
-			ret = -ENOMEM;
-			goto error;
-		}
-		for (i = 0; i < tev->nargs; i++) {
-			if (pev->args[i].name) {
-				tev->args[i].name = strdup(pev->args[i].name);
-				if (tev->args[i].name == NULL) {
-					ret = -ENOMEM;
-					goto error;
-				}
-			}
-			tev->args[i].value = strdup(pev->args[i].var);
-			if (tev->args[i].value == NULL) {
-				ret = -ENOMEM;
-				goto error;
-			}
-			if (pev->args[i].type) {
-				tev->args[i].type = strdup(pev->args[i].type);
-				if (tev->args[i].type == NULL) {
-					ret = -ENOMEM;
-					goto error;
-				}
-			}
-		}
-	}
-
-	if (pev->uprobes)
-		return 1;
-
-	/* Currently just checking function name from symbol map */
-	sym = __find_kernel_function_by_name(tev->point.symbol, NULL);
-	if (!sym) {
-		pr_warning("Kernel symbol \'%s\' not found.\n",
-			   tev->point.symbol);
-		ret = -ENOENT;
-		goto error;
-	} else if (tev->point.offset > sym->end - sym->start) {
-		pr_warning("Offset specified is greater than size of %s\n",
-			   tev->point.symbol);
-		ret = -ENOENT;
-		goto error;
-
-	}
-
-	return 1;
-error:
-	clear_probe_trace_event(tev);
-	free(tev);
-	*tevs = NULL;
-	return ret;
-}
-
-struct __event_package {
-	struct perf_probe_event		*pev;
-	struct probe_trace_event	*tevs;
-	int				ntevs;
-};
-
-int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
-			  int max_tevs, const char *target, bool force_add)
-{
-	int i, j, ret;
-	struct __event_package *pkgs;
-
-	ret = 0;
-	pkgs = zalloc(sizeof(struct __event_package) * npevs);
-
-	if (pkgs == NULL)
-		return -ENOMEM;
-
-	if (!pevs->uprobes)
-		/* Init vmlinux path */
-		ret = init_vmlinux();
-	else
-		ret = init_user_exec();
-
-	if (ret < 0) {
-		free(pkgs);
-		return ret;
-	}
-
-	/* Loop 1: convert all events */
-	for (i = 0; i < npevs; i++) {
-		pkgs[i].pev = &pevs[i];
-		/* Convert with or without debuginfo */
-		ret  = convert_to_probe_trace_events(pkgs[i].pev,
-						     &pkgs[i].tevs,
-						     max_tevs,
-						     target);
-		if (ret < 0)
-			goto end;
-		pkgs[i].ntevs = ret;
-	}
-
-	/* Loop 2: add all events */
-	for (i = 0; i < npevs; i++) {
-		ret = __add_probe_trace_events(pkgs[i].pev, pkgs[i].tevs,
-						pkgs[i].ntevs, force_add);
-		if (ret < 0)
-			break;
-	}
-end:
-	/* Loop 3: cleanup and free trace events  */
-	for (i = 0; i < npevs; i++) {
-		for (j = 0; j < pkgs[i].ntevs; j++)
-			clear_probe_trace_event(&pkgs[i].tevs[j]);
-		free(pkgs[i].tevs);
-	}
-	free(pkgs);
-
-	return ret;
-}
-
-static int __del_trace_probe_event(int fd, struct str_node *ent)
-{
-	char *p;
-	char buf[128];
-	int ret;
-
-	/* Convert from perf-probe event to trace-probe event */
-	ret = e_snprintf(buf, 128, "-:%s", ent->s);
-	if (ret < 0)
-		goto error;
-
-	p = strchr(buf + 2, ':');
-	if (!p) {
-		pr_debug("Internal error: %s should have ':' but not.\n",
-			 ent->s);
-		ret = -ENOTSUP;
-		goto error;
-	}
-	*p = '/';
-
-	pr_debug("Writing event: %s\n", buf);
-	ret = write(fd, buf, strlen(buf));
-	if (ret < 0) {
-		ret = -errno;
-		goto error;
-	}
-
-	printf("Removed event: %s\n", ent->s);
-	return 0;
-error:
-	pr_warning("Failed to delete event: %s\n", strerror(-ret));
-	return ret;
-}
-
-static int del_trace_probe_event(int fd, const char *buf,
-						  struct strlist *namelist)
-{
-	struct str_node *ent, *n;
-	int ret = -1;
-
-	if (strpbrk(buf, "*?")) { /* Glob-exp */
-		strlist__for_each_safe(ent, n, namelist)
-			if (strglobmatch(ent->s, buf)) {
-				ret = __del_trace_probe_event(fd, ent);
-				if (ret < 0)
-					break;
-				strlist__remove(namelist, ent);
-			}
-	} else {
-		ent = strlist__find(namelist, buf);
-		if (ent) {
-			ret = __del_trace_probe_event(fd, ent);
-			if (ret >= 0)
-				strlist__remove(namelist, ent);
-		}
-	}
-
-	return ret;
-}
-
-int del_perf_probe_events(struct strlist *dellist)
-{
-	int ret = -1, ufd = -1, kfd = -1;
-	char buf[128];
-	const char *group, *event;
-	char *p, *str;
-	struct str_node *ent;
-	struct strlist *namelist = NULL, *unamelist = NULL;
-
-	/* Get current event names */
-	kfd = open_kprobe_events(true);
-	if (kfd < 0)
-		return kfd;
-
-	namelist = get_probe_trace_event_names(kfd, true);
-	ufd = open_uprobe_events(true);
-
-	if (ufd >= 0)
-		unamelist = get_probe_trace_event_names(ufd, true);
-
-	if (namelist == NULL && unamelist == NULL)
-		goto error;
-
-	strlist__for_each(ent, dellist) {
-		str = strdup(ent->s);
-		if (str == NULL) {
-			ret = -ENOMEM;
-			goto error;
-		}
-		pr_debug("Parsing: %s\n", str);
-		p = strchr(str, ':');
-		if (p) {
-			group = str;
-			*p = '\0';
-			event = p + 1;
-		} else {
-			group = "*";
-			event = str;
-		}
-
-		ret = e_snprintf(buf, 128, "%s:%s", group, event);
-		if (ret < 0) {
-			pr_err("Failed to copy event.");
-			free(str);
-			goto error;
-		}
-
-		pr_debug("Group: %s, Event: %s\n", group, event);
-
-		if (namelist)
-			ret = del_trace_probe_event(kfd, buf, namelist);
-
-		if (unamelist && ret != 0)
-			ret = del_trace_probe_event(ufd, buf, unamelist);
-
-		if (ret != 0)
-			pr_info("Info: Event \"%s\" does not exist.\n", buf);
-
-		free(str);
-	}
-
-error:
-	if (kfd >= 0) {
-		strlist__delete(namelist);
-		close(kfd);
-	}
-
-	if (ufd >= 0) {
-		strlist__delete(unamelist);
-		close(ufd);
-	}
-
-	return ret;
-}
-
-/* TODO: don't use a global variable for filter ... */
-static struct strfilter *available_func_filter;
-
-/*
- * If a symbol corresponds to a function with global binding and
- * matches filter return 0. For all others return 1.
- */
-static int filter_available_functions(struct map *map __maybe_unused,
-				      struct symbol *sym)
-{
-	if (sym->binding == STB_GLOBAL &&
-	    strfilter__compare(available_func_filter, sym->name))
-		return 0;
-	return 1;
-}
-
-static int __show_available_funcs(struct map *map)
-{
-	if (map__load(map, filter_available_functions)) {
-		pr_err("Failed to load map.\n");
-		return -EINVAL;
-	}
-	if (!dso__sorted_by_name(map->dso, map->type))
-		dso__sort_by_name(map->dso, map->type);
-
-	dso__fprintf_symbols_by_name(map->dso, map->type, stdout);
-	return 0;
-}
-
-static int available_kernel_funcs(const char *module)
-{
-	struct map *map;
-	int ret;
-
-	ret = init_vmlinux();
-	if (ret < 0)
-		return ret;
-
-	map = kernel_get_module_map(module);
-	if (!map) {
-		pr_err("Failed to find %s map.\n", (module) ? : "kernel");
-		return -EINVAL;
-	}
-	return __show_available_funcs(map);
-}
-
-static int available_user_funcs(const char *target)
-{
-	struct map *map;
-	int ret;
-
-	ret = init_user_exec();
-	if (ret < 0)
-		return ret;
-
-	map = dso__new_map(target);
-	ret = __show_available_funcs(map);
-	dso__delete(map->dso);
-	map__delete(map);
-	return ret;
-}
-
-int show_available_funcs(const char *target, struct strfilter *_filter,
-					bool user)
-{
-	setup_pager();
-	available_func_filter = _filter;
-
-	if (!user)
-		return available_kernel_funcs(target);
-
-	return available_user_funcs(target);
-}
-
-/*
- * uprobe_events only accepts address:
- * Convert function and any offset to address
- */
-static int convert_name_to_addr(struct perf_probe_event *pev, const char *exec)
-{
-	struct perf_probe_point *pp = &pev->point;
-	struct symbol *sym;
-	struct map *map = NULL;
-	char *function = NULL, *name = NULL;
-	int ret = -EINVAL;
-	unsigned long long vaddr = 0;
-
-	if (!pp->function) {
-		pr_warning("No function specified for uprobes");
-		goto out;
-	}
-
-	function = strdup(pp->function);
-	if (!function) {
-		pr_warning("Failed to allocate memory by strdup.\n");
-		ret = -ENOMEM;
-		goto out;
-	}
-
-	name = realpath(exec, NULL);
-	if (!name) {
-		pr_warning("Cannot find realpath for %s.\n", exec);
-		goto out;
-	}
-	map = dso__new_map(name);
-	if (!map) {
-		pr_warning("Cannot find appropriate DSO for %s.\n", exec);
-		goto out;
-	}
-	available_func_filter = strfilter__new(function, NULL);
-	if (map__load(map, filter_available_functions)) {
-		pr_err("Failed to load map.\n");
-		goto out;
-	}
-
-	sym = map__find_symbol_by_name(map, function, NULL);
-	if (!sym) {
-		pr_warning("Cannot find %s in DSO %s\n", function, exec);
-		goto out;
-	}
-
-	if (map->start > sym->start)
-		vaddr = map->start;
-	vaddr += sym->start + pp->offset + map->pgoff;
-	pp->offset = 0;
-
-	if (!pev->event) {
-		pev->event = function;
-		function = NULL;
-	}
-	if (!pev->group) {
-		char *ptr1, *ptr2, *exec_copy;
-
-		pev->group = zalloc(sizeof(char *) * 64);
-		exec_copy = strdup(exec);
-		if (!exec_copy) {
-			ret = -ENOMEM;
-			pr_warning("Failed to copy exec string.\n");
-			goto out;
-		}
-
-		ptr1 = strdup(basename(exec_copy));
-		if (ptr1) {
-			ptr2 = strpbrk(ptr1, "-._");
-			if (ptr2)
-				*ptr2 = '\0';
-			e_snprintf(pev->group, 64, "%s_%s", PERFPROBE_GROUP,
-					ptr1);
-			free(ptr1);
-		}
-		free(exec_copy);
-	}
-	free(pp->function);
-	pp->function = zalloc(sizeof(char *) * MAX_PROBE_ARGS);
-	if (!pp->function) {
-		ret = -ENOMEM;
-		pr_warning("Failed to allocate memory by zalloc.\n");
-		goto out;
-	}
-	e_snprintf(pp->function, MAX_PROBE_ARGS, "0x%llx", vaddr);
-	ret = 0;
-
-out:
-	if (map) {
-		dso__delete(map->dso);
-		map__delete(map);
-	}
-	if (function)
-		free(function);
-	if (name)
-		free(name);
-	return ret;
-}
diff --git a/src/tools/perf/util/probe-event.h b/src/tools/perf/util/probe-event.h
deleted file mode 100644
index f9f3de8..0000000
--- a/src/tools/perf/util/probe-event.h
+++ /dev/null
@@ -1,140 +0,0 @@
-#ifndef _PROBE_EVENT_H
-#define _PROBE_EVENT_H
-
-#include <stdbool.h>
-#include "strlist.h"
-#include "strfilter.h"
-
-extern bool probe_event_dry_run;
-
-/* kprobe-tracer and uprobe-tracer tracing point */
-struct probe_trace_point {
-	char		*symbol;	/* Base symbol */
-	char		*module;	/* Module name */
-	unsigned long	offset;		/* Offset from symbol */
-	bool		retprobe;	/* Return probe flag */
-};
-
-/* probe-tracer tracing argument referencing offset */
-struct probe_trace_arg_ref {
-	struct probe_trace_arg_ref	*next;	/* Next reference */
-	long				offset;	/* Offset value */
-};
-
-/* kprobe-tracer and uprobe-tracer tracing argument */
-struct probe_trace_arg {
-	char				*name;	/* Argument name */
-	char				*value;	/* Base value */
-	char				*type;	/* Type name */
-	struct probe_trace_arg_ref	*ref;	/* Referencing offset */
-};
-
-/* kprobe-tracer and uprobe-tracer tracing event (point + arg) */
-struct probe_trace_event {
-	char				*event;	/* Event name */
-	char				*group;	/* Group name */
-	struct probe_trace_point	point;	/* Trace point */
-	int				nargs;	/* Number of args */
-	bool				uprobes;	/* uprobes only */
-	struct probe_trace_arg		*args;	/* Arguments */
-};
-
-/* Perf probe probing point */
-struct perf_probe_point {
-	char		*file;		/* File path */
-	char		*function;	/* Function name */
-	int		line;		/* Line number */
-	bool		retprobe;	/* Return probe flag */
-	char		*lazy_line;	/* Lazy matching pattern */
-	unsigned long	offset;		/* Offset from function entry */
-};
-
-/* Perf probe probing argument field chain */
-struct perf_probe_arg_field {
-	struct perf_probe_arg_field	*next;	/* Next field */
-	char				*name;	/* Name of the field */
-	long				index;	/* Array index number */
-	bool				ref;	/* Referencing flag */
-};
-
-/* Perf probe probing argument */
-struct perf_probe_arg {
-	char				*name;	/* Argument name */
-	char				*var;	/* Variable name */
-	char				*type;	/* Type name */
-	struct perf_probe_arg_field	*field;	/* Structure fields */
-};
-
-/* Perf probe probing event (point + arg) */
-struct perf_probe_event {
-	char			*event;	/* Event name */
-	char			*group;	/* Group name */
-	struct perf_probe_point	point;	/* Probe point */
-	int			nargs;	/* Number of arguments */
-	bool			uprobes;
-	struct perf_probe_arg	*args;	/* Arguments */
-};
-
-
-/* Line number container */
-struct line_node {
-	struct list_head	list;
-	int			line;
-};
-
-/* Line range */
-struct line_range {
-	char			*file;		/* File name */
-	char			*function;	/* Function name */
-	int			start;		/* Start line number */
-	int			end;		/* End line number */
-	int			offset;		/* Start line offset */
-	char			*path;		/* Real path name */
-	char			*comp_dir;	/* Compile directory */
-	struct list_head	line_list;	/* Visible lines */
-};
-
-/* List of variables */
-struct variable_list {
-	struct probe_trace_point	point;	/* Actual probepoint */
-	struct strlist			*vars;	/* Available variables */
-};
-
-/* Command string to events */
-extern int parse_perf_probe_command(const char *cmd,
-				    struct perf_probe_event *pev);
-
-/* Events to command string */
-extern char *synthesize_perf_probe_command(struct perf_probe_event *pev);
-extern char *synthesize_probe_trace_command(struct probe_trace_event *tev);
-extern int synthesize_perf_probe_arg(struct perf_probe_arg *pa, char *buf,
-				     size_t len);
-
-/* Check the perf_probe_event needs debuginfo */
-extern bool perf_probe_event_need_dwarf(struct perf_probe_event *pev);
-
-/* Release event contents */
-extern void clear_perf_probe_event(struct perf_probe_event *pev);
-
-/* Command string to line-range */
-extern int parse_line_range_desc(const char *cmd, struct line_range *lr);
-
-/* Internal use: Return kernel/module path */
-extern const char *kernel_get_module_path(const char *module);
-
-extern int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
-				 int max_probe_points, const char *module,
-				 bool force_add);
-extern int del_perf_probe_events(struct strlist *dellist);
-extern int show_perf_probe_events(void);
-extern int show_line_range(struct line_range *lr, const char *module);
-extern int show_available_vars(struct perf_probe_event *pevs, int npevs,
-			       int max_probe_points, const char *module,
-			       struct strfilter *filter, bool externs);
-extern int show_available_funcs(const char *module, struct strfilter *filter,
-				bool user);
-
-/* Maximum index number of event-name postfix */
-#define MAX_EVENT_INDEX	1024
-
-#endif /*_PROBE_EVENT_H */
diff --git a/src/tools/perf/util/probe-finder.c b/src/tools/perf/util/probe-finder.c
deleted file mode 100644
index 2b74d8e..0000000
--- a/src/tools/perf/util/probe-finder.c
+++ /dev/null
@@ -1,1593 +0,0 @@
-/*
- * probe-finder.c : C expression to kprobe event converter
- *
- * Written by Masami Hiramatsu <mhiramat@redhat.com>
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#include <sys/utsname.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <getopt.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <dwarf-regs.h>
-
-#include <linux/bitops.h>
-#include "event.h"
-#include "debug.h"
-#include "util.h"
-#include "symbol.h"
-#include "probe-finder.h"
-
-/* Kprobe tracer basic type is up to u64 */
-#define MAX_BASIC_TYPE_BITS	64
-
-/* Line number list operations */
-
-/* Add a line to line number list */
-static int line_list__add_line(struct list_head *head, int line)
-{
-	struct line_node *ln;
-	struct list_head *p;
-
-	/* Reverse search, because new line will be the last one */
-	list_for_each_entry_reverse(ln, head, list) {
-		if (ln->line < line) {
-			p = &ln->list;
-			goto found;
-		} else if (ln->line == line)	/* Already exist */
-			return 1;
-	}
-	/* List is empty, or the smallest entry */
-	p = head;
-found:
-	pr_debug("line list: add a line %u\n", line);
-	ln = zalloc(sizeof(struct line_node));
-	if (ln == NULL)
-		return -ENOMEM;
-	ln->line = line;
-	INIT_LIST_HEAD(&ln->list);
-	list_add(&ln->list, p);
-	return 0;
-}
-
-/* Check if the line in line number list */
-static int line_list__has_line(struct list_head *head, int line)
-{
-	struct line_node *ln;
-
-	/* Reverse search, because new line will be the last one */
-	list_for_each_entry(ln, head, list)
-		if (ln->line == line)
-			return 1;
-
-	return 0;
-}
-
-/* Init line number list */
-static void line_list__init(struct list_head *head)
-{
-	INIT_LIST_HEAD(head);
-}
-
-/* Free line number list */
-static void line_list__free(struct list_head *head)
-{
-	struct line_node *ln;
-	while (!list_empty(head)) {
-		ln = list_first_entry(head, struct line_node, list);
-		list_del(&ln->list);
-		free(ln);
-	}
-}
-
-/* Dwarf FL wrappers */
-static char *debuginfo_path;	/* Currently dummy */
-
-static const Dwfl_Callbacks offline_callbacks = {
-	.find_debuginfo = dwfl_standard_find_debuginfo,
-	.debuginfo_path = &debuginfo_path,
-
-	.section_address = dwfl_offline_section_address,
-
-	/* We use this table for core files too.  */
-	.find_elf = dwfl_build_id_find_elf,
-};
-
-/* Get a Dwarf from offline image */
-static int debuginfo__init_offline_dwarf(struct debuginfo *self,
-					 const char *path)
-{
-	int fd;
-
-	fd = open(path, O_RDONLY);
-	if (fd < 0)
-		return fd;
-
-	self->dwfl = dwfl_begin(&offline_callbacks);
-	if (!self->dwfl)
-		goto error;
-
-	self->mod = dwfl_report_offline(self->dwfl, "", "", fd);
-	if (!self->mod)
-		goto error;
-
-	self->dbg = dwfl_module_getdwarf(self->mod, &self->bias);
-	if (!self->dbg)
-		goto error;
-
-	return 0;
-error:
-	if (self->dwfl)
-		dwfl_end(self->dwfl);
-	else
-		close(fd);
-	memset(self, 0, sizeof(*self));
-
-	return -ENOENT;
-}
-
-#if _ELFUTILS_PREREQ(0, 148)
-/* This method is buggy if elfutils is older than 0.148 */
-static int __linux_kernel_find_elf(Dwfl_Module *mod,
-				   void **userdata,
-				   const char *module_name,
-				   Dwarf_Addr base,
-				   char **file_name, Elf **elfp)
-{
-	int fd;
-	const char *path = kernel_get_module_path(module_name);
-
-	pr_debug2("Use file %s for %s\n", path, module_name);
-	if (path) {
-		fd = open(path, O_RDONLY);
-		if (fd >= 0) {
-			*file_name = strdup(path);
-			return fd;
-		}
-	}
-	/* If failed, try to call standard method */
-	return dwfl_linux_kernel_find_elf(mod, userdata, module_name, base,
-					  file_name, elfp);
-}
-
-static const Dwfl_Callbacks kernel_callbacks = {
-	.find_debuginfo = dwfl_standard_find_debuginfo,
-	.debuginfo_path = &debuginfo_path,
-
-	.find_elf = __linux_kernel_find_elf,
-	.section_address = dwfl_linux_kernel_module_section_address,
-};
-
-/* Get a Dwarf from live kernel image */
-static int debuginfo__init_online_kernel_dwarf(struct debuginfo *self,
-					       Dwarf_Addr addr)
-{
-	self->dwfl = dwfl_begin(&kernel_callbacks);
-	if (!self->dwfl)
-		return -EINVAL;
-
-	/* Load the kernel dwarves: Don't care the result here */
-	dwfl_linux_kernel_report_kernel(self->dwfl);
-	dwfl_linux_kernel_report_modules(self->dwfl);
-
-	self->dbg = dwfl_addrdwarf(self->dwfl, addr, &self->bias);
-	/* Here, check whether we could get a real dwarf */
-	if (!self->dbg) {
-		pr_debug("Failed to find kernel dwarf at %lx\n",
-			 (unsigned long)addr);
-		dwfl_end(self->dwfl);
-		memset(self, 0, sizeof(*self));
-		return -ENOENT;
-	}
-
-	return 0;
-}
-#endif
-
-struct debuginfo *debuginfo__new(const char *path)
-{
-	struct debuginfo *self = zalloc(sizeof(struct debuginfo));
-	if (!self)
-		return NULL;
-
-	if (debuginfo__init_offline_dwarf(self, path) < 0) {
-		free(self);
-		self = NULL;
-	}
-
-	return self;
-}
-
-struct debuginfo *debuginfo__new_online_kernel(unsigned long addr)
-{
-	struct debuginfo *self = zalloc(sizeof(struct debuginfo));
-	if (!self)
-		return NULL;
-
-	if (debuginfo__init_online_kernel_dwarf(self, (Dwarf_Addr)addr) < 0) {
-		free(self);
-		self = NULL;
-	}
-
-	return self;
-}
-
-void debuginfo__delete(struct debuginfo *self)
-{
-	if (self) {
-		if (self->dwfl)
-			dwfl_end(self->dwfl);
-		free(self);
-	}
-}
-
-/*
- * Probe finder related functions
- */
-
-static struct probe_trace_arg_ref *alloc_trace_arg_ref(long offs)
-{
-	struct probe_trace_arg_ref *ref;
-	ref = zalloc(sizeof(struct probe_trace_arg_ref));
-	if (ref != NULL)
-		ref->offset = offs;
-	return ref;
-}
-
-/*
- * Convert a location into trace_arg.
- * If tvar == NULL, this just checks variable can be converted.
- */
-static int convert_variable_location(Dwarf_Die *vr_die, Dwarf_Addr addr,
-				     Dwarf_Op *fb_ops,
-				     struct probe_trace_arg *tvar)
-{
-	Dwarf_Attribute attr;
-	Dwarf_Op *op;
-	size_t nops;
-	unsigned int regn;
-	Dwarf_Word offs = 0;
-	bool ref = false;
-	const char *regs;
-	int ret;
-
-	if (dwarf_attr(vr_die, DW_AT_external, &attr) != NULL)
-		goto static_var;
-
-	/* TODO: handle more than 1 exprs */
-	if (dwarf_attr(vr_die, DW_AT_location, &attr) == NULL ||
-	    dwarf_getlocation_addr(&attr, addr, &op, &nops, 1) <= 0 ||
-	    nops == 0) {
-		/* TODO: Support const_value */
-		return -ENOENT;
-	}
-
-	if (op->atom == DW_OP_addr) {
-static_var:
-		if (!tvar)
-			return 0;
-		/* Static variables on memory (not stack), make @varname */
-		ret = strlen(dwarf_diename(vr_die));
-		tvar->value = zalloc(ret + 2);
-		if (tvar->value == NULL)
-			return -ENOMEM;
-		snprintf(tvar->value, ret + 2, "@%s", dwarf_diename(vr_die));
-		tvar->ref = alloc_trace_arg_ref((long)offs);
-		if (tvar->ref == NULL)
-			return -ENOMEM;
-		return 0;
-	}
-
-	/* If this is based on frame buffer, set the offset */
-	if (op->atom == DW_OP_fbreg) {
-		if (fb_ops == NULL)
-			return -ENOTSUP;
-		ref = true;
-		offs = op->number;
-		op = &fb_ops[0];
-	}
-
-	if (op->atom >= DW_OP_breg0 && op->atom <= DW_OP_breg31) {
-		regn = op->atom - DW_OP_breg0;
-		offs += op->number;
-		ref = true;
-	} else if (op->atom >= DW_OP_reg0 && op->atom <= DW_OP_reg31) {
-		regn = op->atom - DW_OP_reg0;
-	} else if (op->atom == DW_OP_bregx) {
-		regn = op->number;
-		offs += op->number2;
-		ref = true;
-	} else if (op->atom == DW_OP_regx) {
-		regn = op->number;
-	} else {
-		pr_debug("DW_OP %x is not supported.\n", op->atom);
-		return -ENOTSUP;
-	}
-
-	if (!tvar)
-		return 0;
-
-	regs = get_arch_regstr(regn);
-	if (!regs) {
-		/* This should be a bug in DWARF or this tool */
-		pr_warning("Mapping for the register number %u "
-			   "missing on this architecture.\n", regn);
-		return -ERANGE;
-	}
-
-	tvar->value = strdup(regs);
-	if (tvar->value == NULL)
-		return -ENOMEM;
-
-	if (ref) {
-		tvar->ref = alloc_trace_arg_ref((long)offs);
-		if (tvar->ref == NULL)
-			return -ENOMEM;
-	}
-	return 0;
-}
-
-#define BYTES_TO_BITS(nb)	((nb) * BITS_PER_LONG / sizeof(long))
-
-static int convert_variable_type(Dwarf_Die *vr_die,
-				 struct probe_trace_arg *tvar,
-				 const char *cast)
-{
-	struct probe_trace_arg_ref **ref_ptr = &tvar->ref;
-	Dwarf_Die type;
-	char buf[16];
-	int bsize, boffs, total;
-	int ret;
-
-	/* TODO: check all types */
-	if (cast && strcmp(cast, "string") != 0) {
-		/* Non string type is OK */
-		tvar->type = strdup(cast);
-		return (tvar->type == NULL) ? -ENOMEM : 0;
-	}
-
-	bsize = dwarf_bitsize(vr_die);
-	if (bsize > 0) {
-		/* This is a bitfield */
-		boffs = dwarf_bitoffset(vr_die);
-		total = dwarf_bytesize(vr_die);
-		if (boffs < 0 || total < 0)
-			return -ENOENT;
-		ret = snprintf(buf, 16, "b%d@%d/%zd", bsize, boffs,
-				BYTES_TO_BITS(total));
-		goto formatted;
-	}
-
-	if (die_get_real_type(vr_die, &type) == NULL) {
-		pr_warning("Failed to get a type information of %s.\n",
-			   dwarf_diename(vr_die));
-		return -ENOENT;
-	}
-
-	pr_debug("%s type is %s.\n",
-		 dwarf_diename(vr_die), dwarf_diename(&type));
-
-	if (cast && strcmp(cast, "string") == 0) {	/* String type */
-		ret = dwarf_tag(&type);
-		if (ret != DW_TAG_pointer_type &&
-		    ret != DW_TAG_array_type) {
-			pr_warning("Failed to cast into string: "
-				   "%s(%s) is not a pointer nor array.\n",
-				   dwarf_diename(vr_die), dwarf_diename(&type));
-			return -EINVAL;
-		}
-		if (die_get_real_type(&type, &type) == NULL) {
-			pr_warning("Failed to get a type"
-				   " information.\n");
-			return -ENOENT;
-		}
-		if (ret == DW_TAG_pointer_type) {
-			while (*ref_ptr)
-				ref_ptr = &(*ref_ptr)->next;
-			/* Add new reference with offset +0 */
-			*ref_ptr = zalloc(sizeof(struct probe_trace_arg_ref));
-			if (*ref_ptr == NULL) {
-				pr_warning("Out of memory error\n");
-				return -ENOMEM;
-			}
-		}
-		if (!die_compare_name(&type, "char") &&
-		    !die_compare_name(&type, "unsigned char")) {
-			pr_warning("Failed to cast into string: "
-				   "%s is not (unsigned) char *.\n",
-				   dwarf_diename(vr_die));
-			return -EINVAL;
-		}
-		tvar->type = strdup(cast);
-		return (tvar->type == NULL) ? -ENOMEM : 0;
-	}
-
-	ret = dwarf_bytesize(&type);
-	if (ret <= 0)
-		/* No size ... try to use default type */
-		return 0;
-	ret = BYTES_TO_BITS(ret);
-
-	/* Check the bitwidth */
-	if (ret > MAX_BASIC_TYPE_BITS) {
-		pr_info("%s exceeds max-bitwidth. Cut down to %d bits.\n",
-			dwarf_diename(&type), MAX_BASIC_TYPE_BITS);
-		ret = MAX_BASIC_TYPE_BITS;
-	}
-	ret = snprintf(buf, 16, "%c%d",
-		       die_is_signed_type(&type) ? 's' : 'u', ret);
-
-formatted:
-	if (ret < 0 || ret >= 16) {
-		if (ret >= 16)
-			ret = -E2BIG;
-		pr_warning("Failed to convert variable type: %s\n",
-			   strerror(-ret));
-		return ret;
-	}
-	tvar->type = strdup(buf);
-	if (tvar->type == NULL)
-		return -ENOMEM;
-	return 0;
-}
-
-static int convert_variable_fields(Dwarf_Die *vr_die, const char *varname,
-				    struct perf_probe_arg_field *field,
-				    struct probe_trace_arg_ref **ref_ptr,
-				    Dwarf_Die *die_mem)
-{
-	struct probe_trace_arg_ref *ref = *ref_ptr;
-	Dwarf_Die type;
-	Dwarf_Word offs;
-	int ret, tag;
-
-	pr_debug("converting %s in %s\n", field->name, varname);
-	if (die_get_real_type(vr_die, &type) == NULL) {
-		pr_warning("Failed to get the type of %s.\n", varname);
-		return -ENOENT;
-	}
-	pr_debug2("Var real type: (%x)\n", (unsigned)dwarf_dieoffset(&type));
-	tag = dwarf_tag(&type);
-
-	if (field->name[0] == '[' &&
-	    (tag == DW_TAG_array_type || tag == DW_TAG_pointer_type)) {
-		if (field->next)
-			/* Save original type for next field */
-			memcpy(die_mem, &type, sizeof(*die_mem));
-		/* Get the type of this array */
-		if (die_get_real_type(&type, &type) == NULL) {
-			pr_warning("Failed to get the type of %s.\n", varname);
-			return -ENOENT;
-		}
-		pr_debug2("Array real type: (%x)\n",
-			 (unsigned)dwarf_dieoffset(&type));
-		if (tag == DW_TAG_pointer_type) {
-			ref = zalloc(sizeof(struct probe_trace_arg_ref));
-			if (ref == NULL)
-				return -ENOMEM;
-			if (*ref_ptr)
-				(*ref_ptr)->next = ref;
-			else
-				*ref_ptr = ref;
-		}
-		ref->offset += dwarf_bytesize(&type) * field->index;
-		if (!field->next)
-			/* Save vr_die for converting types */
-			memcpy(die_mem, vr_die, sizeof(*die_mem));
-		goto next;
-	} else if (tag == DW_TAG_pointer_type) {
-		/* Check the pointer and dereference */
-		if (!field->ref) {
-			pr_err("Semantic error: %s must be referred by '->'\n",
-			       field->name);
-			return -EINVAL;
-		}
-		/* Get the type pointed by this pointer */
-		if (die_get_real_type(&type, &type) == NULL) {
-			pr_warning("Failed to get the type of %s.\n", varname);
-			return -ENOENT;
-		}
-		/* Verify it is a data structure  */
-		tag = dwarf_tag(&type);
-		if (tag != DW_TAG_structure_type && tag != DW_TAG_union_type) {
-			pr_warning("%s is not a data structure nor an union.\n",
-				   varname);
-			return -EINVAL;
-		}
-
-		ref = zalloc(sizeof(struct probe_trace_arg_ref));
-		if (ref == NULL)
-			return -ENOMEM;
-		if (*ref_ptr)
-			(*ref_ptr)->next = ref;
-		else
-			*ref_ptr = ref;
-	} else {
-		/* Verify it is a data structure  */
-		if (tag != DW_TAG_structure_type && tag != DW_TAG_union_type) {
-			pr_warning("%s is not a data structure nor an union.\n",
-				   varname);
-			return -EINVAL;
-		}
-		if (field->name[0] == '[') {
-			pr_err("Semantic error: %s is not a pointor"
-			       " nor array.\n", varname);
-			return -EINVAL;
-		}
-		if (field->ref) {
-			pr_err("Semantic error: %s must be referred by '.'\n",
-			       field->name);
-			return -EINVAL;
-		}
-		if (!ref) {
-			pr_warning("Structure on a register is not "
-				   "supported yet.\n");
-			return -ENOTSUP;
-		}
-	}
-
-	if (die_find_member(&type, field->name, die_mem) == NULL) {
-		pr_warning("%s(tyep:%s) has no member %s.\n", varname,
-			   dwarf_diename(&type), field->name);
-		return -EINVAL;
-	}
-
-	/* Get the offset of the field */
-	if (tag == DW_TAG_union_type) {
-		offs = 0;
-	} else {
-		ret = die_get_data_member_location(die_mem, &offs);
-		if (ret < 0) {
-			pr_warning("Failed to get the offset of %s.\n",
-				   field->name);
-			return ret;
-		}
-	}
-	ref->offset += (long)offs;
-
-next:
-	/* Converting next field */
-	if (field->next)
-		return convert_variable_fields(die_mem, field->name,
-					field->next, &ref, die_mem);
-	else
-		return 0;
-}
-
-/* Show a variables in kprobe event format */
-static int convert_variable(Dwarf_Die *vr_die, struct probe_finder *pf)
-{
-	Dwarf_Die die_mem;
-	int ret;
-
-	pr_debug("Converting variable %s into trace event.\n",
-		 dwarf_diename(vr_die));
-
-	ret = convert_variable_location(vr_die, pf->addr, pf->fb_ops,
-					pf->tvar);
-	if (ret == -ENOENT)
-		pr_err("Failed to find the location of %s at this address.\n"
-		       " Perhaps, it has been optimized out.\n", pf->pvar->var);
-	else if (ret == -ENOTSUP)
-		pr_err("Sorry, we don't support this variable location yet.\n");
-	else if (pf->pvar->field) {
-		ret = convert_variable_fields(vr_die, pf->pvar->var,
-					      pf->pvar->field, &pf->tvar->ref,
-					      &die_mem);
-		vr_die = &die_mem;
-	}
-	if (ret == 0)
-		ret = convert_variable_type(vr_die, pf->tvar, pf->pvar->type);
-	/* *expr will be cached in libdw. Don't free it. */
-	return ret;
-}
-
-/* Find a variable in a scope DIE */
-static int find_variable(Dwarf_Die *sc_die, struct probe_finder *pf)
-{
-	Dwarf_Die vr_die;
-	char buf[32], *ptr;
-	int ret = 0;
-
-	if (!is_c_varname(pf->pvar->var)) {
-		/* Copy raw parameters */
-		pf->tvar->value = strdup(pf->pvar->var);
-		if (pf->tvar->value == NULL)
-			return -ENOMEM;
-		if (pf->pvar->type) {
-			pf->tvar->type = strdup(pf->pvar->type);
-			if (pf->tvar->type == NULL)
-				return -ENOMEM;
-		}
-		if (pf->pvar->name) {
-			pf->tvar->name = strdup(pf->pvar->name);
-			if (pf->tvar->name == NULL)
-				return -ENOMEM;
-		} else
-			pf->tvar->name = NULL;
-		return 0;
-	}
-
-	if (pf->pvar->name)
-		pf->tvar->name = strdup(pf->pvar->name);
-	else {
-		ret = synthesize_perf_probe_arg(pf->pvar, buf, 32);
-		if (ret < 0)
-			return ret;
-		ptr = strchr(buf, ':');	/* Change type separator to _ */
-		if (ptr)
-			*ptr = '_';
-		pf->tvar->name = strdup(buf);
-	}
-	if (pf->tvar->name == NULL)
-		return -ENOMEM;
-
-	pr_debug("Searching '%s' variable in context.\n", pf->pvar->var);
-	/* Search child die for local variables and parameters. */
-	if (!die_find_variable_at(sc_die, pf->pvar->var, pf->addr, &vr_die)) {
-		/* Search again in global variables */
-		if (!die_find_variable_at(&pf->cu_die, pf->pvar->var, 0, &vr_die))
-			ret = -ENOENT;
-	}
-	if (ret >= 0)
-		ret = convert_variable(&vr_die, pf);
-
-	if (ret < 0)
-		pr_warning("Failed to find '%s' in this function.\n",
-			   pf->pvar->var);
-	return ret;
-}
-
-/* Convert subprogram DIE to trace point */
-static int convert_to_trace_point(Dwarf_Die *sp_die, Dwfl_Module *mod,
-				  Dwarf_Addr paddr, bool retprobe,
-				  struct probe_trace_point *tp)
-{
-	Dwarf_Addr eaddr, highaddr;
-	GElf_Sym sym;
-	const char *symbol;
-
-	/* Verify the address is correct */
-	if (dwarf_entrypc(sp_die, &eaddr) != 0) {
-		pr_warning("Failed to get entry address of %s\n",
-			   dwarf_diename(sp_die));
-		return -ENOENT;
-	}
-	if (dwarf_highpc(sp_die, &highaddr) != 0) {
-		pr_warning("Failed to get end address of %s\n",
-			   dwarf_diename(sp_die));
-		return -ENOENT;
-	}
-	if (paddr > highaddr) {
-		pr_warning("Offset specified is greater than size of %s\n",
-			   dwarf_diename(sp_die));
-		return -EINVAL;
-	}
-
-	/* Get an appropriate symbol from symtab */
-	symbol = dwfl_module_addrsym(mod, paddr, &sym, NULL);
-	if (!symbol) {
-		pr_warning("Failed to find symbol at 0x%lx\n",
-			   (unsigned long)paddr);
-		return -ENOENT;
-	}
-	tp->offset = (unsigned long)(paddr - sym.st_value);
-	tp->symbol = strdup(symbol);
-	if (!tp->symbol)
-		return -ENOMEM;
-
-	/* Return probe must be on the head of a subprogram */
-	if (retprobe) {
-		if (eaddr != paddr) {
-			pr_warning("Return probe must be on the head of"
-				   " a real function.\n");
-			return -EINVAL;
-		}
-		tp->retprobe = true;
-	}
-
-	return 0;
-}
-
-/* Call probe_finder callback with scope DIE */
-static int call_probe_finder(Dwarf_Die *sc_die, struct probe_finder *pf)
-{
-	Dwarf_Attribute fb_attr;
-	size_t nops;
-	int ret;
-
-	if (!sc_die) {
-		pr_err("Caller must pass a scope DIE. Program error.\n");
-		return -EINVAL;
-	}
-
-	/* If not a real subprogram, find a real one */
-	if (!die_is_func_def(sc_die)) {
-		if (!die_find_realfunc(&pf->cu_die, pf->addr, &pf->sp_die)) {
-			pr_warning("Failed to find probe point in any "
-				   "functions.\n");
-			return -ENOENT;
-		}
-	} else
-		memcpy(&pf->sp_die, sc_die, sizeof(Dwarf_Die));
-
-	/* Get the frame base attribute/ops from subprogram */
-	dwarf_attr(&pf->sp_die, DW_AT_frame_base, &fb_attr);
-	ret = dwarf_getlocation_addr(&fb_attr, pf->addr, &pf->fb_ops, &nops, 1);
-	if (ret <= 0 || nops == 0) {
-		pf->fb_ops = NULL;
-#if _ELFUTILS_PREREQ(0, 142)
-	} else if (nops == 1 && pf->fb_ops[0].atom == DW_OP_call_frame_cfa &&
-		   pf->cfi != NULL) {
-		Dwarf_Frame *frame;
-		if (dwarf_cfi_addrframe(pf->cfi, pf->addr, &frame) != 0 ||
-		    dwarf_frame_cfa(frame, &pf->fb_ops, &nops) != 0) {
-			pr_warning("Failed to get call frame on 0x%jx\n",
-				   (uintmax_t)pf->addr);
-			return -ENOENT;
-		}
-#endif
-	}
-
-	/* Call finder's callback handler */
-	ret = pf->callback(sc_die, pf);
-
-	/* *pf->fb_ops will be cached in libdw. Don't free it. */
-	pf->fb_ops = NULL;
-
-	return ret;
-}
-
-struct find_scope_param {
-	const char *function;
-	const char *file;
-	int line;
-	int diff;
-	Dwarf_Die *die_mem;
-	bool found;
-};
-
-static int find_best_scope_cb(Dwarf_Die *fn_die, void *data)
-{
-	struct find_scope_param *fsp = data;
-	const char *file;
-	int lno;
-
-	/* Skip if declared file name does not match */
-	if (fsp->file) {
-		file = dwarf_decl_file(fn_die);
-		if (!file || strcmp(fsp->file, file) != 0)
-			return 0;
-	}
-	/* If the function name is given, that's what user expects */
-	if (fsp->function) {
-		if (die_compare_name(fn_die, fsp->function)) {
-			memcpy(fsp->die_mem, fn_die, sizeof(Dwarf_Die));
-			fsp->found = true;
-			return 1;
-		}
-	} else {
-		/* With the line number, find the nearest declared DIE */
-		dwarf_decl_line(fn_die, &lno);
-		if (lno < fsp->line && fsp->diff > fsp->line - lno) {
-			/* Keep a candidate and continue */
-			fsp->diff = fsp->line - lno;
-			memcpy(fsp->die_mem, fn_die, sizeof(Dwarf_Die));
-			fsp->found = true;
-		}
-	}
-	return 0;
-}
-
-/* Find an appropriate scope fits to given conditions */
-static Dwarf_Die *find_best_scope(struct probe_finder *pf, Dwarf_Die *die_mem)
-{
-	struct find_scope_param fsp = {
-		.function = pf->pev->point.function,
-		.file = pf->fname,
-		.line = pf->lno,
-		.diff = INT_MAX,
-		.die_mem = die_mem,
-		.found = false,
-	};
-
-	cu_walk_functions_at(&pf->cu_die, pf->addr, find_best_scope_cb, &fsp);
-
-	return fsp.found ? die_mem : NULL;
-}
-
-static int probe_point_line_walker(const char *fname, int lineno,
-				   Dwarf_Addr addr, void *data)
-{
-	struct probe_finder *pf = data;
-	Dwarf_Die *sc_die, die_mem;
-	int ret;
-
-	if (lineno != pf->lno || strtailcmp(fname, pf->fname) != 0)
-		return 0;
-
-	pf->addr = addr;
-	sc_die = find_best_scope(pf, &die_mem);
-	if (!sc_die) {
-		pr_warning("Failed to find scope of probe point.\n");
-		return -ENOENT;
-	}
-
-	ret = call_probe_finder(sc_die, pf);
-
-	/* Continue if no error, because the line will be in inline function */
-	return ret < 0 ? ret : 0;
-}
-
-/* Find probe point from its line number */
-static int find_probe_point_by_line(struct probe_finder *pf)
-{
-	return die_walk_lines(&pf->cu_die, probe_point_line_walker, pf);
-}
-
-/* Find lines which match lazy pattern */
-static int find_lazy_match_lines(struct list_head *head,
-				 const char *fname, const char *pat)
-{
-	FILE *fp;
-	char *line = NULL;
-	size_t line_len;
-	ssize_t len;
-	int count = 0, linenum = 1;
-
-	fp = fopen(fname, "r");
-	if (!fp) {
-		pr_warning("Failed to open %s: %s\n", fname, strerror(errno));
-		return -errno;
-	}
-
-	while ((len = getline(&line, &line_len, fp)) > 0) {
-
-		if (line[len - 1] == '\n')
-			line[len - 1] = '\0';
-
-		if (strlazymatch(line, pat)) {
-			line_list__add_line(head, linenum);
-			count++;
-		}
-		linenum++;
-	}
-
-	if (ferror(fp))
-		count = -errno;
-	free(line);
-	fclose(fp);
-
-	if (count == 0)
-		pr_debug("No matched lines found in %s.\n", fname);
-	return count;
-}
-
-static int probe_point_lazy_walker(const char *fname, int lineno,
-				   Dwarf_Addr addr, void *data)
-{
-	struct probe_finder *pf = data;
-	Dwarf_Die *sc_die, die_mem;
-	int ret;
-
-	if (!line_list__has_line(&pf->lcache, lineno) ||
-	    strtailcmp(fname, pf->fname) != 0)
-		return 0;
-
-	pr_debug("Probe line found: line:%d addr:0x%llx\n",
-		 lineno, (unsigned long long)addr);
-	pf->addr = addr;
-	pf->lno = lineno;
-	sc_die = find_best_scope(pf, &die_mem);
-	if (!sc_die) {
-		pr_warning("Failed to find scope of probe point.\n");
-		return -ENOENT;
-	}
-
-	ret = call_probe_finder(sc_die, pf);
-
-	/*
-	 * Continue if no error, because the lazy pattern will match
-	 * to other lines
-	 */
-	return ret < 0 ? ret : 0;
-}
-
-/* Find probe points from lazy pattern  */
-static int find_probe_point_lazy(Dwarf_Die *sp_die, struct probe_finder *pf)
-{
-	int ret = 0;
-
-	if (list_empty(&pf->lcache)) {
-		/* Matching lazy line pattern */
-		ret = find_lazy_match_lines(&pf->lcache, pf->fname,
-					    pf->pev->point.lazy_line);
-		if (ret <= 0)
-			return ret;
-	}
-
-	return die_walk_lines(sp_die, probe_point_lazy_walker, pf);
-}
-
-static int probe_point_inline_cb(Dwarf_Die *in_die, void *data)
-{
-	struct probe_finder *pf = data;
-	struct perf_probe_point *pp = &pf->pev->point;
-	Dwarf_Addr addr;
-	int ret;
-
-	if (pp->lazy_line)
-		ret = find_probe_point_lazy(in_die, pf);
-	else {
-		/* Get probe address */
-		if (dwarf_entrypc(in_die, &addr) != 0) {
-			pr_warning("Failed to get entry address of %s.\n",
-				   dwarf_diename(in_die));
-			return -ENOENT;
-		}
-		pf->addr = addr;
-		pf->addr += pp->offset;
-		pr_debug("found inline addr: 0x%jx\n",
-			 (uintmax_t)pf->addr);
-
-		ret = call_probe_finder(in_die, pf);
-	}
-
-	return ret;
-}
-
-/* Callback parameter with return value for libdw */
-struct dwarf_callback_param {
-	void *data;
-	int retval;
-};
-
-/* Search function from function name */
-static int probe_point_search_cb(Dwarf_Die *sp_die, void *data)
-{
-	struct dwarf_callback_param *param = data;
-	struct probe_finder *pf = param->data;
-	struct perf_probe_point *pp = &pf->pev->point;
-
-	/* Check tag and diename */
-	if (!die_is_func_def(sp_die) ||
-	    !die_compare_name(sp_die, pp->function))
-		return DWARF_CB_OK;
-
-	/* Check declared file */
-	if (pp->file && strtailcmp(pp->file, dwarf_decl_file(sp_die)))
-		return DWARF_CB_OK;
-
-	pf->fname = dwarf_decl_file(sp_die);
-	if (pp->line) { /* Function relative line */
-		dwarf_decl_line(sp_die, &pf->lno);
-		pf->lno += pp->line;
-		param->retval = find_probe_point_by_line(pf);
-	} else if (!dwarf_func_inline(sp_die)) {
-		/* Real function */
-		if (pp->lazy_line)
-			param->retval = find_probe_point_lazy(sp_die, pf);
-		else {
-			if (dwarf_entrypc(sp_die, &pf->addr) != 0) {
-				pr_warning("Failed to get entry address of "
-					   "%s.\n", dwarf_diename(sp_die));
-				param->retval = -ENOENT;
-				return DWARF_CB_ABORT;
-			}
-			pf->addr += pp->offset;
-			/* TODO: Check the address in this function */
-			param->retval = call_probe_finder(sp_die, pf);
-		}
-	} else
-		/* Inlined function: search instances */
-		param->retval = die_walk_instances(sp_die,
-					probe_point_inline_cb, (void *)pf);
-
-	return DWARF_CB_ABORT; /* Exit; no same symbol in this CU. */
-}
-
-static int find_probe_point_by_func(struct probe_finder *pf)
-{
-	struct dwarf_callback_param _param = {.data = (void *)pf,
-					      .retval = 0};
-	dwarf_getfuncs(&pf->cu_die, probe_point_search_cb, &_param, 0);
-	return _param.retval;
-}
-
-struct pubname_callback_param {
-	char *function;
-	char *file;
-	Dwarf_Die *cu_die;
-	Dwarf_Die *sp_die;
-	int found;
-};
-
-static int pubname_search_cb(Dwarf *dbg, Dwarf_Global *gl, void *data)
-{
-	struct pubname_callback_param *param = data;
-
-	if (dwarf_offdie(dbg, gl->die_offset, param->sp_die)) {
-		if (dwarf_tag(param->sp_die) != DW_TAG_subprogram)
-			return DWARF_CB_OK;
-
-		if (die_compare_name(param->sp_die, param->function)) {
-			if (!dwarf_offdie(dbg, gl->cu_offset, param->cu_die))
-				return DWARF_CB_OK;
-
-			if (param->file &&
-			    strtailcmp(param->file, dwarf_decl_file(param->sp_die)))
-				return DWARF_CB_OK;
-
-			param->found = 1;
-			return DWARF_CB_ABORT;
-		}
-	}
-
-	return DWARF_CB_OK;
-}
-
-/* Find probe points from debuginfo */
-static int debuginfo__find_probes(struct debuginfo *self,
-				  struct probe_finder *pf)
-{
-	struct perf_probe_point *pp = &pf->pev->point;
-	Dwarf_Off off, noff;
-	size_t cuhl;
-	Dwarf_Die *diep;
-	int ret = 0;
-
-#if _ELFUTILS_PREREQ(0, 142)
-	/* Get the call frame information from this dwarf */
-	pf->cfi = dwarf_getcfi(self->dbg);
-#endif
-
-	off = 0;
-	line_list__init(&pf->lcache);
-
-	/* Fastpath: lookup by function name from .debug_pubnames section */
-	if (pp->function) {
-		struct pubname_callback_param pubname_param = {
-			.function = pp->function,
-			.file	  = pp->file,
-			.cu_die	  = &pf->cu_die,
-			.sp_die	  = &pf->sp_die,
-			.found	  = 0,
-		};
-		struct dwarf_callback_param probe_param = {
-			.data = pf,
-		};
-
-		dwarf_getpubnames(self->dbg, pubname_search_cb,
-				  &pubname_param, 0);
-		if (pubname_param.found) {
-			ret = probe_point_search_cb(&pf->sp_die, &probe_param);
-			if (ret)
-				goto found;
-		}
-	}
-
-	/* Loop on CUs (Compilation Unit) */
-	while (!dwarf_nextcu(self->dbg, off, &noff, &cuhl, NULL, NULL, NULL)) {
-		/* Get the DIE(Debugging Information Entry) of this CU */
-		diep = dwarf_offdie(self->dbg, off + cuhl, &pf->cu_die);
-		if (!diep)
-			continue;
-
-		/* Check if target file is included. */
-		if (pp->file)
-			pf->fname = cu_find_realpath(&pf->cu_die, pp->file);
-		else
-			pf->fname = NULL;
-
-		if (!pp->file || pf->fname) {
-			if (pp->function)
-				ret = find_probe_point_by_func(pf);
-			else if (pp->lazy_line)
-				ret = find_probe_point_lazy(NULL, pf);
-			else {
-				pf->lno = pp->line;
-				ret = find_probe_point_by_line(pf);
-			}
-			if (ret < 0)
-				break;
-		}
-		off = noff;
-	}
-
-found:
-	line_list__free(&pf->lcache);
-
-	return ret;
-}
-
-/* Add a found probe point into trace event list */
-static int add_probe_trace_event(Dwarf_Die *sc_die, struct probe_finder *pf)
-{
-	struct trace_event_finder *tf =
-			container_of(pf, struct trace_event_finder, pf);
-	struct probe_trace_event *tev;
-	int ret, i;
-
-	/* Check number of tevs */
-	if (tf->ntevs == tf->max_tevs) {
-		pr_warning("Too many( > %d) probe point found.\n",
-			   tf->max_tevs);
-		return -ERANGE;
-	}
-	tev = &tf->tevs[tf->ntevs++];
-
-	/* Trace point should be converted from subprogram DIE */
-	ret = convert_to_trace_point(&pf->sp_die, tf->mod, pf->addr,
-				     pf->pev->point.retprobe, &tev->point);
-	if (ret < 0)
-		return ret;
-
-	pr_debug("Probe point found: %s+%lu\n", tev->point.symbol,
-		 tev->point.offset);
-
-	/* Find each argument */
-	tev->nargs = pf->pev->nargs;
-	tev->args = zalloc(sizeof(struct probe_trace_arg) * tev->nargs);
-	if (tev->args == NULL)
-		return -ENOMEM;
-	for (i = 0; i < pf->pev->nargs; i++) {
-		pf->pvar = &pf->pev->args[i];
-		pf->tvar = &tev->args[i];
-		/* Variable should be found from scope DIE */
-		ret = find_variable(sc_die, pf);
-		if (ret != 0)
-			return ret;
-	}
-
-	return 0;
-}
-
-/* Find probe_trace_events specified by perf_probe_event from debuginfo */
-int debuginfo__find_trace_events(struct debuginfo *self,
-				 struct perf_probe_event *pev,
-				 struct probe_trace_event **tevs, int max_tevs)
-{
-	struct trace_event_finder tf = {
-			.pf = {.pev = pev, .callback = add_probe_trace_event},
-			.mod = self->mod, .max_tevs = max_tevs};
-	int ret;
-
-	/* Allocate result tevs array */
-	*tevs = zalloc(sizeof(struct probe_trace_event) * max_tevs);
-	if (*tevs == NULL)
-		return -ENOMEM;
-
-	tf.tevs = *tevs;
-	tf.ntevs = 0;
-
-	ret = debuginfo__find_probes(self, &tf.pf);
-	if (ret < 0) {
-		free(*tevs);
-		*tevs = NULL;
-		return ret;
-	}
-
-	return (ret < 0) ? ret : tf.ntevs;
-}
-
-#define MAX_VAR_LEN 64
-
-/* Collect available variables in this scope */
-static int collect_variables_cb(Dwarf_Die *die_mem, void *data)
-{
-	struct available_var_finder *af = data;
-	struct variable_list *vl;
-	char buf[MAX_VAR_LEN];
-	int tag, ret;
-
-	vl = &af->vls[af->nvls - 1];
-
-	tag = dwarf_tag(die_mem);
-	if (tag == DW_TAG_formal_parameter ||
-	    tag == DW_TAG_variable) {
-		ret = convert_variable_location(die_mem, af->pf.addr,
-						af->pf.fb_ops, NULL);
-		if (ret == 0) {
-			ret = die_get_varname(die_mem, buf, MAX_VAR_LEN);
-			pr_debug2("Add new var: %s\n", buf);
-			if (ret > 0)
-				strlist__add(vl->vars, buf);
-		}
-	}
-
-	if (af->child && dwarf_haspc(die_mem, af->pf.addr))
-		return DIE_FIND_CB_CONTINUE;
-	else
-		return DIE_FIND_CB_SIBLING;
-}
-
-/* Add a found vars into available variables list */
-static int add_available_vars(Dwarf_Die *sc_die, struct probe_finder *pf)
-{
-	struct available_var_finder *af =
-			container_of(pf, struct available_var_finder, pf);
-	struct variable_list *vl;
-	Dwarf_Die die_mem;
-	int ret;
-
-	/* Check number of tevs */
-	if (af->nvls == af->max_vls) {
-		pr_warning("Too many( > %d) probe point found.\n", af->max_vls);
-		return -ERANGE;
-	}
-	vl = &af->vls[af->nvls++];
-
-	/* Trace point should be converted from subprogram DIE */
-	ret = convert_to_trace_point(&pf->sp_die, af->mod, pf->addr,
-				     pf->pev->point.retprobe, &vl->point);
-	if (ret < 0)
-		return ret;
-
-	pr_debug("Probe point found: %s+%lu\n", vl->point.symbol,
-		 vl->point.offset);
-
-	/* Find local variables */
-	vl->vars = strlist__new(true, NULL);
-	if (vl->vars == NULL)
-		return -ENOMEM;
-	af->child = true;
-	die_find_child(sc_die, collect_variables_cb, (void *)af, &die_mem);
-
-	/* Find external variables */
-	if (!af->externs)
-		goto out;
-	/* Don't need to search child DIE for externs. */
-	af->child = false;
-	die_find_child(&pf->cu_die, collect_variables_cb, (void *)af, &die_mem);
-
-out:
-	if (strlist__empty(vl->vars)) {
-		strlist__delete(vl->vars);
-		vl->vars = NULL;
-	}
-
-	return ret;
-}
-
-/* Find available variables at given probe point */
-int debuginfo__find_available_vars_at(struct debuginfo *self,
-				      struct perf_probe_event *pev,
-				      struct variable_list **vls,
-				      int max_vls, bool externs)
-{
-	struct available_var_finder af = {
-			.pf = {.pev = pev, .callback = add_available_vars},
-			.mod = self->mod,
-			.max_vls = max_vls, .externs = externs};
-	int ret;
-
-	/* Allocate result vls array */
-	*vls = zalloc(sizeof(struct variable_list) * max_vls);
-	if (*vls == NULL)
-		return -ENOMEM;
-
-	af.vls = *vls;
-	af.nvls = 0;
-
-	ret = debuginfo__find_probes(self, &af.pf);
-	if (ret < 0) {
-		/* Free vlist for error */
-		while (af.nvls--) {
-			if (af.vls[af.nvls].point.symbol)
-				free(af.vls[af.nvls].point.symbol);
-			if (af.vls[af.nvls].vars)
-				strlist__delete(af.vls[af.nvls].vars);
-		}
-		free(af.vls);
-		*vls = NULL;
-		return ret;
-	}
-
-	return (ret < 0) ? ret : af.nvls;
-}
-
-/* Reverse search */
-int debuginfo__find_probe_point(struct debuginfo *self, unsigned long addr,
-				struct perf_probe_point *ppt)
-{
-	Dwarf_Die cudie, spdie, indie;
-	Dwarf_Addr _addr = 0, baseaddr = 0;
-	const char *fname = NULL, *func = NULL, *basefunc = NULL, *tmp;
-	int baseline = 0, lineno = 0, ret = 0;
-
-	/* Adjust address with bias */
-	addr += self->bias;
-
-	/* Find cu die */
-	if (!dwarf_addrdie(self->dbg, (Dwarf_Addr)addr - self->bias, &cudie)) {
-		pr_warning("Failed to find debug information for address %lx\n",
-			   addr);
-		ret = -EINVAL;
-		goto end;
-	}
-
-	/* Find a corresponding line (filename and lineno) */
-	cu_find_lineinfo(&cudie, addr, &fname, &lineno);
-	/* Don't care whether it failed or not */
-
-	/* Find a corresponding function (name, baseline and baseaddr) */
-	if (die_find_realfunc(&cudie, (Dwarf_Addr)addr, &spdie)) {
-		/* Get function entry information */
-		func = basefunc = dwarf_diename(&spdie);
-		if (!func ||
-		    dwarf_entrypc(&spdie, &baseaddr) != 0 ||
-		    dwarf_decl_line(&spdie, &baseline) != 0) {
-			lineno = 0;
-			goto post;
-		}
-
-		fname = dwarf_decl_file(&spdie);
-		if (addr == (unsigned long)baseaddr) {
-			/* Function entry - Relative line number is 0 */
-			lineno = baseline;
-			goto post;
-		}
-
-		/* Track down the inline functions step by step */
-		while (die_find_top_inlinefunc(&spdie, (Dwarf_Addr)addr,
-						&indie)) {
-			/* There is an inline function */
-			if (dwarf_entrypc(&indie, &_addr) == 0 &&
-			    _addr == addr) {
-				/*
-				 * addr is at an inline function entry.
-				 * In this case, lineno should be the call-site
-				 * line number. (overwrite lineinfo)
-				 */
-				lineno = die_get_call_lineno(&indie);
-				fname = die_get_call_file(&indie);
-				break;
-			} else {
-				/*
-				 * addr is in an inline function body.
-				 * Since lineno points one of the lines
-				 * of the inline function, baseline should
-				 * be the entry line of the inline function.
-				 */
-				tmp = dwarf_diename(&indie);
-				if (!tmp ||
-				    dwarf_decl_line(&indie, &baseline) != 0)
-					break;
-				func = tmp;
-				spdie = indie;
-			}
-		}
-		/* Verify the lineno and baseline are in a same file */
-		tmp = dwarf_decl_file(&spdie);
-		if (!tmp || strcmp(tmp, fname) != 0)
-			lineno = 0;
-	}
-
-post:
-	/* Make a relative line number or an offset */
-	if (lineno)
-		ppt->line = lineno - baseline;
-	else if (basefunc) {
-		ppt->offset = addr - (unsigned long)baseaddr;
-		func = basefunc;
-	}
-
-	/* Duplicate strings */
-	if (func) {
-		ppt->function = strdup(func);
-		if (ppt->function == NULL) {
-			ret = -ENOMEM;
-			goto end;
-		}
-	}
-	if (fname) {
-		ppt->file = strdup(fname);
-		if (ppt->file == NULL) {
-			if (ppt->function) {
-				free(ppt->function);
-				ppt->function = NULL;
-			}
-			ret = -ENOMEM;
-			goto end;
-		}
-	}
-end:
-	if (ret == 0 && (fname || func))
-		ret = 1;	/* Found a point */
-	return ret;
-}
-
-/* Add a line and store the src path */
-static int line_range_add_line(const char *src, unsigned int lineno,
-			       struct line_range *lr)
-{
-	/* Copy source path */
-	if (!lr->path) {
-		lr->path = strdup(src);
-		if (lr->path == NULL)
-			return -ENOMEM;
-	}
-	return line_list__add_line(&lr->line_list, lineno);
-}
-
-static int line_range_walk_cb(const char *fname, int lineno,
-			      Dwarf_Addr addr __maybe_unused,
-			      void *data)
-{
-	struct line_finder *lf = data;
-
-	if ((strtailcmp(fname, lf->fname) != 0) ||
-	    (lf->lno_s > lineno || lf->lno_e < lineno))
-		return 0;
-
-	if (line_range_add_line(fname, lineno, lf->lr) < 0)
-		return -EINVAL;
-
-	return 0;
-}
-
-/* Find line range from its line number */
-static int find_line_range_by_line(Dwarf_Die *sp_die, struct line_finder *lf)
-{
-	int ret;
-
-	ret = die_walk_lines(sp_die ?: &lf->cu_die, line_range_walk_cb, lf);
-
-	/* Update status */
-	if (ret >= 0)
-		if (!list_empty(&lf->lr->line_list))
-			ret = lf->found = 1;
-		else
-			ret = 0;	/* Lines are not found */
-	else {
-		free(lf->lr->path);
-		lf->lr->path = NULL;
-	}
-	return ret;
-}
-
-static int line_range_inline_cb(Dwarf_Die *in_die, void *data)
-{
-	find_line_range_by_line(in_die, data);
-
-	/*
-	 * We have to check all instances of inlined function, because
-	 * some execution paths can be optimized out depends on the
-	 * function argument of instances
-	 */
-	return 0;
-}
-
-/* Search function definition from function name */
-static int line_range_search_cb(Dwarf_Die *sp_die, void *data)
-{
-	struct dwarf_callback_param *param = data;
-	struct line_finder *lf = param->data;
-	struct line_range *lr = lf->lr;
-
-	/* Check declared file */
-	if (lr->file && strtailcmp(lr->file, dwarf_decl_file(sp_die)))
-		return DWARF_CB_OK;
-
-	if (die_is_func_def(sp_die) &&
-	    die_compare_name(sp_die, lr->function)) {
-		lf->fname = dwarf_decl_file(sp_die);
-		dwarf_decl_line(sp_die, &lr->offset);
-		pr_debug("fname: %s, lineno:%d\n", lf->fname, lr->offset);
-		lf->lno_s = lr->offset + lr->start;
-		if (lf->lno_s < 0)	/* Overflow */
-			lf->lno_s = INT_MAX;
-		lf->lno_e = lr->offset + lr->end;
-		if (lf->lno_e < 0)	/* Overflow */
-			lf->lno_e = INT_MAX;
-		pr_debug("New line range: %d to %d\n", lf->lno_s, lf->lno_e);
-		lr->start = lf->lno_s;
-		lr->end = lf->lno_e;
-		if (dwarf_func_inline(sp_die))
-			param->retval = die_walk_instances(sp_die,
-						line_range_inline_cb, lf);
-		else
-			param->retval = find_line_range_by_line(sp_die, lf);
-		return DWARF_CB_ABORT;
-	}
-	return DWARF_CB_OK;
-}
-
-static int find_line_range_by_func(struct line_finder *lf)
-{
-	struct dwarf_callback_param param = {.data = (void *)lf, .retval = 0};
-	dwarf_getfuncs(&lf->cu_die, line_range_search_cb, &param, 0);
-	return param.retval;
-}
-
-int debuginfo__find_line_range(struct debuginfo *self, struct line_range *lr)
-{
-	struct line_finder lf = {.lr = lr, .found = 0};
-	int ret = 0;
-	Dwarf_Off off = 0, noff;
-	size_t cuhl;
-	Dwarf_Die *diep;
-	const char *comp_dir;
-
-	/* Fastpath: lookup by function name from .debug_pubnames section */
-	if (lr->function) {
-		struct pubname_callback_param pubname_param = {
-			.function = lr->function, .file = lr->file,
-			.cu_die = &lf.cu_die, .sp_die = &lf.sp_die, .found = 0};
-		struct dwarf_callback_param line_range_param = {
-			.data = (void *)&lf, .retval = 0};
-
-		dwarf_getpubnames(self->dbg, pubname_search_cb,
-				  &pubname_param, 0);
-		if (pubname_param.found) {
-			line_range_search_cb(&lf.sp_die, &line_range_param);
-			if (lf.found)
-				goto found;
-		}
-	}
-
-	/* Loop on CUs (Compilation Unit) */
-	while (!lf.found && ret >= 0) {
-		if (dwarf_nextcu(self->dbg, off, &noff, &cuhl,
-				 NULL, NULL, NULL) != 0)
-			break;
-
-		/* Get the DIE(Debugging Information Entry) of this CU */
-		diep = dwarf_offdie(self->dbg, off + cuhl, &lf.cu_die);
-		if (!diep)
-			continue;
-
-		/* Check if target file is included. */
-		if (lr->file)
-			lf.fname = cu_find_realpath(&lf.cu_die, lr->file);
-		else
-			lf.fname = 0;
-
-		if (!lr->file || lf.fname) {
-			if (lr->function)
-				ret = find_line_range_by_func(&lf);
-			else {
-				lf.lno_s = lr->start;
-				lf.lno_e = lr->end;
-				ret = find_line_range_by_line(NULL, &lf);
-			}
-		}
-		off = noff;
-	}
-
-found:
-	/* Store comp_dir */
-	if (lf.found) {
-		comp_dir = cu_get_comp_dir(&lf.cu_die);
-		if (comp_dir) {
-			lr->comp_dir = strdup(comp_dir);
-			if (!lr->comp_dir)
-				ret = -ENOMEM;
-		}
-	}
-
-	pr_debug("path: %s\n", lr->path);
-	return (ret < 0) ? ret : lf.found;
-}
-
diff --git a/src/tools/perf/util/probe-finder.h b/src/tools/perf/util/probe-finder.h
deleted file mode 100644
index 3b7d630..0000000
--- a/src/tools/perf/util/probe-finder.h
+++ /dev/null
@@ -1,110 +0,0 @@
-#ifndef _PROBE_FINDER_H
-#define _PROBE_FINDER_H
-
-#include <stdbool.h>
-#include "util.h"
-#include "probe-event.h"
-
-#define MAX_PROBE_BUFFER	1024
-#define MAX_PROBES		 128
-
-static inline int is_c_varname(const char *name)
-{
-	/* TODO */
-	return isalpha(name[0]) || name[0] == '_';
-}
-
-#ifdef DWARF_SUPPORT
-
-#include "dwarf-aux.h"
-
-/* TODO: export debuginfo data structure even if no dwarf support */
-
-/* debug information structure */
-struct debuginfo {
-	Dwarf		*dbg;
-	Dwfl_Module	*mod;
-	Dwfl		*dwfl;
-	Dwarf_Addr	bias;
-};
-
-extern struct debuginfo *debuginfo__new(const char *path);
-extern struct debuginfo *debuginfo__new_online_kernel(unsigned long addr);
-extern void debuginfo__delete(struct debuginfo *self);
-
-/* Find probe_trace_events specified by perf_probe_event from debuginfo */
-extern int debuginfo__find_trace_events(struct debuginfo *self,
-					struct perf_probe_event *pev,
-					struct probe_trace_event **tevs,
-					int max_tevs);
-
-/* Find a perf_probe_point from debuginfo */
-extern int debuginfo__find_probe_point(struct debuginfo *self,
-				       unsigned long addr,
-				       struct perf_probe_point *ppt);
-
-/* Find a line range */
-extern int debuginfo__find_line_range(struct debuginfo *self,
-				      struct line_range *lr);
-
-/* Find available variables */
-extern int debuginfo__find_available_vars_at(struct debuginfo *self,
-					     struct perf_probe_event *pev,
-					     struct variable_list **vls,
-					     int max_points, bool externs);
-
-struct probe_finder {
-	struct perf_probe_event	*pev;		/* Target probe event */
-
-	/* Callback when a probe point is found */
-	int (*callback)(Dwarf_Die *sc_die, struct probe_finder *pf);
-
-	/* For function searching */
-	int			lno;		/* Line number */
-	Dwarf_Addr		addr;		/* Address */
-	const char		*fname;		/* Real file name */
-	Dwarf_Die		cu_die;		/* Current CU */
-	Dwarf_Die		sp_die;
-	struct list_head	lcache;		/* Line cache for lazy match */
-
-	/* For variable searching */
-#if _ELFUTILS_PREREQ(0, 142)
-	Dwarf_CFI		*cfi;		/* Call Frame Information */
-#endif
-	Dwarf_Op		*fb_ops;	/* Frame base attribute */
-	struct perf_probe_arg	*pvar;		/* Current target variable */
-	struct probe_trace_arg	*tvar;		/* Current result variable */
-};
-
-struct trace_event_finder {
-	struct probe_finder	pf;
-	Dwfl_Module		*mod;		/* For solving symbols */
-	struct probe_trace_event *tevs;		/* Found trace events */
-	int			ntevs;		/* Number of trace events */
-	int			max_tevs;	/* Max number of trace events */
-};
-
-struct available_var_finder {
-	struct probe_finder	pf;
-	Dwfl_Module		*mod;		/* For solving symbols */
-	struct variable_list	*vls;		/* Found variable lists */
-	int			nvls;		/* Number of variable lists */
-	int			max_vls;	/* Max no. of variable lists */
-	bool			externs;	/* Find external vars too */
-	bool			child;		/* Search child scopes */
-};
-
-struct line_finder {
-	struct line_range	*lr;		/* Target line range */
-
-	const char		*fname;		/* File name */
-	int			lno_s;		/* Start line number */
-	int			lno_e;		/* End line number */
-	Dwarf_Die		cu_die;		/* Current CU */
-	Dwarf_Die		sp_die;
-	int			found;
-};
-
-#endif /* DWARF_SUPPORT */
-
-#endif /*_PROBE_FINDER_H */
diff --git a/src/tools/perf/util/pstack.c b/src/tools/perf/util/pstack.c
deleted file mode 100644
index daa17ae..0000000
--- a/src/tools/perf/util/pstack.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Simple pointer stack
- *
- * (c) 2010 Arnaldo Carvalho de Melo <acme@redhat.com>
- */
-
-#include "util.h"
-#include "pstack.h"
-#include <linux/kernel.h>
-#include <stdlib.h>
-
-struct pstack {
-	unsigned short	top;
-	unsigned short	max_nr_entries;
-	void		*entries[0];
-};
-
-struct pstack *pstack__new(unsigned short max_nr_entries)
-{
-	struct pstack *pstack = zalloc((sizeof(*pstack) +
-				       max_nr_entries * sizeof(void *)));
-	if (pstack != NULL)
-		pstack->max_nr_entries = max_nr_entries;
-	return pstack;
-}
-
-void pstack__delete(struct pstack *pstack)
-{
-	free(pstack);
-}
-
-bool pstack__empty(const struct pstack *pstack)
-{
-	return pstack->top == 0;
-}
-
-void pstack__remove(struct pstack *pstack, void *key)
-{
-	unsigned short i = pstack->top, last_index = pstack->top - 1;
-
-	while (i-- != 0) {
-		if (pstack->entries[i] == key) {
-			if (i < last_index)
-				memmove(pstack->entries + i,
-					pstack->entries + i + 1,
-					(last_index - i) * sizeof(void *));
-			--pstack->top;
-			return;
-		}
-	}
-	pr_err("%s: %p not on the pstack!\n", __func__, key);
-}
-
-void pstack__push(struct pstack *pstack, void *key)
-{
-	if (pstack->top == pstack->max_nr_entries) {
-		pr_err("%s: top=%d, overflow!\n", __func__, pstack->top);
-		return;
-	}
-	pstack->entries[pstack->top++] = key;
-}
-
-void *pstack__pop(struct pstack *pstack)
-{
-	void *ret;
-
-	if (pstack->top == 0) {
-		pr_err("%s: underflow!\n", __func__);
-		return NULL;
-	}
-
-	ret = pstack->entries[--pstack->top];
-	pstack->entries[pstack->top] = NULL;
-	return ret;
-}
diff --git a/src/tools/perf/util/pstack.h b/src/tools/perf/util/pstack.h
deleted file mode 100644
index 4cedea5..0000000
--- a/src/tools/perf/util/pstack.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef _PERF_PSTACK_
-#define _PERF_PSTACK_
-
-#include <stdbool.h>
-
-struct pstack;
-struct pstack *pstack__new(unsigned short max_nr_entries);
-void pstack__delete(struct pstack *self);
-bool pstack__empty(const struct pstack *self);
-void pstack__remove(struct pstack *self, void *key);
-void pstack__push(struct pstack *self, void *key);
-void *pstack__pop(struct pstack *self);
-
-#endif /* _PERF_PSTACK_ */
diff --git a/src/tools/perf/util/python-ext-sources b/src/tools/perf/util/python-ext-sources
deleted file mode 100644
index f75ae1b..0000000
--- a/src/tools/perf/util/python-ext-sources
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# List of files needed by perf python extension
-#
-# Each source file must be placed on its own line so that it can be
-# processed by Makefile and util/setup.py accordingly.
-#
-
-util/python.c
-util/ctype.c
-util/evlist.c
-util/evsel.c
-util/cpumap.c
-util/hweight.c
-util/thread_map.c
-util/util.c
-util/xyarray.c
-util/cgroup.c
-util/rblist.c
-util/strlist.c
-util/sysfs.c
-../../lib/rbtree.c
diff --git a/src/tools/perf/util/python.c b/src/tools/perf/util/python.c
deleted file mode 100644
index 2ac4bc9..0000000
--- a/src/tools/perf/util/python.c
+++ /dev/null
@@ -1,1079 +0,0 @@
-#include <Python.h>
-#include <structmember.h>
-#include <inttypes.h>
-#include <poll.h>
-#include "evlist.h"
-#include "evsel.h"
-#include "event.h"
-#include "cpumap.h"
-#include "thread_map.h"
-
-/*
- * Support debug printing even though util/debug.c is not linked.  That means
- * implementing 'verbose' and 'eprintf'.
- */
-int verbose;
-
-int eprintf(int level, const char *fmt, ...)
-{
-	va_list args;
-	int ret = 0;
-
-	if (verbose >= level) {
-		va_start(args, fmt);
-		ret = vfprintf(stderr, fmt, args);
-		va_end(args);
-	}
-
-	return ret;
-}
-
-/* Define PyVarObject_HEAD_INIT for python 2.5 */
-#ifndef PyVarObject_HEAD_INIT
-# define PyVarObject_HEAD_INIT(type, size) PyObject_HEAD_INIT(type) size,
-#endif
-
-struct throttle_event {
-	struct perf_event_header header;
-	u64			 time;
-	u64			 id;
-	u64			 stream_id;
-};
-
-PyMODINIT_FUNC initperf(void);
-
-#define member_def(type, member, ptype, help) \
-	{ #member, ptype, \
-	  offsetof(struct pyrf_event, event) + offsetof(struct type, member), \
-	  0, help }
-
-#define sample_member_def(name, member, ptype, help) \
-	{ #name, ptype, \
-	  offsetof(struct pyrf_event, sample) + offsetof(struct perf_sample, member), \
-	  0, help }
-
-struct pyrf_event {
-	PyObject_HEAD
-	struct perf_sample sample;
-	union perf_event   event;
-};
-
-#define sample_members \
-	sample_member_def(sample_ip, ip, T_ULONGLONG, "event type"),			 \
-	sample_member_def(sample_pid, pid, T_INT, "event pid"),			 \
-	sample_member_def(sample_tid, tid, T_INT, "event tid"),			 \
-	sample_member_def(sample_time, time, T_ULONGLONG, "event timestamp"),		 \
-	sample_member_def(sample_addr, addr, T_ULONGLONG, "event addr"),		 \
-	sample_member_def(sample_id, id, T_ULONGLONG, "event id"),			 \
-	sample_member_def(sample_stream_id, stream_id, T_ULONGLONG, "event stream id"), \
-	sample_member_def(sample_period, period, T_ULONGLONG, "event period"),		 \
-	sample_member_def(sample_cpu, cpu, T_UINT, "event cpu"),
-
-static char pyrf_mmap_event__doc[] = PyDoc_STR("perf mmap event object.");
-
-static PyMemberDef pyrf_mmap_event__members[] = {
-	sample_members
-	member_def(perf_event_header, type, T_UINT, "event type"),
-	member_def(mmap_event, pid, T_UINT, "event pid"),
-	member_def(mmap_event, tid, T_UINT, "event tid"),
-	member_def(mmap_event, start, T_ULONGLONG, "start of the map"),
-	member_def(mmap_event, len, T_ULONGLONG, "map length"),
-	member_def(mmap_event, pgoff, T_ULONGLONG, "page offset"),
-	member_def(mmap_event, filename, T_STRING_INPLACE, "backing store"),
-	{ .name = NULL, },
-};
-
-static PyObject *pyrf_mmap_event__repr(struct pyrf_event *pevent)
-{
-	PyObject *ret;
-	char *s;
-
-	if (asprintf(&s, "{ type: mmap, pid: %u, tid: %u, start: %#" PRIx64 ", "
-			 "length: %#" PRIx64 ", offset: %#" PRIx64 ", "
-			 "filename: %s }",
-		     pevent->event.mmap.pid, pevent->event.mmap.tid,
-		     pevent->event.mmap.start, pevent->event.mmap.len,
-		     pevent->event.mmap.pgoff, pevent->event.mmap.filename) < 0) {
-		ret = PyErr_NoMemory();
-	} else {
-		ret = PyString_FromString(s);
-		free(s);
-	}
-	return ret;
-}
-
-static PyTypeObject pyrf_mmap_event__type = {
-	PyVarObject_HEAD_INIT(NULL, 0)
-	.tp_name	= "perf.mmap_event",
-	.tp_basicsize	= sizeof(struct pyrf_event),
-	.tp_flags	= Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
-	.tp_doc		= pyrf_mmap_event__doc,
-	.tp_members	= pyrf_mmap_event__members,
-	.tp_repr	= (reprfunc)pyrf_mmap_event__repr,
-};
-
-static char pyrf_task_event__doc[] = PyDoc_STR("perf task (fork/exit) event object.");
-
-static PyMemberDef pyrf_task_event__members[] = {
-	sample_members
-	member_def(perf_event_header, type, T_UINT, "event type"),
-	member_def(fork_event, pid, T_UINT, "event pid"),
-	member_def(fork_event, ppid, T_UINT, "event ppid"),
-	member_def(fork_event, tid, T_UINT, "event tid"),
-	member_def(fork_event, ptid, T_UINT, "event ptid"),
-	member_def(fork_event, time, T_ULONGLONG, "timestamp"),
-	{ .name = NULL, },
-};
-
-static PyObject *pyrf_task_event__repr(struct pyrf_event *pevent)
-{
-	return PyString_FromFormat("{ type: %s, pid: %u, ppid: %u, tid: %u, "
-				   "ptid: %u, time: %" PRIu64 "}",
-				   pevent->event.header.type == PERF_RECORD_FORK ? "fork" : "exit",
-				   pevent->event.fork.pid,
-				   pevent->event.fork.ppid,
-				   pevent->event.fork.tid,
-				   pevent->event.fork.ptid,
-				   pevent->event.fork.time);
-}
-
-static PyTypeObject pyrf_task_event__type = {
-	PyVarObject_HEAD_INIT(NULL, 0)
-	.tp_name	= "perf.task_event",
-	.tp_basicsize	= sizeof(struct pyrf_event),
-	.tp_flags	= Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
-	.tp_doc		= pyrf_task_event__doc,
-	.tp_members	= pyrf_task_event__members,
-	.tp_repr	= (reprfunc)pyrf_task_event__repr,
-};
-
-static char pyrf_comm_event__doc[] = PyDoc_STR("perf comm event object.");
-
-static PyMemberDef pyrf_comm_event__members[] = {
-	sample_members
-	member_def(perf_event_header, type, T_UINT, "event type"),
-	member_def(comm_event, pid, T_UINT, "event pid"),
-	member_def(comm_event, tid, T_UINT, "event tid"),
-	member_def(comm_event, comm, T_STRING_INPLACE, "process name"),
-	{ .name = NULL, },
-};
-
-static PyObject *pyrf_comm_event__repr(struct pyrf_event *pevent)
-{
-	return PyString_FromFormat("{ type: comm, pid: %u, tid: %u, comm: %s }",
-				   pevent->event.comm.pid,
-				   pevent->event.comm.tid,
-				   pevent->event.comm.comm);
-}
-
-static PyTypeObject pyrf_comm_event__type = {
-	PyVarObject_HEAD_INIT(NULL, 0)
-	.tp_name	= "perf.comm_event",
-	.tp_basicsize	= sizeof(struct pyrf_event),
-	.tp_flags	= Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
-	.tp_doc		= pyrf_comm_event__doc,
-	.tp_members	= pyrf_comm_event__members,
-	.tp_repr	= (reprfunc)pyrf_comm_event__repr,
-};
-
-static char pyrf_throttle_event__doc[] = PyDoc_STR("perf throttle event object.");
-
-static PyMemberDef pyrf_throttle_event__members[] = {
-	sample_members
-	member_def(perf_event_header, type, T_UINT, "event type"),
-	member_def(throttle_event, time, T_ULONGLONG, "timestamp"),
-	member_def(throttle_event, id, T_ULONGLONG, "event id"),
-	member_def(throttle_event, stream_id, T_ULONGLONG, "event stream id"),
-	{ .name = NULL, },
-};
-
-static PyObject *pyrf_throttle_event__repr(struct pyrf_event *pevent)
-{
-	struct throttle_event *te = (struct throttle_event *)(&pevent->event.header + 1);
-
-	return PyString_FromFormat("{ type: %sthrottle, time: %" PRIu64 ", id: %" PRIu64
-				   ", stream_id: %" PRIu64 " }",
-				   pevent->event.header.type == PERF_RECORD_THROTTLE ? "" : "un",
-				   te->time, te->id, te->stream_id);
-}
-
-static PyTypeObject pyrf_throttle_event__type = {
-	PyVarObject_HEAD_INIT(NULL, 0)
-	.tp_name	= "perf.throttle_event",
-	.tp_basicsize	= sizeof(struct pyrf_event),
-	.tp_flags	= Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
-	.tp_doc		= pyrf_throttle_event__doc,
-	.tp_members	= pyrf_throttle_event__members,
-	.tp_repr	= (reprfunc)pyrf_throttle_event__repr,
-};
-
-static char pyrf_lost_event__doc[] = PyDoc_STR("perf lost event object.");
-
-static PyMemberDef pyrf_lost_event__members[] = {
-	sample_members
-	member_def(lost_event, id, T_ULONGLONG, "event id"),
-	member_def(lost_event, lost, T_ULONGLONG, "number of lost events"),
-	{ .name = NULL, },
-};
-
-static PyObject *pyrf_lost_event__repr(struct pyrf_event *pevent)
-{
-	PyObject *ret;
-	char *s;
-
-	if (asprintf(&s, "{ type: lost, id: %#" PRIx64 ", "
-			 "lost: %#" PRIx64 " }",
-		     pevent->event.lost.id, pevent->event.lost.lost) < 0) {
-		ret = PyErr_NoMemory();
-	} else {
-		ret = PyString_FromString(s);
-		free(s);
-	}
-	return ret;
-}
-
-static PyTypeObject pyrf_lost_event__type = {
-	PyVarObject_HEAD_INIT(NULL, 0)
-	.tp_name	= "perf.lost_event",
-	.tp_basicsize	= sizeof(struct pyrf_event),
-	.tp_flags	= Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
-	.tp_doc		= pyrf_lost_event__doc,
-	.tp_members	= pyrf_lost_event__members,
-	.tp_repr	= (reprfunc)pyrf_lost_event__repr,
-};
-
-static char pyrf_read_event__doc[] = PyDoc_STR("perf read event object.");
-
-static PyMemberDef pyrf_read_event__members[] = {
-	sample_members
-	member_def(read_event, pid, T_UINT, "event pid"),
-	member_def(read_event, tid, T_UINT, "event tid"),
-	{ .name = NULL, },
-};
-
-static PyObject *pyrf_read_event__repr(struct pyrf_event *pevent)
-{
-	return PyString_FromFormat("{ type: read, pid: %u, tid: %u }",
-				   pevent->event.read.pid,
-				   pevent->event.read.tid);
-	/*
- 	 * FIXME: return the array of read values,
- 	 * making this method useful ;-)
- 	 */
-}
-
-static PyTypeObject pyrf_read_event__type = {
-	PyVarObject_HEAD_INIT(NULL, 0)
-	.tp_name	= "perf.read_event",
-	.tp_basicsize	= sizeof(struct pyrf_event),
-	.tp_flags	= Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
-	.tp_doc		= pyrf_read_event__doc,
-	.tp_members	= pyrf_read_event__members,
-	.tp_repr	= (reprfunc)pyrf_read_event__repr,
-};
-
-static char pyrf_sample_event__doc[] = PyDoc_STR("perf sample event object.");
-
-static PyMemberDef pyrf_sample_event__members[] = {
-	sample_members
-	member_def(perf_event_header, type, T_UINT, "event type"),
-	{ .name = NULL, },
-};
-
-static PyObject *pyrf_sample_event__repr(struct pyrf_event *pevent)
-{
-	PyObject *ret;
-	char *s;
-
-	if (asprintf(&s, "{ type: sample }") < 0) {
-		ret = PyErr_NoMemory();
-	} else {
-		ret = PyString_FromString(s);
-		free(s);
-	}
-	return ret;
-}
-
-static PyTypeObject pyrf_sample_event__type = {
-	PyVarObject_HEAD_INIT(NULL, 0)
-	.tp_name	= "perf.sample_event",
-	.tp_basicsize	= sizeof(struct pyrf_event),
-	.tp_flags	= Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
-	.tp_doc		= pyrf_sample_event__doc,
-	.tp_members	= pyrf_sample_event__members,
-	.tp_repr	= (reprfunc)pyrf_sample_event__repr,
-};
-
-static int pyrf_event__setup_types(void)
-{
-	int err;
-	pyrf_mmap_event__type.tp_new =
-	pyrf_task_event__type.tp_new =
-	pyrf_comm_event__type.tp_new =
-	pyrf_lost_event__type.tp_new =
-	pyrf_read_event__type.tp_new =
-	pyrf_sample_event__type.tp_new =
-	pyrf_throttle_event__type.tp_new = PyType_GenericNew;
-	err = PyType_Ready(&pyrf_mmap_event__type);
-	if (err < 0)
-		goto out;
-	err = PyType_Ready(&pyrf_lost_event__type);
-	if (err < 0)
-		goto out;
-	err = PyType_Ready(&pyrf_task_event__type);
-	if (err < 0)
-		goto out;
-	err = PyType_Ready(&pyrf_comm_event__type);
-	if (err < 0)
-		goto out;
-	err = PyType_Ready(&pyrf_throttle_event__type);
-	if (err < 0)
-		goto out;
-	err = PyType_Ready(&pyrf_read_event__type);
-	if (err < 0)
-		goto out;
-	err = PyType_Ready(&pyrf_sample_event__type);
-	if (err < 0)
-		goto out;
-out:
-	return err;
-}
-
-static PyTypeObject *pyrf_event__type[] = {
-	[PERF_RECORD_MMAP]	 = &pyrf_mmap_event__type,
-	[PERF_RECORD_LOST]	 = &pyrf_lost_event__type,
-	[PERF_RECORD_COMM]	 = &pyrf_comm_event__type,
-	[PERF_RECORD_EXIT]	 = &pyrf_task_event__type,
-	[PERF_RECORD_THROTTLE]	 = &pyrf_throttle_event__type,
-	[PERF_RECORD_UNTHROTTLE] = &pyrf_throttle_event__type,
-	[PERF_RECORD_FORK]	 = &pyrf_task_event__type,
-	[PERF_RECORD_READ]	 = &pyrf_read_event__type,
-	[PERF_RECORD_SAMPLE]	 = &pyrf_sample_event__type,
-};
-
-static PyObject *pyrf_event__new(union perf_event *event)
-{
-	struct pyrf_event *pevent;
-	PyTypeObject *ptype;
-
-	if (event->header.type < PERF_RECORD_MMAP ||
-	    event->header.type > PERF_RECORD_SAMPLE)
-		return NULL;
-
-	ptype = pyrf_event__type[event->header.type];
-	pevent = PyObject_New(struct pyrf_event, ptype);
-	if (pevent != NULL)
-		memcpy(&pevent->event, event, event->header.size);
-	return (PyObject *)pevent;
-}
-
-struct pyrf_cpu_map {
-	PyObject_HEAD
-
-	struct cpu_map *cpus;
-};
-
-static int pyrf_cpu_map__init(struct pyrf_cpu_map *pcpus,
-			      PyObject *args, PyObject *kwargs)
-{
-	static char *kwlist[] = { "cpustr", NULL };
-	char *cpustr = NULL;
-
-	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s",
-					 kwlist, &cpustr))
-		return -1;
-
-	pcpus->cpus = cpu_map__new(cpustr);
-	if (pcpus->cpus == NULL)
-		return -1;
-	return 0;
-}
-
-static void pyrf_cpu_map__delete(struct pyrf_cpu_map *pcpus)
-{
-	cpu_map__delete(pcpus->cpus);
-	pcpus->ob_type->tp_free((PyObject*)pcpus);
-}
-
-static Py_ssize_t pyrf_cpu_map__length(PyObject *obj)
-{
-	struct pyrf_cpu_map *pcpus = (void *)obj;
-
-	return pcpus->cpus->nr;
-}
-
-static PyObject *pyrf_cpu_map__item(PyObject *obj, Py_ssize_t i)
-{
-	struct pyrf_cpu_map *pcpus = (void *)obj;
-
-	if (i >= pcpus->cpus->nr)
-		return NULL;
-
-	return Py_BuildValue("i", pcpus->cpus->map[i]);
-}
-
-static PySequenceMethods pyrf_cpu_map__sequence_methods = {
-	.sq_length = pyrf_cpu_map__length,
-	.sq_item   = pyrf_cpu_map__item,
-};
-
-static char pyrf_cpu_map__doc[] = PyDoc_STR("cpu map object.");
-
-static PyTypeObject pyrf_cpu_map__type = {
-	PyVarObject_HEAD_INIT(NULL, 0)
-	.tp_name	= "perf.cpu_map",
-	.tp_basicsize	= sizeof(struct pyrf_cpu_map),
-	.tp_dealloc	= (destructor)pyrf_cpu_map__delete,
-	.tp_flags	= Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
-	.tp_doc		= pyrf_cpu_map__doc,
-	.tp_as_sequence	= &pyrf_cpu_map__sequence_methods,
-	.tp_init	= (initproc)pyrf_cpu_map__init,
-};
-
-static int pyrf_cpu_map__setup_types(void)
-{
-	pyrf_cpu_map__type.tp_new = PyType_GenericNew;
-	return PyType_Ready(&pyrf_cpu_map__type);
-}
-
-struct pyrf_thread_map {
-	PyObject_HEAD
-
-	struct thread_map *threads;
-};
-
-static int pyrf_thread_map__init(struct pyrf_thread_map *pthreads,
-				 PyObject *args, PyObject *kwargs)
-{
-	static char *kwlist[] = { "pid", "tid", "uid", NULL };
-	int pid = -1, tid = -1, uid = UINT_MAX;
-
-	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iii",
-					 kwlist, &pid, &tid, &uid))
-		return -1;
-
-	pthreads->threads = thread_map__new(pid, tid, uid);
-	if (pthreads->threads == NULL)
-		return -1;
-	return 0;
-}
-
-static void pyrf_thread_map__delete(struct pyrf_thread_map *pthreads)
-{
-	thread_map__delete(pthreads->threads);
-	pthreads->ob_type->tp_free((PyObject*)pthreads);
-}
-
-static Py_ssize_t pyrf_thread_map__length(PyObject *obj)
-{
-	struct pyrf_thread_map *pthreads = (void *)obj;
-
-	return pthreads->threads->nr;
-}
-
-static PyObject *pyrf_thread_map__item(PyObject *obj, Py_ssize_t i)
-{
-	struct pyrf_thread_map *pthreads = (void *)obj;
-
-	if (i >= pthreads->threads->nr)
-		return NULL;
-
-	return Py_BuildValue("i", pthreads->threads->map[i]);
-}
-
-static PySequenceMethods pyrf_thread_map__sequence_methods = {
-	.sq_length = pyrf_thread_map__length,
-	.sq_item   = pyrf_thread_map__item,
-};
-
-static char pyrf_thread_map__doc[] = PyDoc_STR("thread map object.");
-
-static PyTypeObject pyrf_thread_map__type = {
-	PyVarObject_HEAD_INIT(NULL, 0)
-	.tp_name	= "perf.thread_map",
-	.tp_basicsize	= sizeof(struct pyrf_thread_map),
-	.tp_dealloc	= (destructor)pyrf_thread_map__delete,
-	.tp_flags	= Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
-	.tp_doc		= pyrf_thread_map__doc,
-	.tp_as_sequence	= &pyrf_thread_map__sequence_methods,
-	.tp_init	= (initproc)pyrf_thread_map__init,
-};
-
-static int pyrf_thread_map__setup_types(void)
-{
-	pyrf_thread_map__type.tp_new = PyType_GenericNew;
-	return PyType_Ready(&pyrf_thread_map__type);
-}
-
-struct pyrf_evsel {
-	PyObject_HEAD
-
-	struct perf_evsel evsel;
-};
-
-static int pyrf_evsel__init(struct pyrf_evsel *pevsel,
-			    PyObject *args, PyObject *kwargs)
-{
-	struct perf_event_attr attr = {
-		.type = PERF_TYPE_HARDWARE,
-		.config = PERF_COUNT_HW_CPU_CYCLES,
-		.sample_type = PERF_SAMPLE_PERIOD | PERF_SAMPLE_TID,
-	};
-	static char *kwlist[] = {
-		"type",
-		"config",
-		"sample_freq",
-		"sample_period",
-		"sample_type",
-		"read_format",
-		"disabled",
-		"inherit",
-		"pinned",
-		"exclusive",
-		"exclude_user",
-		"exclude_kernel",
-		"exclude_hv",
-		"exclude_idle",
-		"mmap",
-		"comm",
-		"freq",
-		"inherit_stat",
-		"enable_on_exec",
-		"task",
-		"watermark",
-		"precise_ip",
-		"mmap_data",
-		"sample_id_all",
-		"wakeup_events",
-		"bp_type",
-		"bp_addr",
-		"bp_len",
-		 NULL
-	};
-	u64 sample_period = 0;
-	u32 disabled = 0,
-	    inherit = 0,
-	    pinned = 0,
-	    exclusive = 0,
-	    exclude_user = 0,
-	    exclude_kernel = 0,
-	    exclude_hv = 0,
-	    exclude_idle = 0,
-	    mmap = 0,
-	    comm = 0,
-	    freq = 1,
-	    inherit_stat = 0,
-	    enable_on_exec = 0,
-	    task = 0,
-	    watermark = 0,
-	    precise_ip = 0,
-	    mmap_data = 0,
-	    sample_id_all = 1;
-	int idx = 0;
-
-	if (!PyArg_ParseTupleAndKeywords(args, kwargs,
-					 "|iKiKKiiiiiiiiiiiiiiiiiiiiiKK", kwlist,
-					 &attr.type, &attr.config, &attr.sample_freq,
-					 &sample_period, &attr.sample_type,
-					 &attr.read_format, &disabled, &inherit,
-					 &pinned, &exclusive, &exclude_user,
-					 &exclude_kernel, &exclude_hv, &exclude_idle,
-					 &mmap, &comm, &freq, &inherit_stat,
-					 &enable_on_exec, &task, &watermark,
-					 &precise_ip, &mmap_data, &sample_id_all,
-					 &attr.wakeup_events, &attr.bp_type,
-					 &attr.bp_addr, &attr.bp_len, &idx))
-		return -1;
-
-	/* union... */
-	if (sample_period != 0) {
-		if (attr.sample_freq != 0)
-			return -1; /* FIXME: throw right exception */
-		attr.sample_period = sample_period;
-	}
-
-	/* Bitfields */
-	attr.disabled	    = disabled;
-	attr.inherit	    = inherit;
-	attr.pinned	    = pinned;
-	attr.exclusive	    = exclusive;
-	attr.exclude_user   = exclude_user;
-	attr.exclude_kernel = exclude_kernel;
-	attr.exclude_hv	    = exclude_hv;
-	attr.exclude_idle   = exclude_idle;
-	attr.mmap	    = mmap;
-	attr.comm	    = comm;
-	attr.freq	    = freq;
-	attr.inherit_stat   = inherit_stat;
-	attr.enable_on_exec = enable_on_exec;
-	attr.task	    = task;
-	attr.watermark	    = watermark;
-	attr.precise_ip	    = precise_ip;
-	attr.mmap_data	    = mmap_data;
-	attr.sample_id_all  = sample_id_all;
-
-	perf_evsel__init(&pevsel->evsel, &attr, idx);
-	return 0;
-}
-
-static void pyrf_evsel__delete(struct pyrf_evsel *pevsel)
-{
-	perf_evsel__exit(&pevsel->evsel);
-	pevsel->ob_type->tp_free((PyObject*)pevsel);
-}
-
-static PyObject *pyrf_evsel__open(struct pyrf_evsel *pevsel,
-				  PyObject *args, PyObject *kwargs)
-{
-	struct perf_evsel *evsel = &pevsel->evsel;
-	struct cpu_map *cpus = NULL;
-	struct thread_map *threads = NULL;
-	PyObject *pcpus = NULL, *pthreads = NULL;
-	int group = 0, inherit = 0;
-	static char *kwlist[] = { "cpus", "threads", "group", "inherit", NULL };
-
-	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OOii", kwlist,
-					 &pcpus, &pthreads, &group, &inherit))
-		return NULL;
-
-	if (pthreads != NULL)
-		threads = ((struct pyrf_thread_map *)pthreads)->threads;
-
-	if (pcpus != NULL)
-		cpus = ((struct pyrf_cpu_map *)pcpus)->cpus;
-
-	evsel->attr.inherit = inherit;
-	/*
-	 * This will group just the fds for this single evsel, to group
-	 * multiple events, use evlist.open().
-	 */
-	if (perf_evsel__open(evsel, cpus, threads) < 0) {
-		PyErr_SetFromErrno(PyExc_OSError);
-		return NULL;
-	}
-
-	Py_INCREF(Py_None);
-	return Py_None;
-}
-
-static PyMethodDef pyrf_evsel__methods[] = {
-	{
-		.ml_name  = "open",
-		.ml_meth  = (PyCFunction)pyrf_evsel__open,
-		.ml_flags = METH_VARARGS | METH_KEYWORDS,
-		.ml_doc	  = PyDoc_STR("open the event selector file descriptor table.")
-	},
-	{ .ml_name = NULL, }
-};
-
-static char pyrf_evsel__doc[] = PyDoc_STR("perf event selector list object.");
-
-static PyTypeObject pyrf_evsel__type = {
-	PyVarObject_HEAD_INIT(NULL, 0)
-	.tp_name	= "perf.evsel",
-	.tp_basicsize	= sizeof(struct pyrf_evsel),
-	.tp_dealloc	= (destructor)pyrf_evsel__delete,
-	.tp_flags	= Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
-	.tp_doc		= pyrf_evsel__doc,
-	.tp_methods	= pyrf_evsel__methods,
-	.tp_init	= (initproc)pyrf_evsel__init,
-};
-
-static int pyrf_evsel__setup_types(void)
-{
-	pyrf_evsel__type.tp_new = PyType_GenericNew;
-	return PyType_Ready(&pyrf_evsel__type);
-}
-
-struct pyrf_evlist {
-	PyObject_HEAD
-
-	struct perf_evlist evlist;
-};
-
-static int pyrf_evlist__init(struct pyrf_evlist *pevlist,
-			     PyObject *args, PyObject *kwargs __maybe_unused)
-{
-	PyObject *pcpus = NULL, *pthreads = NULL;
-	struct cpu_map *cpus;
-	struct thread_map *threads;
-
-	if (!PyArg_ParseTuple(args, "OO", &pcpus, &pthreads))
-		return -1;
-
-	threads = ((struct pyrf_thread_map *)pthreads)->threads;
-	cpus = ((struct pyrf_cpu_map *)pcpus)->cpus;
-	perf_evlist__init(&pevlist->evlist, cpus, threads);
-	return 0;
-}
-
-static void pyrf_evlist__delete(struct pyrf_evlist *pevlist)
-{
-	perf_evlist__exit(&pevlist->evlist);
-	pevlist->ob_type->tp_free((PyObject*)pevlist);
-}
-
-static PyObject *pyrf_evlist__mmap(struct pyrf_evlist *pevlist,
-				   PyObject *args, PyObject *kwargs)
-{
-	struct perf_evlist *evlist = &pevlist->evlist;
-	static char *kwlist[] = { "pages", "overwrite", NULL };
-	int pages = 128, overwrite = false;
-
-	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ii", kwlist,
-					 &pages, &overwrite))
-		return NULL;
-
-	if (perf_evlist__mmap(evlist, pages, overwrite) < 0) {
-		PyErr_SetFromErrno(PyExc_OSError);
-		return NULL;
-	}
-
-	Py_INCREF(Py_None);
-	return Py_None;
-}
-
-static PyObject *pyrf_evlist__poll(struct pyrf_evlist *pevlist,
-				   PyObject *args, PyObject *kwargs)
-{
-	struct perf_evlist *evlist = &pevlist->evlist;
-	static char *kwlist[] = { "timeout", NULL };
-	int timeout = -1, n;
-
-	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i", kwlist, &timeout))
-		return NULL;
-
-	n = poll(evlist->pollfd, evlist->nr_fds, timeout);
-	if (n < 0) {
-		PyErr_SetFromErrno(PyExc_OSError);
-		return NULL;
-	}
-
-	return Py_BuildValue("i", n);
-}
-
-static PyObject *pyrf_evlist__get_pollfd(struct pyrf_evlist *pevlist,
-					 PyObject *args __maybe_unused,
-					 PyObject *kwargs __maybe_unused)
-{
-	struct perf_evlist *evlist = &pevlist->evlist;
-        PyObject *list = PyList_New(0);
-	int i;
-
-	for (i = 0; i < evlist->nr_fds; ++i) {
-		PyObject *file;
-		FILE *fp = fdopen(evlist->pollfd[i].fd, "r");
-
-		if (fp == NULL)
-			goto free_list;
-
-		file = PyFile_FromFile(fp, "perf", "r", NULL);
-		if (file == NULL)
-			goto free_list;
-
-		if (PyList_Append(list, file) != 0) {
-			Py_DECREF(file);
-			goto free_list;
-		}
-			
-		Py_DECREF(file);
-	}
-
-	return list;
-free_list:
-	return PyErr_NoMemory();
-}
-
-
-static PyObject *pyrf_evlist__add(struct pyrf_evlist *pevlist,
-				  PyObject *args,
-				  PyObject *kwargs __maybe_unused)
-{
-	struct perf_evlist *evlist = &pevlist->evlist;
-	PyObject *pevsel;
-	struct perf_evsel *evsel;
-
-	if (!PyArg_ParseTuple(args, "O", &pevsel))
-		return NULL;
-
-	Py_INCREF(pevsel);
-	evsel = &((struct pyrf_evsel *)pevsel)->evsel;
-	evsel->idx = evlist->nr_entries;
-	perf_evlist__add(evlist, evsel);
-
-	return Py_BuildValue("i", evlist->nr_entries);
-}
-
-static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist,
-					  PyObject *args, PyObject *kwargs)
-{
-	struct perf_evlist *evlist = &pevlist->evlist;
-	union perf_event *event;
-	int sample_id_all = 1, cpu;
-	static char *kwlist[] = { "cpu", "sample_id_all", NULL };
-	int err;
-
-	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i", kwlist,
-					 &cpu, &sample_id_all))
-		return NULL;
-
-	event = perf_evlist__mmap_read(evlist, cpu);
-	if (event != NULL) {
-		PyObject *pyevent = pyrf_event__new(event);
-		struct pyrf_event *pevent = (struct pyrf_event *)pyevent;
-
-		perf_evlist__mmap_consume(evlist, cpu);
-
-		if (pyevent == NULL)
-			return PyErr_NoMemory();
-
-		err = perf_evlist__parse_sample(evlist, event, &pevent->sample);
-		if (err)
-			return PyErr_Format(PyExc_OSError,
-					    "perf: can't parse sample, err=%d", err);
-		return pyevent;
-	}
-
-	Py_INCREF(Py_None);
-	return Py_None;
-}
-
-static PyObject *pyrf_evlist__open(struct pyrf_evlist *pevlist,
-				   PyObject *args, PyObject *kwargs)
-{
-	struct perf_evlist *evlist = &pevlist->evlist;
-	int group = 0;
-	static char *kwlist[] = { "group", NULL };
-
-	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OOii", kwlist, &group))
-		return NULL;
-
-	if (group)
-		perf_evlist__set_leader(evlist);
-
-	if (perf_evlist__open(evlist) < 0) {
-		PyErr_SetFromErrno(PyExc_OSError);
-		return NULL;
-	}
-
-	Py_INCREF(Py_None);
-	return Py_None;
-}
-
-static PyMethodDef pyrf_evlist__methods[] = {
-	{
-		.ml_name  = "mmap",
-		.ml_meth  = (PyCFunction)pyrf_evlist__mmap,
-		.ml_flags = METH_VARARGS | METH_KEYWORDS,
-		.ml_doc	  = PyDoc_STR("mmap the file descriptor table.")
-	},
-	{
-		.ml_name  = "open",
-		.ml_meth  = (PyCFunction)pyrf_evlist__open,
-		.ml_flags = METH_VARARGS | METH_KEYWORDS,
-		.ml_doc	  = PyDoc_STR("open the file descriptors.")
-	},
-	{
-		.ml_name  = "poll",
-		.ml_meth  = (PyCFunction)pyrf_evlist__poll,
-		.ml_flags = METH_VARARGS | METH_KEYWORDS,
-		.ml_doc	  = PyDoc_STR("poll the file descriptor table.")
-	},
-	{
-		.ml_name  = "get_pollfd",
-		.ml_meth  = (PyCFunction)pyrf_evlist__get_pollfd,
-		.ml_flags = METH_VARARGS | METH_KEYWORDS,
-		.ml_doc	  = PyDoc_STR("get the poll file descriptor table.")
-	},
-	{
-		.ml_name  = "add",
-		.ml_meth  = (PyCFunction)pyrf_evlist__add,
-		.ml_flags = METH_VARARGS | METH_KEYWORDS,
-		.ml_doc	  = PyDoc_STR("adds an event selector to the list.")
-	},
-	{
-		.ml_name  = "read_on_cpu",
-		.ml_meth  = (PyCFunction)pyrf_evlist__read_on_cpu,
-		.ml_flags = METH_VARARGS | METH_KEYWORDS,
-		.ml_doc	  = PyDoc_STR("reads an event.")
-	},
-	{ .ml_name = NULL, }
-};
-
-static Py_ssize_t pyrf_evlist__length(PyObject *obj)
-{
-	struct pyrf_evlist *pevlist = (void *)obj;
-
-	return pevlist->evlist.nr_entries;
-}
-
-static PyObject *pyrf_evlist__item(PyObject *obj, Py_ssize_t i)
-{
-	struct pyrf_evlist *pevlist = (void *)obj;
-	struct perf_evsel *pos;
-
-	if (i >= pevlist->evlist.nr_entries)
-		return NULL;
-
-	list_for_each_entry(pos, &pevlist->evlist.entries, node)
-		if (i-- == 0)
-			break;
-
-	return Py_BuildValue("O", container_of(pos, struct pyrf_evsel, evsel));
-}
-
-static PySequenceMethods pyrf_evlist__sequence_methods = {
-	.sq_length = pyrf_evlist__length,
-	.sq_item   = pyrf_evlist__item,
-};
-
-static char pyrf_evlist__doc[] = PyDoc_STR("perf event selector list object.");
-
-static PyTypeObject pyrf_evlist__type = {
-	PyVarObject_HEAD_INIT(NULL, 0)
-	.tp_name	= "perf.evlist",
-	.tp_basicsize	= sizeof(struct pyrf_evlist),
-	.tp_dealloc	= (destructor)pyrf_evlist__delete,
-	.tp_flags	= Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,
-	.tp_as_sequence	= &pyrf_evlist__sequence_methods,
-	.tp_doc		= pyrf_evlist__doc,
-	.tp_methods	= pyrf_evlist__methods,
-	.tp_init	= (initproc)pyrf_evlist__init,
-};
-
-static int pyrf_evlist__setup_types(void)
-{
-	pyrf_evlist__type.tp_new = PyType_GenericNew;
-	return PyType_Ready(&pyrf_evlist__type);
-}
-
-static struct {
-	const char *name;
-	int	    value;
-} perf__constants[] = {
-	{ "TYPE_HARDWARE",   PERF_TYPE_HARDWARE },
-	{ "TYPE_SOFTWARE",   PERF_TYPE_SOFTWARE },
-	{ "TYPE_TRACEPOINT", PERF_TYPE_TRACEPOINT },
-	{ "TYPE_HW_CACHE",   PERF_TYPE_HW_CACHE },
-	{ "TYPE_RAW",	     PERF_TYPE_RAW },
-	{ "TYPE_BREAKPOINT", PERF_TYPE_BREAKPOINT },
-
-	{ "COUNT_HW_CPU_CYCLES",	  PERF_COUNT_HW_CPU_CYCLES },
-	{ "COUNT_HW_INSTRUCTIONS",	  PERF_COUNT_HW_INSTRUCTIONS },
-	{ "COUNT_HW_CACHE_REFERENCES",	  PERF_COUNT_HW_CACHE_REFERENCES },
-	{ "COUNT_HW_CACHE_MISSES",	  PERF_COUNT_HW_CACHE_MISSES },
-	{ "COUNT_HW_BRANCH_INSTRUCTIONS", PERF_COUNT_HW_BRANCH_INSTRUCTIONS },
-	{ "COUNT_HW_BRANCH_MISSES",	  PERF_COUNT_HW_BRANCH_MISSES },
-	{ "COUNT_HW_BUS_CYCLES",	  PERF_COUNT_HW_BUS_CYCLES },
-	{ "COUNT_HW_CACHE_L1D",		  PERF_COUNT_HW_CACHE_L1D },
-	{ "COUNT_HW_CACHE_L1I",		  PERF_COUNT_HW_CACHE_L1I },
-	{ "COUNT_HW_CACHE_LL",	  	  PERF_COUNT_HW_CACHE_LL },
-	{ "COUNT_HW_CACHE_DTLB",	  PERF_COUNT_HW_CACHE_DTLB },
-	{ "COUNT_HW_CACHE_ITLB",	  PERF_COUNT_HW_CACHE_ITLB },
-	{ "COUNT_HW_CACHE_BPU",		  PERF_COUNT_HW_CACHE_BPU },
-	{ "COUNT_HW_CACHE_OP_READ",	  PERF_COUNT_HW_CACHE_OP_READ },
-	{ "COUNT_HW_CACHE_OP_WRITE",	  PERF_COUNT_HW_CACHE_OP_WRITE },
-	{ "COUNT_HW_CACHE_OP_PREFETCH",	  PERF_COUNT_HW_CACHE_OP_PREFETCH },
-	{ "COUNT_HW_CACHE_RESULT_ACCESS", PERF_COUNT_HW_CACHE_RESULT_ACCESS },
-	{ "COUNT_HW_CACHE_RESULT_MISS",   PERF_COUNT_HW_CACHE_RESULT_MISS },
-
-	{ "COUNT_HW_STALLED_CYCLES_FRONTEND",	  PERF_COUNT_HW_STALLED_CYCLES_FRONTEND },
-	{ "COUNT_HW_STALLED_CYCLES_BACKEND",	  PERF_COUNT_HW_STALLED_CYCLES_BACKEND },
-
-	{ "COUNT_SW_CPU_CLOCK",	       PERF_COUNT_SW_CPU_CLOCK },
-	{ "COUNT_SW_TASK_CLOCK",       PERF_COUNT_SW_TASK_CLOCK },
-	{ "COUNT_SW_PAGE_FAULTS",      PERF_COUNT_SW_PAGE_FAULTS },
-	{ "COUNT_SW_CONTEXT_SWITCHES", PERF_COUNT_SW_CONTEXT_SWITCHES },
-	{ "COUNT_SW_CPU_MIGRATIONS",   PERF_COUNT_SW_CPU_MIGRATIONS },
-	{ "COUNT_SW_PAGE_FAULTS_MIN",  PERF_COUNT_SW_PAGE_FAULTS_MIN },
-	{ "COUNT_SW_PAGE_FAULTS_MAJ",  PERF_COUNT_SW_PAGE_FAULTS_MAJ },
-	{ "COUNT_SW_ALIGNMENT_FAULTS", PERF_COUNT_SW_ALIGNMENT_FAULTS },
-	{ "COUNT_SW_EMULATION_FAULTS", PERF_COUNT_SW_EMULATION_FAULTS },
-	{ "COUNT_SW_DUMMY",            PERF_COUNT_SW_DUMMY },
-
-	{ "SAMPLE_IP",	      PERF_SAMPLE_IP },
-	{ "SAMPLE_TID",	      PERF_SAMPLE_TID },
-	{ "SAMPLE_TIME",      PERF_SAMPLE_TIME },
-	{ "SAMPLE_ADDR",      PERF_SAMPLE_ADDR },
-	{ "SAMPLE_READ",      PERF_SAMPLE_READ },
-	{ "SAMPLE_CALLCHAIN", PERF_SAMPLE_CALLCHAIN },
-	{ "SAMPLE_ID",	      PERF_SAMPLE_ID },
-	{ "SAMPLE_CPU",	      PERF_SAMPLE_CPU },
-	{ "SAMPLE_PERIOD",    PERF_SAMPLE_PERIOD },
-	{ "SAMPLE_STREAM_ID", PERF_SAMPLE_STREAM_ID },
-	{ "SAMPLE_RAW",	      PERF_SAMPLE_RAW },
-
-	{ "FORMAT_TOTAL_TIME_ENABLED", PERF_FORMAT_TOTAL_TIME_ENABLED },
-	{ "FORMAT_TOTAL_TIME_RUNNING", PERF_FORMAT_TOTAL_TIME_RUNNING },
-	{ "FORMAT_ID",		       PERF_FORMAT_ID },
-	{ "FORMAT_GROUP",	       PERF_FORMAT_GROUP },
-
-	{ "RECORD_MMAP",       PERF_RECORD_MMAP },
-	{ "RECORD_LOST",       PERF_RECORD_LOST },
-	{ "RECORD_COMM",       PERF_RECORD_COMM },
-	{ "RECORD_EXIT",       PERF_RECORD_EXIT },
-	{ "RECORD_THROTTLE",   PERF_RECORD_THROTTLE },
-	{ "RECORD_UNTHROTTLE", PERF_RECORD_UNTHROTTLE },
-	{ "RECORD_FORK",       PERF_RECORD_FORK },
-	{ "RECORD_READ",       PERF_RECORD_READ },
-	{ "RECORD_SAMPLE",     PERF_RECORD_SAMPLE },
-	{ .name = NULL, },
-};
-
-static PyMethodDef perf__methods[] = {
-	{ .ml_name = NULL, }
-};
-
-PyMODINIT_FUNC initperf(void)
-{
-	PyObject *obj;
-	int i;
-	PyObject *dict, *module = Py_InitModule("perf", perf__methods);
-
-	if (module == NULL ||
-	    pyrf_event__setup_types() < 0 ||
-	    pyrf_evlist__setup_types() < 0 ||
-	    pyrf_evsel__setup_types() < 0 ||
-	    pyrf_thread_map__setup_types() < 0 ||
-	    pyrf_cpu_map__setup_types() < 0)
-		return;
-
-	page_size = sysconf(_SC_PAGE_SIZE);
-
-	Py_INCREF(&pyrf_evlist__type);
-	PyModule_AddObject(module, "evlist", (PyObject*)&pyrf_evlist__type);
-
-	Py_INCREF(&pyrf_evsel__type);
-	PyModule_AddObject(module, "evsel", (PyObject*)&pyrf_evsel__type);
-
-	Py_INCREF(&pyrf_thread_map__type);
-	PyModule_AddObject(module, "thread_map", (PyObject*)&pyrf_thread_map__type);
-
-	Py_INCREF(&pyrf_cpu_map__type);
-	PyModule_AddObject(module, "cpu_map", (PyObject*)&pyrf_cpu_map__type);
-
-	dict = PyModule_GetDict(module);
-	if (dict == NULL)
-		goto error;
-
-	for (i = 0; perf__constants[i].name != NULL; i++) {
-		obj = PyInt_FromLong(perf__constants[i].value);
-		if (obj == NULL)
-			goto error;
-		PyDict_SetItemString(dict, perf__constants[i].name, obj);
-		Py_DECREF(obj);
-	}
-
-error:
-	if (PyErr_Occurred())
-		PyErr_SetString(PyExc_ImportError, "perf: Init failed!");
-}
-
-/*
- * Dummy, to avoid dragging all the test_attr infrastructure in the python
- * binding.
- */
-void test_attr__open(struct perf_event_attr *attr, pid_t pid, int cpu,
-                     int fd, int group_fd, unsigned long flags)
-{
-}
diff --git a/src/tools/perf/util/quote.c b/src/tools/perf/util/quote.c
deleted file mode 100644
index 01f0324..0000000
--- a/src/tools/perf/util/quote.c
+++ /dev/null
@@ -1,54 +0,0 @@
-#include "cache.h"
-#include "quote.h"
-
-/* Help to copy the thing properly quoted for the shell safety.
- * any single quote is replaced with '\'', any exclamation point
- * is replaced with '\!', and the whole thing is enclosed in a
- *
- * E.g.
- *  original     sq_quote     result
- *  name     ==> name      ==> 'name'
- *  a b      ==> a b       ==> 'a b'
- *  a'b      ==> a'\''b    ==> 'a'\''b'
- *  a!b      ==> a'\!'b    ==> 'a'\!'b'
- */
-static inline int need_bs_quote(char c)
-{
-	return (c == '\'' || c == '!');
-}
-
-static void sq_quote_buf(struct strbuf *dst, const char *src)
-{
-	char *to_free = NULL;
-
-	if (dst->buf == src)
-		to_free = strbuf_detach(dst, NULL);
-
-	strbuf_addch(dst, '\'');
-	while (*src) {
-		size_t len = strcspn(src, "'!");
-		strbuf_add(dst, src, len);
-		src += len;
-		while (need_bs_quote(*src)) {
-			strbuf_addstr(dst, "'\\");
-			strbuf_addch(dst, *src++);
-			strbuf_addch(dst, '\'');
-		}
-	}
-	strbuf_addch(dst, '\'');
-	free(to_free);
-}
-
-void sq_quote_argv(struct strbuf *dst, const char** argv, size_t maxlen)
-{
-	int i;
-
-	/* Copy into destination buffer. */
-	strbuf_grow(dst, 255);
-	for (i = 0; argv[i]; ++i) {
-		strbuf_addch(dst, ' ');
-		sq_quote_buf(dst, argv[i]);
-		if (maxlen && dst->len > maxlen)
-			die("Too many or long arguments");
-	}
-}
diff --git a/src/tools/perf/util/quote.h b/src/tools/perf/util/quote.h
deleted file mode 100644
index 172889e..0000000
--- a/src/tools/perf/util/quote.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef __PERF_QUOTE_H
-#define __PERF_QUOTE_H
-
-#include <stddef.h>
-#include <stdio.h>
-
-/* Help to copy the thing properly quoted for the shell safety.
- * any single quote is replaced with '\'', any exclamation point
- * is replaced with '\!', and the whole thing is enclosed in a
- * single quote pair.
- *
- * For example, if you are passing the result to system() as an
- * argument:
- *
- * sprintf(cmd, "foobar %s %s", sq_quote(arg0), sq_quote(arg1))
- *
- * would be appropriate.  If the system() is going to call ssh to
- * run the command on the other side:
- *
- * sprintf(cmd, "git-diff-tree %s %s", sq_quote(arg0), sq_quote(arg1));
- * sprintf(rcmd, "ssh %s %s", sq_util/quote.host), sq_quote(cmd));
- *
- * Note that the above examples leak memory!  Remember to free result from
- * sq_quote() in a real application.
- */
-
-extern void sq_quote_argv(struct strbuf *, const char **argv, size_t maxlen);
-
-#endif /* __PERF_QUOTE_H */
diff --git a/src/tools/perf/util/rblist.c b/src/tools/perf/util/rblist.c
deleted file mode 100644
index a16cdd2..0000000
--- a/src/tools/perf/util/rblist.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Based on strlist.c by:
- * (c) 2009 Arnaldo Carvalho de Melo <acme@redhat.com>
- *
- * Licensed under the GPLv2.
- */
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "rblist.h"
-
-int rblist__add_node(struct rblist *rblist, const void *new_entry)
-{
-	struct rb_node **p = &rblist->entries.rb_node;
-	struct rb_node *parent = NULL, *new_node;
-
-	while (*p != NULL) {
-		int rc;
-
-		parent = *p;
-
-		rc = rblist->node_cmp(parent, new_entry);
-		if (rc > 0)
-			p = &(*p)->rb_left;
-		else if (rc < 0)
-			p = &(*p)->rb_right;
-		else
-			return -EEXIST;
-	}
-
-	new_node = rblist->node_new(rblist, new_entry);
-	if (new_node == NULL)
-		return -ENOMEM;
-
-	rb_link_node(new_node, parent, p);
-	rb_insert_color(new_node, &rblist->entries);
-	++rblist->nr_entries;
-
-	return 0;
-}
-
-void rblist__remove_node(struct rblist *rblist, struct rb_node *rb_node)
-{
-	rb_erase(rb_node, &rblist->entries);
-	--rblist->nr_entries;
-	rblist->node_delete(rblist, rb_node);
-}
-
-struct rb_node *rblist__find(struct rblist *rblist, const void *entry)
-{
-	struct rb_node **p = &rblist->entries.rb_node;
-	struct rb_node *parent = NULL;
-
-	while (*p != NULL) {
-		int rc;
-
-		parent = *p;
-
-		rc = rblist->node_cmp(parent, entry);
-		if (rc > 0)
-			p = &(*p)->rb_left;
-		else if (rc < 0)
-			p = &(*p)->rb_right;
-		else
-			return parent;
-	}
-
-	return NULL;
-}
-
-void rblist__init(struct rblist *rblist)
-{
-	if (rblist != NULL) {
-		rblist->entries	 = RB_ROOT;
-		rblist->nr_entries = 0;
-	}
-
-	return;
-}
-
-void rblist__delete(struct rblist *rblist)
-{
-	if (rblist != NULL) {
-		struct rb_node *pos, *next = rb_first(&rblist->entries);
-
-		while (next) {
-			pos = next;
-			next = rb_next(pos);
-			rblist__remove_node(rblist, pos);
-		}
-		free(rblist);
-	}
-}
-
-struct rb_node *rblist__entry(const struct rblist *rblist, unsigned int idx)
-{
-	struct rb_node *node;
-
-	for (node = rb_first(&rblist->entries); node; node = rb_next(node)) {
-		if (!idx--)
-			return node;
-	}
-
-	return NULL;
-}
diff --git a/src/tools/perf/util/rblist.h b/src/tools/perf/util/rblist.h
deleted file mode 100644
index 6d0cae5..0000000
--- a/src/tools/perf/util/rblist.h
+++ /dev/null
@@ -1,47 +0,0 @@
-#ifndef __PERF_RBLIST_H
-#define __PERF_RBLIST_H
-
-#include <linux/rbtree.h>
-#include <stdbool.h>
-
-/*
- * create node structs of the form:
- * struct my_node {
- *     struct rb_node rb_node;
- *     ... my data ...
- * };
- *
- * create list structs of the form:
- * struct mylist {
- *     struct rblist rblist;
- *     ... my data ...
- * };
- */
-
-struct rblist {
-	struct rb_root entries;
-	unsigned int   nr_entries;
-
-	int (*node_cmp)(struct rb_node *rbn, const void *entry);
-	struct rb_node *(*node_new)(struct rblist *rlist, const void *new_entry);
-	void (*node_delete)(struct rblist *rblist, struct rb_node *rb_node);
-};
-
-void rblist__init(struct rblist *rblist);
-void rblist__delete(struct rblist *rblist);
-int rblist__add_node(struct rblist *rblist, const void *new_entry);
-void rblist__remove_node(struct rblist *rblist, struct rb_node *rb_node);
-struct rb_node *rblist__find(struct rblist *rblist, const void *entry);
-struct rb_node *rblist__entry(const struct rblist *rblist, unsigned int idx);
-
-static inline bool rblist__empty(const struct rblist *rblist)
-{
-	return rblist->nr_entries == 0;
-}
-
-static inline unsigned int rblist__nr_entries(const struct rblist *rblist)
-{
-	return rblist->nr_entries;
-}
-
-#endif /* __PERF_RBLIST_H */
diff --git a/src/tools/perf/util/record.c b/src/tools/perf/util/record.c
deleted file mode 100644
index 18d73aa..0000000
--- a/src/tools/perf/util/record.c
+++ /dev/null
@@ -1,108 +0,0 @@
-#include "evlist.h"
-#include "evsel.h"
-#include "cpumap.h"
-#include "parse-events.h"
-
-typedef void (*setup_probe_fn_t)(struct perf_evsel *evsel);
-
-static int perf_do_probe_api(setup_probe_fn_t fn, int cpu, const char *str)
-{
-	struct perf_evlist *evlist;
-	struct perf_evsel *evsel;
-	int err = -EAGAIN, fd;
-
-	evlist = perf_evlist__new();
-	if (!evlist)
-		return -ENOMEM;
-
-	if (parse_events(evlist, str))
-		goto out_delete;
-
-	evsel = perf_evlist__first(evlist);
-
-	fd = sys_perf_event_open(&evsel->attr, -1, cpu, -1, 0);
-	if (fd < 0)
-		goto out_delete;
-	close(fd);
-
-	fn(evsel);
-
-	fd = sys_perf_event_open(&evsel->attr, -1, cpu, -1, 0);
-	if (fd < 0) {
-		if (errno == EINVAL)
-			err = -EINVAL;
-		goto out_delete;
-	}
-	close(fd);
-	err = 0;
-
-out_delete:
-	perf_evlist__delete(evlist);
-	return err;
-}
-
-static bool perf_probe_api(setup_probe_fn_t fn)
-{
-	const char *try[] = {"cycles:u", "instructions:u", "cpu-clock", NULL};
-	struct cpu_map *cpus;
-	int cpu, ret, i = 0;
-
-	cpus = cpu_map__new(NULL);
-	if (!cpus)
-		return false;
-	cpu = cpus->map[0];
-	cpu_map__delete(cpus);
-
-	do {
-		ret = perf_do_probe_api(fn, cpu, try[i++]);
-		if (!ret)
-			return true;
-	} while (ret == -EAGAIN && try[i]);
-
-	return false;
-}
-
-static void perf_probe_sample_identifier(struct perf_evsel *evsel)
-{
-	evsel->attr.sample_type |= PERF_SAMPLE_IDENTIFIER;
-}
-
-bool perf_can_sample_identifier(void)
-{
-	return perf_probe_api(perf_probe_sample_identifier);
-}
-
-void perf_evlist__config(struct perf_evlist *evlist,
-			struct perf_record_opts *opts)
-{
-	struct perf_evsel *evsel;
-	bool use_sample_identifier = false;
-
-	/*
-	 * Set the evsel leader links before we configure attributes,
-	 * since some might depend on this info.
-	 */
-	if (opts->group)
-		perf_evlist__set_leader(evlist);
-
-	if (evlist->cpus->map[0] < 0)
-		opts->no_inherit = true;
-
-	list_for_each_entry(evsel, &evlist->entries, node)
-		perf_evsel__config(evsel, opts);
-
-	if (evlist->nr_entries > 1) {
-		struct perf_evsel *first = perf_evlist__first(evlist);
-
-		list_for_each_entry(evsel, &evlist->entries, node) {
-			if (evsel->attr.sample_type == first->attr.sample_type)
-				continue;
-			use_sample_identifier = perf_can_sample_identifier();
-			break;
-		}
-		list_for_each_entry(evsel, &evlist->entries, node)
-			perf_evsel__set_sample_id(evsel, use_sample_identifier);
-	}
-
-	perf_evlist__set_id_pos(evlist);
-}
diff --git a/src/tools/perf/util/run-command.c b/src/tools/perf/util/run-command.c
deleted file mode 100644
index da8e9b2..0000000
--- a/src/tools/perf/util/run-command.c
+++ /dev/null
@@ -1,214 +0,0 @@
-#include "cache.h"
-#include "run-command.h"
-#include "exec_cmd.h"
-
-static inline void close_pair(int fd[2])
-{
-	close(fd[0]);
-	close(fd[1]);
-}
-
-static inline void dup_devnull(int to)
-{
-	int fd = open("/dev/null", O_RDWR);
-	dup2(fd, to);
-	close(fd);
-}
-
-int start_command(struct child_process *cmd)
-{
-	int need_in, need_out, need_err;
-	int fdin[2], fdout[2], fderr[2];
-
-	/*
-	 * In case of errors we must keep the promise to close FDs
-	 * that have been passed in via ->in and ->out.
-	 */
-
-	need_in = !cmd->no_stdin && cmd->in < 0;
-	if (need_in) {
-		if (pipe(fdin) < 0) {
-			if (cmd->out > 0)
-				close(cmd->out);
-			return -ERR_RUN_COMMAND_PIPE;
-		}
-		cmd->in = fdin[1];
-	}
-
-	need_out = !cmd->no_stdout
-		&& !cmd->stdout_to_stderr
-		&& cmd->out < 0;
-	if (need_out) {
-		if (pipe(fdout) < 0) {
-			if (need_in)
-				close_pair(fdin);
-			else if (cmd->in)
-				close(cmd->in);
-			return -ERR_RUN_COMMAND_PIPE;
-		}
-		cmd->out = fdout[0];
-	}
-
-	need_err = !cmd->no_stderr && cmd->err < 0;
-	if (need_err) {
-		if (pipe(fderr) < 0) {
-			if (need_in)
-				close_pair(fdin);
-			else if (cmd->in)
-				close(cmd->in);
-			if (need_out)
-				close_pair(fdout);
-			else if (cmd->out)
-				close(cmd->out);
-			return -ERR_RUN_COMMAND_PIPE;
-		}
-		cmd->err = fderr[0];
-	}
-
-	fflush(NULL);
-	cmd->pid = fork();
-	if (!cmd->pid) {
-		if (cmd->no_stdin)
-			dup_devnull(0);
-		else if (need_in) {
-			dup2(fdin[0], 0);
-			close_pair(fdin);
-		} else if (cmd->in) {
-			dup2(cmd->in, 0);
-			close(cmd->in);
-		}
-
-		if (cmd->no_stderr)
-			dup_devnull(2);
-		else if (need_err) {
-			dup2(fderr[1], 2);
-			close_pair(fderr);
-		}
-
-		if (cmd->no_stdout)
-			dup_devnull(1);
-		else if (cmd->stdout_to_stderr)
-			dup2(2, 1);
-		else if (need_out) {
-			dup2(fdout[1], 1);
-			close_pair(fdout);
-		} else if (cmd->out > 1) {
-			dup2(cmd->out, 1);
-			close(cmd->out);
-		}
-
-		if (cmd->dir && chdir(cmd->dir))
-			die("exec %s: cd to %s failed (%s)", cmd->argv[0],
-			    cmd->dir, strerror(errno));
-		if (cmd->env) {
-			for (; *cmd->env; cmd->env++) {
-				if (strchr(*cmd->env, '='))
-					putenv((char*)*cmd->env);
-				else
-					unsetenv(*cmd->env);
-			}
-		}
-		if (cmd->preexec_cb)
-			cmd->preexec_cb();
-		if (cmd->perf_cmd) {
-			execv_perf_cmd(cmd->argv);
-		} else {
-			execvp(cmd->argv[0], (char *const*) cmd->argv);
-		}
-		exit(127);
-	}
-
-	if (cmd->pid < 0) {
-		int err = errno;
-		if (need_in)
-			close_pair(fdin);
-		else if (cmd->in)
-			close(cmd->in);
-		if (need_out)
-			close_pair(fdout);
-		else if (cmd->out)
-			close(cmd->out);
-		if (need_err)
-			close_pair(fderr);
-		return err == ENOENT ?
-			-ERR_RUN_COMMAND_EXEC :
-			-ERR_RUN_COMMAND_FORK;
-	}
-
-	if (need_in)
-		close(fdin[0]);
-	else if (cmd->in)
-		close(cmd->in);
-
-	if (need_out)
-		close(fdout[1]);
-	else if (cmd->out)
-		close(cmd->out);
-
-	if (need_err)
-		close(fderr[1]);
-
-	return 0;
-}
-
-static int wait_or_whine(pid_t pid)
-{
-	for (;;) {
-		int status, code;
-		pid_t waiting = waitpid(pid, &status, 0);
-
-		if (waiting < 0) {
-			if (errno == EINTR)
-				continue;
-			error("waitpid failed (%s)", strerror(errno));
-			return -ERR_RUN_COMMAND_WAITPID;
-		}
-		if (waiting != pid)
-			return -ERR_RUN_COMMAND_WAITPID_WRONG_PID;
-		if (WIFSIGNALED(status))
-			return -ERR_RUN_COMMAND_WAITPID_SIGNAL;
-
-		if (!WIFEXITED(status))
-			return -ERR_RUN_COMMAND_WAITPID_NOEXIT;
-		code = WEXITSTATUS(status);
-		switch (code) {
-		case 127:
-			return -ERR_RUN_COMMAND_EXEC;
-		case 0:
-			return 0;
-		default:
-			return -code;
-		}
-	}
-}
-
-int finish_command(struct child_process *cmd)
-{
-	return wait_or_whine(cmd->pid);
-}
-
-int run_command(struct child_process *cmd)
-{
-	int code = start_command(cmd);
-	if (code)
-		return code;
-	return finish_command(cmd);
-}
-
-static void prepare_run_command_v_opt(struct child_process *cmd,
-				      const char **argv,
-				      int opt)
-{
-	memset(cmd, 0, sizeof(*cmd));
-	cmd->argv = argv;
-	cmd->no_stdin = opt & RUN_COMMAND_NO_STDIN ? 1 : 0;
-	cmd->perf_cmd = opt & RUN_PERF_CMD ? 1 : 0;
-	cmd->stdout_to_stderr = opt & RUN_COMMAND_STDOUT_TO_STDERR ? 1 : 0;
-}
-
-int run_command_v_opt(const char **argv, int opt)
-{
-	struct child_process cmd;
-	prepare_run_command_v_opt(&cmd, argv, opt);
-	return run_command(&cmd);
-}
diff --git a/src/tools/perf/util/run-command.h b/src/tools/perf/util/run-command.h
deleted file mode 100644
index 1ef264d..0000000
--- a/src/tools/perf/util/run-command.h
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef __PERF_RUN_COMMAND_H
-#define __PERF_RUN_COMMAND_H
-
-enum {
-	ERR_RUN_COMMAND_FORK = 10000,
-	ERR_RUN_COMMAND_EXEC,
-	ERR_RUN_COMMAND_PIPE,
-	ERR_RUN_COMMAND_WAITPID,
-	ERR_RUN_COMMAND_WAITPID_WRONG_PID,
-	ERR_RUN_COMMAND_WAITPID_SIGNAL,
-	ERR_RUN_COMMAND_WAITPID_NOEXIT,
-};
-#define IS_RUN_COMMAND_ERR(x) (-(x) >= ERR_RUN_COMMAND_FORK)
-
-struct child_process {
-	const char **argv;
-	pid_t pid;
-	/*
-	 * Using .in, .out, .err:
-	 * - Specify 0 for no redirections (child inherits stdin, stdout,
-	 *   stderr from parent).
-	 * - Specify -1 to have a pipe allocated as follows:
-	 *     .in: returns the writable pipe end; parent writes to it,
-	 *          the readable pipe end becomes child's stdin
-	 *     .out, .err: returns the readable pipe end; parent reads from
-	 *          it, the writable pipe end becomes child's stdout/stderr
-	 *   The caller of start_command() must close the returned FDs
-	 *   after it has completed reading from/writing to it!
-	 * - Specify > 0 to set a channel to a particular FD as follows:
-	 *     .in: a readable FD, becomes child's stdin
-	 *     .out: a writable FD, becomes child's stdout/stderr
-	 *     .err > 0 not supported
-	 *   The specified FD is closed by start_command(), even in case
-	 *   of errors!
-	 */
-	int in;
-	int out;
-	int err;
-	const char *dir;
-	const char *const *env;
-	unsigned no_stdin:1;
-	unsigned no_stdout:1;
-	unsigned no_stderr:1;
-	unsigned perf_cmd:1; /* if this is to be perf sub-command */
-	unsigned stdout_to_stderr:1;
-	void (*preexec_cb)(void);
-};
-
-int start_command(struct child_process *);
-int finish_command(struct child_process *);
-int run_command(struct child_process *);
-
-#define RUN_COMMAND_NO_STDIN 1
-#define RUN_PERF_CMD	     2	/*If this is to be perf sub-command */
-#define RUN_COMMAND_STDOUT_TO_STDERR 4
-int run_command_v_opt(const char **argv, int opt);
-
-#endif /* __PERF_RUN_COMMAND_H */
diff --git a/src/tools/perf/util/scripting-engines/trace-event-perl.c b/src/tools/perf/util/scripting-engines/trace-event-perl.c
deleted file mode 100644
index c0c9795..0000000
--- a/src/tools/perf/util/scripting-engines/trace-event-perl.c
+++ /dev/null
@@ -1,645 +0,0 @@
-/*
- * trace-event-perl.  Feed perf script events to an embedded Perl interpreter.
- *
- * Copyright (C) 2009 Tom Zanussi <tzanussi@gmail.com>
- *
- *  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, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-
-#include "../util.h"
-#include <EXTERN.h>
-#include <perl.h>
-
-#include "../../perf.h"
-#include "../thread.h"
-#include "../event.h"
-#include "../trace-event.h"
-#include "../evsel.h"
-
-void boot_Perf__Trace__Context(pTHX_ CV *cv);
-void boot_DynaLoader(pTHX_ CV *cv);
-typedef PerlInterpreter * INTERP;
-
-void xs_init(pTHX);
-
-void xs_init(pTHX)
-{
-	const char *file = __FILE__;
-	dXSUB_SYS;
-
-	newXS("Perf::Trace::Context::bootstrap", boot_Perf__Trace__Context,
-	      file);
-	newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
-}
-
-INTERP my_perl;
-
-#define FTRACE_MAX_EVENT				\
-	((1 << (sizeof(unsigned short) * 8)) - 1)
-
-struct event_format *events[FTRACE_MAX_EVENT];
-
-extern struct scripting_context *scripting_context;
-
-static char *cur_field_name;
-static int zero_flag_atom;
-
-static void define_symbolic_value(const char *ev_name,
-				  const char *field_name,
-				  const char *field_value,
-				  const char *field_str)
-{
-	unsigned long long value;
-	dSP;
-
-	value = eval_flag(field_value);
-
-	ENTER;
-	SAVETMPS;
-	PUSHMARK(SP);
-
-	XPUSHs(sv_2mortal(newSVpv(ev_name, 0)));
-	XPUSHs(sv_2mortal(newSVpv(field_name, 0)));
-	XPUSHs(sv_2mortal(newSVuv(value)));
-	XPUSHs(sv_2mortal(newSVpv(field_str, 0)));
-
-	PUTBACK;
-	if (get_cv("main::define_symbolic_value", 0))
-		call_pv("main::define_symbolic_value", G_SCALAR);
-	SPAGAIN;
-	PUTBACK;
-	FREETMPS;
-	LEAVE;
-}
-
-static void define_symbolic_values(struct print_flag_sym *field,
-				   const char *ev_name,
-				   const char *field_name)
-{
-	define_symbolic_value(ev_name, field_name, field->value, field->str);
-	if (field->next)
-		define_symbolic_values(field->next, ev_name, field_name);
-}
-
-static void define_symbolic_field(const char *ev_name,
-				  const char *field_name)
-{
-	dSP;
-
-	ENTER;
-	SAVETMPS;
-	PUSHMARK(SP);
-
-	XPUSHs(sv_2mortal(newSVpv(ev_name, 0)));
-	XPUSHs(sv_2mortal(newSVpv(field_name, 0)));
-
-	PUTBACK;
-	if (get_cv("main::define_symbolic_field", 0))
-		call_pv("main::define_symbolic_field", G_SCALAR);
-	SPAGAIN;
-	PUTBACK;
-	FREETMPS;
-	LEAVE;
-}
-
-static void define_flag_value(const char *ev_name,
-			      const char *field_name,
-			      const char *field_value,
-			      const char *field_str)
-{
-	unsigned long long value;
-	dSP;
-
-	value = eval_flag(field_value);
-
-	ENTER;
-	SAVETMPS;
-	PUSHMARK(SP);
-
-	XPUSHs(sv_2mortal(newSVpv(ev_name, 0)));
-	XPUSHs(sv_2mortal(newSVpv(field_name, 0)));
-	XPUSHs(sv_2mortal(newSVuv(value)));
-	XPUSHs(sv_2mortal(newSVpv(field_str, 0)));
-
-	PUTBACK;
-	if (get_cv("main::define_flag_value", 0))
-		call_pv("main::define_flag_value", G_SCALAR);
-	SPAGAIN;
-	PUTBACK;
-	FREETMPS;
-	LEAVE;
-}
-
-static void define_flag_values(struct print_flag_sym *field,
-			       const char *ev_name,
-			       const char *field_name)
-{
-	define_flag_value(ev_name, field_name, field->value, field->str);
-	if (field->next)
-		define_flag_values(field->next, ev_name, field_name);
-}
-
-static void define_flag_field(const char *ev_name,
-			      const char *field_name,
-			      const char *delim)
-{
-	dSP;
-
-	ENTER;
-	SAVETMPS;
-	PUSHMARK(SP);
-
-	XPUSHs(sv_2mortal(newSVpv(ev_name, 0)));
-	XPUSHs(sv_2mortal(newSVpv(field_name, 0)));
-	XPUSHs(sv_2mortal(newSVpv(delim, 0)));
-
-	PUTBACK;
-	if (get_cv("main::define_flag_field", 0))
-		call_pv("main::define_flag_field", G_SCALAR);
-	SPAGAIN;
-	PUTBACK;
-	FREETMPS;
-	LEAVE;
-}
-
-static void define_event_symbols(struct event_format *event,
-				 const char *ev_name,
-				 struct print_arg *args)
-{
-	switch (args->type) {
-	case PRINT_NULL:
-		break;
-	case PRINT_ATOM:
-		define_flag_value(ev_name, cur_field_name, "0",
-				  args->atom.atom);
-		zero_flag_atom = 0;
-		break;
-	case PRINT_FIELD:
-		if (cur_field_name)
-			free(cur_field_name);
-		cur_field_name = strdup(args->field.name);
-		break;
-	case PRINT_FLAGS:
-		define_event_symbols(event, ev_name, args->flags.field);
-		define_flag_field(ev_name, cur_field_name, args->flags.delim);
-		define_flag_values(args->flags.flags, ev_name, cur_field_name);
-		break;
-	case PRINT_SYMBOL:
-		define_event_symbols(event, ev_name, args->symbol.field);
-		define_symbolic_field(ev_name, cur_field_name);
-		define_symbolic_values(args->symbol.symbols, ev_name,
-				       cur_field_name);
-		break;
-	case PRINT_HEX:
-		define_event_symbols(event, ev_name, args->hex.field);
-		define_event_symbols(event, ev_name, args->hex.size);
-		break;
-	case PRINT_BSTRING:
-	case PRINT_DYNAMIC_ARRAY:
-	case PRINT_STRING:
-		break;
-	case PRINT_TYPE:
-		define_event_symbols(event, ev_name, args->typecast.item);
-		break;
-	case PRINT_OP:
-		if (strcmp(args->op.op, ":") == 0)
-			zero_flag_atom = 1;
-		define_event_symbols(event, ev_name, args->op.left);
-		define_event_symbols(event, ev_name, args->op.right);
-		break;
-	case PRINT_FUNC:
-	default:
-		pr_err("Unsupported print arg type\n");
-		/* we should warn... */
-		return;
-	}
-
-	if (args->next)
-		define_event_symbols(event, ev_name, args->next);
-}
-
-static inline struct event_format *find_cache_event(struct perf_evsel *evsel)
-{
-	static char ev_name[256];
-	struct event_format *event;
-	int type = evsel->attr.config;
-
-	if (events[type])
-		return events[type];
-
-	events[type] = event = evsel->tp_format;
-	if (!event)
-		return NULL;
-
-	sprintf(ev_name, "%s::%s", event->system, event->name);
-
-	define_event_symbols(event, ev_name, event->print_fmt.args);
-
-	return event;
-}
-
-static void perl_process_tracepoint(union perf_event *perf_event __maybe_unused,
-				    struct perf_sample *sample,
-				    struct perf_evsel *evsel,
-				    struct machine *machine __maybe_unused,
-				    struct thread *thread,
-					struct addr_location *al)
-{
-	struct format_field *field;
-	static char handler[256];
-	unsigned long long val;
-	unsigned long s, ns;
-	struct event_format *event;
-	int pid;
-	int cpu = sample->cpu;
-	void *data = sample->raw_data;
-	unsigned long long nsecs = sample->time;
-	char *comm = thread->comm;
-
-	dSP;
-
-	if (evsel->attr.type != PERF_TYPE_TRACEPOINT)
-		return;
-
-	event = find_cache_event(evsel);
-	if (!event)
-		die("ug! no event found for type %" PRIu64, (u64)evsel->attr.config);
-
-	pid = raw_field_value(event, "common_pid", data);
-
-	sprintf(handler, "%s::%s", event->system, event->name);
-
-	s = nsecs / NSECS_PER_SEC;
-	ns = nsecs - s * NSECS_PER_SEC;
-
-	scripting_context->event_data = data;
-	scripting_context->pevent = evsel->tp_format->pevent;
-
-	ENTER;
-	SAVETMPS;
-	PUSHMARK(SP);
-
-	XPUSHs(sv_2mortal(newSVpv(handler, 0)));
-	XPUSHs(sv_2mortal(newSViv(PTR2IV(scripting_context))));
-	XPUSHs(sv_2mortal(newSVuv(cpu)));
-	XPUSHs(sv_2mortal(newSVuv(s)));
-	XPUSHs(sv_2mortal(newSVuv(ns)));
-	XPUSHs(sv_2mortal(newSViv(pid)));
-	XPUSHs(sv_2mortal(newSVpv(comm, 0)));
-
-	/* common fields other than pid can be accessed via xsub fns */
-
-	for (field = event->format.fields; field; field = field->next) {
-		if (field->flags & FIELD_IS_STRING) {
-			int offset;
-			if (field->flags & FIELD_IS_DYNAMIC) {
-				offset = *(int *)(data + field->offset);
-				offset &= 0xffff;
-			} else
-				offset = field->offset;
-			XPUSHs(sv_2mortal(newSVpv((char *)data + offset, 0)));
-		} else { /* FIELD_IS_NUMERIC */
-			val = read_size(event, data + field->offset,
-					field->size);
-			if (field->flags & FIELD_IS_SIGNED) {
-				XPUSHs(sv_2mortal(newSViv(val)));
-			} else {
-				XPUSHs(sv_2mortal(newSVuv(val)));
-			}
-		}
-	}
-
-	PUTBACK;
-
-	if (get_cv(handler, 0))
-		call_pv(handler, G_SCALAR);
-	else if (get_cv("main::trace_unhandled", 0)) {
-		XPUSHs(sv_2mortal(newSVpv(handler, 0)));
-		XPUSHs(sv_2mortal(newSViv(PTR2IV(scripting_context))));
-		XPUSHs(sv_2mortal(newSVuv(cpu)));
-		XPUSHs(sv_2mortal(newSVuv(nsecs)));
-		XPUSHs(sv_2mortal(newSViv(pid)));
-		XPUSHs(sv_2mortal(newSVpv(comm, 0)));
-		call_pv("main::trace_unhandled", G_SCALAR);
-	}
-	SPAGAIN;
-	PUTBACK;
-	FREETMPS;
-	LEAVE;
-}
-
-static void perl_process_event_generic(union perf_event *event,
-				       struct perf_sample *sample,
-				       struct perf_evsel *evsel,
-				       struct machine *machine __maybe_unused,
-				       struct thread *thread __maybe_unused,
-					   struct addr_location *al __maybe_unused)
-{
-	dSP;
-
-	if (!get_cv("process_event", 0))
-		return;
-
-	ENTER;
-	SAVETMPS;
-	PUSHMARK(SP);
-	XPUSHs(sv_2mortal(newSVpvn((const char *)event, event->header.size)));
-	XPUSHs(sv_2mortal(newSVpvn((const char *)&evsel->attr, sizeof(evsel->attr))));
-	XPUSHs(sv_2mortal(newSVpvn((const char *)sample, sizeof(*sample))));
-	XPUSHs(sv_2mortal(newSVpvn((const char *)sample->raw_data, sample->raw_size)));
-	PUTBACK;
-	call_pv("process_event", G_SCALAR);
-	SPAGAIN;
-	PUTBACK;
-	FREETMPS;
-	LEAVE;
-}
-
-static void perl_process_event(union perf_event *event,
-			       struct perf_sample *sample,
-			       struct perf_evsel *evsel,
-			       struct machine *machine,
-			       struct thread *thread,
-				   struct addr_location *al)
-{
-	perl_process_tracepoint(event, sample, evsel, machine, thread, al);
-	perl_process_event_generic(event, sample, evsel, machine, thread, al);
-}
-
-static void run_start_sub(void)
-{
-	dSP; /* access to Perl stack */
-	PUSHMARK(SP);
-
-	if (get_cv("main::trace_begin", 0))
-		call_pv("main::trace_begin", G_DISCARD | G_NOARGS);
-}
-
-/*
- * Start trace script
- */
-static int perl_start_script(const char *script, int argc, const char **argv)
-{
-	const char **command_line;
-	int i, err = 0;
-
-	command_line = malloc((argc + 2) * sizeof(const char *));
-	command_line[0] = "";
-	command_line[1] = script;
-	for (i = 2; i < argc + 2; i++)
-		command_line[i] = argv[i - 2];
-
-	my_perl = perl_alloc();
-	perl_construct(my_perl);
-
-	if (perl_parse(my_perl, xs_init, argc + 2, (char **)command_line,
-		       (char **)NULL)) {
-		err = -1;
-		goto error;
-	}
-
-	if (perl_run(my_perl)) {
-		err = -1;
-		goto error;
-	}
-
-	if (SvTRUE(ERRSV)) {
-		err = -1;
-		goto error;
-	}
-
-	run_start_sub();
-
-	free(command_line);
-	return 0;
-error:
-	perl_free(my_perl);
-	free(command_line);
-
-	return err;
-}
-
-/*
- * Stop trace script
- */
-static int perl_stop_script(void)
-{
-	dSP; /* access to Perl stack */
-	PUSHMARK(SP);
-
-	if (get_cv("main::trace_end", 0))
-		call_pv("main::trace_end", G_DISCARD | G_NOARGS);
-
-	perl_destruct(my_perl);
-	perl_free(my_perl);
-
-	return 0;
-}
-
-static int perl_generate_script(struct pevent *pevent, const char *outfile)
-{
-	struct event_format *event = NULL;
-	struct format_field *f;
-	char fname[PATH_MAX];
-	int not_first, count;
-	FILE *ofp;
-
-	sprintf(fname, "%s.pl", outfile);
-	ofp = fopen(fname, "w");
-	if (ofp == NULL) {
-		fprintf(stderr, "couldn't open %s\n", fname);
-		return -1;
-	}
-
-	fprintf(ofp, "# perf script event handlers, "
-		"generated by perf script -g perl\n");
-
-	fprintf(ofp, "# Licensed under the terms of the GNU GPL"
-		" License version 2\n\n");
-
-	fprintf(ofp, "# The common_* event handler fields are the most useful "
-		"fields common to\n");
-
-	fprintf(ofp, "# all events.  They don't necessarily correspond to "
-		"the 'common_*' fields\n");
-
-	fprintf(ofp, "# in the format files.  Those fields not available as "
-		"handler params can\n");
-
-	fprintf(ofp, "# be retrieved using Perl functions of the form "
-		"common_*($context).\n");
-
-	fprintf(ofp, "# See Context.pm for the list of available "
-		"functions.\n\n");
-
-	fprintf(ofp, "use lib \"$ENV{'PERF_EXEC_PATH'}/scripts/perl/"
-		"Perf-Trace-Util/lib\";\n");
-
-	fprintf(ofp, "use lib \"./Perf-Trace-Util/lib\";\n");
-	fprintf(ofp, "use Perf::Trace::Core;\n");
-	fprintf(ofp, "use Perf::Trace::Context;\n");
-	fprintf(ofp, "use Perf::Trace::Util;\n\n");
-
-	fprintf(ofp, "sub trace_begin\n{\n\t# optional\n}\n\n");
-	fprintf(ofp, "sub trace_end\n{\n\t# optional\n}\n\n");
-
-	while ((event = trace_find_next_event(pevent, event))) {
-		fprintf(ofp, "sub %s::%s\n{\n", event->system, event->name);
-		fprintf(ofp, "\tmy (");
-
-		fprintf(ofp, "$event_name, ");
-		fprintf(ofp, "$context, ");
-		fprintf(ofp, "$common_cpu, ");
-		fprintf(ofp, "$common_secs, ");
-		fprintf(ofp, "$common_nsecs,\n");
-		fprintf(ofp, "\t    $common_pid, ");
-		fprintf(ofp, "$common_comm,\n\t    ");
-
-		not_first = 0;
-		count = 0;
-
-		for (f = event->format.fields; f; f = f->next) {
-			if (not_first++)
-				fprintf(ofp, ", ");
-			if (++count % 5 == 0)
-				fprintf(ofp, "\n\t    ");
-
-			fprintf(ofp, "$%s", f->name);
-		}
-		fprintf(ofp, ") = @_;\n\n");
-
-		fprintf(ofp, "\tprint_header($event_name, $common_cpu, "
-			"$common_secs, $common_nsecs,\n\t             "
-			"$common_pid, $common_comm);\n\n");
-
-		fprintf(ofp, "\tprintf(\"");
-
-		not_first = 0;
-		count = 0;
-
-		for (f = event->format.fields; f; f = f->next) {
-			if (not_first++)
-				fprintf(ofp, ", ");
-			if (count && count % 4 == 0) {
-				fprintf(ofp, "\".\n\t       \"");
-			}
-			count++;
-
-			fprintf(ofp, "%s=", f->name);
-			if (f->flags & FIELD_IS_STRING ||
-			    f->flags & FIELD_IS_FLAG ||
-			    f->flags & FIELD_IS_SYMBOLIC)
-				fprintf(ofp, "%%s");
-			else if (f->flags & FIELD_IS_SIGNED)
-				fprintf(ofp, "%%d");
-			else
-				fprintf(ofp, "%%u");
-		}
-
-		fprintf(ofp, "\\n\",\n\t       ");
-
-		not_first = 0;
-		count = 0;
-
-		for (f = event->format.fields; f; f = f->next) {
-			if (not_first++)
-				fprintf(ofp, ", ");
-
-			if (++count % 5 == 0)
-				fprintf(ofp, "\n\t       ");
-
-			if (f->flags & FIELD_IS_FLAG) {
-				if ((count - 1) % 5 != 0) {
-					fprintf(ofp, "\n\t       ");
-					count = 4;
-				}
-				fprintf(ofp, "flag_str(\"");
-				fprintf(ofp, "%s::%s\", ", event->system,
-					event->name);
-				fprintf(ofp, "\"%s\", $%s)", f->name,
-					f->name);
-			} else if (f->flags & FIELD_IS_SYMBOLIC) {
-				if ((count - 1) % 5 != 0) {
-					fprintf(ofp, "\n\t       ");
-					count = 4;
-				}
-				fprintf(ofp, "symbol_str(\"");
-				fprintf(ofp, "%s::%s\", ", event->system,
-					event->name);
-				fprintf(ofp, "\"%s\", $%s)", f->name,
-					f->name);
-			} else
-				fprintf(ofp, "$%s", f->name);
-		}
-
-		fprintf(ofp, ");\n");
-		fprintf(ofp, "}\n\n");
-	}
-
-	fprintf(ofp, "sub trace_unhandled\n{\n\tmy ($event_name, $context, "
-		"$common_cpu, $common_secs, $common_nsecs,\n\t    "
-		"$common_pid, $common_comm) = @_;\n\n");
-
-	fprintf(ofp, "\tprint_header($event_name, $common_cpu, "
-		"$common_secs, $common_nsecs,\n\t             $common_pid, "
-		"$common_comm);\n}\n\n");
-
-	fprintf(ofp, "sub print_header\n{\n"
-		"\tmy ($event_name, $cpu, $secs, $nsecs, $pid, $comm) = @_;\n\n"
-		"\tprintf(\"%%-20s %%5u %%05u.%%09u %%8u %%-20s \",\n\t       "
-		"$event_name, $cpu, $secs, $nsecs, $pid, $comm);\n}\n");
-
-	fprintf(ofp,
-		"\n# Packed byte string args of process_event():\n"
-		"#\n"
-		"# $event:\tunion perf_event\tutil/event.h\n"
-		"# $attr:\tstruct perf_event_attr\tlinux/perf_event.h\n"
-		"# $sample:\tstruct perf_sample\tutil/event.h\n"
-		"# $raw_data:\tperf_sample->raw_data\tutil/event.h\n"
-		"\n"
-		"sub process_event\n"
-		"{\n"
-		"\tmy ($event, $attr, $sample, $raw_data) = @_;\n"
-		"\n"
-		"\tmy @event\t= unpack(\"LSS\", $event);\n"
-		"\tmy @attr\t= unpack(\"LLQQQQQLLQQ\", $attr);\n"
-		"\tmy @sample\t= unpack(\"QLLQQQQQLL\", $sample);\n"
-		"\tmy @raw_data\t= unpack(\"C*\", $raw_data);\n"
-		"\n"
-		"\tuse Data::Dumper;\n"
-		"\tprint Dumper \\@event, \\@attr, \\@sample, \\@raw_data;\n"
-		"}\n");
-
-	fclose(ofp);
-
-	fprintf(stderr, "generated Perl script: %s\n", fname);
-
-	return 0;
-}
-
-struct scripting_ops perl_scripting_ops = {
-	.name = "Perl",
-	.start_script = perl_start_script,
-	.stop_script = perl_stop_script,
-	.process_event = perl_process_event,
-	.generate_script = perl_generate_script,
-};
diff --git a/src/tools/perf/util/scripting-engines/trace-event-python.c b/src/tools/perf/util/scripting-engines/trace-event-python.c
deleted file mode 100644
index 95d91a0..0000000
--- a/src/tools/perf/util/scripting-engines/trace-event-python.c
+++ /dev/null
@@ -1,706 +0,0 @@
-/*
- * trace-event-python.  Feed trace events to an embedded Python interpreter.
- *
- * Copyright (C) 2010 Tom Zanussi <tzanussi@gmail.com>
- *
- *  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, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-
-#include <Python.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#include "../../perf.h"
-#include "../evsel.h"
-#include "../util.h"
-#include "../event.h"
-#include "../thread.h"
-#include "../trace-event.h"
-
-PyMODINIT_FUNC initperf_trace_context(void);
-
-#define FTRACE_MAX_EVENT				\
-	((1 << (sizeof(unsigned short) * 8)) - 1)
-
-struct event_format *events[FTRACE_MAX_EVENT];
-
-#define MAX_FIELDS	64
-#define N_COMMON_FIELDS	7
-
-extern struct scripting_context *scripting_context;
-
-static char *cur_field_name;
-static int zero_flag_atom;
-
-static PyObject *main_module, *main_dict;
-
-static void handler_call_die(const char *handler_name)
-{
-	PyErr_Print();
-	Py_FatalError("problem in Python trace event handler");
-}
-
-/*
- * Insert val into into the dictionary and decrement the reference counter.
- * This is necessary for dictionaries since PyDict_SetItemString() does not 
- * steal a reference, as opposed to PyTuple_SetItem().
- */
-static void pydict_set_item_string_decref(PyObject *dict, const char *key, PyObject *val)
-{
-	PyDict_SetItemString(dict, key, val);
-	Py_DECREF(val);
-}
-
-static void define_value(enum print_arg_type field_type,
-			 const char *ev_name,
-			 const char *field_name,
-			 const char *field_value,
-			 const char *field_str)
-{
-	const char *handler_name = "define_flag_value";
-	PyObject *handler, *t, *retval;
-	unsigned long long value;
-	unsigned n = 0;
-
-	if (field_type == PRINT_SYMBOL)
-		handler_name = "define_symbolic_value";
-
-	t = PyTuple_New(4);
-	if (!t)
-		Py_FatalError("couldn't create Python tuple");
-
-	value = eval_flag(field_value);
-
-	PyTuple_SetItem(t, n++, PyString_FromString(ev_name));
-	PyTuple_SetItem(t, n++, PyString_FromString(field_name));
-	PyTuple_SetItem(t, n++, PyInt_FromLong(value));
-	PyTuple_SetItem(t, n++, PyString_FromString(field_str));
-
-	handler = PyDict_GetItemString(main_dict, handler_name);
-	if (handler && PyCallable_Check(handler)) {
-		retval = PyObject_CallObject(handler, t);
-		if (retval == NULL)
-			handler_call_die(handler_name);
-	}
-
-	Py_DECREF(t);
-}
-
-static void define_values(enum print_arg_type field_type,
-			  struct print_flag_sym *field,
-			  const char *ev_name,
-			  const char *field_name)
-{
-	define_value(field_type, ev_name, field_name, field->value,
-		     field->str);
-
-	if (field->next)
-		define_values(field_type, field->next, ev_name, field_name);
-}
-
-static void define_field(enum print_arg_type field_type,
-			 const char *ev_name,
-			 const char *field_name,
-			 const char *delim)
-{
-	const char *handler_name = "define_flag_field";
-	PyObject *handler, *t, *retval;
-	unsigned n = 0;
-
-	if (field_type == PRINT_SYMBOL)
-		handler_name = "define_symbolic_field";
-
-	if (field_type == PRINT_FLAGS)
-		t = PyTuple_New(3);
-	else
-		t = PyTuple_New(2);
-	if (!t)
-		Py_FatalError("couldn't create Python tuple");
-
-	PyTuple_SetItem(t, n++, PyString_FromString(ev_name));
-	PyTuple_SetItem(t, n++, PyString_FromString(field_name));
-	if (field_type == PRINT_FLAGS)
-		PyTuple_SetItem(t, n++, PyString_FromString(delim));
-
-	handler = PyDict_GetItemString(main_dict, handler_name);
-	if (handler && PyCallable_Check(handler)) {
-		retval = PyObject_CallObject(handler, t);
-		if (retval == NULL)
-			handler_call_die(handler_name);
-	}
-
-	Py_DECREF(t);
-}
-
-static void define_event_symbols(struct event_format *event,
-				 const char *ev_name,
-				 struct print_arg *args)
-{
-	switch (args->type) {
-	case PRINT_NULL:
-		break;
-	case PRINT_ATOM:
-		define_value(PRINT_FLAGS, ev_name, cur_field_name, "0",
-			     args->atom.atom);
-		zero_flag_atom = 0;
-		break;
-	case PRINT_FIELD:
-		if (cur_field_name)
-			free(cur_field_name);
-		cur_field_name = strdup(args->field.name);
-		break;
-	case PRINT_FLAGS:
-		define_event_symbols(event, ev_name, args->flags.field);
-		define_field(PRINT_FLAGS, ev_name, cur_field_name,
-			     args->flags.delim);
-		define_values(PRINT_FLAGS, args->flags.flags, ev_name,
-			      cur_field_name);
-		break;
-	case PRINT_SYMBOL:
-		define_event_symbols(event, ev_name, args->symbol.field);
-		define_field(PRINT_SYMBOL, ev_name, cur_field_name, NULL);
-		define_values(PRINT_SYMBOL, args->symbol.symbols, ev_name,
-			      cur_field_name);
-		break;
-	case PRINT_HEX:
-		define_event_symbols(event, ev_name, args->hex.field);
-		define_event_symbols(event, ev_name, args->hex.size);
-		break;
-	case PRINT_STRING:
-		break;
-	case PRINT_TYPE:
-		define_event_symbols(event, ev_name, args->typecast.item);
-		break;
-	case PRINT_OP:
-		if (strcmp(args->op.op, ":") == 0)
-			zero_flag_atom = 1;
-		define_event_symbols(event, ev_name, args->op.left);
-		define_event_symbols(event, ev_name, args->op.right);
-		break;
-	default:
-		/* gcc warns for these? */
-	case PRINT_BSTRING:
-	case PRINT_DYNAMIC_ARRAY:
-	case PRINT_FUNC:
-		/* we should warn... */
-		return;
-	}
-
-	if (args->next)
-		define_event_symbols(event, ev_name, args->next);
-}
-
-static inline struct event_format *find_cache_event(struct perf_evsel *evsel)
-{
-	static char ev_name[256];
-	struct event_format *event;
-	int type = evsel->attr.config;
-
-	/*
- 	 * XXX: Do we really need to cache this since now we have evsel->tp_format
- 	 * cached already? Need to re-read this "cache" routine that as well calls
- 	 * define_event_symbols() :-\
- 	 */
-	if (events[type])
-		return events[type];
-
-	events[type] = event = evsel->tp_format;
-	if (!event)
-		return NULL;
-
-	sprintf(ev_name, "%s__%s", event->system, event->name);
-
-	define_event_symbols(event, ev_name, event->print_fmt.args);
-
-	return event;
-}
-
-static void python_process_tracepoint(union perf_event *perf_event
-				      __maybe_unused,
-				 struct perf_sample *sample,
-				 struct perf_evsel *evsel,
-				 struct machine *machine __maybe_unused,
-				 struct thread *thread,
-				 struct addr_location *al)
-{
-	PyObject *handler, *retval, *context, *t, *obj, *dict = NULL;
-	static char handler_name[256];
-	struct format_field *field;
-	unsigned long long val;
-	unsigned long s, ns;
-	struct event_format *event;
-	unsigned n = 0;
-	int pid;
-	int cpu = sample->cpu;
-	void *data = sample->raw_data;
-	unsigned long long nsecs = sample->time;
-	char *comm = thread->comm;
-
-	t = PyTuple_New(MAX_FIELDS);
-	if (!t)
-		Py_FatalError("couldn't create Python tuple");
-
-	event = find_cache_event(evsel);
-	if (!event)
-		die("ug! no event found for type %d", (int)evsel->attr.config);
-
-	pid = raw_field_value(event, "common_pid", data);
-
-	sprintf(handler_name, "%s__%s", event->system, event->name);
-
-	handler = PyDict_GetItemString(main_dict, handler_name);
-	if (handler && !PyCallable_Check(handler))
-		handler = NULL;
-	if (!handler) {
-		dict = PyDict_New();
-		if (!dict)
-			Py_FatalError("couldn't create Python dict");
-	}
-	s = nsecs / NSECS_PER_SEC;
-	ns = nsecs - s * NSECS_PER_SEC;
-
-	scripting_context->event_data = data;
-	scripting_context->pevent = evsel->tp_format->pevent;
-
-	context = PyCObject_FromVoidPtr(scripting_context, NULL);
-
-	PyTuple_SetItem(t, n++, PyString_FromString(handler_name));
-	PyTuple_SetItem(t, n++, context);
-
-	if (handler) {
-		PyTuple_SetItem(t, n++, PyInt_FromLong(cpu));
-		PyTuple_SetItem(t, n++, PyInt_FromLong(s));
-		PyTuple_SetItem(t, n++, PyInt_FromLong(ns));
-		PyTuple_SetItem(t, n++, PyInt_FromLong(pid));
-		PyTuple_SetItem(t, n++, PyString_FromString(comm));
-	} else {
-		pydict_set_item_string_decref(dict, "common_cpu", PyInt_FromLong(cpu));
-		pydict_set_item_string_decref(dict, "common_s", PyInt_FromLong(s));
-		pydict_set_item_string_decref(dict, "common_ns", PyInt_FromLong(ns));
-		pydict_set_item_string_decref(dict, "common_pid", PyInt_FromLong(pid));
-		pydict_set_item_string_decref(dict, "common_comm", PyString_FromString(comm));
-	}
-	for (field = event->format.fields; field; field = field->next) {
-		if (field->flags & FIELD_IS_STRING) {
-			int offset;
-			if (field->flags & FIELD_IS_DYNAMIC) {
-				offset = *(int *)(data + field->offset);
-				offset &= 0xffff;
-			} else
-				offset = field->offset;
-			obj = PyString_FromString((char *)data + offset);
-		} else { /* FIELD_IS_NUMERIC */
-			val = read_size(event, data + field->offset,
-					field->size);
-			if (field->flags & FIELD_IS_SIGNED) {
-				if ((long long)val >= LONG_MIN &&
-				    (long long)val <= LONG_MAX)
-					obj = PyInt_FromLong(val);
-				else
-					obj = PyLong_FromLongLong(val);
-			} else {
-				if (val <= LONG_MAX)
-					obj = PyInt_FromLong(val);
-				else
-					obj = PyLong_FromUnsignedLongLong(val);
-			}
-		}
-		if (handler)
-			PyTuple_SetItem(t, n++, obj);
-		else
-			pydict_set_item_string_decref(dict, field->name, obj);
-
-	}
-	if (!handler)
-		PyTuple_SetItem(t, n++, dict);
-
-	if (_PyTuple_Resize(&t, n) == -1)
-		Py_FatalError("error resizing Python tuple");
-
-	if (handler) {
-		retval = PyObject_CallObject(handler, t);
-		if (retval == NULL)
-			handler_call_die(handler_name);
-	} else {
-		handler = PyDict_GetItemString(main_dict, "trace_unhandled");
-		if (handler && PyCallable_Check(handler)) {
-
-			retval = PyObject_CallObject(handler, t);
-			if (retval == NULL)
-				handler_call_die("trace_unhandled");
-		}
-		Py_DECREF(dict);
-	}
-
-	Py_DECREF(t);
-}
-
-static void python_process_general_event(union perf_event *perf_event
-					 __maybe_unused,
-					 struct perf_sample *sample,
-					 struct perf_evsel *evsel,
-					 struct machine *machine __maybe_unused,
-					 struct thread *thread,
-					 struct addr_location *al)
-{
-	PyObject *handler, *retval, *t, *dict;
-	static char handler_name[64];
-	unsigned n = 0;
-
-	/*
-	 * Use the MAX_FIELDS to make the function expandable, though
-	 * currently there is only one item for the tuple.
-	 */
-	t = PyTuple_New(MAX_FIELDS);
-	if (!t)
-		Py_FatalError("couldn't create Python tuple");
-
-	dict = PyDict_New();
-	if (!dict)
-		Py_FatalError("couldn't create Python dictionary");
-
-	snprintf(handler_name, sizeof(handler_name), "%s", "process_event");
-
-	handler = PyDict_GetItemString(main_dict, handler_name);
-	if (!handler || !PyCallable_Check(handler))
-		goto exit;
-
-	pydict_set_item_string_decref(dict, "ev_name", PyString_FromString(perf_evsel__name(evsel)));
-	pydict_set_item_string_decref(dict, "attr", PyString_FromStringAndSize(
-			(const char *)&evsel->attr, sizeof(evsel->attr)));
-	pydict_set_item_string_decref(dict, "sample", PyString_FromStringAndSize(
-			(const char *)sample, sizeof(*sample)));
-	pydict_set_item_string_decref(dict, "raw_buf", PyString_FromStringAndSize(
-			(const char *)sample->raw_data, sample->raw_size));
-	pydict_set_item_string_decref(dict, "comm",
-			PyString_FromString(thread->comm));
-	if (al->map) {
-		pydict_set_item_string_decref(dict, "dso",
-			PyString_FromString(al->map->dso->name));
-	}
-	if (al->sym) {
-		pydict_set_item_string_decref(dict, "symbol",
-			PyString_FromString(al->sym->name));
-	}
-
-	PyTuple_SetItem(t, n++, dict);
-	if (_PyTuple_Resize(&t, n) == -1)
-		Py_FatalError("error resizing Python tuple");
-
-	retval = PyObject_CallObject(handler, t);
-	if (retval == NULL)
-		handler_call_die(handler_name);
-exit:
-	Py_DECREF(dict);
-	Py_DECREF(t);
-}
-
-static void python_process_event(union perf_event *perf_event,
-				 struct perf_sample *sample,
-				 struct perf_evsel *evsel,
-				 struct machine *machine,
-				 struct thread *thread,
-				 struct addr_location *al)
-{
-	switch (evsel->attr.type) {
-	case PERF_TYPE_TRACEPOINT:
-		python_process_tracepoint(perf_event, sample, evsel,
-					  machine, thread, al);
-		break;
-	/* Reserve for future process_hw/sw/raw APIs */
-	default:
-		python_process_general_event(perf_event, sample, evsel,
-					     machine, thread, al);
-	}
-}
-
-static int run_start_sub(void)
-{
-	PyObject *handler, *retval;
-	int err = 0;
-
-	main_module = PyImport_AddModule("__main__");
-	if (main_module == NULL)
-		return -1;
-	Py_INCREF(main_module);
-
-	main_dict = PyModule_GetDict(main_module);
-	if (main_dict == NULL) {
-		err = -1;
-		goto error;
-	}
-	Py_INCREF(main_dict);
-
-	handler = PyDict_GetItemString(main_dict, "trace_begin");
-	if (handler == NULL || !PyCallable_Check(handler))
-		goto out;
-
-	retval = PyObject_CallObject(handler, NULL);
-	if (retval == NULL)
-		handler_call_die("trace_begin");
-
-	Py_DECREF(retval);
-	return err;
-error:
-	Py_XDECREF(main_dict);
-	Py_XDECREF(main_module);
-out:
-	return err;
-}
-
-/*
- * Start trace script
- */
-static int python_start_script(const char *script, int argc, const char **argv)
-{
-	const char **command_line;
-	char buf[PATH_MAX];
-	int i, err = 0;
-	FILE *fp;
-
-	command_line = malloc((argc + 1) * sizeof(const char *));
-	command_line[0] = script;
-	for (i = 1; i < argc + 1; i++)
-		command_line[i] = argv[i - 1];
-
-	Py_Initialize();
-
-	initperf_trace_context();
-
-	PySys_SetArgv(argc + 1, (char **)command_line);
-
-	fp = fopen(script, "r");
-	if (!fp) {
-		sprintf(buf, "Can't open python script \"%s\"", script);
-		perror(buf);
-		err = -1;
-		goto error;
-	}
-
-	err = PyRun_SimpleFile(fp, script);
-	if (err) {
-		fprintf(stderr, "Error running python script %s\n", script);
-		goto error;
-	}
-
-	err = run_start_sub();
-	if (err) {
-		fprintf(stderr, "Error starting python script %s\n", script);
-		goto error;
-	}
-
-	free(command_line);
-
-	return err;
-error:
-	Py_Finalize();
-	free(command_line);
-
-	return err;
-}
-
-/*
- * Stop trace script
- */
-static int python_stop_script(void)
-{
-	PyObject *handler, *retval;
-	int err = 0;
-
-	handler = PyDict_GetItemString(main_dict, "trace_end");
-	if (handler == NULL || !PyCallable_Check(handler))
-		goto out;
-
-	retval = PyObject_CallObject(handler, NULL);
-	if (retval == NULL)
-		handler_call_die("trace_end");
-	else
-		Py_DECREF(retval);
-out:
-	Py_XDECREF(main_dict);
-	Py_XDECREF(main_module);
-	Py_Finalize();
-
-	return err;
-}
-
-static int python_generate_script(struct pevent *pevent, const char *outfile)
-{
-	struct event_format *event = NULL;
-	struct format_field *f;
-	char fname[PATH_MAX];
-	int not_first, count;
-	FILE *ofp;
-
-	sprintf(fname, "%s.py", outfile);
-	ofp = fopen(fname, "w");
-	if (ofp == NULL) {
-		fprintf(stderr, "couldn't open %s\n", fname);
-		return -1;
-	}
-	fprintf(ofp, "# perf script event handlers, "
-		"generated by perf script -g python\n");
-
-	fprintf(ofp, "# Licensed under the terms of the GNU GPL"
-		" License version 2\n\n");
-
-	fprintf(ofp, "# The common_* event handler fields are the most useful "
-		"fields common to\n");
-
-	fprintf(ofp, "# all events.  They don't necessarily correspond to "
-		"the 'common_*' fields\n");
-
-	fprintf(ofp, "# in the format files.  Those fields not available as "
-		"handler params can\n");
-
-	fprintf(ofp, "# be retrieved using Python functions of the form "
-		"common_*(context).\n");
-
-	fprintf(ofp, "# See the perf-trace-python Documentation for the list "
-		"of available functions.\n\n");
-
-	fprintf(ofp, "import os\n");
-	fprintf(ofp, "import sys\n\n");
-
-	fprintf(ofp, "sys.path.append(os.environ['PERF_EXEC_PATH'] + \\\n");
-	fprintf(ofp, "\t'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')\n");
-	fprintf(ofp, "\nfrom perf_trace_context import *\n");
-	fprintf(ofp, "from Core import *\n\n\n");
-
-	fprintf(ofp, "def trace_begin():\n");
-	fprintf(ofp, "\tprint \"in trace_begin\"\n\n");
-
-	fprintf(ofp, "def trace_end():\n");
-	fprintf(ofp, "\tprint \"in trace_end\"\n\n");
-
-	while ((event = trace_find_next_event(pevent, event))) {
-		fprintf(ofp, "def %s__%s(", event->system, event->name);
-		fprintf(ofp, "event_name, ");
-		fprintf(ofp, "context, ");
-		fprintf(ofp, "common_cpu,\n");
-		fprintf(ofp, "\tcommon_secs, ");
-		fprintf(ofp, "common_nsecs, ");
-		fprintf(ofp, "common_pid, ");
-		fprintf(ofp, "common_comm,\n\t");
-
-		not_first = 0;
-		count = 0;
-
-		for (f = event->format.fields; f; f = f->next) {
-			if (not_first++)
-				fprintf(ofp, ", ");
-			if (++count % 5 == 0)
-				fprintf(ofp, "\n\t");
-
-			fprintf(ofp, "%s", f->name);
-		}
-		fprintf(ofp, "):\n");
-
-		fprintf(ofp, "\t\tprint_header(event_name, common_cpu, "
-			"common_secs, common_nsecs,\n\t\t\t"
-			"common_pid, common_comm)\n\n");
-
-		fprintf(ofp, "\t\tprint \"");
-
-		not_first = 0;
-		count = 0;
-
-		for (f = event->format.fields; f; f = f->next) {
-			if (not_first++)
-				fprintf(ofp, ", ");
-			if (count && count % 3 == 0) {
-				fprintf(ofp, "\" \\\n\t\t\"");
-			}
-			count++;
-
-			fprintf(ofp, "%s=", f->name);
-			if (f->flags & FIELD_IS_STRING ||
-			    f->flags & FIELD_IS_FLAG ||
-			    f->flags & FIELD_IS_SYMBOLIC)
-				fprintf(ofp, "%%s");
-			else if (f->flags & FIELD_IS_SIGNED)
-				fprintf(ofp, "%%d");
-			else
-				fprintf(ofp, "%%u");
-		}
-
-		fprintf(ofp, "\\n\" %% \\\n\t\t(");
-
-		not_first = 0;
-		count = 0;
-
-		for (f = event->format.fields; f; f = f->next) {
-			if (not_first++)
-				fprintf(ofp, ", ");
-
-			if (++count % 5 == 0)
-				fprintf(ofp, "\n\t\t");
-
-			if (f->flags & FIELD_IS_FLAG) {
-				if ((count - 1) % 5 != 0) {
-					fprintf(ofp, "\n\t\t");
-					count = 4;
-				}
-				fprintf(ofp, "flag_str(\"");
-				fprintf(ofp, "%s__%s\", ", event->system,
-					event->name);
-				fprintf(ofp, "\"%s\", %s)", f->name,
-					f->name);
-			} else if (f->flags & FIELD_IS_SYMBOLIC) {
-				if ((count - 1) % 5 != 0) {
-					fprintf(ofp, "\n\t\t");
-					count = 4;
-				}
-				fprintf(ofp, "symbol_str(\"");
-				fprintf(ofp, "%s__%s\", ", event->system,
-					event->name);
-				fprintf(ofp, "\"%s\", %s)", f->name,
-					f->name);
-			} else
-				fprintf(ofp, "%s", f->name);
-		}
-
-		fprintf(ofp, "),\n\n");
-	}
-
-	fprintf(ofp, "def trace_unhandled(event_name, context, "
-		"event_fields_dict):\n");
-
-	fprintf(ofp, "\t\tprint ' '.join(['%%s=%%s'%%(k,str(v))"
-		"for k,v in sorted(event_fields_dict.items())])\n\n");
-
-	fprintf(ofp, "def print_header("
-		"event_name, cpu, secs, nsecs, pid, comm):\n"
-		"\tprint \"%%-20s %%5u %%05u.%%09u %%8u %%-20s \" %% \\\n\t"
-		"(event_name, cpu, secs, nsecs, pid, comm),\n");
-
-	fclose(ofp);
-
-	fprintf(stderr, "generated Python script: %s\n", fname);
-
-	return 0;
-}
-
-struct scripting_ops python_scripting_ops = {
-	.name = "Python",
-	.start_script = python_start_script,
-	.stop_script = python_stop_script,
-	.process_event = python_process_event,
-	.generate_script = python_generate_script,
-};
diff --git a/src/tools/perf/util/session.c b/src/tools/perf/util/session.c
deleted file mode 100644
index 9d78c70..0000000
--- a/src/tools/perf/util/session.c
+++ /dev/null
@@ -1,1680 +0,0 @@
-#include <linux/kernel.h>
-#include <traceevent/event-parse.h>
-
-#include <byteswap.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/mman.h>
-
-#include "evlist.h"
-#include "evsel.h"
-#include "session.h"
-#include "tool.h"
-#include "sort.h"
-#include "util.h"
-#include "cpumap.h"
-#include "perf_regs.h"
-#include "vdso.h"
-
-static int perf_session__open(struct perf_session *self, bool force)
-{
-	struct stat input_stat;
-
-	if (!strcmp(self->filename, "-")) {
-		self->fd_pipe = true;
-		self->fd = STDIN_FILENO;
-
-		if (perf_session__read_header(self) < 0)
-			pr_err("incompatible file format (rerun with -v to learn more)");
-
-		return 0;
-	}
-
-	self->fd = open(self->filename, O_RDONLY);
-	if (self->fd < 0) {
-		int err = errno;
-
-		pr_err("failed to open %s: %s", self->filename, strerror(err));
-		if (err == ENOENT && !strcmp(self->filename, "perf.data"))
-			pr_err("  (try 'perf record' first)");
-		pr_err("\n");
-		return -errno;
-	}
-
-	if (fstat(self->fd, &input_stat) < 0)
-		goto out_close;
-
-	if (!force && input_stat.st_uid && (input_stat.st_uid != geteuid())) {
-		pr_err("file %s not owned by current user or root\n",
-		       self->filename);
-		goto out_close;
-	}
-
-	if (!input_stat.st_size) {
-		pr_info("zero-sized file (%s), nothing to do!\n",
-			self->filename);
-		goto out_close;
-	}
-
-	if (perf_session__read_header(self) < 0) {
-		pr_err("incompatible file format (rerun with -v to learn more)");
-		goto out_close;
-	}
-
-	if (!perf_evlist__valid_sample_type(self->evlist)) {
-		pr_err("non matching sample_type");
-		goto out_close;
-	}
-
-	if (!perf_evlist__valid_sample_id_all(self->evlist)) {
-		pr_err("non matching sample_id_all");
-		goto out_close;
-	}
-
-	if (!perf_evlist__valid_read_format(self->evlist)) {
-		pr_err("non matching read_format");
-		goto out_close;
-	}
-
-	self->size = input_stat.st_size;
-	return 0;
-
-out_close:
-	close(self->fd);
-	self->fd = -1;
-	return -1;
-}
-
-void perf_session__set_id_hdr_size(struct perf_session *session)
-{
-	u16 id_hdr_size = perf_evlist__id_hdr_size(session->evlist);
-
-	machines__set_id_hdr_size(&session->machines, id_hdr_size);
-}
-
-int perf_session__create_kernel_maps(struct perf_session *self)
-{
-	int ret = machine__create_kernel_maps(&self->machines.host);
-
-	if (ret >= 0)
-		ret = machines__create_guest_kernel_maps(&self->machines);
-	return ret;
-}
-
-static void perf_session__destroy_kernel_maps(struct perf_session *self)
-{
-	machines__destroy_kernel_maps(&self->machines);
-}
-
-struct perf_session *perf_session__new(const char *filename, int mode,
-				       bool force, bool repipe,
-				       struct perf_tool *tool)
-{
-	struct perf_session *self;
-	struct stat st;
-	size_t len;
-
-	if (!filename || !strlen(filename)) {
-		if (!fstat(STDIN_FILENO, &st) && S_ISFIFO(st.st_mode))
-			filename = "-";
-		else
-			filename = "perf.data";
-	}
-
-	len = strlen(filename);
-	self = zalloc(sizeof(*self) + len);
-
-	if (self == NULL)
-		goto out;
-
-	memcpy(self->filename, filename, len);
-	self->repipe = repipe;
-	INIT_LIST_HEAD(&self->ordered_samples.samples);
-	INIT_LIST_HEAD(&self->ordered_samples.sample_cache);
-	INIT_LIST_HEAD(&self->ordered_samples.to_free);
-	machines__init(&self->machines);
-
-	if (mode == O_RDONLY) {
-		if (perf_session__open(self, force) < 0)
-			goto out_delete;
-		perf_session__set_id_hdr_size(self);
-	} else if (mode == O_WRONLY) {
-		/*
-		 * In O_RDONLY mode this will be performed when reading the
-		 * kernel MMAP event, in perf_event__process_mmap().
-		 */
-		if (perf_session__create_kernel_maps(self) < 0)
-			goto out_delete;
-	}
-
-	if (tool && tool->ordering_requires_timestamps &&
-	    tool->ordered_samples && !perf_evlist__sample_id_all(self->evlist)) {
-		dump_printf("WARNING: No sample_id_all support, falling back to unordered processing\n");
-		tool->ordered_samples = false;
-	}
-
-out:
-	return self;
-out_delete:
-	perf_session__delete(self);
-	return NULL;
-}
-
-static void perf_session__delete_dead_threads(struct perf_session *session)
-{
-	machine__delete_dead_threads(&session->machines.host);
-}
-
-static void perf_session__delete_threads(struct perf_session *session)
-{
-	machine__delete_threads(&session->machines.host);
-}
-
-static void perf_session_env__delete(struct perf_session_env *env)
-{
-	free(env->hostname);
-	free(env->os_release);
-	free(env->version);
-	free(env->arch);
-	free(env->cpu_desc);
-	free(env->cpuid);
-
-	free(env->cmdline);
-	free(env->sibling_cores);
-	free(env->sibling_threads);
-	free(env->numa_nodes);
-	free(env->pmu_mappings);
-}
-
-void perf_session__delete(struct perf_session *self)
-{
-	perf_session__destroy_kernel_maps(self);
-	perf_session__delete_dead_threads(self);
-	perf_session__delete_threads(self);
-	perf_session_env__delete(&self->header.env);
-	machines__exit(&self->machines);
-	close(self->fd);
-	free(self);
-	vdso__exit();
-}
-
-static int process_event_synth_tracing_data_stub(struct perf_tool *tool
-						 __maybe_unused,
-						 union perf_event *event
-						 __maybe_unused,
-						 struct perf_session *session
-						__maybe_unused)
-{
-	dump_printf(": unhandled!\n");
-	return 0;
-}
-
-static int process_event_synth_attr_stub(struct perf_tool *tool __maybe_unused,
-					 union perf_event *event __maybe_unused,
-					 struct perf_evlist **pevlist
-					 __maybe_unused)
-{
-	dump_printf(": unhandled!\n");
-	return 0;
-}
-
-static int process_event_sample_stub(struct perf_tool *tool __maybe_unused,
-				     union perf_event *event __maybe_unused,
-				     struct perf_sample *sample __maybe_unused,
-				     struct perf_evsel *evsel __maybe_unused,
-				     struct machine *machine __maybe_unused)
-{
-	dump_printf(": unhandled!\n");
-	return 0;
-}
-
-static int process_event_stub(struct perf_tool *tool __maybe_unused,
-			      union perf_event *event __maybe_unused,
-			      struct perf_sample *sample __maybe_unused,
-			      struct machine *machine __maybe_unused)
-{
-	dump_printf(": unhandled!\n");
-	return 0;
-}
-
-static int process_finished_round_stub(struct perf_tool *tool __maybe_unused,
-				       union perf_event *event __maybe_unused,
-				       struct perf_session *perf_session
-				       __maybe_unused)
-{
-	dump_printf(": unhandled!\n");
-	return 0;
-}
-
-static int process_finished_round(struct perf_tool *tool,
-				  union perf_event *event,
-				  struct perf_session *session);
-
-void perf_tool__fill_defaults(struct perf_tool *tool)
-{
-	if (tool->sample == NULL)
-		tool->sample = process_event_sample_stub;
-	if (tool->mmap == NULL)
-		tool->mmap = process_event_stub;
-	if (tool->mmap2 == NULL)
-		tool->mmap2 = process_event_stub;
-	if (tool->comm == NULL)
-		tool->comm = process_event_stub;
-	if (tool->fork == NULL)
-		tool->fork = process_event_stub;
-	if (tool->exit == NULL)
-		tool->exit = process_event_stub;
-	if (tool->lost == NULL)
-		tool->lost = perf_event__process_lost;
-	if (tool->read == NULL)
-		tool->read = process_event_sample_stub;
-	if (tool->throttle == NULL)
-		tool->throttle = process_event_stub;
-	if (tool->unthrottle == NULL)
-		tool->unthrottle = process_event_stub;
-	if (tool->attr == NULL)
-		tool->attr = process_event_synth_attr_stub;
-	if (tool->tracing_data == NULL)
-		tool->tracing_data = process_event_synth_tracing_data_stub;
-	if (tool->build_id == NULL)
-		tool->build_id = process_finished_round_stub;
-	if (tool->finished_round == NULL) {
-		if (tool->ordered_samples)
-			tool->finished_round = process_finished_round;
-		else
-			tool->finished_round = process_finished_round_stub;
-	}
-}
- 
-void mem_bswap_32(void *src, int byte_size)
-{
-	u32 *m = src;
-	while (byte_size > 0) {
-		*m = bswap_32(*m);
-		byte_size -= sizeof(u32);
-		++m;
-	}
-}
-
-void mem_bswap_64(void *src, int byte_size)
-{
-	u64 *m = src;
-
-	while (byte_size > 0) {
-		*m = bswap_64(*m);
-		byte_size -= sizeof(u64);
-		++m;
-	}
-}
-
-static void swap_sample_id_all(union perf_event *event, void *data)
-{
-	void *end = (void *) event + event->header.size;
-	int size = end - data;
-
-	BUG_ON(size % sizeof(u64));
-	mem_bswap_64(data, size);
-}
-
-static void perf_event__all64_swap(union perf_event *event,
-				   bool sample_id_all __maybe_unused)
-{
-	struct perf_event_header *hdr = &event->header;
-	mem_bswap_64(hdr + 1, event->header.size - sizeof(*hdr));
-}
-
-static void perf_event__comm_swap(union perf_event *event, bool sample_id_all)
-{
-	event->comm.pid = bswap_32(event->comm.pid);
-	event->comm.tid = bswap_32(event->comm.tid);
-
-	if (sample_id_all) {
-		void *data = &event->comm.comm;
-
-		data += PERF_ALIGN(strlen(data) + 1, sizeof(u64));
-		swap_sample_id_all(event, data);
-	}
-}
-
-static void perf_event__mmap_swap(union perf_event *event,
-				  bool sample_id_all)
-{
-	event->mmap.pid	  = bswap_32(event->mmap.pid);
-	event->mmap.tid	  = bswap_32(event->mmap.tid);
-	event->mmap.start = bswap_64(event->mmap.start);
-	event->mmap.len	  = bswap_64(event->mmap.len);
-	event->mmap.pgoff = bswap_64(event->mmap.pgoff);
-
-	if (sample_id_all) {
-		void *data = &event->mmap.filename;
-
-		data += PERF_ALIGN(strlen(data) + 1, sizeof(u64));
-		swap_sample_id_all(event, data);
-	}
-}
-
-static void perf_event__mmap2_swap(union perf_event *event,
-				  bool sample_id_all)
-{
-	event->mmap2.pid   = bswap_32(event->mmap2.pid);
-	event->mmap2.tid   = bswap_32(event->mmap2.tid);
-	event->mmap2.start = bswap_64(event->mmap2.start);
-	event->mmap2.len   = bswap_64(event->mmap2.len);
-	event->mmap2.pgoff = bswap_64(event->mmap2.pgoff);
-	event->mmap2.maj   = bswap_32(event->mmap2.maj);
-	event->mmap2.min   = bswap_32(event->mmap2.min);
-	event->mmap2.ino   = bswap_64(event->mmap2.ino);
-
-	if (sample_id_all) {
-		void *data = &event->mmap2.filename;
-
-		data += PERF_ALIGN(strlen(data) + 1, sizeof(u64));
-		swap_sample_id_all(event, data);
-	}
-}
-static void perf_event__task_swap(union perf_event *event, bool sample_id_all)
-{
-	event->fork.pid	 = bswap_32(event->fork.pid);
-	event->fork.tid	 = bswap_32(event->fork.tid);
-	event->fork.ppid = bswap_32(event->fork.ppid);
-	event->fork.ptid = bswap_32(event->fork.ptid);
-	event->fork.time = bswap_64(event->fork.time);
-
-	if (sample_id_all)
-		swap_sample_id_all(event, &event->fork + 1);
-}
-
-static void perf_event__read_swap(union perf_event *event, bool sample_id_all)
-{
-	event->read.pid		 = bswap_32(event->read.pid);
-	event->read.tid		 = bswap_32(event->read.tid);
-	event->read.value	 = bswap_64(event->read.value);
-	event->read.time_enabled = bswap_64(event->read.time_enabled);
-	event->read.time_running = bswap_64(event->read.time_running);
-	event->read.id		 = bswap_64(event->read.id);
-
-	if (sample_id_all)
-		swap_sample_id_all(event, &event->read + 1);
-}
-
-static u8 revbyte(u8 b)
-{
-	int rev = (b >> 4) | ((b & 0xf) << 4);
-	rev = ((rev & 0xcc) >> 2) | ((rev & 0x33) << 2);
-	rev = ((rev & 0xaa) >> 1) | ((rev & 0x55) << 1);
-	return (u8) rev;
-}
-
-/*
- * XXX this is hack in attempt to carry flags bitfield
- * throught endian village. ABI says:
- *
- * Bit-fields are allocated from right to left (least to most significant)
- * on little-endian implementations and from left to right (most to least
- * significant) on big-endian implementations.
- *
- * The above seems to be byte specific, so we need to reverse each
- * byte of the bitfield. 'Internet' also says this might be implementation
- * specific and we probably need proper fix and carry perf_event_attr
- * bitfield flags in separate data file FEAT_ section. Thought this seems
- * to work for now.
- */
-static void swap_bitfield(u8 *p, unsigned len)
-{
-	unsigned i;
-
-	for (i = 0; i < len; i++) {
-		*p = revbyte(*p);
-		p++;
-	}
-}
-
-/* exported for swapping attributes in file header */
-void perf_event__attr_swap(struct perf_event_attr *attr)
-{
-	attr->type		= bswap_32(attr->type);
-	attr->size		= bswap_32(attr->size);
-	attr->config		= bswap_64(attr->config);
-	attr->sample_period	= bswap_64(attr->sample_period);
-	attr->sample_type	= bswap_64(attr->sample_type);
-	attr->read_format	= bswap_64(attr->read_format);
-	attr->wakeup_events	= bswap_32(attr->wakeup_events);
-	attr->bp_type		= bswap_32(attr->bp_type);
-	attr->bp_addr		= bswap_64(attr->bp_addr);
-	attr->bp_len		= bswap_64(attr->bp_len);
-
-	swap_bitfield((u8 *) (&attr->read_format + 1), sizeof(u64));
-}
-
-static void perf_event__hdr_attr_swap(union perf_event *event,
-				      bool sample_id_all __maybe_unused)
-{
-	size_t size;
-
-	perf_event__attr_swap(&event->attr.attr);
-
-	size = event->header.size;
-	size -= (void *)&event->attr.id - (void *)event;
-	mem_bswap_64(event->attr.id, size);
-}
-
-static void perf_event__event_type_swap(union perf_event *event,
-					bool sample_id_all __maybe_unused)
-{
-	event->event_type.event_type.event_id =
-		bswap_64(event->event_type.event_type.event_id);
-}
-
-static void perf_event__tracing_data_swap(union perf_event *event,
-					  bool sample_id_all __maybe_unused)
-{
-	event->tracing_data.size = bswap_32(event->tracing_data.size);
-}
-
-typedef void (*perf_event__swap_op)(union perf_event *event,
-				    bool sample_id_all);
-
-static perf_event__swap_op perf_event__swap_ops[] = {
-	[PERF_RECORD_MMAP]		  = perf_event__mmap_swap,
-	[PERF_RECORD_MMAP2]		  = perf_event__mmap2_swap,
-	[PERF_RECORD_COMM]		  = perf_event__comm_swap,
-	[PERF_RECORD_FORK]		  = perf_event__task_swap,
-	[PERF_RECORD_EXIT]		  = perf_event__task_swap,
-	[PERF_RECORD_LOST]		  = perf_event__all64_swap,
-	[PERF_RECORD_READ]		  = perf_event__read_swap,
-	[PERF_RECORD_SAMPLE]		  = perf_event__all64_swap,
-	[PERF_RECORD_HEADER_ATTR]	  = perf_event__hdr_attr_swap,
-	[PERF_RECORD_HEADER_EVENT_TYPE]	  = perf_event__event_type_swap,
-	[PERF_RECORD_HEADER_TRACING_DATA] = perf_event__tracing_data_swap,
-	[PERF_RECORD_HEADER_BUILD_ID]	  = NULL,
-	[PERF_RECORD_HEADER_MAX]	  = NULL,
-};
-
-struct sample_queue {
-	u64			timestamp;
-	u64			file_offset;
-	union perf_event	*event;
-	struct list_head	list;
-};
-
-static void perf_session_free_sample_buffers(struct perf_session *session)
-{
-	struct ordered_samples *os = &session->ordered_samples;
-
-	while (!list_empty(&os->to_free)) {
-		struct sample_queue *sq;
-
-		sq = list_entry(os->to_free.next, struct sample_queue, list);
-		list_del(&sq->list);
-		free(sq);
-	}
-}
-
-static int perf_session_deliver_event(struct perf_session *session,
-				      union perf_event *event,
-				      struct perf_sample *sample,
-				      struct perf_tool *tool,
-				      u64 file_offset);
-
-static int flush_sample_queue(struct perf_session *s,
-		       struct perf_tool *tool)
-{
-	struct ordered_samples *os = &s->ordered_samples;
-	struct list_head *head = &os->samples;
-	struct sample_queue *tmp, *iter;
-	struct perf_sample sample;
-	u64 limit = os->next_flush;
-	u64 last_ts = os->last_sample ? os->last_sample->timestamp : 0ULL;
-	unsigned idx = 0, progress_next = os->nr_samples / 16;
-	bool show_progress = limit == ULLONG_MAX;
-	int ret;
-
-	if (!tool->ordered_samples || !limit)
-		return 0;
-
-	list_for_each_entry_safe(iter, tmp, head, list) {
-		if (session_done())
-			return 0;
-
-		if (iter->timestamp > limit)
-			break;
-
-		ret = perf_evlist__parse_sample(s->evlist, iter->event, &sample);
-		if (ret)
-			pr_err("Can't parse sample, err = %d\n", ret);
-		else {
-			ret = perf_session_deliver_event(s, iter->event, &sample, tool,
-							 iter->file_offset);
-			if (ret)
-				return ret;
-		}
-
-		os->last_flush = iter->timestamp;
-		list_del(&iter->list);
-		list_add(&iter->list, &os->sample_cache);
-		if (show_progress && (++idx >= progress_next)) {
-			progress_next += os->nr_samples / 16;
-			ui_progress__update(idx, os->nr_samples,
-					    "Processing time ordered events...");
-		}
-	}
-
-	if (list_empty(head)) {
-		os->last_sample = NULL;
-	} else if (last_ts <= limit) {
-		os->last_sample =
-			list_entry(head->prev, struct sample_queue, list);
-	}
-
-	os->nr_samples = 0;
-
-	return 0;
-}
-
-/*
- * When perf record finishes a pass on every buffers, it records this pseudo
- * event.
- * We record the max timestamp t found in the pass n.
- * Assuming these timestamps are monotonic across cpus, we know that if
- * a buffer still has events with timestamps below t, they will be all
- * available and then read in the pass n + 1.
- * Hence when we start to read the pass n + 2, we can safely flush every
- * events with timestamps below t.
- *
- *    ============ PASS n =================
- *       CPU 0         |   CPU 1
- *                     |
- *    cnt1 timestamps  |   cnt2 timestamps
- *          1          |         2
- *          2          |         3
- *          -          |         4  <--- max recorded
- *
- *    ============ PASS n + 1 ==============
- *       CPU 0         |   CPU 1
- *                     |
- *    cnt1 timestamps  |   cnt2 timestamps
- *          3          |         5
- *          4          |         6
- *          5          |         7 <---- max recorded
- *
- *      Flush every events below timestamp 4
- *
- *    ============ PASS n + 2 ==============
- *       CPU 0         |   CPU 1
- *                     |
- *    cnt1 timestamps  |   cnt2 timestamps
- *          6          |         8
- *          7          |         9
- *          -          |         10
- *
- *      Flush every events below timestamp 7
- *      etc...
- */
-static int process_finished_round(struct perf_tool *tool,
-				  union perf_event *event __maybe_unused,
-				  struct perf_session *session)
-{
-	int ret = flush_sample_queue(session, tool);
-	if (!ret)
-		session->ordered_samples.next_flush = session->ordered_samples.max_timestamp;
-
-	return ret;
-}
-
-/* The queue is ordered by time */
-static void __queue_event(struct sample_queue *new, struct perf_session *s)
-{
-	struct ordered_samples *os = &s->ordered_samples;
-	struct sample_queue *sample = os->last_sample;
-	u64 timestamp = new->timestamp;
-	struct list_head *p;
-
-	++os->nr_samples;
-	os->last_sample = new;
-
-	if (!sample) {
-		list_add(&new->list, &os->samples);
-		os->max_timestamp = timestamp;
-		return;
-	}
-
-	/*
-	 * last_sample might point to some random place in the list as it's
-	 * the last queued event. We expect that the new event is close to
-	 * this.
-	 */
-	if (sample->timestamp <= timestamp) {
-		while (sample->timestamp <= timestamp) {
-			p = sample->list.next;
-			if (p == &os->samples) {
-				list_add_tail(&new->list, &os->samples);
-				os->max_timestamp = timestamp;
-				return;
-			}
-			sample = list_entry(p, struct sample_queue, list);
-		}
-		list_add_tail(&new->list, &sample->list);
-	} else {
-		while (sample->timestamp > timestamp) {
-			p = sample->list.prev;
-			if (p == &os->samples) {
-				list_add(&new->list, &os->samples);
-				return;
-			}
-			sample = list_entry(p, struct sample_queue, list);
-		}
-		list_add(&new->list, &sample->list);
-	}
-}
-
-#define MAX_SAMPLE_BUFFER	(64 * 1024 / sizeof(struct sample_queue))
-
-int perf_session_queue_event(struct perf_session *s, union perf_event *event,
-				    struct perf_sample *sample, u64 file_offset)
-{
-	struct ordered_samples *os = &s->ordered_samples;
-	struct list_head *sc = &os->sample_cache;
-	u64 timestamp = sample->time;
-	struct sample_queue *new;
-
-	if (!timestamp || timestamp == ~0ULL)
-		return -ETIME;
-
-	if (timestamp < s->ordered_samples.last_flush) {
-		printf("Warning: Timestamp below last timeslice flush\n");
-		return -EINVAL;
-	}
-
-	if (!list_empty(sc)) {
-		new = list_entry(sc->next, struct sample_queue, list);
-		list_del(&new->list);
-	} else if (os->sample_buffer) {
-		new = os->sample_buffer + os->sample_buffer_idx;
-		if (++os->sample_buffer_idx == MAX_SAMPLE_BUFFER)
-			os->sample_buffer = NULL;
-	} else {
-		os->sample_buffer = malloc(MAX_SAMPLE_BUFFER * sizeof(*new));
-		if (!os->sample_buffer)
-			return -ENOMEM;
-		list_add(&os->sample_buffer->list, &os->to_free);
-		os->sample_buffer_idx = 2;
-		new = os->sample_buffer + 1;
-	}
-
-	new->timestamp = timestamp;
-	new->file_offset = file_offset;
-	new->event = event;
-
-	__queue_event(new, s);
-
-	return 0;
-}
-
-static void callchain__printf(struct perf_sample *sample)
-{
-	unsigned int i;
-
-	printf("... chain: nr:%" PRIu64 "\n", sample->callchain->nr);
-
-	for (i = 0; i < sample->callchain->nr; i++)
-		printf("..... %2d: %016" PRIx64 "\n",
-		       i, sample->callchain->ips[i]);
-}
-
-static void branch_stack__printf(struct perf_sample *sample)
-{
-	uint64_t i;
-
-	printf("... branch stack: nr:%" PRIu64 "\n", sample->branch_stack->nr);
-
-	for (i = 0; i < sample->branch_stack->nr; i++)
-		printf("..... %2"PRIu64": %016" PRIx64 " -> %016" PRIx64 "\n",
-			i, sample->branch_stack->entries[i].from,
-			sample->branch_stack->entries[i].to);
-}
-
-static void regs_dump__printf(u64 mask, u64 *regs)
-{
-	unsigned rid, i = 0;
-
-	for_each_set_bit(rid, (unsigned long *) &mask, sizeof(mask) * 8) {
-		u64 val = regs[i++];
-
-		printf(".... %-5s 0x%" PRIx64 "\n",
-		       perf_reg_name(rid), val);
-	}
-}
-
-static void regs_user__printf(struct perf_sample *sample, u64 mask)
-{
-	struct regs_dump *user_regs = &sample->user_regs;
-
-	if (user_regs->regs) {
-		printf("... user regs: mask 0x%" PRIx64 "\n", mask);
-		regs_dump__printf(mask, user_regs->regs);
-	}
-}
-
-static void stack_user__printf(struct stack_dump *dump)
-{
-	printf("... ustack: size %" PRIu64 ", offset 0x%x\n",
-	       dump->size, dump->offset);
-}
-
-static void perf_session__print_tstamp(struct perf_session *session,
-				       union perf_event *event,
-				       struct perf_sample *sample)
-{
-	u64 sample_type = __perf_evlist__combined_sample_type(session->evlist);
-
-	if (event->header.type != PERF_RECORD_SAMPLE &&
-	    !perf_evlist__sample_id_all(session->evlist)) {
-		fputs("-1 -1 ", stdout);
-		return;
-	}
-
-	if ((sample_type & PERF_SAMPLE_CPU))
-		printf("%u ", sample->cpu);
-
-	if (sample_type & PERF_SAMPLE_TIME)
-		printf("%" PRIu64 " ", sample->time);
-}
-
-static void sample_read__printf(struct perf_sample *sample, u64 read_format)
-{
-	printf("... sample_read:\n");
-
-	if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
-		printf("...... time enabled %016" PRIx64 "\n",
-		       sample->read.time_enabled);
-
-	if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING)
-		printf("...... time running %016" PRIx64 "\n",
-		       sample->read.time_running);
-
-	if (read_format & PERF_FORMAT_GROUP) {
-		u64 i;
-
-		printf(".... group nr %" PRIu64 "\n", sample->read.group.nr);
-
-		for (i = 0; i < sample->read.group.nr; i++) {
-			struct sample_read_value *value;
-
-			value = &sample->read.group.values[i];
-			printf("..... id %016" PRIx64
-			       ", value %016" PRIx64 "\n",
-			       value->id, value->value);
-		}
-	} else
-		printf("..... id %016" PRIx64 ", value %016" PRIx64 "\n",
-			sample->read.one.id, sample->read.one.value);
-}
-
-static void dump_event(struct perf_session *session, union perf_event *event,
-		       u64 file_offset, struct perf_sample *sample)
-{
-	if (!dump_trace)
-		return;
-
-	printf("\n%#" PRIx64 " [%#x]: event: %d\n",
-	       file_offset, event->header.size, event->header.type);
-
-	trace_event(event);
-
-	if (sample)
-		perf_session__print_tstamp(session, event, sample);
-
-	printf("%#" PRIx64 " [%#x]: PERF_RECORD_%s", file_offset,
-	       event->header.size, perf_event__name(event->header.type));
-}
-
-static void dump_sample(struct perf_evsel *evsel, union perf_event *event,
-			struct perf_sample *sample)
-{
-	u64 sample_type;
-
-	if (!dump_trace)
-		return;
-
-	printf("(IP, %d): %d/%d: %#" PRIx64 " period: %" PRIu64 " addr: %#" PRIx64 "\n",
-	       event->header.misc, sample->pid, sample->tid, sample->ip,
-	       sample->period, sample->addr);
-
-	sample_type = evsel->attr.sample_type;
-
-	if (sample_type & PERF_SAMPLE_CALLCHAIN)
-		callchain__printf(sample);
-
-	if (sample_type & PERF_SAMPLE_BRANCH_STACK)
-		branch_stack__printf(sample);
-
-	if (sample_type & PERF_SAMPLE_REGS_USER)
-		regs_user__printf(sample, evsel->attr.sample_regs_user);
-
-	if (sample_type & PERF_SAMPLE_STACK_USER)
-		stack_user__printf(&sample->user_stack);
-
-	if (sample_type & PERF_SAMPLE_WEIGHT)
-		printf("... weight: %" PRIu64 "\n", sample->weight);
-
-	if (sample_type & PERF_SAMPLE_DATA_SRC)
-		printf(" . data_src: 0x%"PRIx64"\n", sample->data_src);
-
-	if (sample_type & PERF_SAMPLE_READ)
-		sample_read__printf(sample, evsel->attr.read_format);
-}
-
-static struct machine *
-	perf_session__find_machine_for_cpumode(struct perf_session *session,
-					       union perf_event *event,
-					       struct perf_sample *sample)
-{
-	const u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
-	struct machine *machine;
-
-	if (perf_guest &&
-	    ((cpumode == PERF_RECORD_MISC_GUEST_KERNEL) ||
-	     (cpumode == PERF_RECORD_MISC_GUEST_USER))) {
-		u32 pid;
-
-		if (event->header.type == PERF_RECORD_MMAP
-		    || event->header.type == PERF_RECORD_MMAP2)
-			pid = event->mmap.pid;
-		else
-			pid = sample->pid;
-
-		machine = perf_session__find_machine(session, pid);
-		if (!machine)
-			machine = perf_session__findnew_machine(session,
-						DEFAULT_GUEST_KERNEL_ID);
-		return machine;
-	}
-
-	return &session->machines.host;
-}
-
-static int deliver_sample_value(struct perf_session *session,
-				struct perf_tool *tool,
-				union perf_event *event,
-				struct perf_sample *sample,
-				struct sample_read_value *v,
-				struct machine *machine)
-{
-	struct perf_sample_id *sid;
-
-	sid = perf_evlist__id2sid(session->evlist, v->id);
-	if (sid) {
-		sample->id     = v->id;
-		sample->period = v->value - sid->period;
-		sid->period    = v->value;
-	}
-
-	if (!sid || sid->evsel == NULL) {
-		++session->stats.nr_unknown_id;
-		return 0;
-	}
-
-	return tool->sample(tool, event, sample, sid->evsel, machine);
-}
-
-static int deliver_sample_group(struct perf_session *session,
-				struct perf_tool *tool,
-				union  perf_event *event,
-				struct perf_sample *sample,
-				struct machine *machine)
-{
-	int ret = -EINVAL;
-	u64 i;
-
-	for (i = 0; i < sample->read.group.nr; i++) {
-		ret = deliver_sample_value(session, tool, event, sample,
-					   &sample->read.group.values[i],
-					   machine);
-		if (ret)
-			break;
-	}
-
-	return ret;
-}
-
-static int
-perf_session__deliver_sample(struct perf_session *session,
-			     struct perf_tool *tool,
-			     union  perf_event *event,
-			     struct perf_sample *sample,
-			     struct perf_evsel *evsel,
-			     struct machine *machine)
-{
-	/* We know evsel != NULL. */
-	u64 sample_type = evsel->attr.sample_type;
-	u64 read_format = evsel->attr.read_format;
-
-	/* Standard sample delievery. */
-	if (!(sample_type & PERF_SAMPLE_READ))
-		return tool->sample(tool, event, sample, evsel, machine);
-
-	/* For PERF_SAMPLE_READ we have either single or group mode. */
-	if (read_format & PERF_FORMAT_GROUP)
-		return deliver_sample_group(session, tool, event, sample,
-					    machine);
-	else
-		return deliver_sample_value(session, tool, event, sample,
-					    &sample->read.one, machine);
-}
-
-static int perf_session_deliver_event(struct perf_session *session,
-				      union perf_event *event,
-				      struct perf_sample *sample,
-				      struct perf_tool *tool,
-				      u64 file_offset)
-{
-	struct perf_evsel *evsel;
-	struct machine *machine;
-
-	dump_event(session, event, file_offset, sample);
-
-	evsel = perf_evlist__id2evsel(session->evlist, sample->id);
-	if (evsel != NULL && event->header.type != PERF_RECORD_SAMPLE) {
-		/*
-		 * XXX We're leaving PERF_RECORD_SAMPLE unnacounted here
-		 * because the tools right now may apply filters, discarding
-		 * some of the samples. For consistency, in the future we
-		 * should have something like nr_filtered_samples and remove
-		 * the sample->period from total_sample_period, etc, KISS for
-		 * now tho.
-		 *
-		 * Also testing against NULL allows us to handle files without
-		 * attr.sample_id_all and/or without PERF_SAMPLE_ID. In the
-		 * future probably it'll be a good idea to restrict event
-		 * processing via perf_session to files with both set.
-		 */
-		hists__inc_nr_events(&evsel->hists, event->header.type);
-	}
-
-	machine = perf_session__find_machine_for_cpumode(session, event,
-							 sample);
-
-	switch (event->header.type) {
-	case PERF_RECORD_SAMPLE:
-		dump_sample(evsel, event, sample);
-		if (evsel == NULL) {
-			++session->stats.nr_unknown_id;
-			return 0;
-		}
-		if (machine == NULL) {
-			++session->stats.nr_unprocessable_samples;
-			return 0;
-		}
-		return perf_session__deliver_sample(session, tool, event,
-						    sample, evsel, machine);
-	case PERF_RECORD_MMAP:
-		return tool->mmap(tool, event, sample, machine);
-	case PERF_RECORD_MMAP2:
-		return tool->mmap2(tool, event, sample, machine);
-	case PERF_RECORD_COMM:
-		return tool->comm(tool, event, sample, machine);
-	case PERF_RECORD_FORK:
-		return tool->fork(tool, event, sample, machine);
-	case PERF_RECORD_EXIT:
-		return tool->exit(tool, event, sample, machine);
-	case PERF_RECORD_LOST:
-		if (tool->lost == perf_event__process_lost)
-			session->stats.total_lost += event->lost.lost;
-		return tool->lost(tool, event, sample, machine);
-	case PERF_RECORD_READ:
-		return tool->read(tool, event, sample, evsel, machine);
-	case PERF_RECORD_THROTTLE:
-		return tool->throttle(tool, event, sample, machine);
-	case PERF_RECORD_UNTHROTTLE:
-		return tool->unthrottle(tool, event, sample, machine);
-	default:
-		++session->stats.nr_unknown_events;
-		return -1;
-	}
-}
-
-static int perf_session__process_user_event(struct perf_session *session, union perf_event *event,
-					    struct perf_tool *tool, u64 file_offset)
-{
-	int err;
-
-	dump_event(session, event, file_offset, NULL);
-
-	/* These events are processed right away */
-	switch (event->header.type) {
-	case PERF_RECORD_HEADER_ATTR:
-		err = tool->attr(tool, event, &session->evlist);
-		if (err == 0)
-			perf_session__set_id_hdr_size(session);
-		return err;
-	case PERF_RECORD_HEADER_TRACING_DATA:
-		/* setup for reading amidst mmap */
-		lseek(session->fd, file_offset, SEEK_SET);
-		return tool->tracing_data(tool, event, session);
-	case PERF_RECORD_HEADER_BUILD_ID:
-		return tool->build_id(tool, event, session);
-	case PERF_RECORD_FINISHED_ROUND:
-		return tool->finished_round(tool, event, session);
-	default:
-		return -EINVAL;
-	}
-}
-
-static void event_swap(union perf_event *event, bool sample_id_all)
-{
-	perf_event__swap_op swap;
-
-	swap = perf_event__swap_ops[event->header.type];
-	if (swap)
-		swap(event, sample_id_all);
-}
-
-static int perf_session__process_event(struct perf_session *session,
-				       union perf_event *event,
-				       struct perf_tool *tool,
-				       u64 file_offset)
-{
-	struct perf_sample sample;
-	int ret;
-
-	if (session->header.needs_swap)
-		event_swap(event, perf_evlist__sample_id_all(session->evlist));
-
-	if (event->header.type >= PERF_RECORD_HEADER_MAX)
-		return -EINVAL;
-
-	events_stats__inc(&session->stats, event->header.type);
-
-	if (event->header.type >= PERF_RECORD_USER_TYPE_START)
-		return perf_session__process_user_event(session, event, tool, file_offset);
-
-	/*
-	 * For all kernel events we get the sample data
-	 */
-	ret = perf_evlist__parse_sample(session->evlist, event, &sample);
-	if (ret)
-		return ret;
-
-	if (tool->ordered_samples) {
-		ret = perf_session_queue_event(session, event, &sample,
-					       file_offset);
-		if (ret != -ETIME)
-			return ret;
-	}
-
-	return perf_session_deliver_event(session, event, &sample, tool,
-					  file_offset);
-}
-
-void perf_event_header__bswap(struct perf_event_header *self)
-{
-	self->type = bswap_32(self->type);
-	self->misc = bswap_16(self->misc);
-	self->size = bswap_16(self->size);
-}
-
-struct thread *perf_session__findnew(struct perf_session *session, pid_t pid)
-{
-	return machine__findnew_thread(&session->machines.host, 0, pid);
-}
-
-static struct thread *perf_session__register_idle_thread(struct perf_session *self)
-{
-	struct thread *thread = perf_session__findnew(self, 0);
-
-	if (thread == NULL || thread__set_comm(thread, "swapper")) {
-		pr_err("problem inserting idle task.\n");
-		thread = NULL;
-	}
-
-	return thread;
-}
-
-static void perf_session__warn_about_errors(const struct perf_session *session,
-					    const struct perf_tool *tool)
-{
-	if (tool->lost == perf_event__process_lost &&
-	    session->stats.nr_events[PERF_RECORD_LOST] != 0) {
-		ui__warning("Processed %d events and lost %d chunks!\n\n"
-			    "Check IO/CPU overload!\n\n",
-			    session->stats.nr_events[0],
-			    session->stats.nr_events[PERF_RECORD_LOST]);
-	}
-
-	if (session->stats.nr_unknown_events != 0) {
-		ui__warning("Found %u unknown events!\n\n"
-			    "Is this an older tool processing a perf.data "
-			    "file generated by a more recent tool?\n\n"
-			    "If that is not the case, consider "
-			    "reporting to linux-kernel@vger.kernel.org.\n\n",
-			    session->stats.nr_unknown_events);
-	}
-
-	if (session->stats.nr_unknown_id != 0) {
-		ui__warning("%u samples with id not present in the header\n",
-			    session->stats.nr_unknown_id);
-	}
-
- 	if (session->stats.nr_invalid_chains != 0) {
- 		ui__warning("Found invalid callchains!\n\n"
- 			    "%u out of %u events were discarded for this reason.\n\n"
- 			    "Consider reporting to linux-kernel@vger.kernel.org.\n\n",
- 			    session->stats.nr_invalid_chains,
- 			    session->stats.nr_events[PERF_RECORD_SAMPLE]);
- 	}
-
-	if (session->stats.nr_unprocessable_samples != 0) {
-		ui__warning("%u unprocessable samples recorded.\n"
-			    "Do you have a KVM guest running and not using 'perf kvm'?\n",
-			    session->stats.nr_unprocessable_samples);
-	}
-}
-
-volatile int session_done;
-
-static int __perf_session__process_pipe_events(struct perf_session *self,
-					       struct perf_tool *tool)
-{
-	union perf_event *event;
-	uint32_t size, cur_size = 0;
-	void *buf = NULL;
-	int skip = 0;
-	u64 head;
-	int err;
-	void *p;
-
-	perf_tool__fill_defaults(tool);
-
-	head = 0;
-	cur_size = sizeof(union perf_event);
-
-	buf = malloc(cur_size);
-	if (!buf)
-		return -errno;
-more:
-	event = buf;
-	err = readn(self->fd, event, sizeof(struct perf_event_header));
-	if (err <= 0) {
-		if (err == 0)
-			goto done;
-
-		pr_err("failed to read event header\n");
-		goto out_err;
-	}
-
-	if (self->header.needs_swap)
-		perf_event_header__bswap(&event->header);
-
-	size = event->header.size;
-	if (size < sizeof(struct perf_event_header)) {
-		pr_err("bad event header size\n");
-		goto out_err;
-	}
-
-	if (size > cur_size) {
-		void *new = realloc(buf, size);
-		if (!new) {
-			pr_err("failed to allocate memory to read event\n");
-			goto out_err;
-		}
-		buf = new;
-		cur_size = size;
-		event = buf;
-	}
-	p = event;
-	p += sizeof(struct perf_event_header);
-
-	if (size - sizeof(struct perf_event_header)) {
-		err = readn(self->fd, p, size - sizeof(struct perf_event_header));
-		if (err <= 0) {
-			if (err == 0) {
-				pr_err("unexpected end of event stream\n");
-				goto done;
-			}
-
-			pr_err("failed to read event data\n");
-			goto out_err;
-		}
-	}
-
-	if ((skip = perf_session__process_event(self, event, tool, head)) < 0) {
-		pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n",
-		       head, event->header.size, event->header.type);
-		err = -EINVAL;
-		goto out_err;
-	}
-
-	head += size;
-
-	if (skip > 0)
-		head += skip;
-
-	if (!session_done())
-		goto more;
-done:
-	err = 0;
-out_err:
-	free(buf);
-	perf_session__warn_about_errors(self, tool);
-	perf_session_free_sample_buffers(self);
-	return err;
-}
-
-static union perf_event *
-fetch_mmaped_event(struct perf_session *session,
-		   u64 head, size_t mmap_size, char *buf)
-{
-	union perf_event *event;
-
-	/*
-	 * Ensure we have enough space remaining to read
-	 * the size of the event in the headers.
-	 */
-	if (head + sizeof(event->header) > mmap_size)
-		return NULL;
-
-	event = (union perf_event *)(buf + head);
-
-	if (session->header.needs_swap)
-		perf_event_header__bswap(&event->header);
-
-	if (head + event->header.size > mmap_size) {
-		/* We're not fetching the event so swap back again */
-		if (session->header.needs_swap)
-			perf_event_header__bswap(&event->header);
-		return NULL;
-	}
-
-	return event;
-}
-
-/*
- * On 64bit we can mmap the data file in one go. No need for tiny mmap
- * slices. On 32bit we use 32MB.
- */
-#if BITS_PER_LONG == 64
-#define MMAP_SIZE ULLONG_MAX
-#define NUM_MMAPS 1
-#else
-#define MMAP_SIZE (32 * 1024 * 1024ULL)
-#define NUM_MMAPS 128
-#endif
-
-int __perf_session__process_events(struct perf_session *session,
-				   u64 data_offset, u64 data_size,
-				   u64 file_size, struct perf_tool *tool)
-{
-	u64 head, page_offset, file_offset, file_pos, progress_next;
-	int err, mmap_prot, mmap_flags, map_idx = 0;
-	size_t	mmap_size;
-	char *buf, *mmaps[NUM_MMAPS];
-	union perf_event *event;
-	uint32_t size;
-
-	perf_tool__fill_defaults(tool);
-
-	page_offset = page_size * (data_offset / page_size);
-	file_offset = page_offset;
-	head = data_offset - page_offset;
-
-	if (data_size && (data_offset + data_size < file_size))
-		file_size = data_offset + data_size;
-
-	progress_next = file_size / 16;
-
-	mmap_size = MMAP_SIZE;
-	if (mmap_size > file_size)
-		mmap_size = file_size;
-
-	memset(mmaps, 0, sizeof(mmaps));
-
-	mmap_prot  = PROT_READ;
-	mmap_flags = MAP_SHARED;
-
-	if (session->header.needs_swap) {
-		mmap_prot  |= PROT_WRITE;
-		mmap_flags = MAP_PRIVATE;
-	}
-remap:
-	buf = mmap(NULL, mmap_size, mmap_prot, mmap_flags, session->fd,
-		   file_offset);
-	if (buf == MAP_FAILED) {
-		pr_err("failed to mmap file\n");
-		err = -errno;
-		goto out_err;
-	}
-	mmaps[map_idx] = buf;
-	map_idx = (map_idx + 1) & (ARRAY_SIZE(mmaps) - 1);
-	file_pos = file_offset + head;
-
-more:
-	event = fetch_mmaped_event(session, head, mmap_size, buf);
-	if (!event) {
-		if (mmaps[map_idx]) {
-			munmap(mmaps[map_idx], mmap_size);
-			mmaps[map_idx] = NULL;
-		}
-
-		page_offset = page_size * (head / page_size);
-		file_offset += page_offset;
-		head -= page_offset;
-		goto remap;
-	}
-
-	size = event->header.size;
-
-	if (size < sizeof(struct perf_event_header) ||
-	    perf_session__process_event(session, event, tool, file_pos) < 0) {
-		pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n",
-		       file_offset + head, event->header.size,
-		       event->header.type);
-		err = -EINVAL;
-		goto out_err;
-	}
-
-	head += size;
-	file_pos += size;
-
-	if (file_pos >= progress_next) {
-		progress_next += file_size / 16;
-		ui_progress__update(file_pos, file_size,
-				    "Processing events...");
-	}
-
-	err = 0;
-	if (session_done())
-		goto out_err;
-
-	if (file_pos < file_size)
-		goto more;
-
-	/* do the final flush for ordered samples */
-	session->ordered_samples.next_flush = ULLONG_MAX;
-	err = flush_sample_queue(session, tool);
-out_err:
-	ui_progress__finish();
-	perf_session__warn_about_errors(session, tool);
-	perf_session_free_sample_buffers(session);
-	return err;
-}
-
-int perf_session__process_events(struct perf_session *self,
-				 struct perf_tool *tool)
-{
-	int err;
-
-	if (perf_session__register_idle_thread(self) == NULL)
-		return -ENOMEM;
-
-	if (!self->fd_pipe)
-		err = __perf_session__process_events(self,
-						     self->header.data_offset,
-						     self->header.data_size,
-						     self->size, tool);
-	else
-		err = __perf_session__process_pipe_events(self, tool);
-
-	return err;
-}
-
-bool perf_session__has_traces(struct perf_session *session, const char *msg)
-{
-	struct perf_evsel *evsel;
-
-	list_for_each_entry(evsel, &session->evlist->entries, node) {
-		if (evsel->attr.type == PERF_TYPE_TRACEPOINT)
-			return true;
-	}
-
-	pr_err("No trace sample to read. Did you call 'perf %s'?\n", msg);
-	return false;
-}
-
-int maps__set_kallsyms_ref_reloc_sym(struct map **maps,
-				     const char *symbol_name, u64 addr)
-{
-	char *bracket;
-	enum map_type i;
-	struct ref_reloc_sym *ref;
-
-	ref = zalloc(sizeof(struct ref_reloc_sym));
-	if (ref == NULL)
-		return -ENOMEM;
-
-	ref->name = strdup(symbol_name);
-	if (ref->name == NULL) {
-		free(ref);
-		return -ENOMEM;
-	}
-
-	bracket = strchr(ref->name, ']');
-	if (bracket)
-		*bracket = '\0';
-
-	ref->addr = addr;
-
-	for (i = 0; i < MAP__NR_TYPES; ++i) {
-		struct kmap *kmap = map__kmap(maps[i]);
-		kmap->ref_reloc_sym = ref;
-	}
-
-	return 0;
-}
-
-size_t perf_session__fprintf_dsos(struct perf_session *self, FILE *fp)
-{
-	return machines__fprintf_dsos(&self->machines, fp);
-}
-
-size_t perf_session__fprintf_dsos_buildid(struct perf_session *self, FILE *fp,
-					  bool (skip)(struct dso *dso, int parm), int parm)
-{
-	return machines__fprintf_dsos_buildid(&self->machines, fp, skip, parm);
-}
-
-size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp)
-{
-	struct perf_evsel *pos;
-	size_t ret = fprintf(fp, "Aggregated stats:\n");
-
-	ret += events_stats__fprintf(&session->stats, fp);
-
-	list_for_each_entry(pos, &session->evlist->entries, node) {
-		ret += fprintf(fp, "%s stats:\n", perf_evsel__name(pos));
-		ret += events_stats__fprintf(&pos->hists.stats, fp);
-	}
-
-	return ret;
-}
-
-size_t perf_session__fprintf(struct perf_session *session, FILE *fp)
-{
-	/*
-	 * FIXME: Here we have to actually print all the machines in this
-	 * session, not just the host...
-	 */
-	return machine__fprintf(&session->machines.host, fp);
-}
-
-struct perf_evsel *perf_session__find_first_evtype(struct perf_session *session,
-					      unsigned int type)
-{
-	struct perf_evsel *pos;
-
-	list_for_each_entry(pos, &session->evlist->entries, node) {
-		if (pos->attr.type == type)
-			return pos;
-	}
-	return NULL;
-}
-
-void perf_evsel__print_ip(struct perf_evsel *evsel, union perf_event *event,
-			  struct perf_sample *sample, struct machine *machine,
-			  unsigned int print_opts, unsigned int stack_depth)
-{
-	struct addr_location al;
-	struct callchain_cursor_node *node;
-	int print_ip = print_opts & PRINT_IP_OPT_IP;
-	int print_sym = print_opts & PRINT_IP_OPT_SYM;
-	int print_dso = print_opts & PRINT_IP_OPT_DSO;
-	int print_symoffset = print_opts & PRINT_IP_OPT_SYMOFFSET;
-	int print_oneline = print_opts & PRINT_IP_OPT_ONELINE;
-	char s = print_oneline ? ' ' : '\t';
-
-	if (perf_event__preprocess_sample(event, machine, &al, sample) < 0) {
-		error("problem processing %d event, skipping it.\n",
-			event->header.type);
-		return;
-	}
-
-	if (symbol_conf.use_callchain && sample->callchain) {
-
-		if (machine__resolve_callchain(machine, evsel, al.thread,
-					       sample, NULL, NULL) != 0) {
-			if (verbose)
-				error("Failed to resolve callchain. Skipping\n");
-			return;
-		}
-		callchain_cursor_commit(&callchain_cursor);
-
-		while (stack_depth) {
-			node = callchain_cursor_current(&callchain_cursor);
-			if (!node)
-				break;
-
-			if (print_ip)
-				printf("%c%16" PRIx64, s, node->ip);
-
-			if (print_sym) {
-				printf(" ");
-				if (print_symoffset) {
-					al.addr = node->ip;
-					al.map  = node->map;
-					symbol__fprintf_symname_offs(node->sym, &al, stdout);
-				} else
-					symbol__fprintf_symname(node->sym, stdout);
-			}
-
-			if (print_dso) {
-				printf(" (");
-				map__fprintf_dsoname(node->map, stdout);
-				printf(")");
-			}
-
-			if (!print_oneline)
-				printf("\n");
-
-			callchain_cursor_advance(&callchain_cursor);
-
-			stack_depth--;
-		}
-
-	} else {
-		if (print_ip)
-			printf("%16" PRIx64, sample->ip);
-
-		if (print_sym) {
-			printf(" ");
-			if (print_symoffset)
-				symbol__fprintf_symname_offs(al.sym, &al,
-							     stdout);
-			else
-				symbol__fprintf_symname(al.sym, stdout);
-		}
-
-		if (print_dso) {
-			printf(" (");
-			map__fprintf_dsoname(al.map, stdout);
-			printf(")");
-		}
-	}
-}
-
-int perf_session__cpu_bitmap(struct perf_session *session,
-			     const char *cpu_list, unsigned long *cpu_bitmap)
-{
-	int i;
-	struct cpu_map *map;
-
-	for (i = 0; i < PERF_TYPE_MAX; ++i) {
-		struct perf_evsel *evsel;
-
-		evsel = perf_session__find_first_evtype(session, i);
-		if (!evsel)
-			continue;
-
-		if (!(evsel->attr.sample_type & PERF_SAMPLE_CPU)) {
-			pr_err("File does not contain CPU events. "
-			       "Remove -c option to proceed.\n");
-			return -1;
-		}
-	}
-
-	map = cpu_map__new(cpu_list);
-	if (map == NULL) {
-		pr_err("Invalid cpu_list\n");
-		return -1;
-	}
-
-	for (i = 0; i < map->nr; i++) {
-		int cpu = map->map[i];
-
-		if (cpu >= MAX_NR_CPUS) {
-			pr_err("Requested CPU %d too large. "
-			       "Consider raising MAX_NR_CPUS\n", cpu);
-			return -1;
-		}
-
-		set_bit(cpu, cpu_bitmap);
-	}
-
-	return 0;
-}
-
-void perf_session__fprintf_info(struct perf_session *session, FILE *fp,
-				bool full)
-{
-	struct stat st;
-	int ret;
-
-	if (session == NULL || fp == NULL)
-		return;
-
-	ret = fstat(session->fd, &st);
-	if (ret == -1)
-		return;
-
-	fprintf(fp, "# ========\n");
-	fprintf(fp, "# captured on: %s", ctime(&st.st_ctime));
-	perf_header__fprintf_info(session, fp, full);
-	fprintf(fp, "# ========\n#\n");
-}
-
-
-int __perf_session__set_tracepoints_handlers(struct perf_session *session,
-					     const struct perf_evsel_str_handler *assocs,
-					     size_t nr_assocs)
-{
-	struct perf_evsel *evsel;
-	size_t i;
-	int err;
-
-	for (i = 0; i < nr_assocs; i++) {
-		/*
-		 * Adding a handler for an event not in the session,
-		 * just ignore it.
-		 */
-		evsel = perf_evlist__find_tracepoint_by_name(session->evlist, assocs[i].name);
-		if (evsel == NULL)
-			continue;
-
-		err = -EEXIST;
-		if (evsel->handler.func != NULL)
-			goto out;
-		evsel->handler.func = assocs[i].handler;
-	}
-
-	err = 0;
-out:
-	return err;
-}
diff --git a/src/tools/perf/util/session.h b/src/tools/perf/util/session.h
deleted file mode 100644
index 04bf737..0000000
--- a/src/tools/perf/util/session.h
+++ /dev/null
@@ -1,131 +0,0 @@
-#ifndef __PERF_SESSION_H
-#define __PERF_SESSION_H
-
-#include "hist.h"
-#include "event.h"
-#include "header.h"
-#include "machine.h"
-#include "symbol.h"
-#include "thread.h"
-#include <linux/rbtree.h>
-#include <linux/perf_event.h>
-
-struct sample_queue;
-struct ip_callchain;
-struct thread;
-
-struct ordered_samples {
-	u64			last_flush;
-	u64			next_flush;
-	u64			max_timestamp;
-	struct list_head	samples;
-	struct list_head	sample_cache;
-	struct list_head	to_free;
-	struct sample_queue	*sample_buffer;
-	struct sample_queue	*last_sample;
-	int			sample_buffer_idx;
-	unsigned int		nr_samples;
-};
-
-struct perf_session {
-	struct perf_header	header;
-	unsigned long		size;
-	struct machines		machines;
-	struct perf_evlist	*evlist;
-	struct pevent		*pevent;
-	struct events_stats	stats;
-	int			fd;
-	bool			fd_pipe;
-	bool			repipe;
-	struct ordered_samples	ordered_samples;
-	char			filename[1];
-};
-
-#define PRINT_IP_OPT_IP		(1<<0)
-#define PRINT_IP_OPT_SYM		(1<<1)
-#define PRINT_IP_OPT_DSO		(1<<2)
-#define PRINT_IP_OPT_SYMOFFSET	(1<<3)
-#define PRINT_IP_OPT_ONELINE	(1<<4)
-
-struct perf_tool;
-
-struct perf_session *perf_session__new(const char *filename, int mode,
-				       bool force, bool repipe,
-				       struct perf_tool *tool);
-void perf_session__delete(struct perf_session *session);
-
-void perf_event_header__bswap(struct perf_event_header *self);
-
-int __perf_session__process_events(struct perf_session *self,
-				   u64 data_offset, u64 data_size, u64 size,
-				   struct perf_tool *tool);
-int perf_session__process_events(struct perf_session *self,
-				 struct perf_tool *tool);
-
-int perf_session_queue_event(struct perf_session *s, union perf_event *event,
-			     struct perf_sample *sample, u64 file_offset);
-
-void perf_tool__fill_defaults(struct perf_tool *tool);
-
-int perf_session__resolve_callchain(struct perf_session *self, struct perf_evsel *evsel,
-				    struct thread *thread,
-				    struct ip_callchain *chain,
-				    struct symbol **parent);
-
-bool perf_session__has_traces(struct perf_session *self, const char *msg);
-
-void mem_bswap_64(void *src, int byte_size);
-void mem_bswap_32(void *src, int byte_size);
-void perf_event__attr_swap(struct perf_event_attr *attr);
-
-int perf_session__create_kernel_maps(struct perf_session *self);
-
-void perf_session__set_id_hdr_size(struct perf_session *session);
-
-static inline
-struct machine *perf_session__find_machine(struct perf_session *self, pid_t pid)
-{
-	return machines__find(&self->machines, pid);
-}
-
-static inline
-struct machine *perf_session__findnew_machine(struct perf_session *self, pid_t pid)
-{
-	return machines__findnew(&self->machines, pid);
-}
-
-struct thread *perf_session__findnew(struct perf_session *self, pid_t pid);
-size_t perf_session__fprintf(struct perf_session *self, FILE *fp);
-
-size_t perf_session__fprintf_dsos(struct perf_session *self, FILE *fp);
-
-size_t perf_session__fprintf_dsos_buildid(struct perf_session *session, FILE *fp,
-					  bool (fn)(struct dso *dso, int parm), int parm);
-
-size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp);
-
-struct perf_evsel *perf_session__find_first_evtype(struct perf_session *session,
-					    unsigned int type);
-
-void perf_evsel__print_ip(struct perf_evsel *evsel, union perf_event *event,
-			  struct perf_sample *sample, struct machine *machine,
-			  unsigned int print_opts, unsigned int stack_depth);
-
-int perf_session__cpu_bitmap(struct perf_session *session,
-			     const char *cpu_list, unsigned long *cpu_bitmap);
-
-void perf_session__fprintf_info(struct perf_session *s, FILE *fp, bool full);
-
-struct perf_evsel_str_handler;
-
-int __perf_session__set_tracepoints_handlers(struct perf_session *session,
-					     const struct perf_evsel_str_handler *assocs,
-					     size_t nr_assocs);
-
-#define perf_session__set_tracepoints_handlers(session, array) \
-	__perf_session__set_tracepoints_handlers(session, array, ARRAY_SIZE(array))
-
-extern volatile int session_done;
-
-#define session_done()	(*(volatile int *)(&session_done))
-#endif /* __PERF_SESSION_H */
diff --git a/src/tools/perf/util/setup.py b/src/tools/perf/util/setup.py
deleted file mode 100644
index 58ea5ca..0000000
--- a/src/tools/perf/util/setup.py
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/python2
-
-from distutils.core import setup, Extension
-from os import getenv
-
-from distutils.command.build_ext   import build_ext   as _build_ext
-from distutils.command.install_lib import install_lib as _install_lib
-
-class build_ext(_build_ext):
-    def finalize_options(self):
-        _build_ext.finalize_options(self)
-        self.build_lib  = build_lib
-        self.build_temp = build_tmp
-
-class install_lib(_install_lib):
-    def finalize_options(self):
-        _install_lib.finalize_options(self)
-        self.build_dir = build_lib
-
-
-cflags = getenv('CFLAGS', '').split()
-# switch off several checks (need to be at the end of cflags list)
-cflags += ['-fno-strict-aliasing', '-Wno-write-strings', '-Wno-unused-parameter' ]
-
-build_lib = getenv('PYTHON_EXTBUILD_LIB')
-build_tmp = getenv('PYTHON_EXTBUILD_TMP')
-libtraceevent = getenv('LIBTRACEEVENT')
-liblk = getenv('LIBLK')
-
-ext_sources = [f.strip() for f in file('util/python-ext-sources')
-				if len(f.strip()) > 0 and f[0] != '#']
-
-perf = Extension('perf',
-		  sources = ext_sources,
-		  include_dirs = ['util/include'],
-		  extra_compile_args = cflags,
-		  extra_objects = [libtraceevent, liblk],
-                 )
-
-setup(name='perf',
-      version='0.1',
-      description='Interface with the Linux profiling infrastructure',
-      author='Arnaldo Carvalho de Melo',
-      author_email='acme@redhat.com',
-      license='GPLv2',
-      url='http://perf.wiki.kernel.org',
-      ext_modules=[perf],
-      cmdclass={'build_ext': build_ext, 'install_lib': install_lib})
diff --git a/src/tools/perf/util/sigchain.c b/src/tools/perf/util/sigchain.c
deleted file mode 100644
index ba785e9..0000000
--- a/src/tools/perf/util/sigchain.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include "sigchain.h"
-#include "cache.h"
-
-#define SIGCHAIN_MAX_SIGNALS 32
-
-struct sigchain_signal {
-	sigchain_fun *old;
-	int n;
-	int alloc;
-};
-static struct sigchain_signal signals[SIGCHAIN_MAX_SIGNALS];
-
-static void check_signum(int sig)
-{
-	if (sig < 1 || sig >= SIGCHAIN_MAX_SIGNALS)
-		die("BUG: signal out of range: %d", sig);
-}
-
-static int sigchain_push(int sig, sigchain_fun f)
-{
-	struct sigchain_signal *s = signals + sig;
-	check_signum(sig);
-
-	ALLOC_GROW(s->old, s->n + 1, s->alloc);
-	s->old[s->n] = signal(sig, f);
-	if (s->old[s->n] == SIG_ERR)
-		return -1;
-	s->n++;
-	return 0;
-}
-
-int sigchain_pop(int sig)
-{
-	struct sigchain_signal *s = signals + sig;
-	check_signum(sig);
-	if (s->n < 1)
-		return 0;
-
-	if (signal(sig, s->old[s->n - 1]) == SIG_ERR)
-		return -1;
-	s->n--;
-	return 0;
-}
-
-void sigchain_push_common(sigchain_fun f)
-{
-	sigchain_push(SIGINT, f);
-	sigchain_push(SIGHUP, f);
-	sigchain_push(SIGTERM, f);
-	sigchain_push(SIGQUIT, f);
-	sigchain_push(SIGPIPE, f);
-}
diff --git a/src/tools/perf/util/sigchain.h b/src/tools/perf/util/sigchain.h
deleted file mode 100644
index 959d64e..0000000
--- a/src/tools/perf/util/sigchain.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef __PERF_SIGCHAIN_H
-#define __PERF_SIGCHAIN_H
-
-typedef void (*sigchain_fun)(int);
-
-int sigchain_pop(int sig);
-
-void sigchain_push_common(sigchain_fun f);
-
-#endif /* __PERF_SIGCHAIN_H */
diff --git a/src/tools/perf/util/sort.c b/src/tools/perf/util/sort.c
deleted file mode 100644
index 5f118a0..0000000
--- a/src/tools/perf/util/sort.c
+++ /dev/null
@@ -1,1061 +0,0 @@
-#include "sort.h"
-#include "hist.h"
-#include "symbol.h"
-
-regex_t		parent_regex;
-const char	default_parent_pattern[] = "^sys_|^do_page_fault";
-const char	*parent_pattern = default_parent_pattern;
-const char	default_sort_order[] = "comm,dso,symbol";
-const char	*sort_order = default_sort_order;
-regex_t		ignore_callees_regex;
-int		have_ignore_callees = 0;
-int		sort__need_collapse = 0;
-int		sort__has_parent = 0;
-int		sort__has_sym = 0;
-enum sort_mode	sort__mode = SORT_MODE__NORMAL;
-
-enum sort_type	sort__first_dimension;
-
-LIST_HEAD(hist_entry__sort_list);
-
-static int repsep_snprintf(char *bf, size_t size, const char *fmt, ...)
-{
-	int n;
-	va_list ap;
-
-	va_start(ap, fmt);
-	n = vsnprintf(bf, size, fmt, ap);
-	if (symbol_conf.field_sep && n > 0) {
-		char *sep = bf;
-
-		while (1) {
-			sep = strchr(sep, *symbol_conf.field_sep);
-			if (sep == NULL)
-				break;
-			*sep = '.';
-		}
-	}
-	va_end(ap);
-
-	if (n >= (int)size)
-		return size - 1;
-	return n;
-}
-
-static int64_t cmp_null(void *l, void *r)
-{
-	if (!l && !r)
-		return 0;
-	else if (!l)
-		return -1;
-	else
-		return 1;
-}
-
-/* --sort pid */
-
-static int64_t
-sort__thread_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	return right->thread->tid - left->thread->tid;
-}
-
-static int hist_entry__thread_snprintf(struct hist_entry *self, char *bf,
-				       size_t size, unsigned int width)
-{
-	return repsep_snprintf(bf, size, "%*s:%5d", width - 6,
-			      self->thread->comm ?: "", self->thread->tid);
-}
-
-struct sort_entry sort_thread = {
-	.se_header	= "Command:  Pid",
-	.se_cmp		= sort__thread_cmp,
-	.se_snprintf	= hist_entry__thread_snprintf,
-	.se_width_idx	= HISTC_THREAD,
-};
-
-/* --sort comm */
-
-static int64_t
-sort__comm_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	return right->thread->tid - left->thread->tid;
-}
-
-static int64_t
-sort__comm_collapse(struct hist_entry *left, struct hist_entry *right)
-{
-	char *comm_l = left->thread->comm;
-	char *comm_r = right->thread->comm;
-
-	if (!comm_l || !comm_r)
-		return cmp_null(comm_l, comm_r);
-
-	return strcmp(comm_l, comm_r);
-}
-
-static int hist_entry__comm_snprintf(struct hist_entry *self, char *bf,
-				     size_t size, unsigned int width)
-{
-	return repsep_snprintf(bf, size, "%*s", width, self->thread->comm);
-}
-
-struct sort_entry sort_comm = {
-	.se_header	= "Command",
-	.se_cmp		= sort__comm_cmp,
-	.se_collapse	= sort__comm_collapse,
-	.se_snprintf	= hist_entry__comm_snprintf,
-	.se_width_idx	= HISTC_COMM,
-};
-
-/* --sort dso */
-
-static int64_t _sort__dso_cmp(struct map *map_l, struct map *map_r)
-{
-	struct dso *dso_l = map_l ? map_l->dso : NULL;
-	struct dso *dso_r = map_r ? map_r->dso : NULL;
-	const char *dso_name_l, *dso_name_r;
-
-	if (!dso_l || !dso_r)
-		return cmp_null(dso_l, dso_r);
-
-	if (verbose) {
-		dso_name_l = dso_l->long_name;
-		dso_name_r = dso_r->long_name;
-	} else {
-		dso_name_l = dso_l->short_name;
-		dso_name_r = dso_r->short_name;
-	}
-
-	return strcmp(dso_name_l, dso_name_r);
-}
-
-static int64_t
-sort__dso_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	return _sort__dso_cmp(left->ms.map, right->ms.map);
-}
-
-static int _hist_entry__dso_snprintf(struct map *map, char *bf,
-				     size_t size, unsigned int width)
-{
-	if (map && map->dso) {
-		const char *dso_name = !verbose ? map->dso->short_name :
-			map->dso->long_name;
-		return repsep_snprintf(bf, size, "%-*s", width, dso_name);
-	}
-
-	return repsep_snprintf(bf, size, "%-*s", width, "[unknown]");
-}
-
-static int hist_entry__dso_snprintf(struct hist_entry *self, char *bf,
-				    size_t size, unsigned int width)
-{
-	return _hist_entry__dso_snprintf(self->ms.map, bf, size, width);
-}
-
-struct sort_entry sort_dso = {
-	.se_header	= "Shared Object",
-	.se_cmp		= sort__dso_cmp,
-	.se_snprintf	= hist_entry__dso_snprintf,
-	.se_width_idx	= HISTC_DSO,
-};
-
-/* --sort symbol */
-
-static int64_t _sort__sym_cmp(struct symbol *sym_l, struct symbol *sym_r)
-{
-	u64 ip_l, ip_r;
-
-	if (!sym_l || !sym_r)
-		return cmp_null(sym_l, sym_r);
-
-	if (sym_l == sym_r)
-		return 0;
-
-	ip_l = sym_l->start;
-	ip_r = sym_r->start;
-
-	return (int64_t)(ip_r - ip_l);
-}
-
-static int64_t
-sort__sym_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	if (!left->ms.sym && !right->ms.sym)
-		return right->level - left->level;
-
-	return _sort__sym_cmp(left->ms.sym, right->ms.sym);
-}
-
-static int _hist_entry__sym_snprintf(struct map *map, struct symbol *sym,
-				     u64 ip, char level, char *bf, size_t size,
-				     unsigned int width)
-{
-	size_t ret = 0;
-
-	if (verbose) {
-		char o = map ? dso__symtab_origin(map->dso) : '!';
-		ret += repsep_snprintf(bf, size, "%-#*llx %c ",
-				       BITS_PER_LONG / 4 + 2, ip, o);
-	}
-
-	ret += repsep_snprintf(bf + ret, size - ret, "[%c] ", level);
-	if (sym && map) {
-		if (map->type == MAP__VARIABLE) {
-			ret += repsep_snprintf(bf + ret, size - ret, "%s", sym->name);
-			ret += repsep_snprintf(bf + ret, size - ret, "+0x%llx",
-					ip - map->unmap_ip(map, sym->start));
-			ret += repsep_snprintf(bf + ret, size - ret, "%-*s",
-				       width - ret, "");
-		} else {
-			ret += repsep_snprintf(bf + ret, size - ret, "%-*s",
-					       width - ret,
-					       sym->name);
-		}
-	} else {
-		size_t len = BITS_PER_LONG / 4;
-		ret += repsep_snprintf(bf + ret, size - ret, "%-#.*llx",
-				       len, ip);
-		ret += repsep_snprintf(bf + ret, size - ret, "%-*s",
-				       width - ret, "");
-	}
-
-	return ret;
-}
-
-static int hist_entry__sym_snprintf(struct hist_entry *self, char *bf,
-				    size_t size, unsigned int width)
-{
-	return _hist_entry__sym_snprintf(self->ms.map, self->ms.sym, self->ip,
-					 self->level, bf, size, width);
-}
-
-struct sort_entry sort_sym = {
-	.se_header	= "Symbol",
-	.se_cmp		= sort__sym_cmp,
-	.se_snprintf	= hist_entry__sym_snprintf,
-	.se_width_idx	= HISTC_SYMBOL,
-};
-
-/* --sort srcline */
-
-static int64_t
-sort__srcline_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	return (int64_t)(right->ip - left->ip);
-}
-
-static int hist_entry__srcline_snprintf(struct hist_entry *self, char *bf,
-					size_t size,
-					unsigned int width __maybe_unused)
-{
-	FILE *fp = NULL;
-	char cmd[PATH_MAX + 2], *path = self->srcline, *nl;
-	size_t line_len;
-
-	if (path != NULL)
-		goto out_path;
-
-	if (!self->ms.map)
-		goto out_ip;
-
-	if (!strncmp(self->ms.map->dso->long_name, "/tmp/perf-", 10))
-		goto out_ip;
-
-	snprintf(cmd, sizeof(cmd), "addr2line -e %s %016" PRIx64,
-		 self->ms.map->dso->long_name, self->ip);
-	fp = popen(cmd, "r");
-	if (!fp)
-		goto out_ip;
-
-	if (getline(&path, &line_len, fp) < 0 || !line_len)
-		goto out_ip;
-	self->srcline = strdup(path);
-	if (self->srcline == NULL)
-		goto out_ip;
-
-	nl = strchr(self->srcline, '\n');
-	if (nl != NULL)
-		*nl = '\0';
-	path = self->srcline;
-out_path:
-	if (fp)
-		pclose(fp);
-	return repsep_snprintf(bf, size, "%s", path);
-out_ip:
-	if (fp)
-		pclose(fp);
-	return repsep_snprintf(bf, size, "%-#*llx", BITS_PER_LONG / 4, self->ip);
-}
-
-struct sort_entry sort_srcline = {
-	.se_header	= "Source:Line",
-	.se_cmp		= sort__srcline_cmp,
-	.se_snprintf	= hist_entry__srcline_snprintf,
-	.se_width_idx	= HISTC_SRCLINE,
-};
-
-/* --sort parent */
-
-static int64_t
-sort__parent_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	struct symbol *sym_l = left->parent;
-	struct symbol *sym_r = right->parent;
-
-	if (!sym_l || !sym_r)
-		return cmp_null(sym_l, sym_r);
-
-	return strcmp(sym_l->name, sym_r->name);
-}
-
-static int hist_entry__parent_snprintf(struct hist_entry *self, char *bf,
-				       size_t size, unsigned int width)
-{
-	return repsep_snprintf(bf, size, "%-*s", width,
-			      self->parent ? self->parent->name : "[other]");
-}
-
-struct sort_entry sort_parent = {
-	.se_header	= "Parent symbol",
-	.se_cmp		= sort__parent_cmp,
-	.se_snprintf	= hist_entry__parent_snprintf,
-	.se_width_idx	= HISTC_PARENT,
-};
-
-/* --sort cpu */
-
-static int64_t
-sort__cpu_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	return right->cpu - left->cpu;
-}
-
-static int hist_entry__cpu_snprintf(struct hist_entry *self, char *bf,
-				       size_t size, unsigned int width)
-{
-	return repsep_snprintf(bf, size, "%*d", width, self->cpu);
-}
-
-struct sort_entry sort_cpu = {
-	.se_header      = "CPU",
-	.se_cmp	        = sort__cpu_cmp,
-	.se_snprintf    = hist_entry__cpu_snprintf,
-	.se_width_idx	= HISTC_CPU,
-};
-
-/* sort keys for branch stacks */
-
-static int64_t
-sort__dso_from_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	return _sort__dso_cmp(left->branch_info->from.map,
-			      right->branch_info->from.map);
-}
-
-static int hist_entry__dso_from_snprintf(struct hist_entry *self, char *bf,
-				    size_t size, unsigned int width)
-{
-	return _hist_entry__dso_snprintf(self->branch_info->from.map,
-					 bf, size, width);
-}
-
-static int64_t
-sort__dso_to_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	return _sort__dso_cmp(left->branch_info->to.map,
-			      right->branch_info->to.map);
-}
-
-static int hist_entry__dso_to_snprintf(struct hist_entry *self, char *bf,
-				       size_t size, unsigned int width)
-{
-	return _hist_entry__dso_snprintf(self->branch_info->to.map,
-					 bf, size, width);
-}
-
-static int64_t
-sort__sym_from_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	struct addr_map_symbol *from_l = &left->branch_info->from;
-	struct addr_map_symbol *from_r = &right->branch_info->from;
-
-	if (!from_l->sym && !from_r->sym)
-		return right->level - left->level;
-
-	return _sort__sym_cmp(from_l->sym, from_r->sym);
-}
-
-static int64_t
-sort__sym_to_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	struct addr_map_symbol *to_l = &left->branch_info->to;
-	struct addr_map_symbol *to_r = &right->branch_info->to;
-
-	if (!to_l->sym && !to_r->sym)
-		return right->level - left->level;
-
-	return _sort__sym_cmp(to_l->sym, to_r->sym);
-}
-
-static int hist_entry__sym_from_snprintf(struct hist_entry *self, char *bf,
-					 size_t size, unsigned int width)
-{
-	struct addr_map_symbol *from = &self->branch_info->from;
-	return _hist_entry__sym_snprintf(from->map, from->sym, from->addr,
-					 self->level, bf, size, width);
-
-}
-
-static int hist_entry__sym_to_snprintf(struct hist_entry *self, char *bf,
-				       size_t size, unsigned int width)
-{
-	struct addr_map_symbol *to = &self->branch_info->to;
-	return _hist_entry__sym_snprintf(to->map, to->sym, to->addr,
-					 self->level, bf, size, width);
-
-}
-
-struct sort_entry sort_dso_from = {
-	.se_header	= "Source Shared Object",
-	.se_cmp		= sort__dso_from_cmp,
-	.se_snprintf	= hist_entry__dso_from_snprintf,
-	.se_width_idx	= HISTC_DSO_FROM,
-};
-
-struct sort_entry sort_dso_to = {
-	.se_header	= "Target Shared Object",
-	.se_cmp		= sort__dso_to_cmp,
-	.se_snprintf	= hist_entry__dso_to_snprintf,
-	.se_width_idx	= HISTC_DSO_TO,
-};
-
-struct sort_entry sort_sym_from = {
-	.se_header	= "Source Symbol",
-	.se_cmp		= sort__sym_from_cmp,
-	.se_snprintf	= hist_entry__sym_from_snprintf,
-	.se_width_idx	= HISTC_SYMBOL_FROM,
-};
-
-struct sort_entry sort_sym_to = {
-	.se_header	= "Target Symbol",
-	.se_cmp		= sort__sym_to_cmp,
-	.se_snprintf	= hist_entry__sym_to_snprintf,
-	.se_width_idx	= HISTC_SYMBOL_TO,
-};
-
-static int64_t
-sort__mispredict_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	const unsigned char mp = left->branch_info->flags.mispred !=
-					right->branch_info->flags.mispred;
-	const unsigned char p = left->branch_info->flags.predicted !=
-					right->branch_info->flags.predicted;
-
-	return mp || p;
-}
-
-static int hist_entry__mispredict_snprintf(struct hist_entry *self, char *bf,
-				    size_t size, unsigned int width){
-	static const char *out = "N/A";
-
-	if (self->branch_info->flags.predicted)
-		out = "N";
-	else if (self->branch_info->flags.mispred)
-		out = "Y";
-
-	return repsep_snprintf(bf, size, "%-*s", width, out);
-}
-
-/* --sort daddr_sym */
-static int64_t
-sort__daddr_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	uint64_t l = 0, r = 0;
-
-	if (left->mem_info)
-		l = left->mem_info->daddr.addr;
-	if (right->mem_info)
-		r = right->mem_info->daddr.addr;
-
-	return (int64_t)(r - l);
-}
-
-static int hist_entry__daddr_snprintf(struct hist_entry *self, char *bf,
-				    size_t size, unsigned int width)
-{
-	uint64_t addr = 0;
-	struct map *map = NULL;
-	struct symbol *sym = NULL;
-
-	if (self->mem_info) {
-		addr = self->mem_info->daddr.addr;
-		map = self->mem_info->daddr.map;
-		sym = self->mem_info->daddr.sym;
-	}
-	return _hist_entry__sym_snprintf(map, sym, addr, self->level, bf, size,
-					 width);
-}
-
-static int64_t
-sort__dso_daddr_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	struct map *map_l = NULL;
-	struct map *map_r = NULL;
-
-	if (left->mem_info)
-		map_l = left->mem_info->daddr.map;
-	if (right->mem_info)
-		map_r = right->mem_info->daddr.map;
-
-	return _sort__dso_cmp(map_l, map_r);
-}
-
-static int hist_entry__dso_daddr_snprintf(struct hist_entry *self, char *bf,
-				    size_t size, unsigned int width)
-{
-	struct map *map = NULL;
-
-	if (self->mem_info)
-		map = self->mem_info->daddr.map;
-
-	return _hist_entry__dso_snprintf(map, bf, size, width);
-}
-
-static int64_t
-sort__locked_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	union perf_mem_data_src data_src_l;
-	union perf_mem_data_src data_src_r;
-
-	if (left->mem_info)
-		data_src_l = left->mem_info->data_src;
-	else
-		data_src_l.mem_lock = PERF_MEM_LOCK_NA;
-
-	if (right->mem_info)
-		data_src_r = right->mem_info->data_src;
-	else
-		data_src_r.mem_lock = PERF_MEM_LOCK_NA;
-
-	return (int64_t)(data_src_r.mem_lock - data_src_l.mem_lock);
-}
-
-static int hist_entry__locked_snprintf(struct hist_entry *self, char *bf,
-				    size_t size, unsigned int width)
-{
-	const char *out;
-	u64 mask = PERF_MEM_LOCK_NA;
-
-	if (self->mem_info)
-		mask = self->mem_info->data_src.mem_lock;
-
-	if (mask & PERF_MEM_LOCK_NA)
-		out = "N/A";
-	else if (mask & PERF_MEM_LOCK_LOCKED)
-		out = "Yes";
-	else
-		out = "No";
-
-	return repsep_snprintf(bf, size, "%-*s", width, out);
-}
-
-static int64_t
-sort__tlb_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	union perf_mem_data_src data_src_l;
-	union perf_mem_data_src data_src_r;
-
-	if (left->mem_info)
-		data_src_l = left->mem_info->data_src;
-	else
-		data_src_l.mem_dtlb = PERF_MEM_TLB_NA;
-
-	if (right->mem_info)
-		data_src_r = right->mem_info->data_src;
-	else
-		data_src_r.mem_dtlb = PERF_MEM_TLB_NA;
-
-	return (int64_t)(data_src_r.mem_dtlb - data_src_l.mem_dtlb);
-}
-
-static const char * const tlb_access[] = {
-	"N/A",
-	"HIT",
-	"MISS",
-	"L1",
-	"L2",
-	"Walker",
-	"Fault",
-};
-#define NUM_TLB_ACCESS (sizeof(tlb_access)/sizeof(const char *))
-
-static int hist_entry__tlb_snprintf(struct hist_entry *self, char *bf,
-				    size_t size, unsigned int width)
-{
-	char out[64];
-	size_t sz = sizeof(out) - 1; /* -1 for null termination */
-	size_t l = 0, i;
-	u64 m = PERF_MEM_TLB_NA;
-	u64 hit, miss;
-
-	out[0] = '\0';
-
-	if (self->mem_info)
-		m = self->mem_info->data_src.mem_dtlb;
-
-	hit = m & PERF_MEM_TLB_HIT;
-	miss = m & PERF_MEM_TLB_MISS;
-
-	/* already taken care of */
-	m &= ~(PERF_MEM_TLB_HIT|PERF_MEM_TLB_MISS);
-
-	for (i = 0; m && i < NUM_TLB_ACCESS; i++, m >>= 1) {
-		if (!(m & 0x1))
-			continue;
-		if (l) {
-			strcat(out, " or ");
-			l += 4;
-		}
-		strncat(out, tlb_access[i], sz - l);
-		l += strlen(tlb_access[i]);
-	}
-	if (*out == '\0')
-		strcpy(out, "N/A");
-	if (hit)
-		strncat(out, " hit", sz - l);
-	if (miss)
-		strncat(out, " miss", sz - l);
-
-	return repsep_snprintf(bf, size, "%-*s", width, out);
-}
-
-static int64_t
-sort__lvl_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	union perf_mem_data_src data_src_l;
-	union perf_mem_data_src data_src_r;
-
-	if (left->mem_info)
-		data_src_l = left->mem_info->data_src;
-	else
-		data_src_l.mem_lvl = PERF_MEM_LVL_NA;
-
-	if (right->mem_info)
-		data_src_r = right->mem_info->data_src;
-	else
-		data_src_r.mem_lvl = PERF_MEM_LVL_NA;
-
-	return (int64_t)(data_src_r.mem_lvl - data_src_l.mem_lvl);
-}
-
-static const char * const mem_lvl[] = {
-	"N/A",
-	"HIT",
-	"MISS",
-	"L1",
-	"LFB",
-	"L2",
-	"L3",
-	"Local RAM",
-	"Remote RAM (1 hop)",
-	"Remote RAM (2 hops)",
-	"Remote Cache (1 hop)",
-	"Remote Cache (2 hops)",
-	"I/O",
-	"Uncached",
-};
-#define NUM_MEM_LVL (sizeof(mem_lvl)/sizeof(const char *))
-
-static int hist_entry__lvl_snprintf(struct hist_entry *self, char *bf,
-				    size_t size, unsigned int width)
-{
-	char out[64];
-	size_t sz = sizeof(out) - 1; /* -1 for null termination */
-	size_t i, l = 0;
-	u64 m =  PERF_MEM_LVL_NA;
-	u64 hit, miss;
-
-	if (self->mem_info)
-		m  = self->mem_info->data_src.mem_lvl;
-
-	out[0] = '\0';
-
-	hit = m & PERF_MEM_LVL_HIT;
-	miss = m & PERF_MEM_LVL_MISS;
-
-	/* already taken care of */
-	m &= ~(PERF_MEM_LVL_HIT|PERF_MEM_LVL_MISS);
-
-	for (i = 0; m && i < NUM_MEM_LVL; i++, m >>= 1) {
-		if (!(m & 0x1))
-			continue;
-		if (l) {
-			strcat(out, " or ");
-			l += 4;
-		}
-		strncat(out, mem_lvl[i], sz - l);
-		l += strlen(mem_lvl[i]);
-	}
-	if (*out == '\0')
-		strcpy(out, "N/A");
-	if (hit)
-		strncat(out, " hit", sz - l);
-	if (miss)
-		strncat(out, " miss", sz - l);
-
-	return repsep_snprintf(bf, size, "%-*s", width, out);
-}
-
-static int64_t
-sort__snoop_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	union perf_mem_data_src data_src_l;
-	union perf_mem_data_src data_src_r;
-
-	if (left->mem_info)
-		data_src_l = left->mem_info->data_src;
-	else
-		data_src_l.mem_snoop = PERF_MEM_SNOOP_NA;
-
-	if (right->mem_info)
-		data_src_r = right->mem_info->data_src;
-	else
-		data_src_r.mem_snoop = PERF_MEM_SNOOP_NA;
-
-	return (int64_t)(data_src_r.mem_snoop - data_src_l.mem_snoop);
-}
-
-static const char * const snoop_access[] = {
-	"N/A",
-	"None",
-	"Miss",
-	"Hit",
-	"HitM",
-};
-#define NUM_SNOOP_ACCESS (sizeof(snoop_access)/sizeof(const char *))
-
-static int hist_entry__snoop_snprintf(struct hist_entry *self, char *bf,
-				    size_t size, unsigned int width)
-{
-	char out[64];
-	size_t sz = sizeof(out) - 1; /* -1 for null termination */
-	size_t i, l = 0;
-	u64 m = PERF_MEM_SNOOP_NA;
-
-	out[0] = '\0';
-
-	if (self->mem_info)
-		m = self->mem_info->data_src.mem_snoop;
-
-	for (i = 0; m && i < NUM_SNOOP_ACCESS; i++, m >>= 1) {
-		if (!(m & 0x1))
-			continue;
-		if (l) {
-			strcat(out, " or ");
-			l += 4;
-		}
-		strncat(out, snoop_access[i], sz - l);
-		l += strlen(snoop_access[i]);
-	}
-
-	if (*out == '\0')
-		strcpy(out, "N/A");
-
-	return repsep_snprintf(bf, size, "%-*s", width, out);
-}
-
-struct sort_entry sort_mispredict = {
-	.se_header	= "Branch Mispredicted",
-	.se_cmp		= sort__mispredict_cmp,
-	.se_snprintf	= hist_entry__mispredict_snprintf,
-	.se_width_idx	= HISTC_MISPREDICT,
-};
-
-static u64 he_weight(struct hist_entry *he)
-{
-	return he->stat.nr_events ? he->stat.weight / he->stat.nr_events : 0;
-}
-
-static int64_t
-sort__local_weight_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	return he_weight(left) - he_weight(right);
-}
-
-static int hist_entry__local_weight_snprintf(struct hist_entry *self, char *bf,
-				    size_t size, unsigned int width)
-{
-	return repsep_snprintf(bf, size, "%-*llu", width, he_weight(self));
-}
-
-struct sort_entry sort_local_weight = {
-	.se_header	= "Local Weight",
-	.se_cmp		= sort__local_weight_cmp,
-	.se_snprintf	= hist_entry__local_weight_snprintf,
-	.se_width_idx	= HISTC_LOCAL_WEIGHT,
-};
-
-static int64_t
-sort__global_weight_cmp(struct hist_entry *left, struct hist_entry *right)
-{
-	return left->stat.weight - right->stat.weight;
-}
-
-static int hist_entry__global_weight_snprintf(struct hist_entry *self, char *bf,
-					      size_t size, unsigned int width)
-{
-	return repsep_snprintf(bf, size, "%-*llu", width, self->stat.weight);
-}
-
-struct sort_entry sort_global_weight = {
-	.se_header	= "Weight",
-	.se_cmp		= sort__global_weight_cmp,
-	.se_snprintf	= hist_entry__global_weight_snprintf,
-	.se_width_idx	= HISTC_GLOBAL_WEIGHT,
-};
-
-struct sort_entry sort_mem_daddr_sym = {
-	.se_header	= "Data Symbol",
-	.se_cmp		= sort__daddr_cmp,
-	.se_snprintf	= hist_entry__daddr_snprintf,
-	.se_width_idx	= HISTC_MEM_DADDR_SYMBOL,
-};
-
-struct sort_entry sort_mem_daddr_dso = {
-	.se_header	= "Data Object",
-	.se_cmp		= sort__dso_daddr_cmp,
-	.se_snprintf	= hist_entry__dso_daddr_snprintf,
-	.se_width_idx	= HISTC_MEM_DADDR_SYMBOL,
-};
-
-struct sort_entry sort_mem_locked = {
-	.se_header	= "Locked",
-	.se_cmp		= sort__locked_cmp,
-	.se_snprintf	= hist_entry__locked_snprintf,
-	.se_width_idx	= HISTC_MEM_LOCKED,
-};
-
-struct sort_entry sort_mem_tlb = {
-	.se_header	= "TLB access",
-	.se_cmp		= sort__tlb_cmp,
-	.se_snprintf	= hist_entry__tlb_snprintf,
-	.se_width_idx	= HISTC_MEM_TLB,
-};
-
-struct sort_entry sort_mem_lvl = {
-	.se_header	= "Memory access",
-	.se_cmp		= sort__lvl_cmp,
-	.se_snprintf	= hist_entry__lvl_snprintf,
-	.se_width_idx	= HISTC_MEM_LVL,
-};
-
-struct sort_entry sort_mem_snoop = {
-	.se_header	= "Snoop",
-	.se_cmp		= sort__snoop_cmp,
-	.se_snprintf	= hist_entry__snoop_snprintf,
-	.se_width_idx	= HISTC_MEM_SNOOP,
-};
-
-struct sort_dimension {
-	const char		*name;
-	struct sort_entry	*entry;
-	int			taken;
-};
-
-#define DIM(d, n, func) [d] = { .name = n, .entry = &(func) }
-
-static struct sort_dimension common_sort_dimensions[] = {
-	DIM(SORT_PID, "pid", sort_thread),
-	DIM(SORT_COMM, "comm", sort_comm),
-	DIM(SORT_DSO, "dso", sort_dso),
-	DIM(SORT_SYM, "symbol", sort_sym),
-	DIM(SORT_PARENT, "parent", sort_parent),
-	DIM(SORT_CPU, "cpu", sort_cpu),
-	DIM(SORT_SRCLINE, "srcline", sort_srcline),
-	DIM(SORT_LOCAL_WEIGHT, "local_weight", sort_local_weight),
-	DIM(SORT_GLOBAL_WEIGHT, "weight", sort_global_weight),
-};
-
-#undef DIM
-
-#define DIM(d, n, func) [d - __SORT_BRANCH_STACK] = { .name = n, .entry = &(func) }
-
-static struct sort_dimension bstack_sort_dimensions[] = {
-	DIM(SORT_DSO_FROM, "dso_from", sort_dso_from),
-	DIM(SORT_DSO_TO, "dso_to", sort_dso_to),
-	DIM(SORT_SYM_FROM, "symbol_from", sort_sym_from),
-	DIM(SORT_SYM_TO, "symbol_to", sort_sym_to),
-	DIM(SORT_MISPREDICT, "mispredict", sort_mispredict),
-};
-
-#undef DIM
-
-#define DIM(d, n, func) [d - __SORT_MEMORY_MODE] = { .name = n, .entry = &(func) }
-
-static struct sort_dimension memory_sort_dimensions[] = {
-	DIM(SORT_MEM_DADDR_SYMBOL, "symbol_daddr", sort_mem_daddr_sym),
-	DIM(SORT_MEM_DADDR_DSO, "dso_daddr", sort_mem_daddr_dso),
-	DIM(SORT_MEM_LOCKED, "locked", sort_mem_locked),
-	DIM(SORT_MEM_TLB, "tlb", sort_mem_tlb),
-	DIM(SORT_MEM_LVL, "mem", sort_mem_lvl),
-	DIM(SORT_MEM_SNOOP, "snoop", sort_mem_snoop),
-};
-
-#undef DIM
-
-static void __sort_dimension__add(struct sort_dimension *sd, enum sort_type idx)
-{
-	if (sd->taken)
-		return;
-
-	if (sd->entry->se_collapse)
-		sort__need_collapse = 1;
-
-	if (list_empty(&hist_entry__sort_list))
-		sort__first_dimension = idx;
-
-	list_add_tail(&sd->entry->list, &hist_entry__sort_list);
-	sd->taken = 1;
-}
-
-int sort_dimension__add(const char *tok)
-{
-	unsigned int i;
-
-	for (i = 0; i < ARRAY_SIZE(common_sort_dimensions); i++) {
-		struct sort_dimension *sd = &common_sort_dimensions[i];
-
-		if (strncasecmp(tok, sd->name, strlen(tok)))
-			continue;
-
-		if (sd->entry == &sort_parent) {
-			int ret = regcomp(&parent_regex, parent_pattern, REG_EXTENDED);
-			if (ret) {
-				char err[BUFSIZ];
-
-				regerror(ret, &parent_regex, err, sizeof(err));
-				pr_err("Invalid regex: %s\n%s", parent_pattern, err);
-				return -EINVAL;
-			}
-			sort__has_parent = 1;
-		} else if (sd->entry == &sort_sym) {
-			sort__has_sym = 1;
-		}
-
-		__sort_dimension__add(sd, i);
-		return 0;
-	}
-
-	for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) {
-		struct sort_dimension *sd = &bstack_sort_dimensions[i];
-
-		if (strncasecmp(tok, sd->name, strlen(tok)))
-			continue;
-
-		if (sort__mode != SORT_MODE__BRANCH)
-			return -EINVAL;
-
-		if (sd->entry == &sort_sym_from || sd->entry == &sort_sym_to)
-			sort__has_sym = 1;
-
-		__sort_dimension__add(sd, i + __SORT_BRANCH_STACK);
-		return 0;
-	}
-
-	for (i = 0; i < ARRAY_SIZE(memory_sort_dimensions); i++) {
-		struct sort_dimension *sd = &memory_sort_dimensions[i];
-
-		if (strncasecmp(tok, sd->name, strlen(tok)))
-			continue;
-
-		if (sort__mode != SORT_MODE__MEMORY)
-			return -EINVAL;
-
-		if (sd->entry == &sort_mem_daddr_sym)
-			sort__has_sym = 1;
-
-		__sort_dimension__add(sd, i + __SORT_MEMORY_MODE);
-		return 0;
-	}
-
-	return -ESRCH;
-}
-
-int setup_sorting(void)
-{
-	char *tmp, *tok, *str = strdup(sort_order);
-	int ret = 0;
-
-	if (str == NULL) {
-		error("Not enough memory to setup sort keys");
-		return -ENOMEM;
-	}
-
-	for (tok = strtok_r(str, ", ", &tmp);
-			tok; tok = strtok_r(NULL, ", ", &tmp)) {
-		ret = sort_dimension__add(tok);
-		if (ret == -EINVAL) {
-			error("Invalid --sort key: `%s'", tok);
-			break;
-		} else if (ret == -ESRCH) {
-			error("Unknown --sort key: `%s'", tok);
-			break;
-		}
-	}
-
-	free(str);
-	return ret;
-}
-
-static void sort_entry__setup_elide(struct sort_entry *self,
-				    struct strlist *list,
-				    const char *list_name, FILE *fp)
-{
-	if (list && strlist__nr_entries(list) == 1) {
-		if (fp != NULL)
-			fprintf(fp, "# %s: %s\n", list_name,
-				strlist__entry(list, 0)->s);
-		self->elide = true;
-	}
-}
-
-void sort__setup_elide(FILE *output)
-{
-	sort_entry__setup_elide(&sort_dso, symbol_conf.dso_list,
-				"dso", output);
-	sort_entry__setup_elide(&sort_comm, symbol_conf.comm_list,
-				"comm", output);
-	sort_entry__setup_elide(&sort_sym, symbol_conf.sym_list,
-				"symbol", output);
-
-	if (sort__mode == SORT_MODE__BRANCH) {
-		sort_entry__setup_elide(&sort_dso_from,
-					symbol_conf.dso_from_list,
-					"dso_from", output);
-		sort_entry__setup_elide(&sort_dso_to,
-					symbol_conf.dso_to_list,
-					"dso_to", output);
-		sort_entry__setup_elide(&sort_sym_from,
-					symbol_conf.sym_from_list,
-					"sym_from", output);
-		sort_entry__setup_elide(&sort_sym_to,
-					symbol_conf.sym_to_list,
-					"sym_to", output);
-	} else if (sort__mode == SORT_MODE__MEMORY) {
-		sort_entry__setup_elide(&sort_dso, symbol_conf.dso_list,
-					"symbol_daddr", output);
-		sort_entry__setup_elide(&sort_dso, symbol_conf.dso_list,
-					"dso_daddr", output);
-		sort_entry__setup_elide(&sort_dso, symbol_conf.dso_list,
-					"mem", output);
-		sort_entry__setup_elide(&sort_dso, symbol_conf.dso_list,
-					"local_weight", output);
-		sort_entry__setup_elide(&sort_dso, symbol_conf.dso_list,
-					"tlb", output);
-		sort_entry__setup_elide(&sort_dso, symbol_conf.dso_list,
-					"snoop", output);
-	}
-
-}
diff --git a/src/tools/perf/util/sort.h b/src/tools/perf/util/sort.h
deleted file mode 100644
index 4e80dbd..0000000
--- a/src/tools/perf/util/sort.h
+++ /dev/null
@@ -1,193 +0,0 @@
-#ifndef __PERF_SORT_H
-#define __PERF_SORT_H
-#include "../builtin.h"
-
-#include "util.h"
-
-#include "color.h"
-#include <linux/list.h>
-#include "cache.h"
-#include <linux/rbtree.h>
-#include "symbol.h"
-#include "string.h"
-#include "callchain.h"
-#include "strlist.h"
-#include "values.h"
-
-#include "../perf.h"
-#include "debug.h"
-#include "header.h"
-
-#include "parse-options.h"
-#include "parse-events.h"
-
-#include "thread.h"
-#include "sort.h"
-
-extern regex_t parent_regex;
-extern const char *sort_order;
-extern const char default_parent_pattern[];
-extern const char *parent_pattern;
-extern const char default_sort_order[];
-extern regex_t ignore_callees_regex;
-extern int have_ignore_callees;
-extern int sort__need_collapse;
-extern int sort__has_parent;
-extern int sort__has_sym;
-extern enum sort_mode sort__mode;
-extern struct sort_entry sort_comm;
-extern struct sort_entry sort_dso;
-extern struct sort_entry sort_sym;
-extern struct sort_entry sort_parent;
-extern struct sort_entry sort_dso_from;
-extern struct sort_entry sort_dso_to;
-extern struct sort_entry sort_sym_from;
-extern struct sort_entry sort_sym_to;
-extern enum sort_type sort__first_dimension;
-
-struct he_stat {
-	u64			period;
-	u64			period_sys;
-	u64			period_us;
-	u64			period_guest_sys;
-	u64			period_guest_us;
-	u64			weight;
-	u32			nr_events;
-};
-
-struct hist_entry_diff {
-	bool	computed;
-
-	/* PERF_HPP__DELTA */
-	double	period_ratio_delta;
-
-	/* PERF_HPP__RATIO */
-	double	period_ratio;
-
-	/* HISTC_WEIGHTED_DIFF */
-	s64	wdiff;
-};
-
-/**
- * struct hist_entry - histogram entry
- *
- * @row_offset - offset from the first callchain expanded to appear on screen
- * @nr_rows - rows expanded in callchain, recalculated on folding/unfolding
- */
-struct hist_entry {
-	struct rb_node		rb_node_in;
-	struct rb_node		rb_node;
-	union {
-		struct list_head node;
-		struct list_head head;
-	} pairs;
-	struct he_stat		stat;
-	struct map_symbol	ms;
-	struct thread		*thread;
-	u64			ip;
-	s32			cpu;
-
-	struct hist_entry_diff	diff;
-
-	/* We are added by hists__add_dummy_entry. */
-	bool			dummy;
-
-	/* XXX These two should move to some tree widget lib */
-	u16			row_offset;
-	u16			nr_rows;
-
-	bool			init_have_children;
-	char			level;
-	bool			used;
-	u8			filtered;
-	char			*srcline;
-	struct symbol		*parent;
-	unsigned long		position;
-	struct rb_root		sorted_chain;
-	struct branch_info	*branch_info;
-	struct hists		*hists;
-	struct mem_info		*mem_info;
-	struct callchain_root	callchain[0]; /* must be last member */
-};
-
-static inline bool hist_entry__has_pairs(struct hist_entry *he)
-{
-	return !list_empty(&he->pairs.node);
-}
-
-static inline struct hist_entry *hist_entry__next_pair(struct hist_entry *he)
-{
-	if (hist_entry__has_pairs(he))
-		return list_entry(he->pairs.node.next, struct hist_entry, pairs.node);
-	return NULL;
-}
-
-static inline void hist_entry__add_pair(struct hist_entry *pair,
-					struct hist_entry *he)
-{
-	list_add_tail(&pair->pairs.node, &he->pairs.head);
-}
-
-enum sort_mode {
-	SORT_MODE__NORMAL,
-	SORT_MODE__BRANCH,
-	SORT_MODE__MEMORY,
-};
-
-enum sort_type {
-	/* common sort keys */
-	SORT_PID,
-	SORT_COMM,
-	SORT_DSO,
-	SORT_SYM,
-	SORT_PARENT,
-	SORT_CPU,
-	SORT_SRCLINE,
-	SORT_LOCAL_WEIGHT,
-	SORT_GLOBAL_WEIGHT,
-
-	/* branch stack specific sort keys */
-	__SORT_BRANCH_STACK,
-	SORT_DSO_FROM = __SORT_BRANCH_STACK,
-	SORT_DSO_TO,
-	SORT_SYM_FROM,
-	SORT_SYM_TO,
-	SORT_MISPREDICT,
-
-	/* memory mode specific sort keys */
-	__SORT_MEMORY_MODE,
-	SORT_MEM_DADDR_SYMBOL = __SORT_MEMORY_MODE,
-	SORT_MEM_DADDR_DSO,
-	SORT_MEM_LOCKED,
-	SORT_MEM_TLB,
-	SORT_MEM_LVL,
-	SORT_MEM_SNOOP,
-};
-
-/*
- * configurable sorting bits
- */
-
-struct sort_entry {
-	struct list_head list;
-
-	const char *se_header;
-
-	int64_t (*se_cmp)(struct hist_entry *, struct hist_entry *);
-	int64_t (*se_collapse)(struct hist_entry *, struct hist_entry *);
-	int	(*se_snprintf)(struct hist_entry *self, char *bf, size_t size,
-			       unsigned int width);
-	u8	se_width_idx;
-	bool	elide;
-};
-
-extern struct sort_entry sort_thread;
-extern struct list_head hist_entry__sort_list;
-
-int setup_sorting(void);
-extern int sort_dimension__add(const char *);
-void sort__setup_elide(FILE *fp);
-
-int report_parse_ignore_callees_opt(const struct option *opt, const char *arg, int unset);
-
-#endif	/* __PERF_SORT_H */
diff --git a/src/tools/perf/util/stat.c b/src/tools/perf/util/stat.c
deleted file mode 100644
index 6506b3d..0000000
--- a/src/tools/perf/util/stat.c
+++ /dev/null
@@ -1,63 +0,0 @@
-#include <math.h>
-
-#include "stat.h"
-
-void update_stats(struct stats *stats, u64 val)
-{
-	double delta;
-
-	stats->n++;
-	delta = val - stats->mean;
-	stats->mean += delta / stats->n;
-	stats->M2 += delta*(val - stats->mean);
-
-	if (val > stats->max)
-		stats->max = val;
-
-	if (val < stats->min)
-		stats->min = val;
-}
-
-double avg_stats(struct stats *stats)
-{
-	return stats->mean;
-}
-
-/*
- * http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance
- *
- *       (\Sum n_i^2) - ((\Sum n_i)^2)/n
- * s^2 = -------------------------------
- *                  n - 1
- *
- * http://en.wikipedia.org/wiki/Stddev
- *
- * The std dev of the mean is related to the std dev by:
- *
- *             s
- * s_mean = -------
- *          sqrt(n)
- *
- */
-double stddev_stats(struct stats *stats)
-{
-	double variance, variance_mean;
-
-	if (stats->n < 2)
-		return 0.0;
-
-	variance = stats->M2 / (stats->n - 1);
-	variance_mean = variance / stats->n;
-
-	return sqrt(variance_mean);
-}
-
-double rel_stddev_stats(double stddev, double avg)
-{
-	double pct = 0.0;
-
-	if (avg)
-		pct = 100.0 * stddev/avg;
-
-	return pct;
-}
diff --git a/src/tools/perf/util/stat.h b/src/tools/perf/util/stat.h
deleted file mode 100644
index ae8ccd7..0000000
--- a/src/tools/perf/util/stat.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef __PERF_STATS_H
-#define __PERF_STATS_H
-
-#include "types.h"
-
-struct stats
-{
-	double n, mean, M2;
-	u64 max, min;
-};
-
-void update_stats(struct stats *stats, u64 val);
-double avg_stats(struct stats *stats);
-double stddev_stats(struct stats *stats);
-double rel_stddev_stats(double stddev, double avg);
-
-static inline void init_stats(struct stats *stats)
-{
-	stats->n    = 0.0;
-	stats->mean = 0.0;
-	stats->M2   = 0.0;
-	stats->min  = (u64) -1;
-	stats->max  = 0;
-}
-#endif
diff --git a/src/tools/perf/util/strbuf.c b/src/tools/perf/util/strbuf.c
deleted file mode 100644
index cfa9068..0000000
--- a/src/tools/perf/util/strbuf.c
+++ /dev/null
@@ -1,134 +0,0 @@
-#include "cache.h"
-#include <linux/kernel.h>
-
-int prefixcmp(const char *str, const char *prefix)
-{
-	for (; ; str++, prefix++)
-		if (!*prefix)
-			return 0;
-		else if (*str != *prefix)
-			return (unsigned char)*prefix - (unsigned char)*str;
-}
-
-/*
- * Used as the default ->buf value, so that people can always assume
- * buf is non NULL and ->buf is NUL terminated even for a freshly
- * initialized strbuf.
- */
-char strbuf_slopbuf[1];
-
-void strbuf_init(struct strbuf *sb, ssize_t hint)
-{
-	sb->alloc = sb->len = 0;
-	sb->buf = strbuf_slopbuf;
-	if (hint)
-		strbuf_grow(sb, hint);
-}
-
-void strbuf_release(struct strbuf *sb)
-{
-	if (sb->alloc) {
-		free(sb->buf);
-		strbuf_init(sb, 0);
-	}
-}
-
-char *strbuf_detach(struct strbuf *sb, size_t *sz)
-{
-	char *res = sb->alloc ? sb->buf : NULL;
-	if (sz)
-		*sz = sb->len;
-	strbuf_init(sb, 0);
-	return res;
-}
-
-void strbuf_grow(struct strbuf *sb, size_t extra)
-{
-	if (sb->len + extra + 1 <= sb->len)
-		die("you want to use way too much memory");
-	if (!sb->alloc)
-		sb->buf = NULL;
-	ALLOC_GROW(sb->buf, sb->len + extra + 1, sb->alloc);
-}
-
-static void strbuf_splice(struct strbuf *sb, size_t pos, size_t len,
-				   const void *data, size_t dlen)
-{
-	if (pos + len < pos)
-		die("you want to use way too much memory");
-	if (pos > sb->len)
-		die("`pos' is too far after the end of the buffer");
-	if (pos + len > sb->len)
-		die("`pos + len' is too far after the end of the buffer");
-
-	if (dlen >= len)
-		strbuf_grow(sb, dlen - len);
-	memmove(sb->buf + pos + dlen,
-			sb->buf + pos + len,
-			sb->len - pos - len);
-	memcpy(sb->buf + pos, data, dlen);
-	strbuf_setlen(sb, sb->len + dlen - len);
-}
-
-void strbuf_remove(struct strbuf *sb, size_t pos, size_t len)
-{
-	strbuf_splice(sb, pos, len, NULL, 0);
-}
-
-void strbuf_add(struct strbuf *sb, const void *data, size_t len)
-{
-	strbuf_grow(sb, len);
-	memcpy(sb->buf + sb->len, data, len);
-	strbuf_setlen(sb, sb->len + len);
-}
-
-void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
-{
-	int len;
-	va_list ap;
-
-	if (!strbuf_avail(sb))
-		strbuf_grow(sb, 64);
-	va_start(ap, fmt);
-	len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
-	va_end(ap);
-	if (len < 0)
-		die("your vsnprintf is broken");
-	if (len > strbuf_avail(sb)) {
-		strbuf_grow(sb, len);
-		va_start(ap, fmt);
-		len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
-		va_end(ap);
-		if (len > strbuf_avail(sb)) {
-			die("this should not happen, your vsnprintf is broken");
-		}
-	}
-	strbuf_setlen(sb, sb->len + len);
-}
-
-ssize_t strbuf_read(struct strbuf *sb, int fd, ssize_t hint)
-{
-	size_t oldlen = sb->len;
-	size_t oldalloc = sb->alloc;
-
-	strbuf_grow(sb, hint ? hint : 8192);
-	for (;;) {
-		ssize_t cnt;
-
-		cnt = read(fd, sb->buf + sb->len, sb->alloc - sb->len - 1);
-		if (cnt < 0) {
-			if (oldalloc == 0)
-				strbuf_release(sb);
-			else
-				strbuf_setlen(sb, oldlen);
-			return -1;
-		}
-		if (!cnt)
-			break;
-		sb->len += cnt;
-		strbuf_grow(sb, 8192);
-	}
-
-	sb->buf[sb->len] = '\0';
-	return sb->len - oldlen;
-}
diff --git a/src/tools/perf/util/strbuf.h b/src/tools/perf/util/strbuf.h
deleted file mode 100644
index 436ac31..0000000
--- a/src/tools/perf/util/strbuf.h
+++ /dev/null
@@ -1,92 +0,0 @@
-#ifndef __PERF_STRBUF_H
-#define __PERF_STRBUF_H
-
-/*
- * Strbuf's can be use in many ways: as a byte array, or to store arbitrary
- * long, overflow safe strings.
- *
- * Strbufs has some invariants that are very important to keep in mind:
- *
- * 1. the ->buf member is always malloc-ed, hence strbuf's can be used to
- *    build complex strings/buffers whose final size isn't easily known.
- *
- *    It is NOT legal to copy the ->buf pointer away.
- *    `strbuf_detach' is the operation that detachs a buffer from its shell
- *    while keeping the shell valid wrt its invariants.
- *
- * 2. the ->buf member is a byte array that has at least ->len + 1 bytes
- *    allocated. The extra byte is used to store a '\0', allowing the ->buf
- *    member to be a valid C-string. Every strbuf function ensure this
- *    invariant is preserved.
- *
- *    Note that it is OK to "play" with the buffer directly if you work it
- *    that way:
- *
- *    strbuf_grow(sb, SOME_SIZE);
- *       ... Here, the memory array starting at sb->buf, and of length
- *       ... strbuf_avail(sb) is all yours, and you are sure that
- *       ... strbuf_avail(sb) is at least SOME_SIZE.
- *    strbuf_setlen(sb, sb->len + SOME_OTHER_SIZE);
- *
- *    Of course, SOME_OTHER_SIZE must be smaller or equal to strbuf_avail(sb).
- *
- *    Doing so is safe, though if it has to be done in many places, adding the
- *    missing API to the strbuf module is the way to go.
- *
- *    XXX: do _not_ assume that the area that is yours is of size ->alloc - 1
- *         even if it's true in the current implementation. Alloc is somehow a
- *         "private" member that should not be messed with.
- */
-
-#include <assert.h>
-
-extern char strbuf_slopbuf[];
-struct strbuf {
-	size_t alloc;
-	size_t len;
-	char *buf;
-};
-
-#define STRBUF_INIT  { 0, 0, strbuf_slopbuf }
-
-/*----- strbuf life cycle -----*/
-extern void strbuf_init(struct strbuf *buf, ssize_t hint);
-extern void strbuf_release(struct strbuf *);
-extern char *strbuf_detach(struct strbuf *, size_t *);
-
-/*----- strbuf size related -----*/
-static inline ssize_t strbuf_avail(const struct strbuf *sb) {
-	return sb->alloc ? sb->alloc - sb->len - 1 : 0;
-}
-
-extern void strbuf_grow(struct strbuf *, size_t);
-
-static inline void strbuf_setlen(struct strbuf *sb, size_t len) {
-	if (!sb->alloc)
-		strbuf_grow(sb, 0);
-	assert(len < sb->alloc);
-	sb->len = len;
-	sb->buf[len] = '\0';
-}
-
-/*----- add data in your buffer -----*/
-static inline void strbuf_addch(struct strbuf *sb, int c) {
-	strbuf_grow(sb, 1);
-	sb->buf[sb->len++] = c;
-	sb->buf[sb->len] = '\0';
-}
-
-extern void strbuf_remove(struct strbuf *, size_t pos, size_t len);
-
-extern void strbuf_add(struct strbuf *, const void *, size_t);
-static inline void strbuf_addstr(struct strbuf *sb, const char *s) {
-	strbuf_add(sb, s, strlen(s));
-}
-
-__attribute__((format(printf,2,3)))
-extern void strbuf_addf(struct strbuf *sb, const char *fmt, ...);
-
-/* XXX: if read fails, any partial read is undone */
-extern ssize_t strbuf_read(struct strbuf *, int fd, ssize_t hint);
-
-#endif /* __PERF_STRBUF_H */
diff --git a/src/tools/perf/util/strfilter.c b/src/tools/perf/util/strfilter.c
deleted file mode 100644
index 834c8eb..0000000
--- a/src/tools/perf/util/strfilter.c
+++ /dev/null
@@ -1,199 +0,0 @@
-#include "util.h"
-#include "string.h"
-#include "strfilter.h"
-
-/* Operators */
-static const char *OP_and	= "&";	/* Logical AND */
-static const char *OP_or	= "|";	/* Logical OR */
-static const char *OP_not	= "!";	/* Logical NOT */
-
-#define is_operator(c)	((c) == '|' || (c) == '&' || (c) == '!')
-#define is_separator(c)	(is_operator(c) || (c) == '(' || (c) == ')')
-
-static void strfilter_node__delete(struct strfilter_node *self)
-{
-	if (self) {
-		if (self->p && !is_operator(*self->p))
-			free((char *)self->p);
-		strfilter_node__delete(self->l);
-		strfilter_node__delete(self->r);
-		free(self);
-	}
-}
-
-void strfilter__delete(struct strfilter *self)
-{
-	if (self) {
-		strfilter_node__delete(self->root);
-		free(self);
-	}
-}
-
-static const char *get_token(const char *s, const char **e)
-{
-	const char *p;
-
-	while (isspace(*s))	/* Skip spaces */
-		s++;
-
-	if (*s == '\0') {
-		p = s;
-		goto end;
-	}
-
-	p = s + 1;
-	if (!is_separator(*s)) {
-		/* End search */
-retry:
-		while (*p && !is_separator(*p) && !isspace(*p))
-			p++;
-		/* Escape and special case: '!' is also used in glob pattern */
-		if (*(p - 1) == '\\' || (*p == '!' && *(p - 1) == '[')) {
-			p++;
-			goto retry;
-		}
-	}
-end:
-	*e = p;
-	return s;
-}
-
-static struct strfilter_node *strfilter_node__alloc(const char *op,
-						    struct strfilter_node *l,
-						    struct strfilter_node *r)
-{
-	struct strfilter_node *ret = zalloc(sizeof(struct strfilter_node));
-
-	if (ret) {
-		ret->p = op;
-		ret->l = l;
-		ret->r = r;
-	}
-
-	return ret;
-}
-
-static struct strfilter_node *strfilter_node__new(const char *s,
-						  const char **ep)
-{
-	struct strfilter_node root, *cur, *last_op;
-	const char *e;
-
-	if (!s)
-		return NULL;
-
-	memset(&root, 0, sizeof(root));
-	last_op = cur = &root;
-
-	s = get_token(s, &e);
-	while (*s != '\0' && *s != ')') {
-		switch (*s) {
-		case '&':	/* Exchg last OP->r with AND */
-			if (!cur->r || !last_op->r)
-				goto error;
-			cur = strfilter_node__alloc(OP_and, last_op->r, NULL);
-			if (!cur)
-				goto nomem;
-			last_op->r = cur;
-			last_op = cur;
-			break;
-		case '|':	/* Exchg the root with OR */
-			if (!cur->r || !root.r)
-				goto error;
-			cur = strfilter_node__alloc(OP_or, root.r, NULL);
-			if (!cur)
-				goto nomem;
-			root.r = cur;
-			last_op = cur;
-			break;
-		case '!':	/* Add NOT as a leaf node */
-			if (cur->r)
-				goto error;
-			cur->r = strfilter_node__alloc(OP_not, NULL, NULL);
-			if (!cur->r)
-				goto nomem;
-			cur = cur->r;
-			break;
-		case '(':	/* Recursively parses inside the parenthesis */
-			if (cur->r)
-				goto error;
-			cur->r = strfilter_node__new(s + 1, &s);
-			if (!s)
-				goto nomem;
-			if (!cur->r || *s != ')')
-				goto error;
-			e = s + 1;
-			break;
-		default:
-			if (cur->r)
-				goto error;
-			cur->r = strfilter_node__alloc(NULL, NULL, NULL);
-			if (!cur->r)
-				goto nomem;
-			cur->r->p = strndup(s, e - s);
-			if (!cur->r->p)
-				goto nomem;
-		}
-		s = get_token(e, &e);
-	}
-	if (!cur->r)
-		goto error;
-	*ep = s;
-	return root.r;
-nomem:
-	s = NULL;
-error:
-	*ep = s;
-	strfilter_node__delete(root.r);
-	return NULL;
-}
-
-/*
- * Parse filter rule and return new strfilter.
- * Return NULL if fail, and *ep == NULL if memory allocation failed.
- */
-struct strfilter *strfilter__new(const char *rules, const char **err)
-{
-	struct strfilter *ret = zalloc(sizeof(struct strfilter));
-	const char *ep = NULL;
-
-	if (ret)
-		ret->root = strfilter_node__new(rules, &ep);
-
-	if (!ret || !ret->root || *ep != '\0') {
-		if (err)
-			*err = ep;
-		strfilter__delete(ret);
-		ret = NULL;
-	}
-
-	return ret;
-}
-
-static bool strfilter_node__compare(struct strfilter_node *self,
-				    const char *str)
-{
-	if (!self || !self->p)
-		return false;
-
-	switch (*self->p) {
-	case '|':	/* OR */
-		return strfilter_node__compare(self->l, str) ||
-			strfilter_node__compare(self->r, str);
-	case '&':	/* AND */
-		return strfilter_node__compare(self->l, str) &&
-			strfilter_node__compare(self->r, str);
-	case '!':	/* NOT */
-		return !strfilter_node__compare(self->r, str);
-	default:
-		return strglobmatch(str, self->p);
-	}
-}
-
-/* Return true if STR matches the filter rules */
-bool strfilter__compare(struct strfilter *self, const char *str)
-{
-	if (!self)
-		return false;
-	return strfilter_node__compare(self->root, str);
-}
diff --git a/src/tools/perf/util/strfilter.h b/src/tools/perf/util/strfilter.h
deleted file mode 100644
index 00f58a7..0000000
--- a/src/tools/perf/util/strfilter.h
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef __PERF_STRFILTER_H
-#define __PERF_STRFILTER_H
-/* General purpose glob matching filter */
-
-#include <linux/list.h>
-#include <stdbool.h>
-
-/* A node of string filter */
-struct strfilter_node {
-	struct strfilter_node *l;	/* Tree left branche (for &,|) */
-	struct strfilter_node *r;	/* Tree right branche (for !,&,|) */
-	const char *p;		/* Operator or rule */
-};
-
-/* String filter */
-struct strfilter {
-	struct strfilter_node *root;
-};
-
-/**
- * strfilter__new - Create a new string filter
- * @rules: Filter rule, which is a combination of glob expressions.
- * @err: Pointer which points an error detected on @rules
- *
- * Parse @rules and return new strfilter. Return NULL if an error detected.
- * In that case, *@err will indicate where it is detected, and *@err is NULL
- * if a memory allocation is failed.
- */
-struct strfilter *strfilter__new(const char *rules, const char **err);
-
-/**
- * strfilter__compare - compare given string and a string filter
- * @self: String filter
- * @str: target string
- *
- * Compare @str and @self. Return true if the str match the rule
- */
-bool strfilter__compare(struct strfilter *self, const char *str);
-
-/**
- * strfilter__delete - delete a string filter
- * @self: String filter to delete
- *
- * Delete @self.
- */
-void strfilter__delete(struct strfilter *self);
-
-#endif
diff --git a/src/tools/perf/util/string.c b/src/tools/perf/util/string.c
deleted file mode 100644
index f0b0c00..0000000
--- a/src/tools/perf/util/string.c
+++ /dev/null
@@ -1,413 +0,0 @@
-#include "util.h"
-#include "linux/string.h"
-
-#define K 1024LL
-/*
- * perf_atoll()
- * Parse (\d+)(b|B|kb|KB|mb|MB|gb|GB|tb|TB) (e.g. "256MB")
- * and return its numeric value
- */
-s64 perf_atoll(const char *str)
-{
-	unsigned int i;
-	s64 length = -1, unit = 1;
-
-	if (!isdigit(str[0]))
-		goto out_err;
-
-	for (i = 1; i < strlen(str); i++) {
-		switch (str[i]) {
-		case 'B':
-		case 'b':
-			break;
-		case 'K':
-			if (str[i + 1] != 'B')
-				goto out_err;
-			else
-				goto kilo;
-		case 'k':
-			if (str[i + 1] != 'b')
-				goto out_err;
-kilo:
-			unit = K;
-			break;
-		case 'M':
-			if (str[i + 1] != 'B')
-				goto out_err;
-			else
-				goto mega;
-		case 'm':
-			if (str[i + 1] != 'b')
-				goto out_err;
-mega:
-			unit = K * K;
-			break;
-		case 'G':
-			if (str[i + 1] != 'B')
-				goto out_err;
-			else
-				goto giga;
-		case 'g':
-			if (str[i + 1] != 'b')
-				goto out_err;
-giga:
-			unit = K * K * K;
-			break;
-		case 'T':
-			if (str[i + 1] != 'B')
-				goto out_err;
-			else
-				goto tera;
-		case 't':
-			if (str[i + 1] != 'b')
-				goto out_err;
-tera:
-			unit = K * K * K * K;
-			break;
-		case '\0':	/* only specified figures */
-			unit = 1;
-			break;
-		default:
-			if (!isdigit(str[i]))
-				goto out_err;
-			break;
-		}
-	}
-
-	length = atoll(str) * unit;
-	goto out;
-
-out_err:
-	length = -1;
-out:
-	return length;
-}
-
-/*
- * Helper function for splitting a string into an argv-like array.
- * originally copied from lib/argv_split.c
- */
-static const char *skip_sep(const char *cp)
-{
-	while (*cp && isspace(*cp))
-		cp++;
-
-	return cp;
-}
-
-static const char *skip_arg(const char *cp)
-{
-	while (*cp && !isspace(*cp))
-		cp++;
-
-	return cp;
-}
-
-static int count_argc(const char *str)
-{
-	int count = 0;
-
-	while (*str) {
-		str = skip_sep(str);
-		if (*str) {
-			count++;
-			str = skip_arg(str);
-		}
-	}
-
-	return count;
-}
-
-/**
- * argv_free - free an argv
- * @argv - the argument vector to be freed
- *
- * Frees an argv and the strings it points to.
- */
-void argv_free(char **argv)
-{
-	char **p;
-	for (p = argv; *p; p++)
-		free(*p);
-
-	free(argv);
-}
-
-/**
- * argv_split - split a string at whitespace, returning an argv
- * @str: the string to be split
- * @argcp: returned argument count
- *
- * Returns an array of pointers to strings which are split out from
- * @str.  This is performed by strictly splitting on white-space; no
- * quote processing is performed.  Multiple whitespace characters are
- * considered to be a single argument separator.  The returned array
- * is always NULL-terminated.  Returns NULL on memory allocation
- * failure.
- */
-char **argv_split(const char *str, int *argcp)
-{
-	int argc = count_argc(str);
-	char **argv = zalloc(sizeof(*argv) * (argc+1));
-	char **argvp;
-
-	if (argv == NULL)
-		goto out;
-
-	if (argcp)
-		*argcp = argc;
-
-	argvp = argv;
-
-	while (*str) {
-		str = skip_sep(str);
-
-		if (*str) {
-			const char *p = str;
-			char *t;
-
-			str = skip_arg(str);
-
-			t = strndup(p, str-p);
-			if (t == NULL)
-				goto fail;
-			*argvp++ = t;
-		}
-	}
-	*argvp = NULL;
-
-out:
-	return argv;
-
-fail:
-	argv_free(argv);
-	return NULL;
-}
-
-/* Character class matching */
-static bool __match_charclass(const char *pat, char c, const char **npat)
-{
-	bool complement = false, ret = true;
-
-	if (*pat == '!') {
-		complement = true;
-		pat++;
-	}
-	if (*pat++ == c)	/* First character is special */
-		goto end;
-
-	while (*pat && *pat != ']') {	/* Matching */
-		if (*pat == '-' && *(pat + 1) != ']') {	/* Range */
-			if (*(pat - 1) <= c && c <= *(pat + 1))
-				goto end;
-			if (*(pat - 1) > *(pat + 1))
-				goto error;
-			pat += 2;
-		} else if (*pat++ == c)
-			goto end;
-	}
-	if (!*pat)
-		goto error;
-	ret = false;
-
-end:
-	while (*pat && *pat != ']')	/* Searching closing */
-		pat++;
-	if (!*pat)
-		goto error;
-	*npat = pat + 1;
-	return complement ? !ret : ret;
-
-error:
-	return false;
-}
-
-/* Glob/lazy pattern matching */
-static bool __match_glob(const char *str, const char *pat, bool ignore_space)
-{
-	while (*str && *pat && *pat != '*') {
-		if (ignore_space) {
-			/* Ignore spaces for lazy matching */
-			if (isspace(*str)) {
-				str++;
-				continue;
-			}
-			if (isspace(*pat)) {
-				pat++;
-				continue;
-			}
-		}
-		if (*pat == '?') {	/* Matches any single character */
-			str++;
-			pat++;
-			continue;
-		} else if (*pat == '[')	/* Character classes/Ranges */
-			if (__match_charclass(pat + 1, *str, &pat)) {
-				str++;
-				continue;
-			} else
-				return false;
-		else if (*pat == '\\') /* Escaped char match as normal char */
-			pat++;
-		if (*str++ != *pat++)
-			return false;
-	}
-	/* Check wild card */
-	if (*pat == '*') {
-		while (*pat == '*')
-			pat++;
-		if (!*pat)	/* Tail wild card matches all */
-			return true;
-		while (*str)
-			if (__match_glob(str++, pat, ignore_space))
-				return true;
-	}
-	return !*str && !*pat;
-}
-
-/**
- * strglobmatch - glob expression pattern matching
- * @str: the target string to match
- * @pat: the pattern string to match
- *
- * This returns true if the @str matches @pat. @pat can includes wildcards
- * ('*','?') and character classes ([CHARS], complementation and ranges are
- * also supported). Also, this supports escape character ('\') to use special
- * characters as normal character.
- *
- * Note: if @pat syntax is broken, this always returns false.
- */
-bool strglobmatch(const char *str, const char *pat)
-{
-	return __match_glob(str, pat, false);
-}
-
-/**
- * strlazymatch - matching pattern strings lazily with glob pattern
- * @str: the target string to match
- * @pat: the pattern string to match
- *
- * This is similar to strglobmatch, except this ignores spaces in
- * the target string.
- */
-bool strlazymatch(const char *str, const char *pat)
-{
-	return __match_glob(str, pat, true);
-}
-
-/**
- * strtailcmp - Compare the tail of two strings
- * @s1: 1st string to be compared
- * @s2: 2nd string to be compared
- *
- * Return 0 if whole of either string is same as another's tail part.
- */
-int strtailcmp(const char *s1, const char *s2)
-{
-	int i1 = strlen(s1);
-	int i2 = strlen(s2);
-	while (--i1 >= 0 && --i2 >= 0) {
-		if (s1[i1] != s2[i2])
-			return s1[i1] - s2[i2];
-	}
-	return 0;
-}
-
-/**
- * strxfrchar - Locate and replace character in @s
- * @s:    The string to be searched/changed.
- * @from: Source character to be replaced.
- * @to:   Destination character.
- *
- * Return pointer to the changed string.
- */
-char *strxfrchar(char *s, char from, char to)
-{
-	char *p = s;
-
-	while ((p = strchr(p, from)) != NULL)
-		*p++ = to;
-
-	return s;
-}
-
-/**
- * ltrim - Removes leading whitespace from @s.
- * @s: The string to be stripped.
- *
- * Return pointer to the first non-whitespace character in @s.
- */
-char *ltrim(char *s)
-{
-	int len = strlen(s);
-
-	while (len && isspace(*s)) {
-		len--;
-		s++;
-	}
-
-	return s;
-}
-
-/**
- * rtrim - Removes trailing whitespace from @s.
- * @s: The string to be stripped.
- *
- * Note that the first trailing whitespace is replaced with a %NUL-terminator
- * in the given string @s. Returns @s.
- */
-char *rtrim(char *s)
-{
-	size_t size = strlen(s);
-	char *end;
-
-	if (!size)
-		return s;
-
-	end = s + size - 1;
-	while (end >= s && isspace(*end))
-		end--;
-	*(end + 1) = '\0';
-
-	return s;
-}
-
-/**
- * memdup - duplicate region of memory
- * @src: memory region to duplicate
- * @len: memory region length
- */
-void *memdup(const void *src, size_t len)
-{
-	void *p;
-
-	p = malloc(len);
-	if (p)
-		memcpy(p, src, len);
-
-	return p;
-}
-
-/**
- * str_append - reallocate string and append another
- * @s: pointer to string pointer
- * @len: pointer to len (initialized)
- * @a: string to append.
- */
-int str_append(char **s, int *len, const char *a)
-{
-	int olen = *s ? strlen(*s) : 0;
-	int nlen = olen + strlen(a) + 1;
-	if (*len < nlen) {
-		*len = *len * 2;
-		if (*len < nlen)
-			*len = nlen;
-		*s = realloc(*s, *len);
-		if (!*s)
-			return -ENOMEM;
-		if (olen == 0)
-			**s = 0;
-	}
-	strcat(*s, a);
-	return 0;
-}
diff --git a/src/tools/perf/util/strlist.c b/src/tools/perf/util/strlist.c
deleted file mode 100644
index eabdce0..0000000
--- a/src/tools/perf/util/strlist.c
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * (c) 2009 Arnaldo Carvalho de Melo <acme@redhat.com>
- *
- * Licensed under the GPLv2.
- */
-
-#include "strlist.h"
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-static
-struct rb_node *strlist__node_new(struct rblist *rblist, const void *entry)
-{
-	const char *s = entry;
-	struct rb_node *rc = NULL;
-	struct strlist *strlist = container_of(rblist, struct strlist, rblist);
-	struct str_node *snode = malloc(sizeof(*snode));
-
-	if (snode != NULL) {
-		if (strlist->dupstr) {
-			s = strdup(s);
-			if (s == NULL)
-				goto out_delete;
-		}
-		snode->s = s;
-		rc = &snode->rb_node;
-	}
-
-	return rc;
-
-out_delete:
-	free(snode);
-	return NULL;
-}
-
-static void str_node__delete(struct str_node *snode, bool dupstr)
-{
-	if (dupstr)
-		free((void *)snode->s);
-	free(snode);
-}
-
-static
-void strlist__node_delete(struct rblist *rblist, struct rb_node *rb_node)
-{
-	struct strlist *slist = container_of(rblist, struct strlist, rblist);
-	struct str_node *snode = container_of(rb_node, struct str_node, rb_node);
-
-	str_node__delete(snode, slist->dupstr);
-}
-
-static int strlist__node_cmp(struct rb_node *rb_node, const void *entry)
-{
-	const char *str = entry;
-	struct str_node *snode = container_of(rb_node, struct str_node, rb_node);
-
-	return strcmp(snode->s, str);
-}
-
-int strlist__add(struct strlist *slist, const char *new_entry)
-{
-	return rblist__add_node(&slist->rblist, new_entry);
-}
-
-int strlist__load(struct strlist *slist, const char *filename)
-{
-	char entry[1024];
-	int err;
-	FILE *fp = fopen(filename, "r");
-
-	if (fp == NULL)
-		return errno;
-
-	while (fgets(entry, sizeof(entry), fp) != NULL) {
-		const size_t len = strlen(entry);
-
-		if (len == 0)
-			continue;
-		entry[len - 1] = '\0';
-
-		err = strlist__add(slist, entry);
-		if (err != 0)
-			goto out;
-	}
-
-	err = 0;
-out:
-	fclose(fp);
-	return err;
-}
-
-void strlist__remove(struct strlist *slist, struct str_node *snode)
-{
-	rblist__remove_node(&slist->rblist, &snode->rb_node);
-}
-
-struct str_node *strlist__find(struct strlist *slist, const char *entry)
-{
-	struct str_node *snode = NULL;
-	struct rb_node *rb_node = rblist__find(&slist->rblist, entry);
-
-	if (rb_node)
-		snode = container_of(rb_node, struct str_node, rb_node);
-
-	return snode;
-}
-
-static int strlist__parse_list_entry(struct strlist *slist, const char *s)
-{
-	if (strncmp(s, "file://", 7) == 0)
-		return strlist__load(slist, s + 7);
-
-	return strlist__add(slist, s);
-}
-
-int strlist__parse_list(struct strlist *slist, const char *s)
-{
-	char *sep;
-	int err;
-
-	while ((sep = strchr(s, ',')) != NULL) {
-		*sep = '\0';
-		err = strlist__parse_list_entry(slist, s);
-		*sep = ',';
-		if (err != 0)
-			return err;
-		s = sep + 1;
-	}
-
-	return *s ? strlist__parse_list_entry(slist, s) : 0;
-}
-
-struct strlist *strlist__new(bool dupstr, const char *list)
-{
-	struct strlist *slist = malloc(sizeof(*slist));
-
-	if (slist != NULL) {
-		rblist__init(&slist->rblist);
-		slist->rblist.node_cmp    = strlist__node_cmp;
-		slist->rblist.node_new    = strlist__node_new;
-		slist->rblist.node_delete = strlist__node_delete;
-
-		slist->dupstr	 = dupstr;
-		if (list && strlist__parse_list(slist, list) != 0)
-			goto out_error;
-	}
-
-	return slist;
-out_error:
-	free(slist);
-	return NULL;
-}
-
-void strlist__delete(struct strlist *slist)
-{
-	if (slist != NULL)
-		rblist__delete(&slist->rblist);
-}
-
-struct str_node *strlist__entry(const struct strlist *slist, unsigned int idx)
-{
-	struct str_node *snode = NULL;
-	struct rb_node *rb_node;
-
-	rb_node = rblist__entry(&slist->rblist, idx);
-	if (rb_node)
-		snode = container_of(rb_node, struct str_node, rb_node);
-
-	return snode;
-}
diff --git a/src/tools/perf/util/strlist.h b/src/tools/perf/util/strlist.h
deleted file mode 100644
index 5c7f870..0000000
--- a/src/tools/perf/util/strlist.h
+++ /dev/null
@@ -1,79 +0,0 @@
-#ifndef __PERF_STRLIST_H
-#define __PERF_STRLIST_H
-
-#include <linux/rbtree.h>
-#include <stdbool.h>
-
-#include "rblist.h"
-
-struct str_node {
-	struct rb_node rb_node;
-	const char     *s;
-};
-
-struct strlist {
-	struct rblist rblist;
-	bool	       dupstr;
-};
-
-struct strlist *strlist__new(bool dupstr, const char *slist);
-void strlist__delete(struct strlist *slist);
-
-void strlist__remove(struct strlist *slist, struct str_node *sn);
-int strlist__load(struct strlist *slist, const char *filename);
-int strlist__add(struct strlist *slist, const char *str);
-
-struct str_node *strlist__entry(const struct strlist *slist, unsigned int idx);
-struct str_node *strlist__find(struct strlist *slist, const char *entry);
-
-static inline bool strlist__has_entry(struct strlist *slist, const char *entry)
-{
-	return strlist__find(slist, entry) != NULL;
-}
-
-static inline bool strlist__empty(const struct strlist *slist)
-{
-	return rblist__empty(&slist->rblist);
-}
-
-static inline unsigned int strlist__nr_entries(const struct strlist *slist)
-{
-	return rblist__nr_entries(&slist->rblist);
-}
-
-/* For strlist iteration */
-static inline struct str_node *strlist__first(struct strlist *slist)
-{
-	struct rb_node *rn = rb_first(&slist->rblist.entries);
-	return rn ? rb_entry(rn, struct str_node, rb_node) : NULL;
-}
-static inline struct str_node *strlist__next(struct str_node *sn)
-{
-	struct rb_node *rn;
-	if (!sn)
-		return NULL;
-	rn = rb_next(&sn->rb_node);
-	return rn ? rb_entry(rn, struct str_node, rb_node) : NULL;
-}
-
-/**
- * strlist_for_each      - iterate over a strlist
- * @pos:	the &struct str_node to use as a loop cursor.
- * @slist:	the &struct strlist for loop.
- */
-#define strlist__for_each(pos, slist)	\
-	for (pos = strlist__first(slist); pos; pos = strlist__next(pos))
-
-/**
- * strlist_for_each_safe - iterate over a strlist safe against removal of
- *                         str_node
- * @pos:	the &struct str_node to use as a loop cursor.
- * @n:		another &struct str_node to use as temporary storage.
- * @slist:	the &struct strlist for loop.
- */
-#define strlist__for_each_safe(pos, n, slist)	\
-	for (pos = strlist__first(slist), n = strlist__next(pos); pos;\
-	     pos = n, n = strlist__next(n))
-
-int strlist__parse_list(struct strlist *slist, const char *s);
-#endif /* __PERF_STRLIST_H */
diff --git a/src/tools/perf/util/svghelper.c b/src/tools/perf/util/svghelper.c
deleted file mode 100644
index 96c8660..0000000
--- a/src/tools/perf/util/svghelper.c
+++ /dev/null
@@ -1,501 +0,0 @@
-/*
- * svghelper.c - helper functions for outputting svg
- *
- * (C) Copyright 2009 Intel Corporation
- *
- * Authors:
- *     Arjan van de Ven <arjan@linux.intel.com>
- *
- * 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; version 2
- * of the License.
- */
-
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-
-#include "svghelper.h"
-
-static u64 first_time, last_time;
-static u64 turbo_frequency, max_freq;
-
-
-#define SLOT_MULT 30.0
-#define SLOT_HEIGHT 25.0
-
-int svg_page_width = 1000;
-
-#define MIN_TEXT_SIZE 0.01
-
-static u64 total_height;
-static FILE *svgfile;
-
-static double cpu2slot(int cpu)
-{
-	return 2 * cpu + 1;
-}
-
-static double cpu2y(int cpu)
-{
-	return cpu2slot(cpu) * SLOT_MULT;
-}
-
-static double time2pixels(u64 __time)
-{
-	double X;
-
-	X = 1.0 * svg_page_width * (__time - first_time) / (last_time - first_time);
-	return X;
-}
-
-/*
- * Round text sizes so that the svg viewer only needs a discrete
- * number of renderings of the font
- */
-static double round_text_size(double size)
-{
-	int loop = 100;
-	double target = 10.0;
-
-	if (size >= 10.0)
-		return size;
-	while (loop--) {
-		if (size >= target)
-			return target;
-		target = target / 2.0;
-	}
-	return size;
-}
-
-void open_svg(const char *filename, int cpus, int rows, u64 start, u64 end)
-{
-	int new_width;
-
-	svgfile = fopen(filename, "w");
-	if (!svgfile) {
-		fprintf(stderr, "Cannot open %s for output\n", filename);
-		return;
-	}
-	first_time = start;
-	first_time = first_time / 100000000 * 100000000;
-	last_time = end;
-
-	/*
-	 * if the recording is short, we default to a width of 1000, but
-	 * for longer recordings we want at least 200 units of width per second
-	 */
-	new_width = (last_time - first_time) / 5000000;
-
-	if (new_width > svg_page_width)
-		svg_page_width = new_width;
-
-	total_height = (1 + rows + cpu2slot(cpus)) * SLOT_MULT;
-	fprintf(svgfile, "<?xml version=\"1.0\" standalone=\"no\"?> \n");
-	fprintf(svgfile, "<svg width=\"%i\" height=\"%" PRIu64 "\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n", svg_page_width, total_height);
-
-	fprintf(svgfile, "<defs>\n  <style type=\"text/css\">\n    <![CDATA[\n");
-
-	fprintf(svgfile, "      rect          { stroke-width: 1; }\n");
-	fprintf(svgfile, "      rect.process  { fill:rgb(180,180,180); fill-opacity:0.9; stroke-width:1;   stroke:rgb(  0,  0,  0); } \n");
-	fprintf(svgfile, "      rect.process2 { fill:rgb(180,180,180); fill-opacity:0.9; stroke-width:0;   stroke:rgb(  0,  0,  0); } \n");
-	fprintf(svgfile, "      rect.sample   { fill:rgb(  0,  0,255); fill-opacity:0.8; stroke-width:0;   stroke:rgb(  0,  0,  0); } \n");
-	fprintf(svgfile, "      rect.blocked  { fill:rgb(255,  0,  0); fill-opacity:0.5; stroke-width:0;   stroke:rgb(  0,  0,  0); } \n");
-	fprintf(svgfile, "      rect.waiting  { fill:rgb(224,214,  0); fill-opacity:0.8; stroke-width:0;   stroke:rgb(  0,  0,  0); } \n");
-	fprintf(svgfile, "      rect.WAITING  { fill:rgb(255,214, 48); fill-opacity:0.6; stroke-width:0;   stroke:rgb(  0,  0,  0); } \n");
-	fprintf(svgfile, "      rect.cpu      { fill:rgb(192,192,192); fill-opacity:0.2; stroke-width:0.5; stroke:rgb(128,128,128); } \n");
-	fprintf(svgfile, "      rect.pstate   { fill:rgb(128,128,128); fill-opacity:0.8; stroke-width:0; } \n");
-	fprintf(svgfile, "      rect.c1       { fill:rgb(255,214,214); fill-opacity:0.5; stroke-width:0; } \n");
-	fprintf(svgfile, "      rect.c2       { fill:rgb(255,172,172); fill-opacity:0.5; stroke-width:0; } \n");
-	fprintf(svgfile, "      rect.c3       { fill:rgb(255,130,130); fill-opacity:0.5; stroke-width:0; } \n");
-	fprintf(svgfile, "      rect.c4       { fill:rgb(255, 88, 88); fill-opacity:0.5; stroke-width:0; } \n");
-	fprintf(svgfile, "      rect.c5       { fill:rgb(255, 44, 44); fill-opacity:0.5; stroke-width:0; } \n");
-	fprintf(svgfile, "      rect.c6       { fill:rgb(255,  0,  0); fill-opacity:0.5; stroke-width:0; } \n");
-	fprintf(svgfile, "      line.pstate   { stroke:rgb(255,255,  0); stroke-opacity:0.8; stroke-width:2; } \n");
-
-	fprintf(svgfile, "    ]]>\n   </style>\n</defs>\n");
-}
-
-void svg_box(int Yslot, u64 start, u64 end, const char *type)
-{
-	if (!svgfile)
-		return;
-
-	fprintf(svgfile, "<rect x=\"%4.8f\" width=\"%4.8f\" y=\"%4.1f\" height=\"%4.1f\" class=\"%s\"/>\n",
-		time2pixels(start), time2pixels(end)-time2pixels(start), Yslot * SLOT_MULT, SLOT_HEIGHT, type);
-}
-
-void svg_sample(int Yslot, int cpu, u64 start, u64 end)
-{
-	double text_size;
-	if (!svgfile)
-		return;
-
-	fprintf(svgfile, "<rect x=\"%4.8f\" width=\"%4.8f\" y=\"%4.1f\" height=\"%4.1f\" class=\"sample\"/>\n",
-		time2pixels(start), time2pixels(end)-time2pixels(start), Yslot * SLOT_MULT, SLOT_HEIGHT);
-
-	text_size = (time2pixels(end)-time2pixels(start));
-	if (cpu > 9)
-		text_size = text_size/2;
-	if (text_size > 1.25)
-		text_size = 1.25;
-	text_size = round_text_size(text_size);
-
-	if (text_size > MIN_TEXT_SIZE)
-		fprintf(svgfile, "<text x=\"%1.8f\" y=\"%1.8f\" font-size=\"%1.8fpt\">%i</text>\n",
-			time2pixels(start), Yslot *  SLOT_MULT + SLOT_HEIGHT - 1, text_size,  cpu + 1);
-
-}
-
-static char *time_to_string(u64 duration)
-{
-	static char text[80];
-
-	text[0] = 0;
-
-	if (duration < 1000) /* less than 1 usec */
-		return text;
-
-	if (duration < 1000 * 1000) { /* less than 1 msec */
-		sprintf(text, "%4.1f us", duration / 1000.0);
-		return text;
-	}
-	sprintf(text, "%4.1f ms", duration / 1000.0 / 1000);
-
-	return text;
-}
-
-void svg_waiting(int Yslot, u64 start, u64 end)
-{
-	char *text;
-	const char *style;
-	double font_size;
-
-	if (!svgfile)
-		return;
-
-	style = "waiting";
-
-	if (end-start > 10 * 1000000) /* 10 msec */
-		style = "WAITING";
-
-	text = time_to_string(end-start);
-
-	font_size = 1.0 * (time2pixels(end)-time2pixels(start));
-
-	if (font_size > 3)
-		font_size = 3;
-
-	font_size = round_text_size(font_size);
-
-	fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\">\n", time2pixels(start), Yslot * SLOT_MULT);
-	fprintf(svgfile, "<rect x=\"0\" width=\"%4.8f\" y=\"0\" height=\"%4.1f\" class=\"%s\"/>\n",
-		time2pixels(end)-time2pixels(start), SLOT_HEIGHT, style);
-	if (font_size > MIN_TEXT_SIZE)
-		fprintf(svgfile, "<text transform=\"rotate(90)\" font-size=\"%1.8fpt\"> %s</text>\n",
-			font_size, text);
-	fprintf(svgfile, "</g>\n");
-}
-
-static char *cpu_model(void)
-{
-	static char cpu_m[255];
-	char buf[256];
-	FILE *file;
-
-	cpu_m[0] = 0;
-	/* CPU type */
-	file = fopen("/proc/cpuinfo", "r");
-	if (file) {
-		while (fgets(buf, 255, file)) {
-			if (strstr(buf, "model name")) {
-				strncpy(cpu_m, &buf[13], 255);
-				break;
-			}
-		}
-		fclose(file);
-	}
-
-	/* CPU type */
-	file = fopen("/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies", "r");
-	if (file) {
-		while (fgets(buf, 255, file)) {
-			unsigned int freq;
-			freq = strtoull(buf, NULL, 10);
-			if (freq > max_freq)
-				max_freq = freq;
-		}
-		fclose(file);
-	}
-	return cpu_m;
-}
-
-void svg_cpu_box(int cpu, u64 __max_freq, u64 __turbo_freq)
-{
-	char cpu_string[80];
-	if (!svgfile)
-		return;
-
-	max_freq = __max_freq;
-	turbo_frequency = __turbo_freq;
-
-	fprintf(svgfile, "<rect x=\"%4.8f\" width=\"%4.8f\" y=\"%4.1f\" height=\"%4.1f\" class=\"cpu\"/>\n",
-		time2pixels(first_time),
-		time2pixels(last_time)-time2pixels(first_time),
-		cpu2y(cpu), SLOT_MULT+SLOT_HEIGHT);
-
-	sprintf(cpu_string, "CPU %i", (int)cpu+1);
-	fprintf(svgfile, "<text x=\"%4.8f\" y=\"%4.8f\">%s</text>\n",
-		10+time2pixels(first_time), cpu2y(cpu) + SLOT_HEIGHT/2, cpu_string);
-
-	fprintf(svgfile, "<text transform=\"translate(%4.8f,%4.8f)\" font-size=\"1.25pt\">%s</text>\n",
-		10+time2pixels(first_time), cpu2y(cpu) + SLOT_MULT + SLOT_HEIGHT - 4, cpu_model());
-}
-
-void svg_process(int cpu, u64 start, u64 end, const char *type, const char *name)
-{
-	double width;
-
-	if (!svgfile)
-		return;
-
-
-	fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\">\n", time2pixels(start), cpu2y(cpu));
-	fprintf(svgfile, "<rect x=\"0\" width=\"%4.8f\" y=\"0\" height=\"%4.1f\" class=\"%s\"/>\n",
-		time2pixels(end)-time2pixels(start), SLOT_MULT+SLOT_HEIGHT, type);
-	width = time2pixels(end)-time2pixels(start);
-	if (width > 6)
-		width = 6;
-
-	width = round_text_size(width);
-
-	if (width > MIN_TEXT_SIZE)
-		fprintf(svgfile, "<text transform=\"rotate(90)\" font-size=\"%3.8fpt\">%s</text>\n",
-			width, name);
-
-	fprintf(svgfile, "</g>\n");
-}
-
-void svg_cstate(int cpu, u64 start, u64 end, int type)
-{
-	double width;
-	char style[128];
-
-	if (!svgfile)
-		return;
-
-
-	if (type > 6)
-		type = 6;
-	sprintf(style, "c%i", type);
-
-	fprintf(svgfile, "<rect class=\"%s\" x=\"%4.8f\" width=\"%4.8f\" y=\"%4.1f\" height=\"%4.1f\"/>\n",
-		style,
-		time2pixels(start), time2pixels(end)-time2pixels(start),
-		cpu2y(cpu), SLOT_MULT+SLOT_HEIGHT);
-
-	width = (time2pixels(end)-time2pixels(start))/2.0;
-	if (width > 6)
-		width = 6;
-
-	width = round_text_size(width);
-
-	if (width > MIN_TEXT_SIZE)
-		fprintf(svgfile, "<text x=\"%4.8f\" y=\"%4.8f\" font-size=\"%3.8fpt\">C%i</text>\n",
-			time2pixels(start), cpu2y(cpu)+width, width, type);
-}
-
-static char *HzToHuman(unsigned long hz)
-{
-	static char buffer[1024];
-	unsigned long long Hz;
-
-	memset(buffer, 0, 1024);
-
-	Hz = hz;
-
-	/* default: just put the Number in */
-	sprintf(buffer, "%9lli", Hz);
-
-	if (Hz > 1000)
-		sprintf(buffer, " %6lli Mhz", (Hz+500)/1000);
-
-	if (Hz > 1500000)
-		sprintf(buffer, " %6.2f Ghz", (Hz+5000.0)/1000000);
-
-	if (Hz == turbo_frequency)
-		sprintf(buffer, "Turbo");
-
-	return buffer;
-}
-
-void svg_pstate(int cpu, u64 start, u64 end, u64 freq)
-{
-	double height = 0;
-
-	if (!svgfile)
-		return;
-
-	if (max_freq)
-		height = freq * 1.0 / max_freq * (SLOT_HEIGHT + SLOT_MULT);
-	height = 1 + cpu2y(cpu) + SLOT_MULT + SLOT_HEIGHT - height;
-	fprintf(svgfile, "<line x1=\"%4.8f\" x2=\"%4.8f\" y1=\"%4.1f\" y2=\"%4.1f\" class=\"pstate\"/>\n",
-		time2pixels(start), time2pixels(end), height, height);
-	fprintf(svgfile, "<text x=\"%4.8f\" y=\"%4.8f\" font-size=\"0.25pt\">%s</text>\n",
-		time2pixels(start), height+0.9, HzToHuman(freq));
-
-}
-
-
-void svg_partial_wakeline(u64 start, int row1, char *desc1, int row2, char *desc2)
-{
-	double height;
-
-	if (!svgfile)
-		return;
-
-
-	if (row1 < row2) {
-		if (row1) {
-			fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%4.2f\" style=\"stroke:rgb(32,255,32);stroke-width:0.009\"/>\n",
-				time2pixels(start), row1 * SLOT_MULT + SLOT_HEIGHT,  time2pixels(start), row1 * SLOT_MULT + SLOT_HEIGHT + SLOT_MULT/32);
-			if (desc2)
-				fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\"><text transform=\"rotate(90)\" font-size=\"0.02pt\">%s &gt;</text></g>\n",
-					time2pixels(start), row1 * SLOT_MULT + SLOT_HEIGHT + SLOT_HEIGHT/48, desc2);
-		}
-		if (row2) {
-			fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%4.2f\" style=\"stroke:rgb(32,255,32);stroke-width:0.009\"/>\n",
-				time2pixels(start), row2 * SLOT_MULT - SLOT_MULT/32,  time2pixels(start), row2 * SLOT_MULT);
-			if (desc1)
-				fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\"><text transform=\"rotate(90)\" font-size=\"0.02pt\">%s &gt;</text></g>\n",
-					time2pixels(start), row2 * SLOT_MULT - SLOT_MULT/32, desc1);
-		}
-	} else {
-		if (row2) {
-			fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%4.2f\" style=\"stroke:rgb(32,255,32);stroke-width:0.009\"/>\n",
-				time2pixels(start), row2 * SLOT_MULT + SLOT_HEIGHT,  time2pixels(start), row2 * SLOT_MULT + SLOT_HEIGHT + SLOT_MULT/32);
-			if (desc1)
-				fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\"><text transform=\"rotate(90)\" font-size=\"0.02pt\">%s &lt;</text></g>\n",
-					time2pixels(start), row2 * SLOT_MULT + SLOT_HEIGHT + SLOT_MULT/48, desc1);
-		}
-		if (row1) {
-			fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%4.2f\" style=\"stroke:rgb(32,255,32);stroke-width:0.009\"/>\n",
-				time2pixels(start), row1 * SLOT_MULT - SLOT_MULT/32,  time2pixels(start), row1 * SLOT_MULT);
-			if (desc2)
-				fprintf(svgfile, "<g transform=\"translate(%4.8f,%4.8f)\"><text transform=\"rotate(90)\" font-size=\"0.02pt\">%s &lt;</text></g>\n",
-					time2pixels(start), row1 * SLOT_MULT - SLOT_HEIGHT/32, desc2);
-		}
-	}
-	height = row1 * SLOT_MULT;
-	if (row2 > row1)
-		height += SLOT_HEIGHT;
-	if (row1)
-		fprintf(svgfile, "<circle  cx=\"%4.8f\" cy=\"%4.2f\" r = \"0.01\"  style=\"fill:rgb(32,255,32)\"/>\n",
-			time2pixels(start), height);
-}
-
-void svg_wakeline(u64 start, int row1, int row2)
-{
-	double height;
-
-	if (!svgfile)
-		return;
-
-
-	if (row1 < row2)
-		fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%4.2f\" style=\"stroke:rgb(32,255,32);stroke-width:0.009\"/>\n",
-			time2pixels(start), row1 * SLOT_MULT + SLOT_HEIGHT,  time2pixels(start), row2 * SLOT_MULT);
-	else
-		fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%4.2f\" style=\"stroke:rgb(32,255,32);stroke-width:0.009\"/>\n",
-			time2pixels(start), row2 * SLOT_MULT + SLOT_HEIGHT,  time2pixels(start), row1 * SLOT_MULT);
-
-	height = row1 * SLOT_MULT;
-	if (row2 > row1)
-		height += SLOT_HEIGHT;
-	fprintf(svgfile, "<circle  cx=\"%4.8f\" cy=\"%4.2f\" r = \"0.01\"  style=\"fill:rgb(32,255,32)\"/>\n",
-			time2pixels(start), height);
-}
-
-void svg_interrupt(u64 start, int row)
-{
-	if (!svgfile)
-		return;
-
-	fprintf(svgfile, "<circle  cx=\"%4.8f\" cy=\"%4.2f\" r = \"0.01\"  style=\"fill:rgb(255,128,128)\"/>\n",
-			time2pixels(start), row * SLOT_MULT);
-	fprintf(svgfile, "<circle  cx=\"%4.8f\" cy=\"%4.2f\" r = \"0.01\"  style=\"fill:rgb(255,128,128)\"/>\n",
-			time2pixels(start), row * SLOT_MULT + SLOT_HEIGHT);
-}
-
-void svg_text(int Yslot, u64 start, const char *text)
-{
-	if (!svgfile)
-		return;
-
-	fprintf(svgfile, "<text x=\"%4.8f\" y=\"%4.8f\">%s</text>\n",
-		time2pixels(start), Yslot * SLOT_MULT+SLOT_HEIGHT/2, text);
-}
-
-static void svg_legenda_box(int X, const char *text, const char *style)
-{
-	double boxsize;
-	boxsize = SLOT_HEIGHT / 2;
-
-	fprintf(svgfile, "<rect x=\"%i\" width=\"%4.8f\" y=\"0\" height=\"%4.1f\" class=\"%s\"/>\n",
-		X, boxsize, boxsize, style);
-	fprintf(svgfile, "<text transform=\"translate(%4.8f, %4.8f)\" font-size=\"%4.8fpt\">%s</text>\n",
-		X + boxsize + 5, boxsize, 0.8 * boxsize, text);
-}
-
-void svg_legenda(void)
-{
-	if (!svgfile)
-		return;
-
-	svg_legenda_box(0,	"Running", "sample");
-	svg_legenda_box(100,	"Idle","c1");
-	svg_legenda_box(200,	"Deeper Idle", "c3");
-	svg_legenda_box(350,	"Deepest Idle", "c6");
-	svg_legenda_box(550,	"Sleeping", "process2");
-	svg_legenda_box(650,	"Waiting for cpu", "waiting");
-	svg_legenda_box(800,	"Blocked on IO", "blocked");
-}
-
-void svg_time_grid(void)
-{
-	u64 i;
-
-	if (!svgfile)
-		return;
-
-	i = first_time;
-	while (i < last_time) {
-		int color = 220;
-		double thickness = 0.075;
-		if ((i % 100000000) == 0) {
-			thickness = 0.5;
-			color = 192;
-		}
-		if ((i % 1000000000) == 0) {
-			thickness = 2.0;
-			color = 128;
-		}
-
-		fprintf(svgfile, "<line x1=\"%4.8f\" y1=\"%4.2f\" x2=\"%4.8f\" y2=\"%" PRIu64 "\" style=\"stroke:rgb(%i,%i,%i);stroke-width:%1.3f\"/>\n",
-			time2pixels(i), SLOT_MULT/2, time2pixels(i), total_height, color, color, color, thickness);
-
-		i += 10000000;
-	}
-}
-
-void svg_close(void)
-{
-	if (svgfile) {
-		fprintf(svgfile, "</svg>\n");
-		fclose(svgfile);
-		svgfile = NULL;
-	}
-}
diff --git a/src/tools/perf/util/svghelper.h b/src/tools/perf/util/svghelper.h
deleted file mode 100644
index e078198..0000000
--- a/src/tools/perf/util/svghelper.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef __PERF_SVGHELPER_H
-#define __PERF_SVGHELPER_H
-
-#include "types.h"
-
-extern void open_svg(const char *filename, int cpus, int rows, u64 start, u64 end);
-extern void svg_box(int Yslot, u64 start, u64 end, const char *type);
-extern void svg_sample(int Yslot, int cpu, u64 start, u64 end);
-extern void svg_waiting(int Yslot, u64 start, u64 end);
-extern void svg_cpu_box(int cpu, u64 max_frequency, u64 turbo_frequency);
-
-
-extern void svg_process(int cpu, u64 start, u64 end, const char *type, const char *name);
-extern void svg_cstate(int cpu, u64 start, u64 end, int type);
-extern void svg_pstate(int cpu, u64 start, u64 end, u64 freq);
-
-
-extern void svg_time_grid(void);
-extern void svg_legenda(void);
-extern void svg_wakeline(u64 start, int row1, int row2);
-extern void svg_partial_wakeline(u64 start, int row1, char *desc1, int row2, char *desc2);
-extern void svg_interrupt(u64 start, int row);
-extern void svg_text(int Yslot, u64 start, const char *text);
-extern void svg_close(void);
-
-extern int svg_page_width;
-
-#endif /* __PERF_SVGHELPER_H */
diff --git a/src/tools/perf/util/symbol-elf.c b/src/tools/perf/util/symbol-elf.c
deleted file mode 100644
index a9c829b..0000000
--- a/src/tools/perf/util/symbol-elf.c
+++ /dev/null
@@ -1,1024 +0,0 @@
-#include <fcntl.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-#include <inttypes.h>
-
-#include "symbol.h"
-#include "debug.h"
-
-#ifndef HAVE_ELF_GETPHDRNUM
-static int elf_getphdrnum(Elf *elf, size_t *dst)
-{
-	GElf_Ehdr gehdr;
-	GElf_Ehdr *ehdr;
-
-	ehdr = gelf_getehdr(elf, &gehdr);
-	if (!ehdr)
-		return -1;
-
-	*dst = ehdr->e_phnum;
-
-	return 0;
-}
-#endif
-
-#ifndef NT_GNU_BUILD_ID
-#define NT_GNU_BUILD_ID 3
-#endif
-
-/**
- * elf_symtab__for_each_symbol - iterate thru all the symbols
- *
- * @syms: struct elf_symtab instance to iterate
- * @idx: uint32_t idx
- * @sym: GElf_Sym iterator
- */
-#define elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) \
-	for (idx = 0, gelf_getsym(syms, idx, &sym);\
-	     idx < nr_syms; \
-	     idx++, gelf_getsym(syms, idx, &sym))
-
-static inline uint8_t elf_sym__type(const GElf_Sym *sym)
-{
-	return GELF_ST_TYPE(sym->st_info);
-}
-
-static inline int elf_sym__is_function(const GElf_Sym *sym)
-{
-	return elf_sym__type(sym) == STT_FUNC &&
-	       sym->st_name != 0 &&
-	       sym->st_shndx != SHN_UNDEF;
-}
-
-static inline bool elf_sym__is_object(const GElf_Sym *sym)
-{
-	return elf_sym__type(sym) == STT_OBJECT &&
-		sym->st_name != 0 &&
-		sym->st_shndx != SHN_UNDEF;
-}
-
-static inline int elf_sym__is_label(const GElf_Sym *sym)
-{
-	return elf_sym__type(sym) == STT_NOTYPE &&
-		sym->st_name != 0 &&
-		sym->st_shndx != SHN_UNDEF &&
-		sym->st_shndx != SHN_ABS;
-}
-
-static bool elf_sym__is_a(GElf_Sym *sym, enum map_type type)
-{
-	switch (type) {
-	case MAP__FUNCTION:
-		return elf_sym__is_function(sym);
-	case MAP__VARIABLE:
-		return elf_sym__is_object(sym);
-	default:
-		return false;
-	}
-}
-
-static inline const char *elf_sym__name(const GElf_Sym *sym,
-					const Elf_Data *symstrs)
-{
-	return symstrs->d_buf + sym->st_name;
-}
-
-static inline const char *elf_sec__name(const GElf_Shdr *shdr,
-					const Elf_Data *secstrs)
-{
-	return secstrs->d_buf + shdr->sh_name;
-}
-
-static inline int elf_sec__is_text(const GElf_Shdr *shdr,
-					const Elf_Data *secstrs)
-{
-	return strstr(elf_sec__name(shdr, secstrs), "text") != NULL;
-}
-
-static inline bool elf_sec__is_data(const GElf_Shdr *shdr,
-				    const Elf_Data *secstrs)
-{
-	return strstr(elf_sec__name(shdr, secstrs), "data") != NULL;
-}
-
-static bool elf_sec__is_a(GElf_Shdr *shdr, Elf_Data *secstrs,
-			  enum map_type type)
-{
-	switch (type) {
-	case MAP__FUNCTION:
-		return elf_sec__is_text(shdr, secstrs);
-	case MAP__VARIABLE:
-		return elf_sec__is_data(shdr, secstrs);
-	default:
-		return false;
-	}
-}
-
-static size_t elf_addr_to_index(Elf *elf, GElf_Addr addr)
-{
-	Elf_Scn *sec = NULL;
-	GElf_Shdr shdr;
-	size_t cnt = 1;
-
-	while ((sec = elf_nextscn(elf, sec)) != NULL) {
-		gelf_getshdr(sec, &shdr);
-
-		if ((addr >= shdr.sh_addr) &&
-		    (addr < (shdr.sh_addr + shdr.sh_size)))
-			return cnt;
-
-		++cnt;
-	}
-
-	return -1;
-}
-
-static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep,
-				    GElf_Shdr *shp, const char *name,
-				    size_t *idx)
-{
-	Elf_Scn *sec = NULL;
-	size_t cnt = 1;
-
-	/* Elf is corrupted/truncated, avoid calling elf_strptr. */
-	if (!elf_rawdata(elf_getscn(elf, ep->e_shstrndx), NULL))
-		return NULL;
-
-	while ((sec = elf_nextscn(elf, sec)) != NULL) {
-		char *str;
-
-		gelf_getshdr(sec, shp);
-		str = elf_strptr(elf, ep->e_shstrndx, shp->sh_name);
-		if (!strcmp(name, str)) {
-			if (idx)
-				*idx = cnt;
-			break;
-		}
-		++cnt;
-	}
-
-	return sec;
-}
-
-#define elf_section__for_each_rel(reldata, pos, pos_mem, idx, nr_entries) \
-	for (idx = 0, pos = gelf_getrel(reldata, 0, &pos_mem); \
-	     idx < nr_entries; \
-	     ++idx, pos = gelf_getrel(reldata, idx, &pos_mem))
-
-#define elf_section__for_each_rela(reldata, pos, pos_mem, idx, nr_entries) \
-	for (idx = 0, pos = gelf_getrela(reldata, 0, &pos_mem); \
-	     idx < nr_entries; \
-	     ++idx, pos = gelf_getrela(reldata, idx, &pos_mem))
-
-/*
- * We need to check if we have a .dynsym, so that we can handle the
- * .plt, synthesizing its symbols, that aren't on the symtabs (be it
- * .dynsym or .symtab).
- * And always look at the original dso, not at debuginfo packages, that
- * have the PLT data stripped out (shdr_rel_plt.sh_type == SHT_NOBITS).
- */
-int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *map,
-				symbol_filter_t filter)
-{
-	uint32_t nr_rel_entries, idx;
-	GElf_Sym sym;
-	u64 plt_offset;
-	GElf_Shdr shdr_plt;
-	struct symbol *f;
-	GElf_Shdr shdr_rel_plt, shdr_dynsym;
-	Elf_Data *reldata, *syms, *symstrs;
-	Elf_Scn *scn_plt_rel, *scn_symstrs, *scn_dynsym;
-	size_t dynsym_idx;
-	GElf_Ehdr ehdr;
-	char sympltname[1024];
-	Elf *elf;
-	int nr = 0, symidx, err = 0;
-
-	if (!ss->dynsym)
-		return 0;
-
-	elf = ss->elf;
-	ehdr = ss->ehdr;
-
-	scn_dynsym = ss->dynsym;
-	shdr_dynsym = ss->dynshdr;
-	dynsym_idx = ss->dynsym_idx;
-
-	if (scn_dynsym == NULL)
-		goto out_elf_end;
-
-	scn_plt_rel = elf_section_by_name(elf, &ehdr, &shdr_rel_plt,
-					  ".rela.plt", NULL);
-	if (scn_plt_rel == NULL) {
-		scn_plt_rel = elf_section_by_name(elf, &ehdr, &shdr_rel_plt,
-						  ".rel.plt", NULL);
-		if (scn_plt_rel == NULL)
-			goto out_elf_end;
-	}
-
-	err = -1;
-
-	if (shdr_rel_plt.sh_link != dynsym_idx)
-		goto out_elf_end;
-
-	if (elf_section_by_name(elf, &ehdr, &shdr_plt, ".plt", NULL) == NULL)
-		goto out_elf_end;
-
-	/*
-	 * Fetch the relocation section to find the idxes to the GOT
-	 * and the symbols in the .dynsym they refer to.
-	 */
-	reldata = elf_getdata(scn_plt_rel, NULL);
-	if (reldata == NULL)
-		goto out_elf_end;
-
-	syms = elf_getdata(scn_dynsym, NULL);
-	if (syms == NULL)
-		goto out_elf_end;
-
-	scn_symstrs = elf_getscn(elf, shdr_dynsym.sh_link);
-	if (scn_symstrs == NULL)
-		goto out_elf_end;
-
-	symstrs = elf_getdata(scn_symstrs, NULL);
-	if (symstrs == NULL)
-		goto out_elf_end;
-
-	if (symstrs->d_size == 0)
-		goto out_elf_end;
-
-	nr_rel_entries = shdr_rel_plt.sh_size / shdr_rel_plt.sh_entsize;
-	plt_offset = shdr_plt.sh_offset;
-
-	if (shdr_rel_plt.sh_type == SHT_RELA) {
-		GElf_Rela pos_mem, *pos;
-
-		elf_section__for_each_rela(reldata, pos, pos_mem, idx,
-					   nr_rel_entries) {
-			symidx = GELF_R_SYM(pos->r_info);
-			plt_offset += shdr_plt.sh_entsize;
-			gelf_getsym(syms, symidx, &sym);
-			snprintf(sympltname, sizeof(sympltname),
-				 "%s@plt", elf_sym__name(&sym, symstrs));
-
-			f = symbol__new(plt_offset, shdr_plt.sh_entsize,
-					STB_GLOBAL, sympltname);
-			if (!f)
-				goto out_elf_end;
-
-			if (filter && filter(map, f))
-				symbol__delete(f);
-			else {
-				symbols__insert(&dso->symbols[map->type], f);
-				++nr;
-			}
-		}
-	} else if (shdr_rel_plt.sh_type == SHT_REL) {
-		GElf_Rel pos_mem, *pos;
-		elf_section__for_each_rel(reldata, pos, pos_mem, idx,
-					  nr_rel_entries) {
-			symidx = GELF_R_SYM(pos->r_info);
-			plt_offset += shdr_plt.sh_entsize;
-			gelf_getsym(syms, symidx, &sym);
-			snprintf(sympltname, sizeof(sympltname),
-				 "%s@plt", elf_sym__name(&sym, symstrs));
-
-			f = symbol__new(plt_offset, shdr_plt.sh_entsize,
-					STB_GLOBAL, sympltname);
-			if (!f)
-				goto out_elf_end;
-
-			if (filter && filter(map, f))
-				symbol__delete(f);
-			else {
-				symbols__insert(&dso->symbols[map->type], f);
-				++nr;
-			}
-		}
-	}
-
-	err = 0;
-out_elf_end:
-	if (err == 0)
-		return nr;
-	pr_debug("%s: problems reading %s PLT info.\n",
-		 __func__, dso->long_name);
-	return 0;
-}
-
-/*
- * Align offset to 4 bytes as needed for note name and descriptor data.
- */
-#define NOTE_ALIGN(n) (((n) + 3) & -4U)
-
-static int elf_read_build_id(Elf *elf, void *bf, size_t size)
-{
-	int err = -1;
-	GElf_Ehdr ehdr;
-	GElf_Shdr shdr;
-	Elf_Data *data;
-	Elf_Scn *sec;
-	Elf_Kind ek;
-	void *ptr;
-
-	if (size < BUILD_ID_SIZE)
-		goto out;
-
-	ek = elf_kind(elf);
-	if (ek != ELF_K_ELF)
-		goto out;
-
-	if (gelf_getehdr(elf, &ehdr) == NULL) {
-		pr_err("%s: cannot get elf header.\n", __func__);
-		goto out;
-	}
-
-	/*
-	 * Check following sections for notes:
-	 *   '.note.gnu.build-id'
-	 *   '.notes'
-	 *   '.note' (VDSO specific)
-	 */
-	do {
-		sec = elf_section_by_name(elf, &ehdr, &shdr,
-					  ".note.gnu.build-id", NULL);
-		if (sec)
-			break;
-
-		sec = elf_section_by_name(elf, &ehdr, &shdr,
-					  ".notes", NULL);
-		if (sec)
-			break;
-
-		sec = elf_section_by_name(elf, &ehdr, &shdr,
-					  ".note", NULL);
-		if (sec)
-			break;
-
-		return err;
-
-	} while (0);
-
-	data = elf_getdata(sec, NULL);
-	if (data == NULL)
-		goto out;
-
-	ptr = data->d_buf;
-	while (ptr < (data->d_buf + data->d_size)) {
-		GElf_Nhdr *nhdr = ptr;
-		size_t namesz = NOTE_ALIGN(nhdr->n_namesz),
-		       descsz = NOTE_ALIGN(nhdr->n_descsz);
-		const char *name;
-
-		ptr += sizeof(*nhdr);
-		name = ptr;
-		ptr += namesz;
-		if (nhdr->n_type == NT_GNU_BUILD_ID &&
-		    nhdr->n_namesz == sizeof("GNU")) {
-			if (memcmp(name, "GNU", sizeof("GNU")) == 0) {
-				size_t sz = min(size, descsz);
-				memcpy(bf, ptr, sz);
-				memset(bf + sz, 0, size - sz);
-				err = descsz;
-				break;
-			}
-		}
-		ptr += descsz;
-	}
-
-out:
-	return err;
-}
-
-int filename__read_build_id(const char *filename, void *bf, size_t size)
-{
-	int fd, err = -1;
-	Elf *elf;
-
-	if (size < BUILD_ID_SIZE)
-		goto out;
-
-	fd = open(filename, O_RDONLY);
-	if (fd < 0)
-		goto out;
-
-	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
-	if (elf == NULL) {
-		pr_debug2("%s: cannot read %s ELF file.\n", __func__, filename);
-		goto out_close;
-	}
-
-	err = elf_read_build_id(elf, bf, size);
-
-	elf_end(elf);
-out_close:
-	close(fd);
-out:
-	return err;
-}
-
-int sysfs__read_build_id(const char *filename, void *build_id, size_t size)
-{
-	int fd, err = -1;
-
-	if (size < BUILD_ID_SIZE)
-		goto out;
-
-	fd = open(filename, O_RDONLY);
-	if (fd < 0)
-		goto out;
-
-	while (1) {
-		char bf[BUFSIZ];
-		GElf_Nhdr nhdr;
-		size_t namesz, descsz;
-
-		if (read(fd, &nhdr, sizeof(nhdr)) != sizeof(nhdr))
-			break;
-
-		namesz = NOTE_ALIGN(nhdr.n_namesz);
-		descsz = NOTE_ALIGN(nhdr.n_descsz);
-		if (nhdr.n_type == NT_GNU_BUILD_ID &&
-		    nhdr.n_namesz == sizeof("GNU")) {
-			if (read(fd, bf, namesz) != (ssize_t)namesz)
-				break;
-			if (memcmp(bf, "GNU", sizeof("GNU")) == 0) {
-				size_t sz = min(descsz, size);
-				if (read(fd, build_id, sz) == (ssize_t)sz) {
-					memset(build_id + sz, 0, size - sz);
-					err = 0;
-					break;
-				}
-			} else if (read(fd, bf, descsz) != (ssize_t)descsz)
-				break;
-		} else {
-			int n = namesz + descsz;
-			if (read(fd, bf, n) != n)
-				break;
-		}
-	}
-	close(fd);
-out:
-	return err;
-}
-
-int filename__read_debuglink(const char *filename, char *debuglink,
-			     size_t size)
-{
-	int fd, err = -1;
-	Elf *elf;
-	GElf_Ehdr ehdr;
-	GElf_Shdr shdr;
-	Elf_Data *data;
-	Elf_Scn *sec;
-	Elf_Kind ek;
-
-	fd = open(filename, O_RDONLY);
-	if (fd < 0)
-		goto out;
-
-	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
-	if (elf == NULL) {
-		pr_debug2("%s: cannot read %s ELF file.\n", __func__, filename);
-		goto out_close;
-	}
-
-	ek = elf_kind(elf);
-	if (ek != ELF_K_ELF)
-		goto out_close;
-
-	if (gelf_getehdr(elf, &ehdr) == NULL) {
-		pr_err("%s: cannot get elf header.\n", __func__);
-		goto out_close;
-	}
-
-	sec = elf_section_by_name(elf, &ehdr, &shdr,
-				  ".gnu_debuglink", NULL);
-	if (sec == NULL)
-		goto out_close;
-
-	data = elf_getdata(sec, NULL);
-	if (data == NULL)
-		goto out_close;
-
-	/* the start of this section is a zero-terminated string */
-	strncpy(debuglink, data->d_buf, size);
-
-	elf_end(elf);
-
-out_close:
-	close(fd);
-out:
-	return err;
-}
-
-static int dso__swap_init(struct dso *dso, unsigned char eidata)
-{
-	static unsigned int const endian = 1;
-
-	dso->needs_swap = DSO_SWAP__NO;
-
-	switch (eidata) {
-	case ELFDATA2LSB:
-		/* We are big endian, DSO is little endian. */
-		if (*(unsigned char const *)&endian != 1)
-			dso->needs_swap = DSO_SWAP__YES;
-		break;
-
-	case ELFDATA2MSB:
-		/* We are little endian, DSO is big endian. */
-		if (*(unsigned char const *)&endian != 0)
-			dso->needs_swap = DSO_SWAP__YES;
-		break;
-
-	default:
-		pr_err("unrecognized DSO data encoding %d\n", eidata);
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-bool symsrc__possibly_runtime(struct symsrc *ss)
-{
-	return ss->dynsym || ss->opdsec;
-}
-
-bool symsrc__has_symtab(struct symsrc *ss)
-{
-	return ss->symtab != NULL;
-}
-
-void symsrc__destroy(struct symsrc *ss)
-{
-	free(ss->name);
-	elf_end(ss->elf);
-	close(ss->fd);
-}
-
-int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name,
-		 enum dso_binary_type type)
-{
-	int err = -1;
-	GElf_Ehdr ehdr;
-	Elf *elf;
-	int fd;
-
-	fd = open(name, O_RDONLY);
-	if (fd < 0)
-		return -1;
-
-	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
-	if (elf == NULL) {
-		pr_debug("%s: cannot read %s ELF file.\n", __func__, name);
-		goto out_close;
-	}
-
-	if (gelf_getehdr(elf, &ehdr) == NULL) {
-		pr_debug("%s: cannot get elf header.\n", __func__);
-		goto out_elf_end;
-	}
-
-	if (dso__swap_init(dso, ehdr.e_ident[EI_DATA]))
-		goto out_elf_end;
-
-	/* Always reject images with a mismatched build-id: */
-	if (dso->has_build_id) {
-		u8 build_id[BUILD_ID_SIZE];
-
-		if (elf_read_build_id(elf, build_id, BUILD_ID_SIZE) < 0)
-			goto out_elf_end;
-
-		if (!dso__build_id_equal(dso, build_id))
-			goto out_elf_end;
-	}
-
-	ss->symtab = elf_section_by_name(elf, &ehdr, &ss->symshdr, ".symtab",
-			NULL);
-	if (ss->symshdr.sh_type != SHT_SYMTAB)
-		ss->symtab = NULL;
-
-	ss->dynsym_idx = 0;
-	ss->dynsym = elf_section_by_name(elf, &ehdr, &ss->dynshdr, ".dynsym",
-			&ss->dynsym_idx);
-	if (ss->dynshdr.sh_type != SHT_DYNSYM)
-		ss->dynsym = NULL;
-
-	ss->opdidx = 0;
-	ss->opdsec = elf_section_by_name(elf, &ehdr, &ss->opdshdr, ".opd",
-			&ss->opdidx);
-	if (ss->opdshdr.sh_type != SHT_PROGBITS)
-		ss->opdsec = NULL;
-
-	if (dso->kernel == DSO_TYPE_USER) {
-		GElf_Shdr shdr;
-		ss->adjust_symbols = (ehdr.e_type == ET_EXEC ||
-				ehdr.e_type == ET_REL ||
-				elf_section_by_name(elf, &ehdr, &shdr,
-						     ".gnu.prelink_undo",
-						     NULL) != NULL);
-	} else {
-		ss->adjust_symbols = ehdr.e_type == ET_EXEC ||
-				     ehdr.e_type == ET_REL;
-	}
-
-	ss->name   = strdup(name);
-	if (!ss->name)
-		goto out_elf_end;
-
-	ss->elf    = elf;
-	ss->fd     = fd;
-	ss->ehdr   = ehdr;
-	ss->type   = type;
-
-	return 0;
-
-out_elf_end:
-	elf_end(elf);
-out_close:
-	close(fd);
-	return err;
-}
-
-/**
- * ref_reloc_sym_not_found - has kernel relocation symbol been found.
- * @kmap: kernel maps and relocation reference symbol
- *
- * This function returns %true if we are dealing with the kernel maps and the
- * relocation reference symbol has not yet been found.  Otherwise %false is
- * returned.
- */
-static bool ref_reloc_sym_not_found(struct kmap *kmap)
-{
-	return kmap && kmap->ref_reloc_sym && kmap->ref_reloc_sym->name &&
-	       !kmap->ref_reloc_sym->unrelocated_addr;
-}
-
-/**
- * ref_reloc - kernel relocation offset.
- * @kmap: kernel maps and relocation reference symbol
- *
- * This function returns the offset of kernel addresses as determined by using
- * the relocation reference symbol i.e. if the kernel has not been relocated
- * then the return value is zero.
- */
-static u64 ref_reloc(struct kmap *kmap)
-{
-	if (kmap && kmap->ref_reloc_sym &&
-	    kmap->ref_reloc_sym->unrelocated_addr)
-		return kmap->ref_reloc_sym->addr -
-		       kmap->ref_reloc_sym->unrelocated_addr;
-	return 0;
-}
-
-int dso__load_sym(struct dso *dso, struct map *map,
-		  struct symsrc *syms_ss, struct symsrc *runtime_ss,
-		  symbol_filter_t filter, int kmodule)
-{
-	struct kmap *kmap = dso->kernel ? map__kmap(map) : NULL;
-	struct map *curr_map = map;
-	struct dso *curr_dso = dso;
-	Elf_Data *symstrs, *secstrs;
-	uint32_t nr_syms;
-	int err = -1;
-	uint32_t idx;
-	GElf_Ehdr ehdr;
-	GElf_Shdr shdr;
-	Elf_Data *syms, *opddata = NULL;
-	GElf_Sym sym;
-	Elf_Scn *sec, *sec_strndx;
-	Elf *elf;
-	int nr = 0;
-	bool remap_kernel = false, adjust_kernel_syms = false;
-
-	dso->symtab_type = syms_ss->type;
-	dso->rel = syms_ss->ehdr.e_type == ET_REL;
-
-	/*
-	 * Modules may already have symbols from kallsyms, but those symbols
-	 * have the wrong values for the dso maps, so remove them.
-	 */
-	if (kmodule && syms_ss->symtab)
-		symbols__delete(&dso->symbols[map->type]);
-
-	if (!syms_ss->symtab) {
-		syms_ss->symtab  = syms_ss->dynsym;
-		syms_ss->symshdr = syms_ss->dynshdr;
-	}
-
-	elf = syms_ss->elf;
-	ehdr = syms_ss->ehdr;
-	sec = syms_ss->symtab;
-	shdr = syms_ss->symshdr;
-
-	if (runtime_ss->opdsec)
-		opddata = elf_rawdata(runtime_ss->opdsec, NULL);
-
-	syms = elf_getdata(sec, NULL);
-	if (syms == NULL)
-		goto out_elf_end;
-
-	sec = elf_getscn(elf, shdr.sh_link);
-	if (sec == NULL)
-		goto out_elf_end;
-
-	symstrs = elf_getdata(sec, NULL);
-	if (symstrs == NULL)
-		goto out_elf_end;
-
-	sec_strndx = elf_getscn(elf, ehdr.e_shstrndx);
-	if (sec_strndx == NULL)
-		goto out_elf_end;
-
-	secstrs = elf_getdata(sec_strndx, NULL);
-	if (secstrs == NULL)
-		goto out_elf_end;
-
-	nr_syms = shdr.sh_size / shdr.sh_entsize;
-
-	memset(&sym, 0, sizeof(sym));
-
-	/*
-	 * The kernel relocation symbol is needed in advance in order to adjust
-	 * kernel maps correctly.
-	 */
-	if (ref_reloc_sym_not_found(kmap)) {
-		elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) {
-			const char *elf_name = elf_sym__name(&sym, symstrs);
-
-			if (strcmp(elf_name, kmap->ref_reloc_sym->name))
-				continue;
-			kmap->ref_reloc_sym->unrelocated_addr = sym.st_value;
-			break;
-		}
-	}
-
-	dso->adjust_symbols = runtime_ss->adjust_symbols || ref_reloc(kmap);
-	/*
-	 * Initial kernel and module mappings do not map to the dso.  For
-	 * function mappings, flag the fixups.
-	 */
-	if (map->type == MAP__FUNCTION && (dso->kernel || kmodule)) {
-		remap_kernel = true;
-		adjust_kernel_syms = dso->adjust_symbols;
-	}
-	elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) {
-		struct symbol *f;
-		const char *elf_name = elf_sym__name(&sym, symstrs);
-		char *demangled = NULL;
-		int is_label = elf_sym__is_label(&sym);
-		const char *section_name;
-		bool used_opd = false;
-
-		if (!is_label && !elf_sym__is_a(&sym, map->type))
-			continue;
-
-		/* Reject ARM ELF "mapping symbols": these aren't unique and
-		 * don't identify functions, so will confuse the profile
-		 * output: */
-		if (ehdr.e_machine == EM_ARM) {
-			if (!strcmp(elf_name, "$a") ||
-			    !strcmp(elf_name, "$d") ||
-			    !strcmp(elf_name, "$t"))
-				continue;
-		}
-
-		if (runtime_ss->opdsec && sym.st_shndx == runtime_ss->opdidx) {
-			u32 offset = sym.st_value - syms_ss->opdshdr.sh_addr;
-			u64 *opd = opddata->d_buf + offset;
-			sym.st_value = DSO__SWAP(dso, u64, *opd);
-			sym.st_shndx = elf_addr_to_index(runtime_ss->elf,
-					sym.st_value);
-			used_opd = true;
-		}
-		/*
-		 * When loading symbols in a data mapping, ABS symbols (which
-		 * has a value of SHN_ABS in its st_shndx) failed at
-		 * elf_getscn().  And it marks the loading as a failure so
-		 * already loaded symbols cannot be fixed up.
-		 *
-		 * I'm not sure what should be done. Just ignore them for now.
-		 * - Namhyung Kim
-		 */
-		if (sym.st_shndx == SHN_ABS)
-			continue;
-
-		sec = elf_getscn(runtime_ss->elf, sym.st_shndx);
-		if (!sec)
-			goto out_elf_end;
-
-		gelf_getshdr(sec, &shdr);
-
-		if (is_label && !elf_sec__is_a(&shdr, secstrs, map->type))
-			continue;
-
-		section_name = elf_sec__name(&shdr, secstrs);
-
-		/* On ARM, symbols for thumb functions have 1 added to
-		 * the symbol address as a flag - remove it */
-		if ((ehdr.e_machine == EM_ARM) &&
-		    (map->type == MAP__FUNCTION) &&
-		    (sym.st_value & 1))
-			--sym.st_value;
-
-		if (dso->kernel || kmodule) {
-			char dso_name[PATH_MAX];
-
-			/* Adjust symbol to map to file offset */
-			if (adjust_kernel_syms)
-				sym.st_value -= shdr.sh_addr - shdr.sh_offset;
-
-			if (strcmp(section_name,
-				   (curr_dso->short_name +
-				    dso->short_name_len)) == 0)
-				goto new_symbol;
-
-			if (strcmp(section_name, ".text") == 0) {
-				/*
-				 * The initial kernel mapping is based on
-				 * kallsyms and identity maps.  Overwrite it to
-				 * map to the kernel dso.
-				 */
-				if (remap_kernel && dso->kernel) {
-					remap_kernel = false;
-					map->start = shdr.sh_addr +
-						     ref_reloc(kmap);
-					map->end = map->start + shdr.sh_size;
-					map->pgoff = shdr.sh_offset;
-					map->map_ip = map__map_ip;
-					map->unmap_ip = map__unmap_ip;
-					/* Ensure maps are correctly ordered */
-					map_groups__remove(kmap->kmaps, map);
-					map_groups__insert(kmap->kmaps, map);
-				}
-
-				/*
-				 * The initial module mapping is based on
-				 * /proc/modules mapped to offset zero.
-				 * Overwrite it to map to the module dso.
-				 */
-				if (remap_kernel && kmodule) {
-					remap_kernel = false;
-					map->pgoff = shdr.sh_offset;
-				}
-
-				curr_map = map;
-				curr_dso = dso;
-				goto new_symbol;
-			}
-
-			if (!kmap)
-				goto new_symbol;
-
-			snprintf(dso_name, sizeof(dso_name),
-				 "%s%s", dso->short_name, section_name);
-
-			curr_map = map_groups__find_by_name(kmap->kmaps, map->type, dso_name);
-			if (curr_map == NULL) {
-				u64 start = sym.st_value;
-
-				if (kmodule)
-					start += map->start + shdr.sh_offset;
-
-				curr_dso = dso__new(dso_name);
-				if (curr_dso == NULL)
-					goto out_elf_end;
-				curr_dso->kernel = dso->kernel;
-				curr_dso->long_name = dso->long_name;
-				curr_dso->long_name_len = dso->long_name_len;
-				curr_map = map__new2(start, curr_dso,
-						     map->type);
-				if (curr_map == NULL) {
-					dso__delete(curr_dso);
-					goto out_elf_end;
-				}
-				if (adjust_kernel_syms) {
-					curr_map->start = shdr.sh_addr +
-							  ref_reloc(kmap);
-					curr_map->end = curr_map->start +
-							shdr.sh_size;
-					curr_map->pgoff = shdr.sh_offset;
-				} else {
-					curr_map->map_ip = identity__map_ip;
-					curr_map->unmap_ip = identity__map_ip;
-				}
-				curr_dso->symtab_type = dso->symtab_type;
-				map_groups__insert(kmap->kmaps, curr_map);
-				dsos__add(&dso->node, curr_dso);
-				dso__set_loaded(curr_dso, map->type);
-			} else
-				curr_dso = curr_map->dso;
-
-			goto new_symbol;
-		}
-
-		if ((used_opd && runtime_ss->adjust_symbols)
-				|| (!used_opd && syms_ss->adjust_symbols)) {
-			pr_debug4("%s: adjusting symbol: st_value: %#" PRIx64 " "
-				  "sh_addr: %#" PRIx64 " sh_offset: %#" PRIx64 "\n", __func__,
-				  (u64)sym.st_value, (u64)shdr.sh_addr,
-				  (u64)shdr.sh_offset);
-			sym.st_value -= shdr.sh_addr - shdr.sh_offset;
-		}
-		/*
-		 * We need to figure out if the object was created from C++ sources
-		 * DWARF DW_compile_unit has this, but we don't always have access
-		 * to it...
-		 */
-		if (symbol_conf.demangle) {
-			demangled = bfd_demangle(NULL, elf_name,
-						 DMGL_PARAMS | DMGL_ANSI);
-			if (demangled != NULL)
-				elf_name = demangled;
-		}
-new_symbol:
-		f = symbol__new(sym.st_value, sym.st_size,
-				GELF_ST_BIND(sym.st_info), elf_name);
-		free(demangled);
-		if (!f)
-			goto out_elf_end;
-
-		if (filter && filter(curr_map, f))
-			symbol__delete(f);
-		else {
-			symbols__insert(&curr_dso->symbols[curr_map->type], f);
-			nr++;
-		}
-	}
-
-	/*
-	 * For misannotated, zeroed, ASM function sizes.
-	 */
-	if (nr > 0) {
-		symbols__fixup_duplicate(&dso->symbols[map->type]);
-		symbols__fixup_end(&dso->symbols[map->type]);
-		if (kmap) {
-			/*
-			 * We need to fixup this here too because we create new
-			 * maps here, for things like vsyscall sections.
-			 */
-			__map_groups__fixup_end(kmap->kmaps, map->type);
-		}
-	}
-	err = nr;
-out_elf_end:
-	return err;
-}
-
-static int elf_read_maps(Elf *elf, bool exe, mapfn_t mapfn, void *data)
-{
-	GElf_Phdr phdr;
-	size_t i, phdrnum;
-	int err;
-	u64 sz;
-
-	if (elf_getphdrnum(elf, &phdrnum))
-		return -1;
-
-	for (i = 0; i < phdrnum; i++) {
-		if (gelf_getphdr(elf, i, &phdr) == NULL)
-			return -1;
-		if (phdr.p_type != PT_LOAD)
-			continue;
-		if (exe) {
-			if (!(phdr.p_flags & PF_X))
-				continue;
-		} else {
-			if (!(phdr.p_flags & PF_R))
-				continue;
-		}
-		sz = min(phdr.p_memsz, phdr.p_filesz);
-		if (!sz)
-			continue;
-		err = mapfn(phdr.p_vaddr, sz, phdr.p_offset, data);
-		if (err)
-			return err;
-	}
-	return 0;
-}
-
-int file__read_maps(int fd, bool exe, mapfn_t mapfn, void *data,
-		    bool *is_64_bit)
-{
-	int err;
-	Elf *elf;
-
-	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
-	if (elf == NULL)
-		return -1;
-
-	if (is_64_bit)
-		*is_64_bit = (gelf_getclass(elf) == ELFCLASS64);
-
-	err = elf_read_maps(elf, exe, mapfn, data);
-
-	elf_end(elf);
-	return err;
-}
-
-void symbol__elf_init(void)
-{
-	elf_version(EV_CURRENT);
-}
diff --git a/src/tools/perf/util/symbol-minimal.c b/src/tools/perf/util/symbol-minimal.c
deleted file mode 100644
index 3a802c3..0000000
--- a/src/tools/perf/util/symbol-minimal.c
+++ /dev/null
@@ -1,313 +0,0 @@
-#include "symbol.h"
-
-#include <stdio.h>
-#include <fcntl.h>
-#include <string.h>
-#include <byteswap.h>
-#include <sys/stat.h>
-
-
-static bool check_need_swap(int file_endian)
-{
-	const int data = 1;
-	u8 *check = (u8 *)&data;
-	int host_endian;
-
-	if (check[0] == 1)
-		host_endian = ELFDATA2LSB;
-	else
-		host_endian = ELFDATA2MSB;
-
-	return host_endian != file_endian;
-}
-
-#define NOTE_ALIGN(sz) (((sz) + 3) & ~3)
-
-#define NT_GNU_BUILD_ID	3
-
-static int read_build_id(void *note_data, size_t note_len, void *bf,
-			 size_t size, bool need_swap)
-{
-	struct {
-		u32 n_namesz;
-		u32 n_descsz;
-		u32 n_type;
-	} *nhdr;
-	void *ptr;
-
-	ptr = note_data;
-	while (ptr < (note_data + note_len)) {
-		const char *name;
-		size_t namesz, descsz;
-
-		nhdr = ptr;
-		if (need_swap) {
-			nhdr->n_namesz = bswap_32(nhdr->n_namesz);
-			nhdr->n_descsz = bswap_32(nhdr->n_descsz);
-			nhdr->n_type = bswap_32(nhdr->n_type);
-		}
-
-		namesz = NOTE_ALIGN(nhdr->n_namesz);
-		descsz = NOTE_ALIGN(nhdr->n_descsz);
-
-		ptr += sizeof(*nhdr);
-		name = ptr;
-		ptr += namesz;
-		if (nhdr->n_type == NT_GNU_BUILD_ID &&
-		    nhdr->n_namesz == sizeof("GNU")) {
-			if (memcmp(name, "GNU", sizeof("GNU")) == 0) {
-				size_t sz = min(size, descsz);
-				memcpy(bf, ptr, sz);
-				memset(bf + sz, 0, size - sz);
-				return 0;
-			}
-		}
-		ptr += descsz;
-	}
-
-	return -1;
-}
-
-int filename__read_debuglink(const char *filename __maybe_unused,
-			     char *debuglink __maybe_unused,
-			     size_t size __maybe_unused)
-{
-	return -1;
-}
-
-/*
- * Just try PT_NOTE header otherwise fails
- */
-int filename__read_build_id(const char *filename, void *bf, size_t size)
-{
-	FILE *fp;
-	int ret = -1;
-	bool need_swap = false;
-	u8 e_ident[EI_NIDENT];
-	size_t buf_size;
-	void *buf;
-	int i;
-
-	fp = fopen(filename, "r");
-	if (fp == NULL)
-		return -1;
-
-	if (fread(e_ident, sizeof(e_ident), 1, fp) != 1)
-		goto out;
-
-	if (memcmp(e_ident, ELFMAG, SELFMAG) ||
-	    e_ident[EI_VERSION] != EV_CURRENT)
-		goto out;
-
-	need_swap = check_need_swap(e_ident[EI_DATA]);
-
-	/* for simplicity */
-	fseek(fp, 0, SEEK_SET);
-
-	if (e_ident[EI_CLASS] == ELFCLASS32) {
-		Elf32_Ehdr ehdr;
-		Elf32_Phdr *phdr;
-
-		if (fread(&ehdr, sizeof(ehdr), 1, fp) != 1)
-			goto out;
-
-		if (need_swap) {
-			ehdr.e_phoff = bswap_32(ehdr.e_phoff);
-			ehdr.e_phentsize = bswap_16(ehdr.e_phentsize);
-			ehdr.e_phnum = bswap_16(ehdr.e_phnum);
-		}
-
-		buf_size = ehdr.e_phentsize * ehdr.e_phnum;
-		buf = malloc(buf_size);
-		if (buf == NULL)
-			goto out;
-
-		fseek(fp, ehdr.e_phoff, SEEK_SET);
-		if (fread(buf, buf_size, 1, fp) != 1)
-			goto out_free;
-
-		for (i = 0, phdr = buf; i < ehdr.e_phnum; i++, phdr++) {
-			void *tmp;
-
-			if (need_swap) {
-				phdr->p_type = bswap_32(phdr->p_type);
-				phdr->p_offset = bswap_32(phdr->p_offset);
-				phdr->p_filesz = bswap_32(phdr->p_filesz);
-			}
-
-			if (phdr->p_type != PT_NOTE)
-				continue;
-
-			buf_size = phdr->p_filesz;
-			tmp = realloc(buf, buf_size);
-			if (tmp == NULL)
-				goto out_free;
-
-			buf = tmp;
-			fseek(fp, phdr->p_offset, SEEK_SET);
-			if (fread(buf, buf_size, 1, fp) != 1)
-				goto out_free;
-
-			ret = read_build_id(buf, buf_size, bf, size, need_swap);
-			if (ret == 0)
-				ret = size;
-			break;
-		}
-	} else {
-		Elf64_Ehdr ehdr;
-		Elf64_Phdr *phdr;
-
-		if (fread(&ehdr, sizeof(ehdr), 1, fp) != 1)
-			goto out;
-
-		if (need_swap) {
-			ehdr.e_phoff = bswap_64(ehdr.e_phoff);
-			ehdr.e_phentsize = bswap_16(ehdr.e_phentsize);
-			ehdr.e_phnum = bswap_16(ehdr.e_phnum);
-		}
-
-		buf_size = ehdr.e_phentsize * ehdr.e_phnum;
-		buf = malloc(buf_size);
-		if (buf == NULL)
-			goto out;
-
-		fseek(fp, ehdr.e_phoff, SEEK_SET);
-		if (fread(buf, buf_size, 1, fp) != 1)
-			goto out_free;
-
-		for (i = 0, phdr = buf; i < ehdr.e_phnum; i++, phdr++) {
-			void *tmp;
-
-			if (need_swap) {
-				phdr->p_type = bswap_32(phdr->p_type);
-				phdr->p_offset = bswap_64(phdr->p_offset);
-				phdr->p_filesz = bswap_64(phdr->p_filesz);
-			}
-
-			if (phdr->p_type != PT_NOTE)
-				continue;
-
-			buf_size = phdr->p_filesz;
-			tmp = realloc(buf, buf_size);
-			if (tmp == NULL)
-				goto out_free;
-
-			buf = tmp;
-			fseek(fp, phdr->p_offset, SEEK_SET);
-			if (fread(buf, buf_size, 1, fp) != 1)
-				goto out_free;
-
-			ret = read_build_id(buf, buf_size, bf, size, need_swap);
-			if (ret == 0)
-				ret = size;
-			break;
-		}
-	}
-out_free:
-	free(buf);
-out:
-	fclose(fp);
-	return ret;
-}
-
-int sysfs__read_build_id(const char *filename, void *build_id, size_t size)
-{
-	int fd;
-	int ret = -1;
-	struct stat stbuf;
-	size_t buf_size;
-	void *buf;
-
-	fd = open(filename, O_RDONLY);
-	if (fd < 0)
-		return -1;
-
-	if (fstat(fd, &stbuf) < 0)
-		goto out;
-
-	buf_size = stbuf.st_size;
-	buf = malloc(buf_size);
-	if (buf == NULL)
-		goto out;
-
-	if (read(fd, buf, buf_size) != (ssize_t) buf_size)
-		goto out_free;
-
-	ret = read_build_id(buf, buf_size, build_id, size, false);
-out_free:
-	free(buf);
-out:
-	close(fd);
-	return ret;
-}
-
-int symsrc__init(struct symsrc *ss, struct dso *dso __maybe_unused,
-		 const char *name,
-	         enum dso_binary_type type)
-{
-	int fd = open(name, O_RDONLY);
-	if (fd < 0)
-		return -1;
-
-	ss->name = strdup(name);
-	if (!ss->name)
-		goto out_close;
-
-	ss->type = type;
-
-	return 0;
-out_close:
-	close(fd);
-	return -1;
-}
-
-bool symsrc__possibly_runtime(struct symsrc *ss __maybe_unused)
-{
-	/* Assume all sym sources could be a runtime image. */
-	return true;
-}
-
-bool symsrc__has_symtab(struct symsrc *ss __maybe_unused)
-{
-	return false;
-}
-
-void symsrc__destroy(struct symsrc *ss)
-{
-	free(ss->name);
-	close(ss->fd);
-}
-
-int dso__synthesize_plt_symbols(struct dso *dso __maybe_unused,
-				struct symsrc *ss __maybe_unused,
-				struct map *map __maybe_unused,
-				symbol_filter_t filter __maybe_unused)
-{
-	return 0;
-}
-
-int dso__load_sym(struct dso *dso, struct map *map __maybe_unused,
-		  struct symsrc *ss,
-		  struct symsrc *runtime_ss __maybe_unused,
-		  symbol_filter_t filter __maybe_unused,
-		  int kmodule __maybe_unused)
-{
-	unsigned char *build_id[BUILD_ID_SIZE];
-
-	if (filename__read_build_id(ss->name, build_id, BUILD_ID_SIZE) > 0) {
-		dso__set_build_id(dso, build_id);
-		return 1;
-	}
-	return 0;
-}
-
-int file__read_maps(int fd __maybe_unused, bool exe __maybe_unused,
-		    mapfn_t mapfn __maybe_unused, void *data __maybe_unused,
-		    bool *is_64_bit __maybe_unused)
-{
-	return -1;
-}
-
-void symbol__elf_init(void)
-{
-}
diff --git a/src/tools/perf/util/symbol.c b/src/tools/perf/util/symbol.c
deleted file mode 100644
index 7eb0362..0000000
--- a/src/tools/perf/util/symbol.c
+++ /dev/null
@@ -1,1509 +0,0 @@
-#include <dirent.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/param.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <inttypes.h>
-#include "build-id.h"
-#include "util.h"
-#include "debug.h"
-#include "machine.h"
-#include "symbol.h"
-#include "strlist.h"
-
-#include <elf.h>
-#include <limits.h>
-#include <sys/utsname.h>
-
-#ifndef KSYM_NAME_LEN
-#define KSYM_NAME_LEN 256
-#endif
-
-static int dso__load_kernel_sym(struct dso *dso, struct map *map,
-				symbol_filter_t filter);
-static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map,
-			symbol_filter_t filter);
-int vmlinux_path__nr_entries;
-char **vmlinux_path;
-
-struct symbol_conf symbol_conf = {
-	.use_modules	  = true,
-	.try_vmlinux_path = true,
-	.annotate_src	  = true,
-	.demangle	  = true,
-	.symfs            = "",
-};
-
-static enum dso_binary_type binary_type_symtab[] = {
-	DSO_BINARY_TYPE__KALLSYMS,
-	DSO_BINARY_TYPE__GUEST_KALLSYMS,
-	DSO_BINARY_TYPE__JAVA_JIT,
-	DSO_BINARY_TYPE__DEBUGLINK,
-	DSO_BINARY_TYPE__BUILD_ID_CACHE,
-	DSO_BINARY_TYPE__FEDORA_DEBUGINFO,
-	DSO_BINARY_TYPE__UBUNTU_DEBUGINFO,
-	DSO_BINARY_TYPE__BUILDID_DEBUGINFO,
-	DSO_BINARY_TYPE__SYSTEM_PATH_DSO,
-	DSO_BINARY_TYPE__GUEST_KMODULE,
-	DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE,
-	DSO_BINARY_TYPE__NOT_FOUND,
-};
-
-#define DSO_BINARY_TYPE__SYMTAB_CNT ARRAY_SIZE(binary_type_symtab)
-
-bool symbol_type__is_a(char symbol_type, enum map_type map_type)
-{
-	symbol_type = toupper(symbol_type);
-
-	switch (map_type) {
-	case MAP__FUNCTION:
-		return symbol_type == 'T' || symbol_type == 'W';
-	case MAP__VARIABLE:
-		return symbol_type == 'D';
-	default:
-		return false;
-	}
-}
-
-static int prefix_underscores_count(const char *str)
-{
-	const char *tail = str;
-
-	while (*tail == '_')
-		tail++;
-
-	return tail - str;
-}
-
-#define SYMBOL_A 0
-#define SYMBOL_B 1
-
-static int choose_best_symbol(struct symbol *syma, struct symbol *symb)
-{
-	s64 a;
-	s64 b;
-	size_t na, nb;
-
-	/* Prefer a symbol with non zero length */
-	a = syma->end - syma->start;
-	b = symb->end - symb->start;
-	if ((b == 0) && (a > 0))
-		return SYMBOL_A;
-	else if ((a == 0) && (b > 0))
-		return SYMBOL_B;
-
-	/* Prefer a non weak symbol over a weak one */
-	a = syma->binding == STB_WEAK;
-	b = symb->binding == STB_WEAK;
-	if (b && !a)
-		return SYMBOL_A;
-	if (a && !b)
-		return SYMBOL_B;
-
-	/* Prefer a global symbol over a non global one */
-	a = syma->binding == STB_GLOBAL;
-	b = symb->binding == STB_GLOBAL;
-	if (a && !b)
-		return SYMBOL_A;
-	if (b && !a)
-		return SYMBOL_B;
-
-	/* Prefer a symbol with less underscores */
-	a = prefix_underscores_count(syma->name);
-	b = prefix_underscores_count(symb->name);
-	if (b > a)
-		return SYMBOL_A;
-	else if (a > b)
-		return SYMBOL_B;
-
-	/* Choose the symbol with the longest name */
-	na = strlen(syma->name);
-	nb = strlen(symb->name);
-	if (na > nb)
-		return SYMBOL_A;
-	else if (na < nb)
-		return SYMBOL_B;
-
-	/* Avoid "SyS" kernel syscall aliases */
-	if (na >= 3 && !strncmp(syma->name, "SyS", 3))
-		return SYMBOL_B;
-	if (na >= 10 && !strncmp(syma->name, "compat_SyS", 10))
-		return SYMBOL_B;
-
-	return SYMBOL_A;
-}
-
-void symbols__fixup_duplicate(struct rb_root *symbols)
-{
-	struct rb_node *nd;
-	struct symbol *curr, *next;
-
-	nd = rb_first(symbols);
-
-	while (nd) {
-		curr = rb_entry(nd, struct symbol, rb_node);
-again:
-		nd = rb_next(&curr->rb_node);
-		next = rb_entry(nd, struct symbol, rb_node);
-
-		if (!nd)
-			break;
-
-		if (curr->start != next->start)
-			continue;
-
-		if (choose_best_symbol(curr, next) == SYMBOL_A) {
-			rb_erase(&next->rb_node, symbols);
-			goto again;
-		} else {
-			nd = rb_next(&curr->rb_node);
-			rb_erase(&curr->rb_node, symbols);
-		}
-	}
-}
-
-void symbols__fixup_end(struct rb_root *symbols)
-{
-	struct rb_node *nd, *prevnd = rb_first(symbols);
-	struct symbol *curr, *prev;
-
-	if (prevnd == NULL)
-		return;
-
-	curr = rb_entry(prevnd, struct symbol, rb_node);
-
-	for (nd = rb_next(prevnd); nd; nd = rb_next(nd)) {
-		prev = curr;
-		curr = rb_entry(nd, struct symbol, rb_node);
-
-		if (prev->end == prev->start && prev->end != curr->start)
-			prev->end = curr->start - 1;
-	}
-
-	/* Last entry */
-	if (curr->end == curr->start)
-		curr->end = roundup(curr->start, 4096);
-}
-
-void __map_groups__fixup_end(struct map_groups *mg, enum map_type type)
-{
-	struct map *prev, *curr;
-	struct rb_node *nd, *prevnd = rb_first(&mg->maps[type]);
-
-	if (prevnd == NULL)
-		return;
-
-	curr = rb_entry(prevnd, struct map, rb_node);
-
-	for (nd = rb_next(prevnd); nd; nd = rb_next(nd)) {
-		prev = curr;
-		curr = rb_entry(nd, struct map, rb_node);
-		prev->end = curr->start - 1;
-	}
-
-	/*
-	 * We still haven't the actual symbols, so guess the
-	 * last map final address.
-	 */
-	curr->end = ~0ULL;
-}
-
-struct symbol *symbol__new(u64 start, u64 len, u8 binding, const char *name)
-{
-	size_t namelen = strlen(name) + 1;
-	struct symbol *sym = calloc(1, (symbol_conf.priv_size +
-					sizeof(*sym) + namelen));
-	if (sym == NULL)
-		return NULL;
-
-	if (symbol_conf.priv_size)
-		sym = ((void *)sym) + symbol_conf.priv_size;
-
-	sym->start   = start;
-	sym->end     = len ? start + len - 1 : start;
-	sym->binding = binding;
-	sym->namelen = namelen - 1;
-
-	pr_debug4("%s: %s %#" PRIx64 "-%#" PRIx64 "\n",
-		  __func__, name, start, sym->end);
-	memcpy(sym->name, name, namelen);
-
-	return sym;
-}
-
-void symbol__delete(struct symbol *sym)
-{
-	free(((void *)sym) - symbol_conf.priv_size);
-}
-
-size_t symbol__fprintf(struct symbol *sym, FILE *fp)
-{
-	return fprintf(fp, " %" PRIx64 "-%" PRIx64 " %c %s\n",
-		       sym->start, sym->end,
-		       sym->binding == STB_GLOBAL ? 'g' :
-		       sym->binding == STB_LOCAL  ? 'l' : 'w',
-		       sym->name);
-}
-
-size_t symbol__fprintf_symname_offs(const struct symbol *sym,
-				    const struct addr_location *al, FILE *fp)
-{
-	unsigned long offset;
-	size_t length;
-
-	if (sym && sym->name) {
-		length = fprintf(fp, "%s", sym->name);
-		if (al) {
-			if (al->addr < sym->end)
-				offset = al->addr - sym->start;
-			else
-				offset = al->addr - al->map->start - sym->start;
-			length += fprintf(fp, "+0x%lx", offset);
-		}
-		return length;
-	} else
-		return fprintf(fp, "[unknown]");
-}
-
-size_t symbol__fprintf_symname(const struct symbol *sym, FILE *fp)
-{
-	return symbol__fprintf_symname_offs(sym, NULL, fp);
-}
-
-void symbols__delete(struct rb_root *symbols)
-{
-	struct symbol *pos;
-	struct rb_node *next = rb_first(symbols);
-
-	while (next) {
-		pos = rb_entry(next, struct symbol, rb_node);
-		next = rb_next(&pos->rb_node);
-		rb_erase(&pos->rb_node, symbols);
-		symbol__delete(pos);
-	}
-}
-
-void symbols__insert(struct rb_root *symbols, struct symbol *sym)
-{
-	struct rb_node **p = &symbols->rb_node;
-	struct rb_node *parent = NULL;
-	const u64 ip = sym->start;
-	struct symbol *s;
-
-	while (*p != NULL) {
-		parent = *p;
-		s = rb_entry(parent, struct symbol, rb_node);
-		if (ip < s->start)
-			p = &(*p)->rb_left;
-		else
-			p = &(*p)->rb_right;
-	}
-	rb_link_node(&sym->rb_node, parent, p);
-	rb_insert_color(&sym->rb_node, symbols);
-}
-
-static struct symbol *symbols__find(struct rb_root *symbols, u64 ip)
-{
-	struct rb_node *n;
-
-	if (symbols == NULL)
-		return NULL;
-
-	n = symbols->rb_node;
-
-	while (n) {
-		struct symbol *s = rb_entry(n, struct symbol, rb_node);
-
-		if (ip < s->start)
-			n = n->rb_left;
-		else if (ip > s->end)
-			n = n->rb_right;
-		else
-			return s;
-	}
-
-	return NULL;
-}
-
-static struct symbol *symbols__first(struct rb_root *symbols)
-{
-	struct rb_node *n = rb_first(symbols);
-
-	if (n)
-		return rb_entry(n, struct symbol, rb_node);
-
-	return NULL;
-}
-
-struct symbol_name_rb_node {
-	struct rb_node	rb_node;
-	struct symbol	sym;
-};
-
-static void symbols__insert_by_name(struct rb_root *symbols, struct symbol *sym)
-{
-	struct rb_node **p = &symbols->rb_node;
-	struct rb_node *parent = NULL;
-	struct symbol_name_rb_node *symn, *s;
-
-	symn = container_of(sym, struct symbol_name_rb_node, sym);
-
-	while (*p != NULL) {
-		parent = *p;
-		s = rb_entry(parent, struct symbol_name_rb_node, rb_node);
-		if (strcmp(sym->name, s->sym.name) < 0)
-			p = &(*p)->rb_left;
-		else
-			p = &(*p)->rb_right;
-	}
-	rb_link_node(&symn->rb_node, parent, p);
-	rb_insert_color(&symn->rb_node, symbols);
-}
-
-static void symbols__sort_by_name(struct rb_root *symbols,
-				  struct rb_root *source)
-{
-	struct rb_node *nd;
-
-	for (nd = rb_first(source); nd; nd = rb_next(nd)) {
-		struct symbol *pos = rb_entry(nd, struct symbol, rb_node);
-		symbols__insert_by_name(symbols, pos);
-	}
-}
-
-static struct symbol *symbols__find_by_name(struct rb_root *symbols,
-					    const char *name)
-{
-	struct rb_node *n;
-
-	if (symbols == NULL)
-		return NULL;
-
-	n = symbols->rb_node;
-
-	while (n) {
-		struct symbol_name_rb_node *s;
-		int cmp;
-
-		s = rb_entry(n, struct symbol_name_rb_node, rb_node);
-		cmp = strcmp(name, s->sym.name);
-
-		if (cmp < 0)
-			n = n->rb_left;
-		else if (cmp > 0)
-			n = n->rb_right;
-		else
-			return &s->sym;
-	}
-
-	return NULL;
-}
-
-struct symbol *dso__find_symbol(struct dso *dso,
-				enum map_type type, u64 addr)
-{
-	return symbols__find(&dso->symbols[type], addr);
-}
-
-struct symbol *dso__first_symbol(struct dso *dso, enum map_type type)
-{
-	return symbols__first(&dso->symbols[type]);
-}
-
-struct symbol *dso__find_symbol_by_name(struct dso *dso, enum map_type type,
-					const char *name)
-{
-	return symbols__find_by_name(&dso->symbol_names[type], name);
-}
-
-void dso__sort_by_name(struct dso *dso, enum map_type type)
-{
-	dso__set_sorted_by_name(dso, type);
-	return symbols__sort_by_name(&dso->symbol_names[type],
-				     &dso->symbols[type]);
-}
-
-size_t dso__fprintf_symbols_by_name(struct dso *dso,
-				    enum map_type type, FILE *fp)
-{
-	size_t ret = 0;
-	struct rb_node *nd;
-	struct symbol_name_rb_node *pos;
-
-	for (nd = rb_first(&dso->symbol_names[type]); nd; nd = rb_next(nd)) {
-		pos = rb_entry(nd, struct symbol_name_rb_node, rb_node);
-		fprintf(fp, "%s\n", pos->sym.name);
-	}
-
-	return ret;
-}
-
-int kallsyms__parse(const char *filename, void *arg,
-		    int (*process_symbol)(void *arg, const char *name,
-					  char type, u64 start))
-{
-	char *line = NULL;
-	size_t n;
-	int err = -1;
-	FILE *file = fopen(filename, "r");
-
-	if (file == NULL)
-		goto out_failure;
-
-	err = 0;
-
-	while (!feof(file)) {
-		u64 start;
-		int line_len, len;
-		char symbol_type;
-		char *symbol_name;
-
-		line_len = getline(&line, &n, file);
-		if (line_len < 0 || !line)
-			break;
-
-		line[--line_len] = '\0'; /* \n */
-
-		len = hex2u64(line, &start);
-
-		len++;
-		if (len + 2 >= line_len)
-			continue;
-
-		symbol_type = line[len];
-		len += 2;
-		symbol_name = line + len;
-		len = line_len - len;
-
-		if (len >= KSYM_NAME_LEN) {
-			err = -1;
-			break;
-		}
-
-		err = process_symbol(arg, symbol_name,
-				     symbol_type, start);
-		if (err)
-			break;
-	}
-
-	free(line);
-	fclose(file);
-	return err;
-
-out_failure:
-	return -1;
-}
-
-struct process_kallsyms_args {
-	struct map *map;
-	struct dso *dso;
-};
-
-static u8 kallsyms2elf_type(char type)
-{
-	if (type == 'W')
-		return STB_WEAK;
-
-	return isupper(type) ? STB_GLOBAL : STB_LOCAL;
-}
-
-static int map__process_kallsym_symbol(void *arg, const char *name,
-				       char type, u64 start)
-{
-	struct symbol *sym;
-	struct process_kallsyms_args *a = arg;
-	struct rb_root *root = &a->dso->symbols[a->map->type];
-
-	if (!symbol_type__is_a(type, a->map->type))
-		return 0;
-
-	/*
-	 * module symbols are not sorted so we add all
-	 * symbols, setting length to 0, and rely on
-	 * symbols__fixup_end() to fix it up.
-	 */
-	sym = symbol__new(start, 0, kallsyms2elf_type(type), name);
-	if (sym == NULL)
-		return -ENOMEM;
-	/*
-	 * We will pass the symbols to the filter later, in
-	 * map__split_kallsyms, when we have split the maps per module
-	 */
-	symbols__insert(root, sym);
-
-	return 0;
-}
-
-/*
- * Loads the function entries in /proc/kallsyms into kernel_map->dso,
- * so that we can in the next step set the symbol ->end address and then
- * call kernel_maps__split_kallsyms.
- */
-static int dso__load_all_kallsyms(struct dso *dso, const char *filename,
-				  struct map *map)
-{
-	struct process_kallsyms_args args = { .map = map, .dso = dso, };
-	return kallsyms__parse(filename, &args, map__process_kallsym_symbol);
-}
-
-static int dso__split_kallsyms_for_kcore(struct dso *dso, struct map *map,
-					 symbol_filter_t filter)
-{
-	struct map_groups *kmaps = map__kmap(map)->kmaps;
-	struct map *curr_map;
-	struct symbol *pos;
-	int count = 0, moved = 0;
-	struct rb_root *root = &dso->symbols[map->type];
-	struct rb_node *next = rb_first(root);
-
-	while (next) {
-		char *module;
-
-		pos = rb_entry(next, struct symbol, rb_node);
-		next = rb_next(&pos->rb_node);
-
-		module = strchr(pos->name, '\t');
-		if (module)
-			*module = '\0';
-
-		curr_map = map_groups__find(kmaps, map->type, pos->start);
-
-		if (!curr_map || (filter && filter(curr_map, pos))) {
-			rb_erase(&pos->rb_node, root);
-			symbol__delete(pos);
-		} else {
-			pos->start -= curr_map->start - curr_map->pgoff;
-			if (pos->end)
-				pos->end -= curr_map->start - curr_map->pgoff;
-			if (curr_map != map) {
-				rb_erase(&pos->rb_node, root);
-				symbols__insert(
-					&curr_map->dso->symbols[curr_map->type],
-					pos);
-				++moved;
-			} else {
-				++count;
-			}
-		}
-	}
-
-	/* Symbols have been adjusted */
-	dso->adjust_symbols = 1;
-
-	return count + moved;
-}
-
-/*
- * Split the symbols into maps, making sure there are no overlaps, i.e. the
- * kernel range is broken in several maps, named [kernel].N, as we don't have
- * the original ELF section names vmlinux have.
- */
-static int dso__split_kallsyms(struct dso *dso, struct map *map,
-			       symbol_filter_t filter)
-{
-	struct map_groups *kmaps = map__kmap(map)->kmaps;
-	struct machine *machine = kmaps->machine;
-	struct map *curr_map = map;
-	struct symbol *pos;
-	int count = 0, moved = 0;	
-	struct rb_root *root = &dso->symbols[map->type];
-	struct rb_node *next = rb_first(root);
-	int kernel_range = 0;
-
-	while (next) {
-		char *module;
-
-		pos = rb_entry(next, struct symbol, rb_node);
-		next = rb_next(&pos->rb_node);
-
-		module = strchr(pos->name, '\t');
-		if (module) {
-			if (!symbol_conf.use_modules)
-				goto discard_symbol;
-
-			*module++ = '\0';
-
-			if (strcmp(curr_map->dso->short_name, module)) {
-				if (curr_map != map &&
-				    dso->kernel == DSO_TYPE_GUEST_KERNEL &&
-				    machine__is_default_guest(machine)) {
-					/*
-					 * We assume all symbols of a module are
-					 * continuous in * kallsyms, so curr_map
-					 * points to a module and all its
-					 * symbols are in its kmap. Mark it as
-					 * loaded.
-					 */
-					dso__set_loaded(curr_map->dso,
-							curr_map->type);
-				}
-
-				curr_map = map_groups__find_by_name(kmaps,
-							map->type, module);
-				if (curr_map == NULL) {
-					pr_debug("%s/proc/{kallsyms,modules} "
-					         "inconsistency while looking "
-						 "for \"%s\" module!\n",
-						 machine->root_dir, module);
-					curr_map = map;
-					goto discard_symbol;
-				}
-
-				if (curr_map->dso->loaded &&
-				    !machine__is_default_guest(machine))
-					goto discard_symbol;
-			}
-			/*
-			 * So that we look just like we get from .ko files,
-			 * i.e. not prelinked, relative to map->start.
-			 */
-			pos->start = curr_map->map_ip(curr_map, pos->start);
-			pos->end   = curr_map->map_ip(curr_map, pos->end);
-		} else if (curr_map != map) {
-			char dso_name[PATH_MAX];
-			struct dso *ndso;
-
-			if (count == 0) {
-				curr_map = map;
-				goto filter_symbol;
-			}
-
-			if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
-				snprintf(dso_name, sizeof(dso_name),
-					"[guest.kernel].%d",
-					kernel_range++);
-			else
-				snprintf(dso_name, sizeof(dso_name),
-					"[kernel].%d",
-					kernel_range++);
-
-			ndso = dso__new(dso_name);
-			if (ndso == NULL)
-				return -1;
-
-			ndso->kernel = dso->kernel;
-
-			curr_map = map__new2(pos->start, ndso, map->type);
-			if (curr_map == NULL) {
-				dso__delete(ndso);
-				return -1;
-			}
-
-			curr_map->map_ip = curr_map->unmap_ip = identity__map_ip;
-			map_groups__insert(kmaps, curr_map);
-			++kernel_range;
-		}
-filter_symbol:
-		if (filter && filter(curr_map, pos)) {
-discard_symbol:		rb_erase(&pos->rb_node, root);
-			symbol__delete(pos);
-		} else {
-			if (curr_map != map) {
-				rb_erase(&pos->rb_node, root);
-				symbols__insert(&curr_map->dso->symbols[curr_map->type], pos);
-				++moved;
-			} else
-				++count;
-		}
-	}
-
-	if (curr_map != map &&
-	    dso->kernel == DSO_TYPE_GUEST_KERNEL &&
-	    machine__is_default_guest(kmaps->machine)) {
-		dso__set_loaded(curr_map->dso, curr_map->type);
-	}
-
-	return count + moved;
-}
-
-bool symbol__restricted_filename(const char *filename,
-				 const char *restricted_filename)
-{
-	bool restricted = false;
-
-	if (symbol_conf.kptr_restrict) {
-		char *r = realpath(filename, NULL);
-
-		if (r != NULL) {
-			restricted = strcmp(r, restricted_filename) == 0;
-			free(r);
-			return restricted;
-		}
-	}
-
-	return restricted;
-}
-
-struct kcore_mapfn_data {
-	struct dso *dso;
-	enum map_type type;
-	struct list_head maps;
-};
-
-static int kcore_mapfn(u64 start, u64 len, u64 pgoff, void *data)
-{
-	struct kcore_mapfn_data *md = data;
-	struct map *map;
-
-	map = map__new2(start, md->dso, md->type);
-	if (map == NULL)
-		return -ENOMEM;
-
-	map->end = map->start + len;
-	map->pgoff = pgoff;
-
-	list_add(&map->node, &md->maps);
-
-	return 0;
-}
-
-/*
- * If kallsyms is referenced by name then we look for kcore in the same
- * directory.
- */
-static bool kcore_filename_from_kallsyms_filename(char *kcore_filename,
-						  const char *kallsyms_filename)
-{
-	char *name;
-
-	strcpy(kcore_filename, kallsyms_filename);
-	name = strrchr(kcore_filename, '/');
-	if (!name)
-		return false;
-
-	if (!strcmp(name, "/kallsyms")) {
-		strcpy(name, "/kcore");
-		return true;
-	}
-
-	return false;
-}
-
-static int dso__load_kcore(struct dso *dso, struct map *map,
-			   const char *kallsyms_filename)
-{
-	struct map_groups *kmaps = map__kmap(map)->kmaps;
-	struct machine *machine = kmaps->machine;
-	struct kcore_mapfn_data md;
-	struct map *old_map, *new_map, *replacement_map = NULL;
-	bool is_64_bit;
-	int err, fd;
-	char kcore_filename[PATH_MAX];
-	struct symbol *sym;
-
-	/* This function requires that the map is the kernel map */
-	if (map != machine->vmlinux_maps[map->type])
-		return -EINVAL;
-
-	if (!kcore_filename_from_kallsyms_filename(kcore_filename,
-						   kallsyms_filename))
-		return -EINVAL;
-
-	md.dso = dso;
-	md.type = map->type;
-	INIT_LIST_HEAD(&md.maps);
-
-	fd = open(kcore_filename, O_RDONLY);
-	if (fd < 0)
-		return -EINVAL;
-
-	/* Read new maps into temporary lists */
-	err = file__read_maps(fd, md.type == MAP__FUNCTION, kcore_mapfn, &md,
-			      &is_64_bit);
-	if (err)
-		goto out_err;
-
-	if (list_empty(&md.maps)) {
-		err = -EINVAL;
-		goto out_err;
-	}
-
-	/* Remove old maps */
-	old_map = map_groups__first(kmaps, map->type);
-	while (old_map) {
-		struct map *next = map_groups__next(old_map);
-
-		if (old_map != map)
-			map_groups__remove(kmaps, old_map);
-		old_map = next;
-	}
-
-	/* Find the kernel map using the first symbol */
-	sym = dso__first_symbol(dso, map->type);
-	list_for_each_entry(new_map, &md.maps, node) {
-		if (sym && sym->start >= new_map->start &&
-		    sym->start < new_map->end) {
-			replacement_map = new_map;
-			break;
-		}
-	}
-
-	if (!replacement_map)
-		replacement_map = list_entry(md.maps.next, struct map, node);
-
-	/* Add new maps */
-	while (!list_empty(&md.maps)) {
-		new_map = list_entry(md.maps.next, struct map, node);
-		list_del(&new_map->node);
-		if (new_map == replacement_map) {
-			map->start	= new_map->start;
-			map->end	= new_map->end;
-			map->pgoff	= new_map->pgoff;
-			map->map_ip	= new_map->map_ip;
-			map->unmap_ip	= new_map->unmap_ip;
-			map__delete(new_map);
-			/* Ensure maps are correctly ordered */
-			map_groups__remove(kmaps, map);
-			map_groups__insert(kmaps, map);
-		} else {
-			map_groups__insert(kmaps, new_map);
-		}
-	}
-
-	/*
-	 * Set the data type and long name so that kcore can be read via
-	 * dso__data_read_addr().
-	 */
-	if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
-		dso->data_type = DSO_BINARY_TYPE__GUEST_KCORE;
-	else
-		dso->data_type = DSO_BINARY_TYPE__KCORE;
-	dso__set_long_name(dso, strdup(kcore_filename));
-
-	close(fd);
-
-	if (map->type == MAP__FUNCTION)
-		pr_debug("Using %s for kernel object code\n", kcore_filename);
-	else
-		pr_debug("Using %s for kernel data\n", kcore_filename);
-
-	return 0;
-
-out_err:
-	while (!list_empty(&md.maps)) {
-		map = list_entry(md.maps.next, struct map, node);
-		list_del(&map->node);
-		map__delete(map);
-	}
-	close(fd);
-	return -EINVAL;
-}
-
-int dso__load_kallsyms(struct dso *dso, const char *filename,
-		       struct map *map, symbol_filter_t filter)
-{
-	if (symbol__restricted_filename(filename, "/proc/kallsyms"))
-		return -1;
-
-	if (dso__load_all_kallsyms(dso, filename, map) < 0)
-		return -1;
-
-	symbols__fixup_duplicate(&dso->symbols[map->type]);
-	symbols__fixup_end(&dso->symbols[map->type]);
-
-	if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
-		dso->symtab_type = DSO_BINARY_TYPE__GUEST_KALLSYMS;
-	else
-		dso->symtab_type = DSO_BINARY_TYPE__KALLSYMS;
-
-	if (!dso__load_kcore(dso, map, filename))
-		return dso__split_kallsyms_for_kcore(dso, map, filter);
-	else
-		return dso__split_kallsyms(dso, map, filter);
-}
-
-static int dso__load_perf_map(struct dso *dso, struct map *map,
-			      symbol_filter_t filter)
-{
-	char *line = NULL;
-	size_t n;
-	FILE *file;
-	int nr_syms = 0;
-
-	file = fopen(dso->long_name, "r");
-	if (file == NULL)
-		goto out_failure;
-
-	while (!feof(file)) {
-		u64 start, size;
-		struct symbol *sym;
-		int line_len, len;
-
-		line_len = getline(&line, &n, file);
-		if (line_len < 0)
-			break;
-
-		if (!line)
-			goto out_failure;
-
-		line[--line_len] = '\0'; /* \n */
-
-		len = hex2u64(line, &start);
-
-		len++;
-		if (len + 2 >= line_len)
-			continue;
-
-		len += hex2u64(line + len, &size);
-
-		len++;
-		if (len + 2 >= line_len)
-			continue;
-
-		sym = symbol__new(start, size, STB_GLOBAL, line + len);
-
-		if (sym == NULL)
-			goto out_delete_line;
-
-		if (filter && filter(map, sym))
-			symbol__delete(sym);
-		else {
-			symbols__insert(&dso->symbols[map->type], sym);
-			nr_syms++;
-		}
-	}
-
-	free(line);
-	fclose(file);
-
-	return nr_syms;
-
-out_delete_line:
-	free(line);
-out_failure:
-	return -1;
-}
-
-int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter)
-{
-	char *name;
-	int ret = -1;
-	u_int i;
-	struct machine *machine;
-	char *root_dir = (char *) "";
-	int ss_pos = 0;
-	struct symsrc ss_[2];
-	struct symsrc *syms_ss = NULL, *runtime_ss = NULL;
-
-	dso__set_loaded(dso, map->type);
-
-	if (dso->kernel == DSO_TYPE_KERNEL)
-		return dso__load_kernel_sym(dso, map, filter);
-	else if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
-		return dso__load_guest_kernel_sym(dso, map, filter);
-
-	if (map->groups && map->groups->machine)
-		machine = map->groups->machine;
-	else
-		machine = NULL;
-
-	dso->adjust_symbols = 0;
-
-	if (strncmp(dso->name, "/tmp/perf-", 10) == 0) {
-		struct stat st;
-
-		if (lstat(dso->name, &st) < 0)
-			return -1;
-
-		if (st.st_uid && (st.st_uid != geteuid())) {
-			pr_warning("File %s not owned by current user or root, "
-				"ignoring it.\n", dso->name);
-			return -1;
-		}
-
-		ret = dso__load_perf_map(dso, map, filter);
-		dso->symtab_type = ret > 0 ? DSO_BINARY_TYPE__JAVA_JIT :
-					     DSO_BINARY_TYPE__NOT_FOUND;
-		return ret;
-	}
-
-	if (machine)
-		root_dir = machine->root_dir;
-
-	name = malloc(PATH_MAX);
-	if (!name)
-		return -1;
-
-	/* Iterate over candidate debug images.
-	 * Keep track of "interesting" ones (those which have a symtab, dynsym,
-	 * and/or opd section) for processing.
-	 */
-	for (i = 0; i < DSO_BINARY_TYPE__SYMTAB_CNT; i++) {
-		struct symsrc *ss = &ss_[ss_pos];
-		bool next_slot = false;
-
-		enum dso_binary_type symtab_type = binary_type_symtab[i];
-
-		if (dso__binary_type_file(dso, symtab_type,
-					  root_dir, name, PATH_MAX))
-			continue;
-
-		/* Name is now the name of the next image to try */
-		if (symsrc__init(ss, dso, name, symtab_type) < 0)
-			continue;
-
-		if (!syms_ss && symsrc__has_symtab(ss)) {
-			syms_ss = ss;
-			next_slot = true;
-		}
-
-		if (!runtime_ss && symsrc__possibly_runtime(ss)) {
-			runtime_ss = ss;
-			next_slot = true;
-		}
-
-		if (next_slot) {
-			ss_pos++;
-
-			if (syms_ss && runtime_ss)
-				break;
-		}
-
-	}
-
-	if (!runtime_ss && !syms_ss)
-		goto out_free;
-
-	if (runtime_ss && !syms_ss) {
-		syms_ss = runtime_ss;
-	}
-
-	/* We'll have to hope for the best */
-	if (!runtime_ss && syms_ss)
-		runtime_ss = syms_ss;
-
-	if (syms_ss) {
-		int km;
-
-		km = dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE ||
-		     dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE;
-		ret = dso__load_sym(dso, map, syms_ss, runtime_ss, filter, km);
-	} else {
-		ret = -1;
-	}
-
-	if (ret > 0) {
-		int nr_plt;
-
-		nr_plt = dso__synthesize_plt_symbols(dso, runtime_ss, map, filter);
-		if (nr_plt > 0)
-			ret += nr_plt;
-	}
-
-	for (; ss_pos > 0; ss_pos--)
-		symsrc__destroy(&ss_[ss_pos - 1]);
-out_free:
-	free(name);
-	if (ret < 0 && strstr(dso->name, " (deleted)") != NULL)
-		return 0;
-	return ret;
-}
-
-struct map *map_groups__find_by_name(struct map_groups *mg,
-				     enum map_type type, const char *name)
-{
-	struct rb_node *nd;
-
-	for (nd = rb_first(&mg->maps[type]); nd; nd = rb_next(nd)) {
-		struct map *map = rb_entry(nd, struct map, rb_node);
-
-		if (map->dso && strcmp(map->dso->short_name, name) == 0)
-			return map;
-	}
-
-	return NULL;
-}
-
-int dso__load_vmlinux(struct dso *dso, struct map *map,
-		      const char *vmlinux, symbol_filter_t filter)
-{
-	int err = -1;
-	struct symsrc ss;
-	char symfs_vmlinux[PATH_MAX];
-	enum dso_binary_type symtab_type;
-
-	if (vmlinux[0] == '/')
-		snprintf(symfs_vmlinux, sizeof(symfs_vmlinux), "%s", vmlinux);
-	else
-		snprintf(symfs_vmlinux, sizeof(symfs_vmlinux), "%s%s",
-			 symbol_conf.symfs, vmlinux);
-
-	if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
-		symtab_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
-	else
-		symtab_type = DSO_BINARY_TYPE__VMLINUX;
-
-	if (symsrc__init(&ss, dso, symfs_vmlinux, symtab_type))
-		return -1;
-
-	err = dso__load_sym(dso, map, &ss, &ss, filter, 0);
-	symsrc__destroy(&ss);
-
-	if (err > 0) {
-		if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
-			dso->data_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
-		else
-			dso->data_type = DSO_BINARY_TYPE__VMLINUX;
-		dso__set_long_name(dso, (char *)vmlinux);
-		dso__set_loaded(dso, map->type);
-		pr_debug("Using %s for symbols\n", symfs_vmlinux);
-	}
-
-	return err;
-}
-
-int dso__load_vmlinux_path(struct dso *dso, struct map *map,
-			   symbol_filter_t filter)
-{
-	int i, err = 0;
-	char *filename;
-
-	pr_debug("Looking at the vmlinux_path (%d entries long)\n",
-		 vmlinux_path__nr_entries + 1);
-
-	filename = dso__build_id_filename(dso, NULL, 0);
-	if (filename != NULL) {
-		err = dso__load_vmlinux(dso, map, filename, filter);
-		if (err > 0) {
-			dso->lname_alloc = 1;
-			goto out;
-		}
-		free(filename);
-	}
-
-	for (i = 0; i < vmlinux_path__nr_entries; ++i) {
-		err = dso__load_vmlinux(dso, map, vmlinux_path[i], filter);
-		if (err > 0) {
-			dso__set_long_name(dso, strdup(vmlinux_path[i]));
-			dso->lname_alloc = 1;
-			break;
-		}
-	}
-out:
-	return err;
-}
-
-static int dso__load_kernel_sym(struct dso *dso, struct map *map,
-				symbol_filter_t filter)
-{
-	int err;
-	const char *kallsyms_filename = NULL;
-	char *kallsyms_allocated_filename = NULL;
-	/*
-	 * Step 1: if the user specified a kallsyms or vmlinux filename, use
-	 * it and only it, reporting errors to the user if it cannot be used.
-	 *
-	 * For instance, try to analyse an ARM perf.data file _without_ a
-	 * build-id, or if the user specifies the wrong path to the right
-	 * vmlinux file, obviously we can't fallback to another vmlinux (a
-	 * x86_86 one, on the machine where analysis is being performed, say),
-	 * or worse, /proc/kallsyms.
-	 *
-	 * If the specified file _has_ a build-id and there is a build-id
-	 * section in the perf.data file, we will still do the expected
-	 * validation in dso__load_vmlinux and will bail out if they don't
-	 * match.
-	 */
-	if (symbol_conf.kallsyms_name != NULL) {
-		kallsyms_filename = symbol_conf.kallsyms_name;
-		goto do_kallsyms;
-	}
-
-	if (symbol_conf.vmlinux_name != NULL) {
-		err = dso__load_vmlinux(dso, map,
-					symbol_conf.vmlinux_name, filter);
-		if (err > 0) {
-			dso__set_long_name(dso,
-					   strdup(symbol_conf.vmlinux_name));
-			dso->lname_alloc = 1;
-			return err;
-		}
-		return err;
-	}
-
-	if (vmlinux_path != NULL) {
-		err = dso__load_vmlinux_path(dso, map, filter);
-		if (err > 0)
-			return err;
-	}
-
-	/* do not try local files if a symfs was given */
-	if (symbol_conf.symfs[0] != 0)
-		return -1;
-
-	/*
-	 * Say the kernel DSO was created when processing the build-id header table,
-	 * we have a build-id, so check if it is the same as the running kernel,
-	 * using it if it is.
-	 */
-	if (dso->has_build_id) {
-		u8 kallsyms_build_id[BUILD_ID_SIZE];
-		char sbuild_id[BUILD_ID_SIZE * 2 + 1];
-
-		if (sysfs__read_build_id("/sys/kernel/notes", kallsyms_build_id,
-					 sizeof(kallsyms_build_id)) == 0) {
-			if (dso__build_id_equal(dso, kallsyms_build_id)) {
-				kallsyms_filename = "/proc/kallsyms";
-				goto do_kallsyms;
-			}
-		}
-		/*
-		 * Now look if we have it on the build-id cache in
-		 * $HOME/.debug/[kernel.kallsyms].
-		 */
-		build_id__sprintf(dso->build_id, sizeof(dso->build_id),
-				  sbuild_id);
-
-		if (asprintf(&kallsyms_allocated_filename,
-			     "%s/.debug/[kernel.kallsyms]/%s",
-			     getenv("HOME"), sbuild_id) == -1) {
-			pr_err("Not enough memory for kallsyms file lookup\n");
-			return -1;
-		}
-
-		kallsyms_filename = kallsyms_allocated_filename;
-
-		if (access(kallsyms_filename, F_OK)) {
-			pr_err("No kallsyms or vmlinux with build-id %s "
-			       "was found\n", sbuild_id);
-			free(kallsyms_allocated_filename);
-			return -1;
-		}
-	} else {
-		/*
-		 * Last resort, if we don't have a build-id and couldn't find
-		 * any vmlinux file, try the running kernel kallsyms table.
-		 */
-		kallsyms_filename = "/proc/kallsyms";
-	}
-
-do_kallsyms:
-	err = dso__load_kallsyms(dso, kallsyms_filename, map, filter);
-	if (err > 0)
-		pr_debug("Using %s for symbols\n", kallsyms_filename);
-	free(kallsyms_allocated_filename);
-
-	if (err > 0 && !dso__is_kcore(dso)) {
-		dso__set_long_name(dso, strdup("[kernel.kallsyms]"));
-		map__fixup_start(map);
-		map__fixup_end(map);
-	}
-
-	return err;
-}
-
-static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map,
-				      symbol_filter_t filter)
-{
-	int err;
-	const char *kallsyms_filename = NULL;
-	struct machine *machine;
-	char path[PATH_MAX];
-
-	if (!map->groups) {
-		pr_debug("Guest kernel map hasn't the point to groups\n");
-		return -1;
-	}
-	machine = map->groups->machine;
-
-	if (machine__is_default_guest(machine)) {
-		/*
-		 * if the user specified a vmlinux filename, use it and only
-		 * it, reporting errors to the user if it cannot be used.
-		 * Or use file guest_kallsyms inputted by user on commandline
-		 */
-		if (symbol_conf.default_guest_vmlinux_name != NULL) {
-			err = dso__load_vmlinux(dso, map,
-				symbol_conf.default_guest_vmlinux_name, filter);
-			return err;
-		}
-
-		kallsyms_filename = symbol_conf.default_guest_kallsyms;
-		if (!kallsyms_filename)
-			return -1;
-	} else {
-		sprintf(path, "%s/proc/kallsyms", machine->root_dir);
-		kallsyms_filename = path;
-	}
-
-	err = dso__load_kallsyms(dso, kallsyms_filename, map, filter);
-	if (err > 0)
-		pr_debug("Using %s for symbols\n", kallsyms_filename);
-	if (err > 0 && !dso__is_kcore(dso)) {
-		machine__mmap_name(machine, path, sizeof(path));
-		dso__set_long_name(dso, strdup(path));
-		map__fixup_start(map);
-		map__fixup_end(map);
-	}
-
-	return err;
-}
-
-static void vmlinux_path__exit(void)
-{
-	while (--vmlinux_path__nr_entries >= 0) {
-		free(vmlinux_path[vmlinux_path__nr_entries]);
-		vmlinux_path[vmlinux_path__nr_entries] = NULL;
-	}
-
-	free(vmlinux_path);
-	vmlinux_path = NULL;
-}
-
-static int vmlinux_path__init(void)
-{
-	struct utsname uts;
-	char bf[PATH_MAX];
-
-	vmlinux_path = malloc(sizeof(char *) * 5);
-	if (vmlinux_path == NULL)
-		return -1;
-
-	vmlinux_path[vmlinux_path__nr_entries] = strdup("vmlinux");
-	if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
-		goto out_fail;
-	++vmlinux_path__nr_entries;
-	vmlinux_path[vmlinux_path__nr_entries] = strdup("/boot/vmlinux");
-	if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
-		goto out_fail;
-	++vmlinux_path__nr_entries;
-
-	/* only try running kernel version if no symfs was given */
-	if (symbol_conf.symfs[0] != 0)
-		return 0;
-
-	if (uname(&uts) < 0)
-		return -1;
-
-	snprintf(bf, sizeof(bf), "/boot/vmlinux-%s", uts.release);
-	vmlinux_path[vmlinux_path__nr_entries] = strdup(bf);
-	if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
-		goto out_fail;
-	++vmlinux_path__nr_entries;
-	snprintf(bf, sizeof(bf), "/lib/modules/%s/build/vmlinux", uts.release);
-	vmlinux_path[vmlinux_path__nr_entries] = strdup(bf);
-	if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
-		goto out_fail;
-	++vmlinux_path__nr_entries;
-	snprintf(bf, sizeof(bf), "/usr/lib/debug/lib/modules/%s/vmlinux",
-		 uts.release);
-	vmlinux_path[vmlinux_path__nr_entries] = strdup(bf);
-	if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
-		goto out_fail;
-	++vmlinux_path__nr_entries;
-
-	return 0;
-
-out_fail:
-	vmlinux_path__exit();
-	return -1;
-}
-
-static int setup_list(struct strlist **list, const char *list_str,
-		      const char *list_name)
-{
-	if (list_str == NULL)
-		return 0;
-
-	*list = strlist__new(true, list_str);
-	if (!*list) {
-		pr_err("problems parsing %s list\n", list_name);
-		return -1;
-	}
-	return 0;
-}
-
-static bool symbol__read_kptr_restrict(void)
-{
-	bool value = false;
-
-	if (geteuid() != 0) {
-		FILE *fp = fopen("/proc/sys/kernel/kptr_restrict", "r");
-		if (fp != NULL) {
-			char line[8];
-
-			if (fgets(line, sizeof(line), fp) != NULL)
-				value = atoi(line) != 0;
-
-			fclose(fp);
-		}
-	}
-
-	return value;
-}
-
-int symbol__init(void)
-{
-	const char *symfs;
-
-	if (symbol_conf.initialized)
-		return 0;
-
-	symbol_conf.priv_size = PERF_ALIGN(symbol_conf.priv_size, sizeof(u64));
-
-	symbol__elf_init();
-
-	if (symbol_conf.sort_by_name)
-		symbol_conf.priv_size += (sizeof(struct symbol_name_rb_node) -
-					  sizeof(struct symbol));
-
-	if (symbol_conf.try_vmlinux_path && vmlinux_path__init() < 0)
-		return -1;
-
-	if (symbol_conf.field_sep && *symbol_conf.field_sep == '.') {
-		pr_err("'.' is the only non valid --field-separator argument\n");
-		return -1;
-	}
-
-	if (setup_list(&symbol_conf.dso_list,
-		       symbol_conf.dso_list_str, "dso") < 0)
-		return -1;
-
-	if (setup_list(&symbol_conf.comm_list,
-		       symbol_conf.comm_list_str, "comm") < 0)
-		goto out_free_dso_list;
-
-	if (setup_list(&symbol_conf.sym_list,
-		       symbol_conf.sym_list_str, "symbol") < 0)
-		goto out_free_comm_list;
-
-	/*
-	 * A path to symbols of "/" is identical to ""
-	 * reset here for simplicity.
-	 */
-	symfs = realpath(symbol_conf.symfs, NULL);
-	if (symfs == NULL)
-		symfs = symbol_conf.symfs;
-	if (strcmp(symfs, "/") == 0)
-		symbol_conf.symfs = "";
-	if (symfs != symbol_conf.symfs)
-		free((void *)symfs);
-
-	symbol_conf.kptr_restrict = symbol__read_kptr_restrict();
-
-	symbol_conf.initialized = true;
-	return 0;
-
-out_free_comm_list:
-	strlist__delete(symbol_conf.comm_list);
-out_free_dso_list:
-	strlist__delete(symbol_conf.dso_list);
-	return -1;
-}
-
-void symbol__exit(void)
-{
-	if (!symbol_conf.initialized)
-		return;
-	strlist__delete(symbol_conf.sym_list);
-	strlist__delete(symbol_conf.dso_list);
-	strlist__delete(symbol_conf.comm_list);
-	vmlinux_path__exit();
-	symbol_conf.sym_list = symbol_conf.dso_list = symbol_conf.comm_list = NULL;
-	symbol_conf.initialized = false;
-}
diff --git a/src/tools/perf/util/symbol.h b/src/tools/perf/util/symbol.h
deleted file mode 100644
index fd5b70e..0000000
--- a/src/tools/perf/util/symbol.h
+++ /dev/null
@@ -1,255 +0,0 @@
-#ifndef __PERF_SYMBOL
-#define __PERF_SYMBOL 1
-
-#include <linux/types.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include "map.h"
-#include "../perf.h"
-#include <linux/list.h>
-#include <linux/rbtree.h>
-#include <stdio.h>
-#include <byteswap.h>
-#include <libgen.h>
-#include "build-id.h"
-
-#ifdef LIBELF_SUPPORT
-#include <libelf.h>
-#include <gelf.h>
-#endif
-#include <elf.h>
-
-#include "dso.h"
-
-#ifdef HAVE_CPLUS_DEMANGLE
-extern char *cplus_demangle(const char *, int);
-
-static inline char *bfd_demangle(void __maybe_unused *v, const char *c, int i)
-{
-	return cplus_demangle(c, i);
-}
-#else
-#ifdef NO_DEMANGLE
-static inline char *bfd_demangle(void __maybe_unused *v,
-				 const char __maybe_unused *c,
-				 int __maybe_unused i)
-{
-	return NULL;
-}
-#else
-#define PACKAGE 'perf'
-#include <bfd.h>
-#endif
-#endif
-
-/*
- * libelf 0.8.x and earlier do not support ELF_C_READ_MMAP;
- * for newer versions we can use mmap to reduce memory usage:
- */
-#ifdef LIBELF_MMAP
-# define PERF_ELF_C_READ_MMAP ELF_C_READ_MMAP
-#else
-# define PERF_ELF_C_READ_MMAP ELF_C_READ
-#endif
-
-#ifndef DMGL_PARAMS
-#define DMGL_PARAMS      (1 << 0)       /* Include function args */
-#define DMGL_ANSI        (1 << 1)       /* Include const, volatile, etc */
-#endif
-
-/** struct symbol - symtab entry
- *
- * @ignore - resolvable but tools ignore it (e.g. idle routines)
- */
-struct symbol {
-	struct rb_node	rb_node;
-	u64		start;
-	u64		end;
-	u16		namelen;
-	u8		binding;
-	bool		ignore;
-	char		name[0];
-};
-
-void symbol__delete(struct symbol *sym);
-void symbols__delete(struct rb_root *symbols);
-
-static inline size_t symbol__size(const struct symbol *sym)
-{
-	return sym->end - sym->start + 1;
-}
-
-struct strlist;
-
-struct symbol_conf {
-	unsigned short	priv_size;
-	unsigned short	nr_events;
-	bool		try_vmlinux_path,
-			show_kernel_path,
-			use_modules,
-			sort_by_name,
-			show_nr_samples,
-			show_total_period,
-			use_callchain,
-			exclude_other,
-			show_cpu_utilization,
-			initialized,
-			kptr_restrict,
-			annotate_asm_raw,
-			annotate_src,
-			event_group,
-			demangle;
-	const char	*vmlinux_name,
-			*kallsyms_name,
-			*source_prefix,
-			*field_sep;
-	const char	*default_guest_vmlinux_name,
-			*default_guest_kallsyms,
-			*default_guest_modules;
-	const char	*guestmount;
-	const char	*dso_list_str,
-			*comm_list_str,
-			*sym_list_str,
-			*col_width_list_str;
-       struct strlist	*dso_list,
-			*comm_list,
-			*sym_list,
-			*dso_from_list,
-			*dso_to_list,
-			*sym_from_list,
-			*sym_to_list;
-	const char	*symfs;
-};
-
-extern struct symbol_conf symbol_conf;
-extern int vmlinux_path__nr_entries;
-extern char **vmlinux_path;
-
-static inline void *symbol__priv(struct symbol *sym)
-{
-	return ((void *)sym) - symbol_conf.priv_size;
-}
-
-struct ref_reloc_sym {
-	const char	*name;
-	u64		addr;
-	u64		unrelocated_addr;
-};
-
-struct map_symbol {
-	struct map    *map;
-	struct symbol *sym;
-	bool	      unfolded;
-	bool	      has_children;
-};
-
-struct addr_map_symbol {
-	struct map    *map;
-	struct symbol *sym;
-	u64	      addr;
-	u64	      al_addr;
-};
-
-struct branch_info {
-	struct addr_map_symbol from;
-	struct addr_map_symbol to;
-	struct branch_flags flags;
-};
-
-struct mem_info {
-	struct addr_map_symbol iaddr;
-	struct addr_map_symbol daddr;
-	union perf_mem_data_src data_src;
-};
-
-struct addr_location {
-	struct thread *thread;
-	struct map    *map;
-	struct symbol *sym;
-	u64	      addr;
-	char	      level;
-	bool	      filtered;
-	u8	      cpumode;
-	s32	      cpu;
-};
-
-struct symsrc {
-	char *name;
-	int fd;
-	enum dso_binary_type type;
-
-#ifdef LIBELF_SUPPORT
-	Elf *elf;
-	GElf_Ehdr ehdr;
-
-	Elf_Scn *opdsec;
-	size_t opdidx;
-	GElf_Shdr opdshdr;
-
-	Elf_Scn *symtab;
-	GElf_Shdr symshdr;
-
-	Elf_Scn *dynsym;
-	size_t dynsym_idx;
-	GElf_Shdr dynshdr;
-
-	bool adjust_symbols;
-#endif
-};
-
-void symsrc__destroy(struct symsrc *ss);
-int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name,
-		 enum dso_binary_type type);
-bool symsrc__has_symtab(struct symsrc *ss);
-bool symsrc__possibly_runtime(struct symsrc *ss);
-
-int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter);
-int dso__load_vmlinux(struct dso *dso, struct map *map,
-		      const char *vmlinux, symbol_filter_t filter);
-int dso__load_vmlinux_path(struct dso *dso, struct map *map,
-			   symbol_filter_t filter);
-int dso__load_kallsyms(struct dso *dso, const char *filename, struct map *map,
-		       symbol_filter_t filter);
-
-struct symbol *dso__find_symbol(struct dso *dso, enum map_type type,
-				u64 addr);
-struct symbol *dso__find_symbol_by_name(struct dso *dso, enum map_type type,
-					const char *name);
-struct symbol *dso__first_symbol(struct dso *dso, enum map_type type);
-
-int filename__read_build_id(const char *filename, void *bf, size_t size);
-int sysfs__read_build_id(const char *filename, void *bf, size_t size);
-int kallsyms__parse(const char *filename, void *arg,
-		    int (*process_symbol)(void *arg, const char *name,
-					  char type, u64 start));
-int filename__read_debuglink(const char *filename, char *debuglink,
-			     size_t size);
-
-int symbol__init(void);
-void symbol__exit(void);
-void symbol__elf_init(void);
-struct symbol *symbol__new(u64 start, u64 len, u8 binding, const char *name);
-size_t symbol__fprintf_symname_offs(const struct symbol *sym,
-				    const struct addr_location *al, FILE *fp);
-size_t symbol__fprintf_symname(const struct symbol *sym, FILE *fp);
-size_t symbol__fprintf(struct symbol *sym, FILE *fp);
-bool symbol_type__is_a(char symbol_type, enum map_type map_type);
-bool symbol__restricted_filename(const char *filename,
-				 const char *restricted_filename);
-
-int dso__load_sym(struct dso *dso, struct map *map, struct symsrc *syms_ss,
-		  struct symsrc *runtime_ss, symbol_filter_t filter,
-		  int kmodule);
-int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss,
-				struct map *map, symbol_filter_t filter);
-
-void symbols__insert(struct rb_root *symbols, struct symbol *sym);
-void symbols__fixup_duplicate(struct rb_root *symbols);
-void symbols__fixup_end(struct rb_root *symbols);
-void __map_groups__fixup_end(struct map_groups *mg, enum map_type type);
-
-typedef int (*mapfn_t)(u64 start, u64 len, u64 pgoff, void *data);
-int file__read_maps(int fd, bool exe, mapfn_t mapfn, void *data,
-		    bool *is_64_bit);
-
-#endif /* __PERF_SYMBOL */
diff --git a/src/tools/perf/util/sysfs.c b/src/tools/perf/util/sysfs.c
deleted file mode 100644
index f71e9ea..0000000
--- a/src/tools/perf/util/sysfs.c
+++ /dev/null
@@ -1,60 +0,0 @@
-
-#include "util.h"
-#include "sysfs.h"
-
-static const char * const sysfs_known_mountpoints[] = {
-	"/sys",
-	0,
-};
-
-static int sysfs_found;
-char sysfs_mountpoint[PATH_MAX + 1];
-
-static int sysfs_valid_mountpoint(const char *sysfs)
-{
-	struct statfs st_fs;
-
-	if (statfs(sysfs, &st_fs) < 0)
-		return -ENOENT;
-	else if (st_fs.f_type != (long) SYSFS_MAGIC)
-		return -ENOENT;
-
-	return 0;
-}
-
-const char *sysfs_find_mountpoint(void)
-{
-	const char * const *ptr;
-	char type[100];
-	FILE *fp;
-
-	if (sysfs_found)
-		return (const char *) sysfs_mountpoint;
-
-	ptr = sysfs_known_mountpoints;
-	while (*ptr) {
-		if (sysfs_valid_mountpoint(*ptr) == 0) {
-			sysfs_found = 1;
-			strcpy(sysfs_mountpoint, *ptr);
-			return sysfs_mountpoint;
-		}
-		ptr++;
-	}
-
-	/* give up and parse /proc/mounts */
-	fp = fopen("/proc/mounts", "r");
-	if (fp == NULL)
-		return NULL;
-
-	while (!sysfs_found &&
-	       fscanf(fp, "%*s %" STR(PATH_MAX) "s %99s %*s %*d %*d\n",
-		      sysfs_mountpoint, type) == 2) {
-
-		if (strcmp(type, "sysfs") == 0)
-			sysfs_found = 1;
-	}
-
-	fclose(fp);
-
-	return sysfs_found ? sysfs_mountpoint : NULL;
-}
diff --git a/src/tools/perf/util/sysfs.h b/src/tools/perf/util/sysfs.h
deleted file mode 100644
index a813b72..0000000
--- a/src/tools/perf/util/sysfs.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef __SYSFS_H__
-#define __SYSFS_H__
-
-const char *sysfs_find_mountpoint(void);
-
-#endif /* __DEBUGFS_H__ */
diff --git a/src/tools/perf/util/target.c b/src/tools/perf/util/target.c
deleted file mode 100644
index 065528b..0000000
--- a/src/tools/perf/util/target.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Helper functions for handling target threads/cpus
- *
- * Copyright (C) 2012, LG Electronics, Namhyung Kim <namhyung.kim@lge.com>
- *
- * Released under the GPL v2.
- */
-
-#include "target.h"
-#include "debug.h"
-
-#include <pwd.h>
-#include <string.h>
-
-
-enum perf_target_errno perf_target__validate(struct perf_target *target)
-{
-	enum perf_target_errno ret = PERF_ERRNO_TARGET__SUCCESS;
-
-	if (target->pid)
-		target->tid = target->pid;
-
-	/* CPU and PID are mutually exclusive */
-	if (target->tid && target->cpu_list) {
-		target->cpu_list = NULL;
-		if (ret == PERF_ERRNO_TARGET__SUCCESS)
-			ret = PERF_ERRNO_TARGET__PID_OVERRIDE_CPU;
-	}
-
-	/* UID and PID are mutually exclusive */
-	if (target->tid && target->uid_str) {
-		target->uid_str = NULL;
-		if (ret == PERF_ERRNO_TARGET__SUCCESS)
-			ret = PERF_ERRNO_TARGET__PID_OVERRIDE_UID;
-	}
-
-	/* UID and CPU are mutually exclusive */
-	if (target->uid_str && target->cpu_list) {
-		target->cpu_list = NULL;
-		if (ret == PERF_ERRNO_TARGET__SUCCESS)
-			ret = PERF_ERRNO_TARGET__UID_OVERRIDE_CPU;
-	}
-
-	/* PID and SYSTEM are mutually exclusive */
-	if (target->tid && target->system_wide) {
-		target->system_wide = false;
-		if (ret == PERF_ERRNO_TARGET__SUCCESS)
-			ret = PERF_ERRNO_TARGET__PID_OVERRIDE_SYSTEM;
-	}
-
-	/* UID and SYSTEM are mutually exclusive */
-	if (target->uid_str && target->system_wide) {
-		target->system_wide = false;
-		if (ret == PERF_ERRNO_TARGET__SUCCESS)
-			ret = PERF_ERRNO_TARGET__UID_OVERRIDE_SYSTEM;
-	}
-
-	return ret;
-}
-
-enum perf_target_errno perf_target__parse_uid(struct perf_target *target)
-{
-	struct passwd pwd, *result;
-	char buf[1024];
-	const char *str = target->uid_str;
-
-	target->uid = UINT_MAX;
-	if (str == NULL)
-		return PERF_ERRNO_TARGET__SUCCESS;
-
-	/* Try user name first */
-	getpwnam_r(str, &pwd, buf, sizeof(buf), &result);
-
-	if (result == NULL) {
-		/*
-		 * The user name not found. Maybe it's a UID number.
-		 */
-		char *endptr;
-		int uid = strtol(str, &endptr, 10);
-
-		if (*endptr != '\0')
-			return PERF_ERRNO_TARGET__INVALID_UID;
-
-		getpwuid_r(uid, &pwd, buf, sizeof(buf), &result);
-
-		if (result == NULL)
-			return PERF_ERRNO_TARGET__USER_NOT_FOUND;
-	}
-
-	target->uid = result->pw_uid;
-	return PERF_ERRNO_TARGET__SUCCESS;
-}
-
-/*
- * This must have a same ordering as the enum perf_target_errno.
- */
-static const char *perf_target__error_str[] = {
-	"PID/TID switch overriding CPU",
-	"PID/TID switch overriding UID",
-	"UID switch overriding CPU",
-	"PID/TID switch overriding SYSTEM",
-	"UID switch overriding SYSTEM",
-	"Invalid User: %s",
-	"Problems obtaining information for user %s",
-};
-
-int perf_target__strerror(struct perf_target *target, int errnum,
-			  char *buf, size_t buflen)
-{
-	int idx;
-	const char *msg;
-
-	BUG_ON(buflen == 0);
-
-	if (errnum >= 0) {
-		const char *err = strerror_r(errnum, buf, buflen);
-
-		if (err != buf) {
-			size_t len = strlen(err);
-			memcpy(buf, err, min(buflen - 1, len));
-			*(buf + min(buflen - 1, len)) = '\0';
-		}
-
-		return 0;
-	}
-
-	if (errnum <  __PERF_ERRNO_TARGET__START ||
-	    errnum >= __PERF_ERRNO_TARGET__END)
-		return -1;
-
-	idx = errnum - __PERF_ERRNO_TARGET__START;
-	msg = perf_target__error_str[idx];
-
-	switch (errnum) {
-	case PERF_ERRNO_TARGET__PID_OVERRIDE_CPU
-	 ... PERF_ERRNO_TARGET__UID_OVERRIDE_SYSTEM:
-		snprintf(buf, buflen, "%s", msg);
-		break;
-
-	case PERF_ERRNO_TARGET__INVALID_UID:
-	case PERF_ERRNO_TARGET__USER_NOT_FOUND:
-		snprintf(buf, buflen, msg, target->uid_str);
-		break;
-
-	default:
-		/* cannot reach here */
-		break;
-	}
-
-	return 0;
-}
diff --git a/src/tools/perf/util/target.h b/src/tools/perf/util/target.h
deleted file mode 100644
index a4be857..0000000
--- a/src/tools/perf/util/target.h
+++ /dev/null
@@ -1,65 +0,0 @@
-#ifndef _PERF_TARGET_H
-#define _PERF_TARGET_H
-
-#include <stdbool.h>
-#include <sys/types.h>
-
-struct perf_target {
-	const char   *pid;
-	const char   *tid;
-	const char   *cpu_list;
-	const char   *uid_str;
-	uid_t	     uid;
-	bool	     system_wide;
-	bool	     uses_mmap;
-};
-
-enum perf_target_errno {
-	PERF_ERRNO_TARGET__SUCCESS		= 0,
-
-	/*
-	 * Choose an arbitrary negative big number not to clash with standard
-	 * errno since SUS requires the errno has distinct positive values.
-	 * See 'Issue 6' in the link below.
-	 *
-	 * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
-	 */
-	__PERF_ERRNO_TARGET__START		= -10000,
-
-
-	/* for perf_target__validate() */
-	PERF_ERRNO_TARGET__PID_OVERRIDE_CPU	= __PERF_ERRNO_TARGET__START,
-	PERF_ERRNO_TARGET__PID_OVERRIDE_UID,
-	PERF_ERRNO_TARGET__UID_OVERRIDE_CPU,
-	PERF_ERRNO_TARGET__PID_OVERRIDE_SYSTEM,
-	PERF_ERRNO_TARGET__UID_OVERRIDE_SYSTEM,
-
-	/* for perf_target__parse_uid() */
-	PERF_ERRNO_TARGET__INVALID_UID,
-	PERF_ERRNO_TARGET__USER_NOT_FOUND,
-
-	__PERF_ERRNO_TARGET__END,
-};
-
-enum perf_target_errno perf_target__validate(struct perf_target *target);
-enum perf_target_errno perf_target__parse_uid(struct perf_target *target);
-
-int perf_target__strerror(struct perf_target *target, int errnum, char *buf,
-			  size_t buflen);
-
-static inline bool perf_target__has_task(struct perf_target *target)
-{
-	return target->tid || target->pid || target->uid_str;
-}
-
-static inline bool perf_target__has_cpu(struct perf_target *target)
-{
-	return target->system_wide || target->cpu_list;
-}
-
-static inline bool perf_target__none(struct perf_target *target)
-{
-	return !perf_target__has_task(target) && !perf_target__has_cpu(target);
-}
-
-#endif /* _PERF_TARGET_H */
diff --git a/src/tools/perf/util/thread.c b/src/tools/perf/util/thread.c
deleted file mode 100644
index e3d4a55..0000000
--- a/src/tools/perf/util/thread.c
+++ /dev/null
@@ -1,91 +0,0 @@
-#include "../perf.h"
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include "session.h"
-#include "thread.h"
-#include "util.h"
-#include "debug.h"
-
-struct thread *thread__new(pid_t pid, pid_t tid)
-{
-	struct thread *self = zalloc(sizeof(*self));
-
-	if (self != NULL) {
-		map_groups__init(&self->mg);
-		self->pid_ = pid;
-		self->tid = tid;
-		self->ppid = -1;
-		self->comm = malloc(32);
-		if (self->comm)
-			snprintf(self->comm, 32, ":%d", self->tid);
-	}
-
-	return self;
-}
-
-void thread__delete(struct thread *self)
-{
-	map_groups__exit(&self->mg);
-	free(self->comm);
-	free(self);
-}
-
-int thread__set_comm(struct thread *self, const char *comm)
-{
-	int err;
-
-	if (self->comm)
-		free(self->comm);
-	self->comm = strdup(comm);
-	err = self->comm == NULL ? -ENOMEM : 0;
-	if (!err) {
-		self->comm_set = true;
-	}
-	return err;
-}
-
-int thread__comm_len(struct thread *self)
-{
-	if (!self->comm_len) {
-		if (!self->comm)
-			return 0;
-		self->comm_len = strlen(self->comm);
-	}
-
-	return self->comm_len;
-}
-
-size_t thread__fprintf(struct thread *thread, FILE *fp)
-{
-	return fprintf(fp, "Thread %d %s\n", thread->tid, thread->comm) +
-	       map_groups__fprintf(&thread->mg, verbose, fp);
-}
-
-void thread__insert_map(struct thread *self, struct map *map)
-{
-	map_groups__fixup_overlappings(&self->mg, map, verbose, stderr);
-	map_groups__insert(&self->mg, map);
-}
-
-int thread__fork(struct thread *self, struct thread *parent)
-{
-	int i;
-
-	if (parent->comm_set) {
-		if (self->comm)
-			free(self->comm);
-		self->comm = strdup(parent->comm);
-		if (!self->comm)
-			return -ENOMEM;
-		self->comm_set = true;
-	}
-
-	for (i = 0; i < MAP__NR_TYPES; ++i)
-		if (map_groups__clone(&self->mg, &parent->mg, i) < 0)
-			return -ENOMEM;
-
-	self->ppid = parent->tid;
-
-	return 0;
-}
diff --git a/src/tools/perf/util/thread.h b/src/tools/perf/util/thread.h
deleted file mode 100644
index 4ebbb40..0000000
--- a/src/tools/perf/util/thread.h
+++ /dev/null
@@ -1,65 +0,0 @@
-#ifndef __PERF_THREAD_H
-#define __PERF_THREAD_H
-
-#include <linux/rbtree.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include "symbol.h"
-
-struct thread {
-	union {
-		struct rb_node	 rb_node;
-		struct list_head node;
-	};
-	struct map_groups	mg;
-	pid_t			pid_; /* Not all tools update this */
-	pid_t			tid;
-	pid_t			ppid;
-	char			shortname[3];
-	bool			comm_set;
-	bool			dead; /* if set thread has exited */
-	char			*comm;
-	int			comm_len;
-
-	void			*priv;
-};
-
-struct machine;
-
-struct thread *thread__new(pid_t pid, pid_t tid);
-void thread__delete(struct thread *self);
-static inline void thread__exited(struct thread *thread)
-{
-	thread->dead = true;
-}
-
-int thread__set_comm(struct thread *self, const char *comm);
-int thread__comm_len(struct thread *self);
-void thread__insert_map(struct thread *self, struct map *map);
-int thread__fork(struct thread *self, struct thread *parent);
-size_t thread__fprintf(struct thread *thread, FILE *fp);
-
-static inline struct map *thread__find_map(struct thread *self,
-					   enum map_type type, u64 addr)
-{
-	return self ? map_groups__find(&self->mg, type, addr) : NULL;
-}
-
-void thread__find_addr_map(struct thread *thread, struct machine *machine,
-			   u8 cpumode, enum map_type type, u64 addr,
-			   struct addr_location *al);
-
-void thread__find_addr_location(struct thread *thread, struct machine *machine,
-				u8 cpumode, enum map_type type, u64 addr,
-				struct addr_location *al);
-
-static inline void *thread__priv(struct thread *thread)
-{
-	return thread->priv;
-}
-
-static inline void thread__set_priv(struct thread *thread, void *p)
-{
-	thread->priv = p;
-}
-#endif	/* __PERF_THREAD_H */
diff --git a/src/tools/perf/util/thread_map.c b/src/tools/perf/util/thread_map.c
deleted file mode 100644
index 9b5f856..0000000
--- a/src/tools/perf/util/thread_map.c
+++ /dev/null
@@ -1,296 +0,0 @@
-#include <dirent.h>
-#include <limits.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include "strlist.h"
-#include <string.h>
-#include "thread_map.h"
-
-/* Skip "." and ".." directories */
-static int filter(const struct dirent *dir)
-{
-	if (dir->d_name[0] == '.')
-		return 0;
-	else
-		return 1;
-}
-
-struct thread_map *thread_map__new_by_pid(pid_t pid)
-{
-	struct thread_map *threads;
-	char name[256];
-	int items;
-	struct dirent **namelist = NULL;
-	int i;
-
-	sprintf(name, "/proc/%d/task", pid);
-	items = scandir(name, &namelist, filter, NULL);
-	if (items <= 0)
-		return NULL;
-
-	threads = malloc(sizeof(*threads) + sizeof(pid_t) * items);
-	if (threads != NULL) {
-		for (i = 0; i < items; i++)
-			threads->map[i] = atoi(namelist[i]->d_name);
-		threads->nr = items;
-	}
-
-	for (i=0; i<items; i++)
-		free(namelist[i]);
-	free(namelist);
-
-	return threads;
-}
-
-struct thread_map *thread_map__new_by_tid(pid_t tid)
-{
-	struct thread_map *threads = malloc(sizeof(*threads) + sizeof(pid_t));
-
-	if (threads != NULL) {
-		threads->map[0] = tid;
-		threads->nr	= 1;
-	}
-
-	return threads;
-}
-
-struct thread_map *thread_map__new_by_uid(uid_t uid)
-{
-	DIR *proc;
-	int max_threads = 32, items, i;
-	char path[256];
-	struct dirent dirent, *next, **namelist = NULL;
-	struct thread_map *threads = malloc(sizeof(*threads) +
-					    max_threads * sizeof(pid_t));
-	if (threads == NULL)
-		goto out;
-
-	proc = opendir("/proc");
-	if (proc == NULL)
-		goto out_free_threads;
-
-	threads->nr = 0;
-
-	while (!readdir_r(proc, &dirent, &next) && next) {
-		char *end;
-		bool grow = false;
-		struct stat st;
-		pid_t pid = strtol(dirent.d_name, &end, 10);
-
-		if (*end) /* only interested in proper numerical dirents */
-			continue;
-
-		snprintf(path, sizeof(path), "/proc/%s", dirent.d_name);
-
-		if (stat(path, &st) != 0)
-			continue;
-
-		if (st.st_uid != uid)
-			continue;
-
-		snprintf(path, sizeof(path), "/proc/%d/task", pid);
-		items = scandir(path, &namelist, filter, NULL);
-		if (items <= 0)
-			goto out_free_closedir;
-
-		while (threads->nr + items >= max_threads) {
-			max_threads *= 2;
-			grow = true;
-		}
-
-		if (grow) {
-			struct thread_map *tmp;
-
-			tmp = realloc(threads, (sizeof(*threads) +
-						max_threads * sizeof(pid_t)));
-			if (tmp == NULL)
-				goto out_free_namelist;
-
-			threads = tmp;
-		}
-
-		for (i = 0; i < items; i++)
-			threads->map[threads->nr + i] = atoi(namelist[i]->d_name);
-
-		for (i = 0; i < items; i++)
-			free(namelist[i]);
-		free(namelist);
-
-		threads->nr += items;
-	}
-
-out_closedir:
-	closedir(proc);
-out:
-	return threads;
-
-out_free_threads:
-	free(threads);
-	return NULL;
-
-out_free_namelist:
-	for (i = 0; i < items; i++)
-		free(namelist[i]);
-	free(namelist);
-
-out_free_closedir:
-	free(threads);
-	threads = NULL;
-	goto out_closedir;
-}
-
-struct thread_map *thread_map__new(pid_t pid, pid_t tid, uid_t uid)
-{
-	if (pid != -1)
-		return thread_map__new_by_pid(pid);
-
-	if (tid == -1 && uid != UINT_MAX)
-		return thread_map__new_by_uid(uid);
-
-	return thread_map__new_by_tid(tid);
-}
-
-static struct thread_map *thread_map__new_by_pid_str(const char *pid_str)
-{
-	struct thread_map *threads = NULL, *nt;
-	char name[256];
-	int items, total_tasks = 0;
-	struct dirent **namelist = NULL;
-	int i, j = 0;
-	pid_t pid, prev_pid = INT_MAX;
-	char *end_ptr;
-	struct str_node *pos;
-	struct strlist *slist = strlist__new(false, pid_str);
-
-	if (!slist)
-		return NULL;
-
-	strlist__for_each(pos, slist) {
-		pid = strtol(pos->s, &end_ptr, 10);
-
-		if (pid == INT_MIN || pid == INT_MAX ||
-		    (*end_ptr != '\0' && *end_ptr != ','))
-			goto out_free_threads;
-
-		if (pid == prev_pid)
-			continue;
-
-		sprintf(name, "/proc/%d/task", pid);
-		items = scandir(name, &namelist, filter, NULL);
-		if (items <= 0)
-			goto out_free_threads;
-
-		total_tasks += items;
-		nt = realloc(threads, (sizeof(*threads) +
-				       sizeof(pid_t) * total_tasks));
-		if (nt == NULL)
-			goto out_free_namelist;
-
-		threads = nt;
-
-		for (i = 0; i < items; i++) {
-			threads->map[j++] = atoi(namelist[i]->d_name);
-			free(namelist[i]);
-		}
-		threads->nr = total_tasks;
-		free(namelist);
-	}
-
-out:
-	strlist__delete(slist);
-	return threads;
-
-out_free_namelist:
-	for (i = 0; i < items; i++)
-		free(namelist[i]);
-	free(namelist);
-
-out_free_threads:
-	free(threads);
-	threads = NULL;
-	goto out;
-}
-
-static struct thread_map *thread_map__new_by_tid_str(const char *tid_str)
-{
-	struct thread_map *threads = NULL, *nt;
-	int ntasks = 0;
-	pid_t tid, prev_tid = INT_MAX;
-	char *end_ptr;
-	struct str_node *pos;
-	struct strlist *slist;
-
-	/* perf-stat expects threads to be generated even if tid not given */
-	if (!tid_str) {
-		threads = malloc(sizeof(*threads) + sizeof(pid_t));
-		if (threads != NULL) {
-			threads->map[0] = -1;
-			threads->nr	= 1;
-		}
-		return threads;
-	}
-
-	slist = strlist__new(false, tid_str);
-	if (!slist)
-		return NULL;
-
-	strlist__for_each(pos, slist) {
-		tid = strtol(pos->s, &end_ptr, 10);
-
-		if (tid == INT_MIN || tid == INT_MAX ||
-		    (*end_ptr != '\0' && *end_ptr != ','))
-			goto out_free_threads;
-
-		if (tid == prev_tid)
-			continue;
-
-		ntasks++;
-		nt = realloc(threads, sizeof(*threads) + sizeof(pid_t) * ntasks);
-
-		if (nt == NULL)
-			goto out_free_threads;
-
-		threads = nt;
-		threads->map[ntasks - 1] = tid;
-		threads->nr		 = ntasks;
-	}
-out:
-	return threads;
-
-out_free_threads:
-	free(threads);
-	threads = NULL;
-	goto out;
-}
-
-struct thread_map *thread_map__new_str(const char *pid, const char *tid,
-				       uid_t uid)
-{
-	if (pid)
-		return thread_map__new_by_pid_str(pid);
-
-	if (!tid && uid != UINT_MAX)
-		return thread_map__new_by_uid(uid);
-
-	return thread_map__new_by_tid_str(tid);
-}
-
-void thread_map__delete(struct thread_map *threads)
-{
-	free(threads);
-}
-
-size_t thread_map__fprintf(struct thread_map *threads, FILE *fp)
-{
-	int i;
-	size_t printed = fprintf(fp, "%d thread%s: ",
-				 threads->nr, threads->nr > 1 ? "s" : "");
-	for (i = 0; i < threads->nr; ++i)
-		printed += fprintf(fp, "%s%d", i ? ", " : "", threads->map[i]);
-
-	return printed + fprintf(fp, "\n");
-}
diff --git a/src/tools/perf/util/thread_map.h b/src/tools/perf/util/thread_map.h
deleted file mode 100644
index 0cd8b31..0000000
--- a/src/tools/perf/util/thread_map.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef __PERF_THREAD_MAP_H
-#define __PERF_THREAD_MAP_H
-
-#include <sys/types.h>
-#include <stdio.h>
-
-struct thread_map {
-	int nr;
-	pid_t map[];
-};
-
-struct thread_map *thread_map__new_by_pid(pid_t pid);
-struct thread_map *thread_map__new_by_tid(pid_t tid);
-struct thread_map *thread_map__new_by_uid(uid_t uid);
-struct thread_map *thread_map__new(pid_t pid, pid_t tid, uid_t uid);
-
-struct thread_map *thread_map__new_str(const char *pid,
-		const char *tid, uid_t uid);
-
-void thread_map__delete(struct thread_map *threads);
-
-size_t thread_map__fprintf(struct thread_map *threads, FILE *fp);
-
-static inline int thread_map__nr(struct thread_map *threads)
-{
-	return threads ? threads->nr : 1;
-}
-
-#endif	/* __PERF_THREAD_MAP_H */
diff --git a/src/tools/perf/util/tool.h b/src/tools/perf/util/tool.h
deleted file mode 100644
index 4385816..0000000
--- a/src/tools/perf/util/tool.h
+++ /dev/null
@@ -1,47 +0,0 @@
-#ifndef __PERF_TOOL_H
-#define __PERF_TOOL_H
-
-#include <stdbool.h>
-
-struct perf_session;
-union perf_event;
-struct perf_evlist;
-struct perf_evsel;
-struct perf_sample;
-struct perf_tool;
-struct machine;
-
-typedef int (*event_sample)(struct perf_tool *tool, union perf_event *event,
-			    struct perf_sample *sample,
-			    struct perf_evsel *evsel, struct machine *machine);
-
-typedef int (*event_op)(struct perf_tool *tool, union perf_event *event,
-			struct perf_sample *sample, struct machine *machine);
-
-typedef int (*event_attr_op)(struct perf_tool *tool,
-			     union perf_event *event,
-			     struct perf_evlist **pevlist);
-
-typedef int (*event_op2)(struct perf_tool *tool, union perf_event *event,
-			 struct perf_session *session);
-
-struct perf_tool {
-	event_sample	sample,
-			read;
-	event_op	mmap,
-			mmap2,
-			comm,
-			fork,
-			exit,
-			lost,
-			throttle,
-			unthrottle;
-	event_attr_op	attr;
-	event_op2	tracing_data;
-	event_op2	finished_round,
-			build_id;
-	bool		ordered_samples;
-	bool		ordering_requires_timestamps;
-};
-
-#endif /* __PERF_TOOL_H */
diff --git a/src/tools/perf/util/top.c b/src/tools/perf/util/top.c
deleted file mode 100644
index f857b51..0000000
--- a/src/tools/perf/util/top.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2011, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
- *
- * Refactored from builtin-top.c, see that files for further copyright notes.
- *
- * Released under the GPL v2. (and only v2, not any later version)
- */
-
-#include "cpumap.h"
-#include "event.h"
-#include "evlist.h"
-#include "evsel.h"
-#include "parse-events.h"
-#include "symbol.h"
-#include "top.h"
-#include <inttypes.h>
-
-#define SNPRINTF(buf, size, fmt, args...) \
-({ \
-	size_t r = snprintf(buf, size, fmt, ## args); \
-	r > size ?  size : r; \
-})
-
-size_t perf_top__header_snprintf(struct perf_top *top, char *bf, size_t size)
-{
-	float samples_per_sec;
-	float ksamples_per_sec;
-	float esamples_percent;
-	struct perf_record_opts *opts = &top->record_opts;
-	struct perf_target *target = &opts->target;
-	size_t ret = 0;
-
-	if (top->samples) {
-		samples_per_sec = top->samples / top->delay_secs;
-		ksamples_per_sec = top->kernel_samples / top->delay_secs;
-		esamples_percent = (100.0 * top->exact_samples) / top->samples;
-	} else {
-		samples_per_sec = ksamples_per_sec = esamples_percent = 0.0;
-	}
-
-	if (!perf_guest) {
-		float ksamples_percent = 0.0;
-
-		if (samples_per_sec)
-			ksamples_percent = (100.0 * ksamples_per_sec) /
-							samples_per_sec;
-		ret = SNPRINTF(bf, size,
-			       "   PerfTop:%8.0f irqs/sec  kernel:%4.1f%%"
-			       "  exact: %4.1f%% [", samples_per_sec,
-			       ksamples_percent, esamples_percent);
-	} else {
-		float us_samples_per_sec = top->us_samples / top->delay_secs;
-		float guest_kernel_samples_per_sec = top->guest_kernel_samples / top->delay_secs;
-		float guest_us_samples_per_sec = top->guest_us_samples / top->delay_secs;
-
-		ret = SNPRINTF(bf, size,
-			       "   PerfTop:%8.0f irqs/sec  kernel:%4.1f%% us:%4.1f%%"
-			       " guest kernel:%4.1f%% guest us:%4.1f%%"
-			       " exact: %4.1f%% [", samples_per_sec,
-			       100.0 - (100.0 * ((samples_per_sec - ksamples_per_sec) /
-						 samples_per_sec)),
-			       100.0 - (100.0 * ((samples_per_sec - us_samples_per_sec) /
-						 samples_per_sec)),
-			       100.0 - (100.0 * ((samples_per_sec -
-						  guest_kernel_samples_per_sec) /
-						 samples_per_sec)),
-			       100.0 - (100.0 * ((samples_per_sec -
-						  guest_us_samples_per_sec) /
-						 samples_per_sec)),
-			       esamples_percent);
-	}
-
-	if (top->evlist->nr_entries == 1) {
-		struct perf_evsel *first = perf_evlist__first(top->evlist);
-		ret += SNPRINTF(bf + ret, size - ret, "%" PRIu64 "%s ",
-				(uint64_t)first->attr.sample_period,
-				opts->freq ? "Hz" : "");
-	}
-
-	ret += SNPRINTF(bf + ret, size - ret, "%s", perf_evsel__name(top->sym_evsel));
-
-	ret += SNPRINTF(bf + ret, size - ret, "], ");
-
-	if (target->pid)
-		ret += SNPRINTF(bf + ret, size - ret, " (target_pid: %s",
-				target->pid);
-	else if (target->tid)
-		ret += SNPRINTF(bf + ret, size - ret, " (target_tid: %s",
-				target->tid);
-	else if (target->uid_str != NULL)
-		ret += SNPRINTF(bf + ret, size - ret, " (uid: %s",
-				target->uid_str);
-	else
-		ret += SNPRINTF(bf + ret, size - ret, " (all");
-
-	if (target->cpu_list)
-		ret += SNPRINTF(bf + ret, size - ret, ", CPU%s: %s)",
-				top->evlist->cpus->nr > 1 ? "s" : "",
-				target->cpu_list);
-	else {
-		if (target->tid)
-			ret += SNPRINTF(bf + ret, size - ret, ")");
-		else
-			ret += SNPRINTF(bf + ret, size - ret, ", %d CPU%s)",
-					top->evlist->cpus->nr,
-					top->evlist->cpus->nr > 1 ? "s" : "");
-	}
-
-	return ret;
-}
-
-void perf_top__reset_sample_counters(struct perf_top *top)
-{
-	top->samples = top->us_samples = top->kernel_samples =
-	top->exact_samples = top->guest_kernel_samples =
-	top->guest_us_samples = 0;
-}
diff --git a/src/tools/perf/util/top.h b/src/tools/perf/util/top.h
deleted file mode 100644
index b554ffc..0000000
--- a/src/tools/perf/util/top.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef __PERF_TOP_H
-#define __PERF_TOP_H 1
-
-#include "tool.h"
-#include "types.h"
-#include <stddef.h>
-#include <stdbool.h>
-#include <termios.h>
-
-struct perf_evlist;
-struct perf_evsel;
-struct perf_session;
-
-struct perf_top {
-	struct perf_tool   tool;
-	struct perf_evlist *evlist;
-	struct perf_record_opts record_opts;
-	/*
-	 * Symbols will be added here in perf_event__process_sample and will
-	 * get out after decayed.
-	 */
-	u64		   samples;
-	u64		   kernel_samples, us_samples;
-	u64		   exact_samples;
-	u64		   guest_us_samples, guest_kernel_samples;
-	int		   print_entries, count_filter, delay_secs;
-	bool		   hide_kernel_symbols, hide_user_symbols, zero;
-	bool		   use_tui, use_stdio;
-	bool		   kptr_restrict_warned;
-	bool		   vmlinux_warned;
-	bool		   dump_symtab;
-	struct hist_entry  *sym_filter_entry;
-	struct perf_evsel  *sym_evsel;
-	struct perf_session *session;
-	struct winsize	   winsize;
-	int		   realtime_prio;
-	int		   sym_pcnt_filter;
-	const char	   *sym_filter;
-	float		   min_percent;
-};
-
-#define CONSOLE_CLEAR ""
-
-size_t perf_top__header_snprintf(struct perf_top *top, char *bf, size_t size);
-void perf_top__reset_sample_counters(struct perf_top *top);
-#endif /* __PERF_TOP_H */
diff --git a/src/tools/perf/util/trace-event-info.c b/src/tools/perf/util/trace-event-info.c
deleted file mode 100644
index f3c9e55..0000000
--- a/src/tools/perf/util/trace-event-info.c
+++ /dev/null
@@ -1,602 +0,0 @@
-/*
- * Copyright (C) 2008,2009, Steven Rostedt <srostedt@redhat.com>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- * 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; version 2 of the License (not later!)
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
-#include "util.h"
-#include <dirent.h>
-#include <mntent.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <pthread.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <stdbool.h>
-#include <linux/list.h>
-#include <linux/kernel.h>
-
-#include "../perf.h"
-#include "trace-event.h"
-#include <lk/debugfs.h>
-#include "evsel.h"
-
-#define VERSION "0.5"
-
-static int output_fd;
-
-
-int bigendian(void)
-{
-	unsigned char str[] = { 0x1, 0x2, 0x3, 0x4, 0x0, 0x0, 0x0, 0x0};
-	unsigned int *ptr;
-
-	ptr = (unsigned int *)(void *)str;
-	return *ptr == 0x01020304;
-}
-
-/* unfortunately, you can not stat debugfs or proc files for size */
-static int record_file(const char *file, ssize_t hdr_sz)
-{
-	unsigned long long size = 0;
-	char buf[BUFSIZ], *sizep;
-	off_t hdr_pos = lseek(output_fd, 0, SEEK_CUR);
-	int r, fd;
-	int err = -EIO;
-
-	fd = open(file, O_RDONLY);
-	if (fd < 0) {
-		pr_debug("Can't read '%s'", file);
-		return -errno;
-	}
-
-	/* put in zeros for file size, then fill true size later */
-	if (hdr_sz) {
-		if (write(output_fd, &size, hdr_sz) != hdr_sz)
-			goto out;
-	}
-
-	do {
-		r = read(fd, buf, BUFSIZ);
-		if (r > 0) {
-			size += r;
-			if (write(output_fd, buf, r) != r)
-				goto out;
-		}
-	} while (r > 0);
-
-	/* ugh, handle big-endian hdr_size == 4 */
-	sizep = (char*)&size;
-	if (bigendian())
-		sizep += sizeof(u64) - hdr_sz;
-
-	if (hdr_sz && pwrite(output_fd, sizep, hdr_sz, hdr_pos) < 0) {
-		pr_debug("writing file size failed\n");
-		goto out;
-	}
-
-	err = 0;
-out:
-	close(fd);
-	return err;
-}
-
-static int record_header_files(void)
-{
-	char *path;
-	struct stat st;
-	int err = -EIO;
-
-	path = get_tracing_file("events/header_page");
-	if (!path) {
-		pr_debug("can't get tracing/events/header_page");
-		return -ENOMEM;
-	}
-
-	if (stat(path, &st) < 0) {
-		pr_debug("can't read '%s'", path);
-		goto out;
-	}
-
-	if (write(output_fd, "header_page", 12) != 12) {
-		pr_debug("can't write header_page\n");
-		goto out;
-	}
-
-	if (record_file(path, 8) < 0) {
-		pr_debug("can't record header_page file\n");
-		goto out;
-	}
-
-	put_tracing_file(path);
-
-	path = get_tracing_file("events/header_event");
-	if (!path) {
-		pr_debug("can't get tracing/events/header_event");
-		err = -ENOMEM;
-		goto out;
-	}
-
-	if (stat(path, &st) < 0) {
-		pr_debug("can't read '%s'", path);
-		goto out;
-	}
-
-	if (write(output_fd, "header_event", 13) != 13) {
-		pr_debug("can't write header_event\n");
-		goto out;
-	}
-
-	if (record_file(path, 8) < 0) {
-		pr_debug("can't record header_event file\n");
-		goto out;
-	}
-
-	err = 0;
-out:
-	put_tracing_file(path);
-	return err;
-}
-
-static bool name_in_tp_list(char *sys, struct tracepoint_path *tps)
-{
-	while (tps) {
-		if (!strcmp(sys, tps->name))
-			return true;
-		tps = tps->next;
-	}
-
-	return false;
-}
-
-static int copy_event_system(const char *sys, struct tracepoint_path *tps)
-{
-	struct dirent *dent;
-	struct stat st;
-	char *format;
-	DIR *dir;
-	int count = 0;
-	int ret;
-	int err;
-
-	dir = opendir(sys);
-	if (!dir) {
-		pr_debug("can't read directory '%s'", sys);
-		return -errno;
-	}
-
-	while ((dent = readdir(dir))) {
-		if (dent->d_type != DT_DIR ||
-		    strcmp(dent->d_name, ".") == 0 ||
-		    strcmp(dent->d_name, "..") == 0 ||
-		    !name_in_tp_list(dent->d_name, tps))
-			continue;
-		format = malloc(strlen(sys) + strlen(dent->d_name) + 10);
-		if (!format) {
-			err = -ENOMEM;
-			goto out;
-		}
-		sprintf(format, "%s/%s/format", sys, dent->d_name);
-		ret = stat(format, &st);
-		free(format);
-		if (ret < 0)
-			continue;
-		count++;
-	}
-
-	if (write(output_fd, &count, 4) != 4) {
-		err = -EIO;
-		pr_debug("can't write count\n");
-		goto out;
-	}
-
-	rewinddir(dir);
-	while ((dent = readdir(dir))) {
-		if (dent->d_type != DT_DIR ||
-		    strcmp(dent->d_name, ".") == 0 ||
-		    strcmp(dent->d_name, "..") == 0 ||
-		    !name_in_tp_list(dent->d_name, tps))
-			continue;
-		format = malloc(strlen(sys) + strlen(dent->d_name) + 10);
-		if (!format) {
-			err = -ENOMEM;
-			goto out;
-		}
-		sprintf(format, "%s/%s/format", sys, dent->d_name);
-		ret = stat(format, &st);
-
-		if (ret >= 0) {
-			err = record_file(format, 8);
-			if (err) {
-				free(format);
-				goto out;
-			}
-		}
-		free(format);
-	}
-	err = 0;
-out:
-	closedir(dir);
-	return err;
-}
-
-static int record_ftrace_files(struct tracepoint_path *tps)
-{
-	char *path;
-	int ret;
-
-	path = get_tracing_file("events/ftrace");
-	if (!path) {
-		pr_debug("can't get tracing/events/ftrace");
-		return -ENOMEM;
-	}
-
-	ret = copy_event_system(path, tps);
-
-	put_tracing_file(path);
-
-	return ret;
-}
-
-static bool system_in_tp_list(char *sys, struct tracepoint_path *tps)
-{
-	while (tps) {
-		if (!strcmp(sys, tps->system))
-			return true;
-		tps = tps->next;
-	}
-
-	return false;
-}
-
-static int record_event_files(struct tracepoint_path *tps)
-{
-	struct dirent *dent;
-	struct stat st;
-	char *path;
-	char *sys;
-	DIR *dir;
-	int count = 0;
-	int ret;
-	int err;
-
-	path = get_tracing_file("events");
-	if (!path) {
-		pr_debug("can't get tracing/events");
-		return -ENOMEM;
-	}
-
-	dir = opendir(path);
-	if (!dir) {
-		err = -errno;
-		pr_debug("can't read directory '%s'", path);
-		goto out;
-	}
-
-	while ((dent = readdir(dir))) {
-		if (dent->d_type != DT_DIR ||
-		    strcmp(dent->d_name, ".") == 0 ||
-		    strcmp(dent->d_name, "..") == 0 ||
-		    strcmp(dent->d_name, "ftrace") == 0 ||
-		    !system_in_tp_list(dent->d_name, tps))
-			continue;
-		count++;
-	}
-
-	if (write(output_fd, &count, 4) != 4) {
-		err = -EIO;
-		pr_debug("can't write count\n");
-		goto out;
-	}
-
-	rewinddir(dir);
-	while ((dent = readdir(dir))) {
-		if (dent->d_type != DT_DIR ||
-		    strcmp(dent->d_name, ".") == 0 ||
-		    strcmp(dent->d_name, "..") == 0 ||
-		    strcmp(dent->d_name, "ftrace") == 0 ||
-		    !system_in_tp_list(dent->d_name, tps))
-			continue;
-		sys = malloc(strlen(path) + strlen(dent->d_name) + 2);
-		if (!sys) {
-			err = -ENOMEM;
-			goto out;
-		}
-		sprintf(sys, "%s/%s", path, dent->d_name);
-		ret = stat(sys, &st);
-		if (ret >= 0) {
-			ssize_t size = strlen(dent->d_name) + 1;
-
-			if (write(output_fd, dent->d_name, size) != size ||
-			    copy_event_system(sys, tps) < 0) {
-				err = -EIO;
-				free(sys);
-				goto out;
-			}
-		}
-		free(sys);
-	}
-	err = 0;
-out:
-	closedir(dir);
-	put_tracing_file(path);
-
-	return err;
-}
-
-static int record_proc_kallsyms(void)
-{
-	unsigned int size;
-	const char *path = "/proc/kallsyms";
-	struct stat st;
-	int ret, err = 0;
-
-	ret = stat(path, &st);
-	if (ret < 0) {
-		/* not found */
-		size = 0;
-		if (write(output_fd, &size, 4) != 4)
-			err = -EIO;
-		return err;
-	}
-	return record_file(path, 4);
-}
-
-static int record_ftrace_printk(void)
-{
-	unsigned int size;
-	char *path;
-	struct stat st;
-	int ret, err = 0;
-
-	path = get_tracing_file("printk_formats");
-	if (!path) {
-		pr_debug("can't get tracing/printk_formats");
-		return -ENOMEM;
-	}
-
-	ret = stat(path, &st);
-	if (ret < 0) {
-		/* not found */
-		size = 0;
-		if (write(output_fd, &size, 4) != 4)
-			err = -EIO;
-		goto out;
-	}
-	err = record_file(path, 4);
-
-out:
-	put_tracing_file(path);
-	return err;
-}
-
-static void
-put_tracepoints_path(struct tracepoint_path *tps)
-{
-	while (tps) {
-		struct tracepoint_path *t = tps;
-
-		tps = tps->next;
-		free(t->name);
-		free(t->system);
-		free(t);
-	}
-}
-
-static struct tracepoint_path *
-get_tracepoints_path(struct list_head *pattrs)
-{
-	struct tracepoint_path path, *ppath = &path;
-	struct perf_evsel *pos;
-	int nr_tracepoints = 0;
-
-	list_for_each_entry(pos, pattrs, node) {
-		if (pos->attr.type != PERF_TYPE_TRACEPOINT)
-			continue;
-		++nr_tracepoints;
-
-		if (pos->name) {
-			ppath->next = tracepoint_name_to_path(pos->name);
-			if (ppath->next)
-				goto next;
-
-			if (strchr(pos->name, ':') == NULL)
-				goto try_id;
-
-			goto error;
-		}
-
-try_id:
-		ppath->next = tracepoint_id_to_path(pos->attr.config);
-		if (!ppath->next) {
-error:
-			pr_debug("No memory to alloc tracepoints list\n");
-			put_tracepoints_path(&path);
-			return NULL;
-		}
-next:
-		ppath = ppath->next;
-	}
-
-	return nr_tracepoints > 0 ? path.next : NULL;
-}
-
-bool have_tracepoints(struct list_head *pattrs)
-{
-	struct perf_evsel *pos;
-
-	list_for_each_entry(pos, pattrs, node)
-		if (pos->attr.type == PERF_TYPE_TRACEPOINT)
-			return true;
-
-	return false;
-}
-
-static int tracing_data_header(void)
-{
-	char buf[20];
-	ssize_t size;
-
-	/* just guessing this is someone's birthday.. ;) */
-	buf[0] = 23;
-	buf[1] = 8;
-	buf[2] = 68;
-	memcpy(buf + 3, "tracing", 7);
-
-	if (write(output_fd, buf, 10) != 10)
-		return -1;
-
-	size = strlen(VERSION) + 1;
-	if (write(output_fd, VERSION, size) != size)
-		return -1;
-
-	/* save endian */
-	if (bigendian())
-		buf[0] = 1;
-	else
-		buf[0] = 0;
-
-	if (write(output_fd, buf, 1) != 1)
-		return -1;
-
-	/* save size of long */
-	buf[0] = sizeof(long);
-	if (write(output_fd, buf, 1) != 1)
-		return -1;
-
-	/* save page_size */
-	if (write(output_fd, &page_size, 4) != 4)
-		return -1;
-
-	return 0;
-}
-
-struct tracing_data *tracing_data_get(struct list_head *pattrs,
-				      int fd, bool temp)
-{
-	struct tracepoint_path *tps;
-	struct tracing_data *tdata;
-	int err;
-
-	output_fd = fd;
-
-	tps = get_tracepoints_path(pattrs);
-	if (!tps)
-		return NULL;
-
-	tdata = malloc(sizeof(*tdata));
-	if (!tdata)
-		return NULL;
-
-	tdata->temp = temp;
-	tdata->size = 0;
-
-	if (temp) {
-		int temp_fd;
-
-		snprintf(tdata->temp_file, sizeof(tdata->temp_file),
-			 "/tmp/perf-XXXXXX");
-		if (!mkstemp(tdata->temp_file)) {
-			pr_debug("Can't make temp file");
-			return NULL;
-		}
-
-		temp_fd = open(tdata->temp_file, O_RDWR);
-		if (temp_fd < 0) {
-			pr_debug("Can't read '%s'", tdata->temp_file);
-			return NULL;
-		}
-
-		/*
-		 * Set the temp file the default output, so all the
-		 * tracing data are stored into it.
-		 */
-		output_fd = temp_fd;
-	}
-
-	err = tracing_data_header();
-	if (err)
-		goto out;
-	err = record_header_files();
-	if (err)
-		goto out;
-	err = record_ftrace_files(tps);
-	if (err)
-		goto out;
-	err = record_event_files(tps);
-	if (err)
-		goto out;
-	err = record_proc_kallsyms();
-	if (err)
-		goto out;
-	err = record_ftrace_printk();
-
-out:
-	/*
-	 * All tracing data are stored by now, we can restore
-	 * the default output file in case we used temp file.
-	 */
-	if (temp) {
-		tdata->size = lseek(output_fd, 0, SEEK_CUR);
-		close(output_fd);
-		output_fd = fd;
-	}
-
-	if (err) {
-		free(tdata);
-		tdata = NULL;
-	}
-
-	put_tracepoints_path(tps);
-	return tdata;
-}
-
-int tracing_data_put(struct tracing_data *tdata)
-{
-	int err = 0;
-
-	if (tdata->temp) {
-		err = record_file(tdata->temp_file, 0);
-		unlink(tdata->temp_file);
-	}
-
-	free(tdata);
-	return err;
-}
-
-int read_tracing_data(int fd, struct list_head *pattrs)
-{
-	int err;
-	struct tracing_data *tdata;
-
-	/*
-	 * We work over the real file, so we can write data
-	 * directly, no temp file is needed.
-	 */
-	tdata = tracing_data_get(pattrs, fd, false);
-	if (!tdata)
-		return -ENOMEM;
-
-	err = tracing_data_put(tdata);
-	return err;
-}
diff --git a/src/tools/perf/util/trace-event-parse.c b/src/tools/perf/util/trace-event-parse.c
deleted file mode 100644
index e9e1c03..0000000
--- a/src/tools/perf/util/trace-event-parse.c
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * Copyright (C) 2009, Steven Rostedt <srostedt@redhat.com>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- * 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; version 2 of the License (not later!)
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-
-#include "../perf.h"
-#include "util.h"
-#include "trace-event.h"
-
-struct pevent *read_trace_init(int file_bigendian, int host_bigendian)
-{
-	struct pevent *pevent = pevent_alloc();
-
-	if (pevent != NULL) {
-		pevent_set_flag(pevent, PEVENT_NSEC_OUTPUT);
-		pevent_set_file_bigendian(pevent, file_bigendian);
-		pevent_set_host_bigendian(pevent, host_bigendian);
-	}
-
-	return pevent;
-}
-
-static int get_common_field(struct scripting_context *context,
-			    int *offset, int *size, const char *type)
-{
-	struct pevent *pevent = context->pevent;
-	struct event_format *event;
-	struct format_field *field;
-
-	if (!*size) {
-		if (!pevent->events)
-			return 0;
-
-		event = pevent->events[0];
-		field = pevent_find_common_field(event, type);
-		if (!field)
-			return 0;
-		*offset = field->offset;
-		*size = field->size;
-	}
-
-	return pevent_read_number(pevent, context->event_data + *offset, *size);
-}
-
-int common_lock_depth(struct scripting_context *context)
-{
-	static int offset;
-	static int size;
-	int ret;
-
-	ret = get_common_field(context, &size, &offset,
-			       "common_lock_depth");
-	if (ret < 0)
-		return -1;
-
-	return ret;
-}
-
-int common_flags(struct scripting_context *context)
-{
-	static int offset;
-	static int size;
-	int ret;
-
-	ret = get_common_field(context, &size, &offset,
-			       "common_flags");
-	if (ret < 0)
-		return -1;
-
-	return ret;
-}
-
-int common_pc(struct scripting_context *context)
-{
-	static int offset;
-	static int size;
-	int ret;
-
-	ret = get_common_field(context, &size, &offset,
-			       "common_preempt_count");
-	if (ret < 0)
-		return -1;
-
-	return ret;
-}
-
-unsigned long long
-raw_field_value(struct event_format *event, const char *name, void *data)
-{
-	struct format_field *field;
-	unsigned long long val;
-
-	field = pevent_find_any_field(event, name);
-	if (!field)
-		return 0ULL;
-
-	pevent_read_number_field(field, data, &val);
-
-	return val;
-}
-
-void *raw_field_ptr(struct event_format *event, const char *name, void *data)
-{
-	struct format_field *field;
-
-	field = pevent_find_any_field(event, name);
-	if (!field)
-		return NULL;
-
-	if (field->flags & FIELD_IS_DYNAMIC) {
-		int offset;
-
-		offset = *(int *)(data + field->offset);
-		offset &= 0xffff;
-
-		return data + offset;
-	}
-
-	return data + field->offset;
-}
-
-int trace_parse_common_type(struct pevent *pevent, void *data)
-{
-	struct pevent_record record;
-
-	record.data = data;
-	return pevent_data_type(pevent, &record);
-}
-
-int trace_parse_common_pid(struct pevent *pevent, void *data)
-{
-	struct pevent_record record;
-
-	record.data = data;
-	return pevent_data_pid(pevent, &record);
-}
-
-unsigned long long read_size(struct event_format *event, void *ptr, int size)
-{
-	return pevent_read_number(event->pevent, ptr, size);
-}
-
-void event_format__print(struct event_format *event,
-			 int cpu, void *data, int size)
-{
-	struct pevent_record record;
-	struct trace_seq s;
-
-	memset(&record, 0, sizeof(record));
-	record.cpu = cpu;
-	record.size = size;
-	record.data = data;
-
-	trace_seq_init(&s);
-	pevent_event_info(&s, event, &record);
-	trace_seq_do_printf(&s);
-}
-
-void parse_proc_kallsyms(struct pevent *pevent,
-			 char *file, unsigned int size __maybe_unused)
-{
-	unsigned long long addr;
-	char *func;
-	char *line;
-	char *next = NULL;
-	char *addr_str;
-	char *mod;
-	char *fmt = NULL;
-
-	line = strtok_r(file, "\n", &next);
-	while (line) {
-		mod = NULL;
-		addr_str = strtok_r(line, " ", &fmt);
-		addr = strtoull(addr_str, NULL, 16);
-		/* skip character */
-		strtok_r(NULL, " ", &fmt);
-		func = strtok_r(NULL, "\t", &fmt);
-		mod = strtok_r(NULL, "]", &fmt);
-		/* truncate the extra '[' */
-		if (mod)
-			mod = mod + 1;
-
-		pevent_register_function(pevent, func, addr, mod);
-
-		line = strtok_r(NULL, "\n", &next);
-	}
-}
-
-void parse_ftrace_printk(struct pevent *pevent,
-			 char *file, unsigned int size __maybe_unused)
-{
-	unsigned long long addr;
-	char *printk;
-	char *line;
-	char *next = NULL;
-	char *addr_str;
-	char *fmt;
-
-	line = strtok_r(file, "\n", &next);
-	while (line) {
-		addr_str = strtok_r(line, ":", &fmt);
-		if (!addr_str) {
-			warning("printk format with empty entry");
-			break;
-		}
-		addr = strtoull(addr_str, NULL, 16);
-		/* fmt still has a space, skip it */
-		printk = strdup(fmt+1);
-		line = strtok_r(NULL, "\n", &next);
-		pevent_register_print_string(pevent, printk, addr);
-	}
-}
-
-int parse_ftrace_file(struct pevent *pevent, char *buf, unsigned long size)
-{
-	return pevent_parse_event(pevent, buf, size, "ftrace");
-}
-
-int parse_event_file(struct pevent *pevent,
-		     char *buf, unsigned long size, char *sys)
-{
-	return pevent_parse_event(pevent, buf, size, sys);
-}
-
-struct event_format *trace_find_next_event(struct pevent *pevent,
-					   struct event_format *event)
-{
-	static int idx;
-
-	if (!pevent || !pevent->events)
-		return NULL;
-
-	if (!event) {
-		idx = 0;
-		return pevent->events[0];
-	}
-
-	if (idx < pevent->nr_events && event == pevent->events[idx]) {
-		idx++;
-		if (idx == pevent->nr_events)
-			return NULL;
-		return pevent->events[idx];
-	}
-
-	for (idx = 1; idx < pevent->nr_events; idx++) {
-		if (event == pevent->events[idx - 1])
-			return pevent->events[idx];
-	}
-	return NULL;
-}
-
-struct flag {
-	const char *name;
-	unsigned long long value;
-};
-
-static const struct flag flags[] = {
-	{ "HI_SOFTIRQ", 0 },
-	{ "TIMER_SOFTIRQ", 1 },
-	{ "NET_TX_SOFTIRQ", 2 },
-	{ "NET_RX_SOFTIRQ", 3 },
-	{ "BLOCK_SOFTIRQ", 4 },
-	{ "BLOCK_IOPOLL_SOFTIRQ", 5 },
-	{ "TASKLET_SOFTIRQ", 6 },
-	{ "SCHED_SOFTIRQ", 7 },
-	{ "HRTIMER_SOFTIRQ", 8 },
-	{ "RCU_SOFTIRQ", 9 },
-
-	{ "HRTIMER_NORESTART", 0 },
-	{ "HRTIMER_RESTART", 1 },
-};
-
-unsigned long long eval_flag(const char *flag)
-{
-	int i;
-
-	/*
-	 * Some flags in the format files do not get converted.
-	 * If the flag is not numeric, see if it is something that
-	 * we already know about.
-	 */
-	if (isdigit(flag[0]))
-		return strtoull(flag, NULL, 0);
-
-	for (i = 0; i < (int)(sizeof(flags)/sizeof(flags[0])); i++)
-		if (strcmp(flags[i].name, flag) == 0)
-			return flags[i].value;
-
-	return 0;
-}
diff --git a/src/tools/perf/util/trace-event-read.c b/src/tools/perf/util/trace-event-read.c
deleted file mode 100644
index f211227..0000000
--- a/src/tools/perf/util/trace-event-read.c
+++ /dev/null
@@ -1,442 +0,0 @@
-/*
- * Copyright (C) 2009, Steven Rostedt <srostedt@redhat.com>
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- * 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; version 2 of the License (not later!)
- *
- * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
-#include <dirent.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <getopt.h>
-#include <stdarg.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <sys/mman.h>
-#include <pthread.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include "../perf.h"
-#include "util.h"
-#include "trace-event.h"
-
-static int input_fd;
-
-static ssize_t trace_data_size;
-static bool repipe;
-
-static int __do_read(int fd, void *buf, int size)
-{
-	int rsize = size;
-
-	while (size) {
-		int ret = read(fd, buf, size);
-
-		if (ret <= 0)
-			return -1;
-
-		if (repipe) {
-			int retw = write(STDOUT_FILENO, buf, ret);
-
-			if (retw <= 0 || retw != ret) {
-				pr_debug("repiping input file");
-				return -1;
-			}
-		}
-
-		size -= ret;
-		buf += ret;
-	}
-
-	return rsize;
-}
-
-static int do_read(void *data, int size)
-{
-	int r;
-
-	r = __do_read(input_fd, data, size);
-	if (r <= 0) {
-		pr_debug("reading input file (size expected=%d received=%d)",
-			 size, r);
-		return -1;
-	}
-
-	trace_data_size += r;
-
-	return r;
-}
-
-/* If it fails, the next read will report it */
-static void skip(int size)
-{
-	char buf[BUFSIZ];
-	int r;
-
-	while (size) {
-		r = size > BUFSIZ ? BUFSIZ : size;
-		do_read(buf, r);
-		size -= r;
-	};
-}
-
-static unsigned int read4(struct pevent *pevent)
-{
-	unsigned int data;
-
-	if (do_read(&data, 4) < 0)
-		return 0;
-	return __data2host4(pevent, data);
-}
-
-static unsigned long long read8(struct pevent *pevent)
-{
-	unsigned long long data;
-
-	if (do_read(&data, 8) < 0)
-		return 0;
-	return __data2host8(pevent, data);
-}
-
-static char *read_string(void)
-{
-	char buf[BUFSIZ];
-	char *str = NULL;
-	int size = 0;
-	off_t r;
-	char c;
-
-	for (;;) {
-		r = read(input_fd, &c, 1);
-		if (r < 0) {
-			pr_debug("reading input file");
-			goto out;
-		}
-
-		if (!r) {
-			pr_debug("no data");
-			goto out;
-		}
-
-		if (repipe) {
-			int retw = write(STDOUT_FILENO, &c, 1);
-
-			if (retw <= 0 || retw != r) {
-				pr_debug("repiping input file string");
-				goto out;
-			}
-		}
-
-		buf[size++] = c;
-
-		if (!c)
-			break;
-	}
-
-	trace_data_size += size;
-
-	str = malloc(size);
-	if (str)
-		memcpy(str, buf, size);
-out:
-	return str;
-}
-
-static int read_proc_kallsyms(struct pevent *pevent)
-{
-	unsigned int size;
-	char *buf;
-
-	size = read4(pevent);
-	if (!size)
-		return 0;
-
-	buf = malloc(size + 1);
-	if (buf == NULL)
-		return -1;
-
-	if (do_read(buf, size) < 0) {
-		free(buf);
-		return -1;
-	}
-	buf[size] = '\0';
-
-	parse_proc_kallsyms(pevent, buf, size);
-
-	free(buf);
-	return 0;
-}
-
-static int read_ftrace_printk(struct pevent *pevent)
-{
-	unsigned int size;
-	char *buf;
-
-	/* it can have 0 size */
-	size = read4(pevent);
-	if (!size)
-		return 0;
-
-	buf = malloc(size);
-	if (buf == NULL)
-		return -1;
-
-	if (do_read(buf, size) < 0) {
-		free(buf);
-		return -1;
-	}
-
-	parse_ftrace_printk(pevent, buf, size);
-
-	free(buf);
-	return 0;
-}
-
-static int read_header_files(struct pevent *pevent)
-{
-	unsigned long long size;
-	char *header_page;
-	char buf[BUFSIZ];
-	int ret = 0;
-
-	if (do_read(buf, 12) < 0)
-		return -1;
-
-	if (memcmp(buf, "header_page", 12) != 0) {
-		pr_debug("did not read header page");
-		return -1;
-	}
-
-	size = read8(pevent);
-
-	header_page = malloc(size);
-	if (header_page == NULL)
-		return -1;
-
-	if (do_read(header_page, size) < 0) {
-		pr_debug("did not read header page");
-		free(header_page);
-		return -1;
-	}
-
-	if (!pevent_parse_header_page(pevent, header_page, size,
-				      pevent_get_long_size(pevent))) {
-		/*
-		 * The commit field in the page is of type long,
-		 * use that instead, since it represents the kernel.
-		 */
-		pevent_set_long_size(pevent, pevent->header_page_size_size);
-	}
-	free(header_page);
-
-	if (do_read(buf, 13) < 0)
-		return -1;
-
-	if (memcmp(buf, "header_event", 13) != 0) {
-		pr_debug("did not read header event");
-		return -1;
-	}
-
-	size = read8(pevent);
-	skip(size);
-
-	return ret;
-}
-
-static int read_ftrace_file(struct pevent *pevent, unsigned long long size)
-{
-	char *buf;
-
-	buf = malloc(size);
-	if (buf == NULL)
-		return -1;
-
-	if (do_read(buf, size) < 0) {
-		free(buf);
-		return -1;
-	}
-
-	parse_ftrace_file(pevent, buf, size);
-	free(buf);
-	return 0;
-}
-
-static int read_event_file(struct pevent *pevent, char *sys,
-			    unsigned long long size)
-{
-	char *buf;
-
-	buf = malloc(size);
-	if (buf == NULL)
-		return -1;
-
-	if (do_read(buf, size) < 0) {
-		free(buf);
-		return -1;
-	}
-
-	parse_event_file(pevent, buf, size, sys);
-	free(buf);
-	return 0;
-}
-
-static int read_ftrace_files(struct pevent *pevent)
-{
-	unsigned long long size;
-	int count;
-	int i;
-	int ret;
-
-	count = read4(pevent);
-
-	for (i = 0; i < count; i++) {
-		size = read8(pevent);
-		ret = read_ftrace_file(pevent, size);
-		if (ret)
-			return ret;
-	}
-	return 0;
-}
-
-static int read_event_files(struct pevent *pevent)
-{
-	unsigned long long size;
-	char *sys;
-	int systems;
-	int count;
-	int i,x;
-	int ret;
-
-	systems = read4(pevent);
-
-	for (i = 0; i < systems; i++) {
-		sys = read_string();
-		if (sys == NULL)
-			return -1;
-
-		count = read4(pevent);
-
-		for (x=0; x < count; x++) {
-			size = read8(pevent);
-			ret = read_event_file(pevent, sys, size);
-			if (ret)
-				return ret;
-		}
-	}
-	return 0;
-}
-
-ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
-{
-	char buf[BUFSIZ];
-	char test[] = { 23, 8, 68 };
-	char *version;
-	int show_version = 0;
-	int show_funcs = 0;
-	int show_printk = 0;
-	ssize_t size = -1;
-	int file_bigendian;
-	int host_bigendian;
-	int file_long_size;
-	int file_page_size;
-	struct pevent *pevent;
-	int err;
-
-	*ppevent = NULL;
-
-	repipe = __repipe;
-	input_fd = fd;
-
-	if (do_read(buf, 3) < 0)
-		return -1;
-	if (memcmp(buf, test, 3) != 0) {
-		pr_debug("no trace data in the file");
-		return -1;
-	}
-
-	if (do_read(buf, 7) < 0)
-		return -1;
-	if (memcmp(buf, "tracing", 7) != 0) {
-		pr_debug("not a trace file (missing 'tracing' tag)");
-		return -1;
-	}
-
-	version = read_string();
-	if (version == NULL)
-		return -1;
-	if (show_version)
-		printf("version = %s\n", version);
-	free(version);
-
-	if (do_read(buf, 1) < 0)
-		return -1;
-	file_bigendian = buf[0];
-	host_bigendian = bigendian();
-
-	pevent = read_trace_init(file_bigendian, host_bigendian);
-	if (pevent == NULL) {
-		pr_debug("read_trace_init failed");
-		goto out;
-	}
-
-	if (do_read(buf, 1) < 0)
-		goto out;
-	file_long_size = buf[0];
-
-	file_page_size = read4(pevent);
-	if (!file_page_size)
-		goto out;
-
-	pevent_set_long_size(pevent, file_long_size);
-	pevent_set_page_size(pevent, file_page_size);
-
-	err = read_header_files(pevent);
-	if (err)
-		goto out;
-	err = read_ftrace_files(pevent);
-	if (err)
-		goto out;
-	err = read_event_files(pevent);
-	if (err)
-		goto out;
-	err = read_proc_kallsyms(pevent);
-	if (err)
-		goto out;
-	err = read_ftrace_printk(pevent);
-	if (err)
-		goto out;
-
-	size = trace_data_size;
-	repipe = false;
-
-	if (show_funcs) {
-		pevent_print_funcs(pevent);
-	} else if (show_printk) {
-		pevent_print_printk(pevent);
-	}
-
-	*ppevent = pevent;
-	pevent = NULL;
-
-out:
-	if (pevent)
-		pevent_free(pevent);
-	return size;
-}
diff --git a/src/tools/perf/util/trace-event-scripting.c b/src/tools/perf/util/trace-event-scripting.c
deleted file mode 100644
index 95199e4..0000000
--- a/src/tools/perf/util/trace-event-scripting.c
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * trace-event-scripting.  Scripting engine common and initialization code.
- *
- * Copyright (C) 2009-2010 Tom Zanussi <tzanussi@gmail.com>
- *
- *  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, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#include "../perf.h"
-#include "util.h"
-#include "trace-event.h"
-
-struct scripting_context *scripting_context;
-
-static int stop_script_unsupported(void)
-{
-	return 0;
-}
-
-static void process_event_unsupported(union perf_event *event __maybe_unused,
-				      struct perf_sample *sample __maybe_unused,
-				      struct perf_evsel *evsel __maybe_unused,
-				      struct machine *machine __maybe_unused,
-				      struct thread *thread __maybe_unused,
-					  struct addr_location *al __maybe_unused)
-{
-}
-
-static void print_python_unsupported_msg(void)
-{
-	fprintf(stderr, "Python scripting not supported."
-		"  Install libpython and rebuild perf to enable it.\n"
-		"For example:\n  # apt-get install python-dev (ubuntu)"
-		"\n  # yum install python-devel (Fedora)"
-		"\n  etc.\n");
-}
-
-static int python_start_script_unsupported(const char *script __maybe_unused,
-					   int argc __maybe_unused,
-					   const char **argv __maybe_unused)
-{
-	print_python_unsupported_msg();
-
-	return -1;
-}
-
-static int python_generate_script_unsupported(struct pevent *pevent
-					      __maybe_unused,
-					      const char *outfile
-					      __maybe_unused)
-{
-	print_python_unsupported_msg();
-
-	return -1;
-}
-
-struct scripting_ops python_scripting_unsupported_ops = {
-	.name = "Python",
-	.start_script = python_start_script_unsupported,
-	.stop_script = stop_script_unsupported,
-	.process_event = process_event_unsupported,
-	.generate_script = python_generate_script_unsupported,
-};
-
-static void register_python_scripting(struct scripting_ops *scripting_ops)
-{
-	int err;
-	err = script_spec_register("Python", scripting_ops);
-	if (err)
-		die("error registering Python script extension");
-
-	err = script_spec_register("py", scripting_ops);
-	if (err)
-		die("error registering py script extension");
-
-	scripting_context = malloc(sizeof(struct scripting_context));
-}
-
-#ifdef NO_LIBPYTHON
-void setup_python_scripting(void)
-{
-	register_python_scripting(&python_scripting_unsupported_ops);
-}
-#else
-extern struct scripting_ops python_scripting_ops;
-
-void setup_python_scripting(void)
-{
-	register_python_scripting(&python_scripting_ops);
-}
-#endif
-
-static void print_perl_unsupported_msg(void)
-{
-	fprintf(stderr, "Perl scripting not supported."
-		"  Install libperl and rebuild perf to enable it.\n"
-		"For example:\n  # apt-get install libperl-dev (ubuntu)"
-		"\n  # yum install 'perl(ExtUtils::Embed)' (Fedora)"
-		"\n  etc.\n");
-}
-
-static int perl_start_script_unsupported(const char *script __maybe_unused,
-					 int argc __maybe_unused,
-					 const char **argv __maybe_unused)
-{
-	print_perl_unsupported_msg();
-
-	return -1;
-}
-
-static int perl_generate_script_unsupported(struct pevent *pevent
-					    __maybe_unused,
-					    const char *outfile __maybe_unused)
-{
-	print_perl_unsupported_msg();
-
-	return -1;
-}
-
-struct scripting_ops perl_scripting_unsupported_ops = {
-	.name = "Perl",
-	.start_script = perl_start_script_unsupported,
-	.stop_script = stop_script_unsupported,
-	.process_event = process_event_unsupported,
-	.generate_script = perl_generate_script_unsupported,
-};
-
-static void register_perl_scripting(struct scripting_ops *scripting_ops)
-{
-	int err;
-	err = script_spec_register("Perl", scripting_ops);
-	if (err)
-		die("error registering Perl script extension");
-
-	err = script_spec_register("pl", scripting_ops);
-	if (err)
-		die("error registering pl script extension");
-
-	scripting_context = malloc(sizeof(struct scripting_context));
-}
-
-#ifdef NO_LIBPERL
-void setup_perl_scripting(void)
-{
-	register_perl_scripting(&perl_scripting_unsupported_ops);
-}
-#else
-extern struct scripting_ops perl_scripting_ops;
-
-void setup_perl_scripting(void)
-{
-	register_perl_scripting(&perl_scripting_ops);
-}
-#endif
diff --git a/src/tools/perf/util/trace-event.h b/src/tools/perf/util/trace-event.h
deleted file mode 100644
index fafe1a4..0000000
--- a/src/tools/perf/util/trace-event.h
+++ /dev/null
@@ -1,91 +0,0 @@
-#ifndef _PERF_UTIL_TRACE_EVENT_H
-#define _PERF_UTIL_TRACE_EVENT_H
-
-#include <traceevent/event-parse.h>
-#include "parse-events.h"
-#include "session.h"
-
-struct machine;
-struct perf_sample;
-union perf_event;
-struct perf_tool;
-struct thread;
-
-extern struct pevent *perf_pevent;
-
-int bigendian(void);
-
-struct pevent *read_trace_init(int file_bigendian, int host_bigendian);
-void event_format__print(struct event_format *event,
-			 int cpu, void *data, int size);
-
-int parse_ftrace_file(struct pevent *pevent, char *buf, unsigned long size);
-int parse_event_file(struct pevent *pevent,
-		     char *buf, unsigned long size, char *sys);
-
-struct pevent_record *trace_peek_data(struct pevent *pevent, int cpu);
-
-unsigned long long
-raw_field_value(struct event_format *event, const char *name, void *data);
-void *raw_field_ptr(struct event_format *event, const char *name, void *data);
-
-void parse_proc_kallsyms(struct pevent *pevent, char *file, unsigned int size);
-void parse_ftrace_printk(struct pevent *pevent, char *file, unsigned int size);
-
-ssize_t trace_report(int fd, struct pevent **pevent, bool repipe);
-
-int trace_parse_common_type(struct pevent *pevent, void *data);
-int trace_parse_common_pid(struct pevent *pevent, void *data);
-
-struct event_format *trace_find_next_event(struct pevent *pevent,
-					   struct event_format *event);
-unsigned long long read_size(struct event_format *event, void *ptr, int size);
-unsigned long long eval_flag(const char *flag);
-
-struct pevent_record *trace_read_data(struct pevent *pevent, int cpu);
-int read_tracing_data(int fd, struct list_head *pattrs);
-
-struct tracing_data {
-	/* size is only valid if temp is 'true' */
-	ssize_t size;
-	bool temp;
-	char temp_file[50];
-};
-
-struct tracing_data *tracing_data_get(struct list_head *pattrs,
-				      int fd, bool temp);
-int tracing_data_put(struct tracing_data *tdata);
-
-
-struct addr_location;
-
-struct perf_session;
-
-struct scripting_ops {
-	const char *name;
-	int (*start_script) (const char *script, int argc, const char **argv);
-	int (*stop_script) (void);
-	void (*process_event) (union perf_event *event,
-			       struct perf_sample *sample,
-			       struct perf_evsel *evsel,
-			       struct machine *machine,
-			       struct thread *thread,
-				   struct addr_location *al);
-	int (*generate_script) (struct pevent *pevent, const char *outfile);
-};
-
-int script_spec_register(const char *spec, struct scripting_ops *ops);
-
-void setup_perl_scripting(void);
-void setup_python_scripting(void);
-
-struct scripting_context {
-	struct pevent *pevent;
-	void *event_data;
-};
-
-int common_pc(struct scripting_context *context);
-int common_flags(struct scripting_context *context);
-int common_lock_depth(struct scripting_context *context);
-
-#endif /* _PERF_UTIL_TRACE_EVENT_H */
diff --git a/src/tools/perf/util/types.h b/src/tools/perf/util/types.h
deleted file mode 100644
index c51fa6b..0000000
--- a/src/tools/perf/util/types.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef __PERF_TYPES_H
-#define __PERF_TYPES_H
-
-#include <stdint.h>
-
-/*
- * We define u64 as uint64_t for every architecture
- * so that we can print it with "%"PRIx64 without getting warnings.
- */
-typedef uint64_t	   u64;
-typedef int64_t		   s64;
-typedef unsigned int	   u32;
-typedef signed int	   s32;
-typedef unsigned short	   u16;
-typedef signed short	   s16;
-typedef unsigned char	   u8;
-typedef signed char	   s8;
-
-union u64_swap {
-	u64 val64;
-	u32 val32[2];
-};
-
-#endif /* __PERF_TYPES_H */
diff --git a/src/tools/perf/util/unwind.c b/src/tools/perf/util/unwind.c
deleted file mode 100644
index 2f891f7..0000000
--- a/src/tools/perf/util/unwind.c
+++ /dev/null
@@ -1,571 +0,0 @@
-/*
- * Post mortem Dwarf CFI based unwinding on top of regs and stack dumps.
- *
- * Lots of this code have been borrowed or heavily inspired from parts of
- * the libunwind 0.99 code which are (amongst other contributors I may have
- * forgotten):
- *
- * Copyright (C) 2002-2007 Hewlett-Packard Co
- *	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
- *
- * And the bugs have been added by:
- *
- * Copyright (C) 2010, Frederic Weisbecker <fweisbec@gmail.com>
- * Copyright (C) 2012, Jiri Olsa <jolsa@redhat.com>
- *
- */
-
-#include <elf.h>
-#include <gelf.h>
-#include <fcntl.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <linux/list.h>
-#include <libunwind.h>
-#include <libunwind-ptrace.h>
-#include "thread.h"
-#include "session.h"
-#include "perf_regs.h"
-#include "unwind.h"
-#include "util.h"
-
-extern int
-UNW_OBJ(dwarf_search_unwind_table) (unw_addr_space_t as,
-				    unw_word_t ip,
-				    unw_dyn_info_t *di,
-				    unw_proc_info_t *pi,
-				    int need_unwind_info, void *arg);
-
-#define dwarf_search_unwind_table UNW_OBJ(dwarf_search_unwind_table)
-
-#define DW_EH_PE_FORMAT_MASK	0x0f	/* format of the encoded value */
-#define DW_EH_PE_APPL_MASK	0x70	/* how the value is to be applied */
-
-/* Pointer-encoding formats: */
-#define DW_EH_PE_omit		0xff
-#define DW_EH_PE_ptr		0x00	/* pointer-sized unsigned value */
-#define DW_EH_PE_udata4		0x03	/* unsigned 32-bit value */
-#define DW_EH_PE_udata8		0x04	/* unsigned 64-bit value */
-#define DW_EH_PE_sdata4		0x0b	/* signed 32-bit value */
-#define DW_EH_PE_sdata8		0x0c	/* signed 64-bit value */
-
-/* Pointer-encoding application: */
-#define DW_EH_PE_absptr		0x00	/* absolute value */
-#define DW_EH_PE_pcrel		0x10	/* rel. to addr. of encoded value */
-
-/*
- * The following are not documented by LSB v1.3, yet they are used by
- * GCC, presumably they aren't documented by LSB since they aren't
- * used on Linux:
- */
-#define DW_EH_PE_funcrel	0x40	/* start-of-procedure-relative */
-#define DW_EH_PE_aligned	0x50	/* aligned pointer */
-
-/* Flags intentionaly not handled, since they're not needed:
- * #define DW_EH_PE_indirect      0x80
- * #define DW_EH_PE_uleb128       0x01
- * #define DW_EH_PE_udata2        0x02
- * #define DW_EH_PE_sleb128       0x09
- * #define DW_EH_PE_sdata2        0x0a
- * #define DW_EH_PE_textrel       0x20
- * #define DW_EH_PE_datarel       0x30
- */
-
-struct unwind_info {
-	struct perf_sample	*sample;
-	struct machine		*machine;
-	struct thread		*thread;
-	u64			sample_uregs;
-};
-
-#define dw_read(ptr, type, end) ({	\
-	type *__p = (type *) ptr;	\
-	type  __v;			\
-	if ((__p + 1) > (type *) end)	\
-		return -EINVAL;		\
-	__v = *__p++;			\
-	ptr = (typeof(ptr)) __p;	\
-	__v;				\
-	})
-
-static int __dw_read_encoded_value(u8 **p, u8 *end, u64 *val,
-				   u8 encoding)
-{
-	u8 *cur = *p;
-	*val = 0;
-
-	switch (encoding) {
-	case DW_EH_PE_omit:
-		*val = 0;
-		goto out;
-	case DW_EH_PE_ptr:
-		*val = dw_read(cur, unsigned long, end);
-		goto out;
-	default:
-		break;
-	}
-
-	switch (encoding & DW_EH_PE_APPL_MASK) {
-	case DW_EH_PE_absptr:
-		break;
-	case DW_EH_PE_pcrel:
-		*val = (unsigned long) cur;
-		break;
-	default:
-		return -EINVAL;
-	}
-
-	if ((encoding & 0x07) == 0x00)
-		encoding |= DW_EH_PE_udata4;
-
-	switch (encoding & DW_EH_PE_FORMAT_MASK) {
-	case DW_EH_PE_sdata4:
-		*val += dw_read(cur, s32, end);
-		break;
-	case DW_EH_PE_udata4:
-		*val += dw_read(cur, u32, end);
-		break;
-	case DW_EH_PE_sdata8:
-		*val += dw_read(cur, s64, end);
-		break;
-	case DW_EH_PE_udata8:
-		*val += dw_read(cur, u64, end);
-		break;
-	default:
-		return -EINVAL;
-	}
-
- out:
-	*p = cur;
-	return 0;
-}
-
-#define dw_read_encoded_value(ptr, end, enc) ({			\
-	u64 __v;						\
-	if (__dw_read_encoded_value(&ptr, end, &__v, enc)) {	\
-		return -EINVAL;                                 \
-	}                                                       \
-	__v;                                                    \
-	})
-
-static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep,
-				    GElf_Shdr *shp, const char *name)
-{
-	Elf_Scn *sec = NULL;
-
-	while ((sec = elf_nextscn(elf, sec)) != NULL) {
-		char *str;
-
-		gelf_getshdr(sec, shp);
-		str = elf_strptr(elf, ep->e_shstrndx, shp->sh_name);
-		if (!strcmp(name, str))
-			break;
-	}
-
-	return sec;
-}
-
-static u64 elf_section_offset(int fd, const char *name)
-{
-	Elf *elf;
-	GElf_Ehdr ehdr;
-	GElf_Shdr shdr;
-	u64 offset = 0;
-
-	elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL);
-	if (elf == NULL)
-		return 0;
-
-	do {
-		if (gelf_getehdr(elf, &ehdr) == NULL)
-			break;
-
-		if (!elf_section_by_name(elf, &ehdr, &shdr, name))
-			break;
-
-		offset = shdr.sh_offset;
-	} while (0);
-
-	elf_end(elf);
-	return offset;
-}
-
-struct table_entry {
-	u32 start_ip_offset;
-	u32 fde_offset;
-};
-
-struct eh_frame_hdr {
-	unsigned char version;
-	unsigned char eh_frame_ptr_enc;
-	unsigned char fde_count_enc;
-	unsigned char table_enc;
-
-	/*
-	 * The rest of the header is variable-length and consists of the
-	 * following members:
-	 *
-	 *	encoded_t eh_frame_ptr;
-	 *	encoded_t fde_count;
-	 */
-
-	/* A single encoded pointer should not be more than 8 bytes. */
-	u64 enc[2];
-
-	/*
-	 * struct {
-	 *    encoded_t start_ip;
-	 *    encoded_t fde_addr;
-	 * } binary_search_table[fde_count];
-	 */
-	char data[0];
-} __packed;
-
-static int unwind_spec_ehframe(struct dso *dso, struct machine *machine,
-			       u64 offset, u64 *table_data, u64 *segbase,
-			       u64 *fde_count)
-{
-	struct eh_frame_hdr hdr;
-	u8 *enc = (u8 *) &hdr.enc;
-	u8 *end = (u8 *) &hdr.data;
-	ssize_t r;
-
-	r = dso__data_read_offset(dso, machine, offset,
-				  (u8 *) &hdr, sizeof(hdr));
-	if (r != sizeof(hdr))
-		return -EINVAL;
-
-	/* We dont need eh_frame_ptr, just skip it. */
-	dw_read_encoded_value(enc, end, hdr.eh_frame_ptr_enc);
-
-	*fde_count  = dw_read_encoded_value(enc, end, hdr.fde_count_enc);
-	*segbase    = offset;
-	*table_data = (enc - (u8 *) &hdr) + offset;
-	return 0;
-}
-
-static int read_unwind_spec(struct dso *dso, struct machine *machine,
-			    u64 *table_data, u64 *segbase, u64 *fde_count)
-{
-	int ret = -EINVAL, fd;
-	u64 offset;
-
-	fd = dso__data_fd(dso, machine);
-	if (fd < 0)
-		return -EINVAL;
-
-	offset = elf_section_offset(fd, ".eh_frame_hdr");
-	close(fd);
-
-	if (offset)
-		ret = unwind_spec_ehframe(dso, machine, offset,
-					  table_data, segbase,
-					  fde_count);
-
-	/* TODO .debug_frame check if eh_frame_hdr fails */
-	return ret;
-}
-
-static struct map *find_map(unw_word_t ip, struct unwind_info *ui)
-{
-	struct addr_location al;
-
-	thread__find_addr_map(ui->thread, ui->machine, PERF_RECORD_MISC_USER,
-			      MAP__FUNCTION, ip, &al);
-	return al.map;
-}
-
-static int
-find_proc_info(unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
-	       int need_unwind_info, void *arg)
-{
-	struct unwind_info *ui = arg;
-	struct map *map;
-	unw_dyn_info_t di;
-	u64 table_data, segbase, fde_count;
-
-	map = find_map(ip, ui);
-	if (!map || !map->dso)
-		return -EINVAL;
-
-	pr_debug("unwind: find_proc_info dso %s\n", map->dso->name);
-
-	if (read_unwind_spec(map->dso, ui->machine,
-			     &table_data, &segbase, &fde_count))
-		return -EINVAL;
-
-	memset(&di, 0, sizeof(di));
-	di.format   = UNW_INFO_FORMAT_REMOTE_TABLE;
-	di.start_ip = map->start;
-	di.end_ip   = map->end;
-	di.u.rti.segbase    = map->start + segbase;
-	di.u.rti.table_data = map->start + table_data;
-	di.u.rti.table_len  = fde_count * sizeof(struct table_entry)
-			      / sizeof(unw_word_t);
-	return dwarf_search_unwind_table(as, ip, &di, pi,
-					 need_unwind_info, arg);
-}
-
-static int access_fpreg(unw_addr_space_t __maybe_unused as,
-			unw_regnum_t __maybe_unused num,
-			unw_fpreg_t __maybe_unused *val,
-			int __maybe_unused __write,
-			void __maybe_unused *arg)
-{
-	pr_err("unwind: access_fpreg unsupported\n");
-	return -UNW_EINVAL;
-}
-
-static int get_dyn_info_list_addr(unw_addr_space_t __maybe_unused as,
-				  unw_word_t __maybe_unused *dil_addr,
-				  void __maybe_unused *arg)
-{
-	return -UNW_ENOINFO;
-}
-
-static int resume(unw_addr_space_t __maybe_unused as,
-		  unw_cursor_t __maybe_unused *cu,
-		  void __maybe_unused *arg)
-{
-	pr_err("unwind: resume unsupported\n");
-	return -UNW_EINVAL;
-}
-
-static int
-get_proc_name(unw_addr_space_t __maybe_unused as,
-	      unw_word_t __maybe_unused addr,
-		char __maybe_unused *bufp, size_t __maybe_unused buf_len,
-		unw_word_t __maybe_unused *offp, void __maybe_unused *arg)
-{
-	pr_err("unwind: get_proc_name unsupported\n");
-	return -UNW_EINVAL;
-}
-
-static int access_dso_mem(struct unwind_info *ui, unw_word_t addr,
-			  unw_word_t *data)
-{
-	struct addr_location al;
-	ssize_t size;
-
-	thread__find_addr_map(ui->thread, ui->machine, PERF_RECORD_MISC_USER,
-			      MAP__FUNCTION, addr, &al);
-	if (!al.map) {
-		pr_debug("unwind: no map for %lx\n", (unsigned long)addr);
-		return -1;
-	}
-
-	if (!al.map->dso)
-		return -1;
-
-	size = dso__data_read_addr(al.map->dso, al.map, ui->machine,
-				   addr, (u8 *) data, sizeof(*data));
-
-	return !(size == sizeof(*data));
-}
-
-static int reg_value(unw_word_t *valp, struct regs_dump *regs, int id,
-		     u64 sample_regs)
-{
-	int i, idx = 0;
-
-	if (!(sample_regs & (1 << id)))
-		return -EINVAL;
-
-	for (i = 0; i < id; i++) {
-		if (sample_regs & (1 << i))
-			idx++;
-	}
-
-	*valp = regs->regs[idx];
-	return 0;
-}
-
-static int access_mem(unw_addr_space_t __maybe_unused as,
-		      unw_word_t addr, unw_word_t *valp,
-		      int __write, void *arg)
-{
-	struct unwind_info *ui = arg;
-	struct stack_dump *stack = &ui->sample->user_stack;
-	unw_word_t start, end;
-	int offset;
-	int ret;
-
-	/* Don't support write, probably not needed. */
-	if (__write || !stack || !ui->sample->user_regs.regs) {
-		*valp = 0;
-		return 0;
-	}
-
-	ret = reg_value(&start, &ui->sample->user_regs, PERF_REG_SP,
-			ui->sample_uregs);
-	if (ret)
-		return ret;
-
-	end = start + stack->size;
-
-	/* Check overflow. */
-	if (addr + sizeof(unw_word_t) < addr)
-		return -EINVAL;
-
-	if (addr < start || addr + sizeof(unw_word_t) >= end) {
-		ret = access_dso_mem(ui, addr, valp);
-		if (ret) {
-			pr_debug("unwind: access_mem %p not inside range %p-%p\n",
-				(void *)addr, (void *)start, (void *)end);
-			*valp = 0;
-			return ret;
-		}
-		return 0;
-	}
-
-	offset = addr - start;
-	*valp  = *(unw_word_t *)&stack->data[offset];
-	pr_debug("unwind: access_mem addr %p, val %lx, offset %d\n",
-		 (void *)addr, (unsigned long)*valp, offset);
-	return 0;
-}
-
-static int access_reg(unw_addr_space_t __maybe_unused as,
-		      unw_regnum_t regnum, unw_word_t *valp,
-		      int __write, void *arg)
-{
-	struct unwind_info *ui = arg;
-	int id, ret;
-
-	/* Don't support write, I suspect we don't need it. */
-	if (__write) {
-		pr_err("unwind: access_reg w %d\n", regnum);
-		return 0;
-	}
-
-	if (!ui->sample->user_regs.regs) {
-		*valp = 0;
-		return 0;
-	}
-
-	id = unwind__arch_reg_id(regnum);
-	if (id < 0)
-		return -EINVAL;
-
-	ret = reg_value(valp, &ui->sample->user_regs, id, ui->sample_uregs);
-	if (ret) {
-		pr_err("unwind: can't read reg %d\n", regnum);
-		return ret;
-	}
-
-	pr_debug("unwind: reg %d, val %lx\n", regnum, (unsigned long)*valp);
-	return 0;
-}
-
-static void put_unwind_info(unw_addr_space_t __maybe_unused as,
-			    unw_proc_info_t *pi __maybe_unused,
-			    void *arg __maybe_unused)
-{
-	pr_debug("unwind: put_unwind_info called\n");
-}
-
-static int entry(u64 ip, struct thread *thread, struct machine *machine,
-		 unwind_entry_cb_t cb, void *arg)
-{
-	struct unwind_entry e;
-	struct addr_location al;
-
-	thread__find_addr_location(thread, machine,
-				   PERF_RECORD_MISC_USER,
-				   MAP__FUNCTION, ip, &al);
-
-	e.ip = ip;
-	e.map = al.map;
-	e.sym = al.sym;
-
-	pr_debug("unwind: %s:ip = 0x%" PRIx64 " (0x%" PRIx64 ")\n",
-		 al.sym ? al.sym->name : "''",
-		 ip,
-		 al.map ? al.map->map_ip(al.map, ip) : (u64) 0);
-
-	return cb(&e, arg);
-}
-
-static void display_error(int err)
-{
-	switch (err) {
-	case UNW_EINVAL:
-		pr_err("unwind: Only supports local.\n");
-		break;
-	case UNW_EUNSPEC:
-		pr_err("unwind: Unspecified error.\n");
-		break;
-	case UNW_EBADREG:
-		pr_err("unwind: Register unavailable.\n");
-		break;
-	default:
-		break;
-	}
-}
-
-static unw_accessors_t accessors = {
-	.find_proc_info		= find_proc_info,
-	.put_unwind_info	= put_unwind_info,
-	.get_dyn_info_list_addr	= get_dyn_info_list_addr,
-	.access_mem		= access_mem,
-	.access_reg		= access_reg,
-	.access_fpreg		= access_fpreg,
-	.resume			= resume,
-	.get_proc_name		= get_proc_name,
-};
-
-static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
-		       void *arg)
-{
-	unw_addr_space_t addr_space;
-	unw_cursor_t c;
-	int ret;
-
-	addr_space = unw_create_addr_space(&accessors, 0);
-	if (!addr_space) {
-		pr_err("unwind: Can't create unwind address space.\n");
-		return -ENOMEM;
-	}
-
-	ret = unw_init_remote(&c, addr_space, ui);
-	if (ret)
-		display_error(ret);
-
-	while (!ret && (unw_step(&c) > 0)) {
-		unw_word_t ip;
-
-		unw_get_reg(&c, UNW_REG_IP, &ip);
-		ret = entry(ip, ui->thread, ui->machine, cb, arg);
-	}
-
-	unw_destroy_addr_space(addr_space);
-	return ret;
-}
-
-int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
-			struct machine *machine, struct thread *thread,
-			u64 sample_uregs, struct perf_sample *data)
-{
-	unw_word_t ip;
-	struct unwind_info ui = {
-		.sample       = data,
-		.sample_uregs = sample_uregs,
-		.thread       = thread,
-		.machine      = machine,
-	};
-	int ret;
-
-	if (!data->user_regs.regs)
-		return -EINVAL;
-
-	ret = reg_value(&ip, &data->user_regs, PERF_REG_IP, sample_uregs);
-	if (ret)
-		return ret;
-
-	ret = entry(ip, thread, machine, cb, arg);
-	if (ret)
-		return -ENOMEM;
-
-	return get_entries(&ui, cb, arg);
-}
diff --git a/src/tools/perf/util/unwind.h b/src/tools/perf/util/unwind.h
deleted file mode 100644
index cb6bc50..0000000
--- a/src/tools/perf/util/unwind.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef __UNWIND_H
-#define __UNWIND_H
-
-#include "types.h"
-#include "event.h"
-#include "symbol.h"
-
-struct unwind_entry {
-	struct map	*map;
-	struct symbol	*sym;
-	u64		ip;
-};
-
-typedef int (*unwind_entry_cb_t)(struct unwind_entry *entry, void *arg);
-
-#ifdef LIBUNWIND_SUPPORT
-int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
-			struct machine *machine,
-			struct thread *thread,
-			u64 sample_uregs,
-			struct perf_sample *data);
-int unwind__arch_reg_id(int regnum);
-#else
-static inline int
-unwind__get_entries(unwind_entry_cb_t cb __maybe_unused,
-		    void *arg __maybe_unused,
-		    struct machine *machine __maybe_unused,
-		    struct thread *thread __maybe_unused,
-		    u64 sample_uregs __maybe_unused,
-		    struct perf_sample *data __maybe_unused)
-{
-	return 0;
-}
-#endif /* LIBUNWIND_SUPPORT */
-#endif /* __UNWIND_H */
diff --git a/src/tools/perf/util/usage.c b/src/tools/perf/util/usage.c
deleted file mode 100644
index 4007aca..0000000
--- a/src/tools/perf/util/usage.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * usage.c
- *
- * Various reporting routines.
- * Originally copied from GIT source.
- *
- * Copyright (C) Linus Torvalds, 2005
- */
-#include "util.h"
-#include "debug.h"
-
-static void report(const char *prefix, const char *err, va_list params)
-{
-	char msg[1024];
-	vsnprintf(msg, sizeof(msg), err, params);
-	fprintf(stderr, " %s%s\n", prefix, msg);
-}
-
-static NORETURN void usage_builtin(const char *err)
-{
-	fprintf(stderr, "\n Usage: %s\n", err);
-	exit(129);
-}
-
-static NORETURN void die_builtin(const char *err, va_list params)
-{
-	report(" Fatal: ", err, params);
-	exit(128);
-}
-
-static void error_builtin(const char *err, va_list params)
-{
-	report(" Error: ", err, params);
-}
-
-static void warn_builtin(const char *warn, va_list params)
-{
-	report(" Warning: ", warn, params);
-}
-
-/* If we are in a dlopen()ed .so write to a global variable would segfault
- * (ugh), so keep things static. */
-static void (*usage_routine)(const char *err) NORETURN = usage_builtin;
-static void (*die_routine)(const char *err, va_list params) NORETURN = die_builtin;
-static void (*error_routine)(const char *err, va_list params) = error_builtin;
-static void (*warn_routine)(const char *err, va_list params) = warn_builtin;
-
-void set_die_routine(void (*routine)(const char *err, va_list params) NORETURN)
-{
-	die_routine = routine;
-}
-
-void usage(const char *err)
-{
-	usage_routine(err);
-}
-
-void die(const char *err, ...)
-{
-	va_list params;
-
-	va_start(params, err);
-	die_routine(err, params);
-	va_end(params);
-}
-
-int error(const char *err, ...)
-{
-	va_list params;
-
-	va_start(params, err);
-	error_routine(err, params);
-	va_end(params);
-	return -1;
-}
-
-void warning(const char *warn, ...)
-{
-	va_list params;
-
-	va_start(params, warn);
-	warn_routine(warn, params);
-	va_end(params);
-}
diff --git a/src/tools/perf/util/util.c b/src/tools/perf/util/util.c
deleted file mode 100644
index 6d17b18..0000000
--- a/src/tools/perf/util/util.c
+++ /dev/null
@@ -1,363 +0,0 @@
-#include "../perf.h"
-#include "util.h"
-#include <sys/mman.h>
-#ifdef BACKTRACE_SUPPORT
-#include <execinfo.h>
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-
-/*
- * XXX We need to find a better place for these things...
- */
-unsigned int page_size;
-
-bool test_attr__enabled;
-
-bool perf_host  = true;
-bool perf_guest = false;
-
-char tracing_events_path[PATH_MAX + 1] = "/sys/kernel/debug/tracing/events";
-
-void event_attr_init(struct perf_event_attr *attr)
-{
-	if (!perf_host)
-		attr->exclude_host  = 1;
-	if (!perf_guest)
-		attr->exclude_guest = 1;
-	/* to capture ABI version */
-	attr->size = sizeof(*attr);
-}
-
-int mkdir_p(char *path, mode_t mode)
-{
-	struct stat st;
-	int err;
-	char *d = path;
-
-	if (*d != '/')
-		return -1;
-
-	if (stat(path, &st) == 0)
-		return 0;
-
-	while (*++d == '/');
-
-	while ((d = strchr(d, '/'))) {
-		*d = '\0';
-		err = stat(path, &st) && mkdir(path, mode);
-		*d++ = '/';
-		if (err)
-			return -1;
-		while (*d == '/')
-			++d;
-	}
-	return (stat(path, &st) && mkdir(path, mode)) ? -1 : 0;
-}
-
-static int slow_copyfile(const char *from, const char *to)
-{
-	int err = 0;
-	char *line = NULL;
-	size_t n;
-	FILE *from_fp = fopen(from, "r"), *to_fp;
-
-	if (from_fp == NULL)
-		goto out;
-
-	to_fp = fopen(to, "w");
-	if (to_fp == NULL)
-		goto out_fclose_from;
-
-	while (getline(&line, &n, from_fp) > 0)
-		if (fputs(line, to_fp) == EOF)
-			goto out_fclose_to;
-	err = 0;
-out_fclose_to:
-	fclose(to_fp);
-	free(line);
-out_fclose_from:
-	fclose(from_fp);
-out:
-	return err;
-}
-
-int copyfile(const char *from, const char *to)
-{
-	int fromfd, tofd;
-	struct stat st;
-	void *addr;
-	int err = -1;
-
-	if (stat(from, &st))
-		goto out;
-
-	if (st.st_size == 0) /* /proc? do it slowly... */
-		return slow_copyfile(from, to);
-
-	fromfd = open(from, O_RDONLY);
-	if (fromfd < 0)
-		goto out;
-
-	tofd = creat(to, 0755);
-	if (tofd < 0)
-		goto out_close_from;
-
-	addr = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fromfd, 0);
-	if (addr == MAP_FAILED)
-		goto out_close_to;
-
-	if (write(tofd, addr, st.st_size) == st.st_size)
-		err = 0;
-
-	munmap(addr, st.st_size);
-out_close_to:
-	close(tofd);
-	if (err)
-		unlink(to);
-out_close_from:
-	close(fromfd);
-out:
-	return err;
-}
-
-unsigned long convert_unit(unsigned long value, char *unit)
-{
-	*unit = ' ';
-
-	if (value > 1000) {
-		value /= 1000;
-		*unit = 'K';
-	}
-
-	if (value > 1000) {
-		value /= 1000;
-		*unit = 'M';
-	}
-
-	if (value > 1000) {
-		value /= 1000;
-		*unit = 'G';
-	}
-
-	return value;
-}
-
-int readn(int fd, void *buf, size_t n)
-{
-	void *buf_start = buf;
-
-	while (n) {
-		int ret = read(fd, buf, n);
-
-		if (ret <= 0)
-			return ret;
-
-		n -= ret;
-		buf += ret;
-	}
-
-	return buf - buf_start;
-}
-
-size_t hex_width(u64 v)
-{
-	size_t n = 1;
-
-	while ((v >>= 4))
-		++n;
-
-	return n;
-}
-
-static int hex(char ch)
-{
-	if ((ch >= '0') && (ch <= '9'))
-		return ch - '0';
-	if ((ch >= 'a') && (ch <= 'f'))
-		return ch - 'a' + 10;
-	if ((ch >= 'A') && (ch <= 'F'))
-		return ch - 'A' + 10;
-	return -1;
-}
-
-/*
- * While we find nice hex chars, build a long_val.
- * Return number of chars processed.
- */
-int hex2u64(const char *ptr, u64 *long_val)
-{
-	const char *p = ptr;
-	*long_val = 0;
-
-	while (*p) {
-		const int hex_val = hex(*p);
-
-		if (hex_val < 0)
-			break;
-
-		*long_val = (*long_val << 4) | hex_val;
-		p++;
-	}
-
-	return p - ptr;
-}
-
-/* Obtain a backtrace and print it to stdout. */
-#ifdef BACKTRACE_SUPPORT
-void dump_stack(void)
-{
-	void *array[16];
-	size_t size = backtrace(array, ARRAY_SIZE(array));
-	char **strings = backtrace_symbols(array, size);
-	size_t i;
-
-	printf("Obtained %zd stack frames.\n", size);
-
-	for (i = 0; i < size; i++)
-		printf("%s\n", strings[i]);
-
-	free(strings);
-}
-#else
-void dump_stack(void) {}
-#endif
-
-void get_term_dimensions(struct winsize *ws)
-{
-	char *s = getenv("LINES");
-
-	if (s != NULL) {
-		ws->ws_row = atoi(s);
-		s = getenv("COLUMNS");
-		if (s != NULL) {
-			ws->ws_col = atoi(s);
-			if (ws->ws_row && ws->ws_col)
-				return;
-		}
-	}
-#ifdef TIOCGWINSZ
-	if (ioctl(1, TIOCGWINSZ, ws) == 0 &&
-	    ws->ws_row && ws->ws_col)
-		return;
-#endif
-	ws->ws_row = 25;
-	ws->ws_col = 80;
-}
-
-static void set_tracing_events_path(const char *mountpoint)
-{
-	snprintf(tracing_events_path, sizeof(tracing_events_path), "%s/%s",
-		 mountpoint, "tracing/events");
-}
-
-const char *perf_debugfs_mount(const char *mountpoint)
-{
-	const char *mnt;
-
-	mnt = debugfs_mount(mountpoint);
-	if (!mnt)
-		return NULL;
-
-	set_tracing_events_path(mnt);
-
-	return mnt;
-}
-
-void perf_debugfs_set_path(const char *mntpt)
-{
-	snprintf(debugfs_mountpoint, strlen(debugfs_mountpoint), "%s", mntpt);
-	set_tracing_events_path(mntpt);
-}
-
-static const char *find_debugfs(void)
-{
-	const char *path = perf_debugfs_mount(NULL);
-
-	if (!path)
-		fprintf(stderr, "Your kernel does not support the debugfs filesystem");
-
-	return path;
-}
-
-/*
- * Finds the path to the debugfs/tracing
- * Allocates the string and stores it.
- */
-const char *find_tracing_dir(void)
-{
-	static char *tracing;
-	static int tracing_found;
-	const char *debugfs;
-
-	if (tracing_found)
-		return tracing;
-
-	debugfs = find_debugfs();
-	if (!debugfs)
-		return NULL;
-
-	tracing = malloc(strlen(debugfs) + 9);
-	if (!tracing)
-		return NULL;
-
-	sprintf(tracing, "%s/tracing", debugfs);
-
-	tracing_found = 1;
-	return tracing;
-}
-
-char *get_tracing_file(const char *name)
-{
-	const char *tracing;
-	char *file;
-
-	tracing = find_tracing_dir();
-	if (!tracing)
-		return NULL;
-
-	file = malloc(strlen(tracing) + strlen(name) + 2);
-	if (!file)
-		return NULL;
-
-	sprintf(file, "%s/%s", tracing, name);
-	return file;
-}
-
-void put_tracing_file(char *file)
-{
-	free(file);
-}
-
-int parse_nsec_time(const char *str, u64 *ptime)
-{
-	u64 time_sec, time_nsec;
-	char *end;
-
-	time_sec = strtoul(str, &end, 10);
-	if (*end != '.' && *end != '\0')
-		return -1;
-
-	if (*end == '.') {
-		int i;
-		char nsec_buf[10];
-
-		if (strlen(++end) > 9)
-			return -1;
-
-		strncpy(nsec_buf, end, 9);
-		nsec_buf[9] = '\0';
-
-		/* make it nsec precision */
-		for (i = strlen(nsec_buf); i < 9; i++)
-			nsec_buf[i] = '0';
-
-		time_nsec = strtoul(nsec_buf, &end, 10);
-		if (*end != '\0')
-			return -1;
-	} else
-		time_nsec = 0;
-
-	*ptime = time_sec * NSEC_PER_SEC + time_nsec;
-	return 0;
-}
diff --git a/src/tools/perf/util/util.h b/src/tools/perf/util/util.h
deleted file mode 100644
index a535359..0000000
--- a/src/tools/perf/util/util.h
+++ /dev/null
@@ -1,284 +0,0 @@
-#ifndef GIT_COMPAT_UTIL_H
-#define GIT_COMPAT_UTIL_H
-
-#ifndef FLEX_ARRAY
-/*
- * See if our compiler is known to support flexible array members.
- */
-#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
-# define FLEX_ARRAY /* empty */
-#elif defined(__GNUC__)
-# if (__GNUC__ >= 3)
-#  define FLEX_ARRAY /* empty */
-# else
-#  define FLEX_ARRAY 0 /* older GNU extension */
-# endif
-#endif
-
-/*
- * Otherwise, default to safer but a bit wasteful traditional style
- */
-#ifndef FLEX_ARRAY
-# define FLEX_ARRAY 1
-#endif
-#endif
-
-#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
-
-#ifdef __GNUC__
-#define TYPEOF(x) (__typeof__(x))
-#else
-#define TYPEOF(x)
-#endif
-
-#define MSB(x, bits) ((x) & TYPEOF(x)(~0ULL << (sizeof(x) * 8 - (bits))))
-#define HAS_MULTI_BITS(i)  ((i) & ((i) - 1))  /* checks if an integer has more than 1 bit set */
-
-/* Approximation of the length of the decimal representation of this type. */
-#define decimal_length(x)	((int)(sizeof(x) * 2.56 + 0.5) + 1)
-
-#define _ALL_SOURCE 1
-#define _BSD_SOURCE 1
-#define HAS_BOOL
-
-#include <unistd.h>
-#include <stdio.h>
-#include <sys/stat.h>
-#include <sys/statfs.h>
-#include <fcntl.h>
-#include <stdbool.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <errno.h>
-#include <limits.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <dirent.h>
-#include <sys/time.h>
-#include <time.h>
-#include <signal.h>
-#include <fnmatch.h>
-#include <assert.h>
-#include <regex.h>
-#include <utime.h>
-#include <sys/wait.h>
-#include <sys/poll.h>
-#include <sys/socket.h>
-#include <sys/ioctl.h>
-#include <inttypes.h>
-#include <linux/magic.h>
-#include "types.h"
-#include <sys/ttydefaults.h>
-#include <lk/debugfs.h>
-#include <termios.h>
-
-extern const char *graph_line;
-extern const char *graph_dotted_line;
-extern char buildid_dir[];
-extern char tracing_events_path[];
-extern void perf_debugfs_set_path(const char *mountpoint);
-const char *perf_debugfs_mount(const char *mountpoint);
-const char *find_tracing_dir(void);
-char *get_tracing_file(const char *name);
-void put_tracing_file(char *file);
-
-/* On most systems <limits.h> would have given us this, but
- * not on some systems (e.g. GNU/Hurd).
- */
-#ifndef PATH_MAX
-#define PATH_MAX 4096
-#endif
-
-#ifndef PRIuMAX
-#define PRIuMAX "llu"
-#endif
-
-#ifndef PRIu32
-#define PRIu32 "u"
-#endif
-
-#ifndef PRIx32
-#define PRIx32 "x"
-#endif
-
-#ifndef PATH_SEP
-#define PATH_SEP ':'
-#endif
-
-#ifndef STRIP_EXTENSION
-#define STRIP_EXTENSION ""
-#endif
-
-#ifndef has_dos_drive_prefix
-#define has_dos_drive_prefix(path) 0
-#endif
-
-#ifndef is_dir_sep
-#define is_dir_sep(c) ((c) == '/')
-#endif
-
-#ifdef __GNUC__
-#define NORETURN __attribute__((__noreturn__))
-#else
-#define NORETURN
-#ifndef __attribute__
-#define __attribute__(x)
-#endif
-#endif
-
-/* General helper functions */
-extern void usage(const char *err) NORETURN;
-extern void die(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2)));
-extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
-extern void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
-
-#include "../../../include/linux/stringify.h"
-
-#define DIE_IF(cnd)	\
-	do { if (cnd)	\
-		die(" at (" __FILE__ ":" __stringify(__LINE__) "): "	\
-		    __stringify(cnd) "\n");				\
-	} while (0)
-
-
-extern void set_die_routine(void (*routine)(const char *err, va_list params) NORETURN);
-
-extern int prefixcmp(const char *str, const char *prefix);
-extern void set_buildid_dir(void);
-extern void disable_buildid_cache(void);
-
-static inline const char *skip_prefix(const char *str, const char *prefix)
-{
-	size_t len = strlen(prefix);
-	return strncmp(str, prefix, len) ? NULL : str + len;
-}
-
-#ifdef __GLIBC_PREREQ
-#if __GLIBC_PREREQ(2, 1)
-#define HAVE_STRCHRNUL
-#endif
-#endif
-
-#ifndef HAVE_STRCHRNUL
-#define strchrnul gitstrchrnul
-static inline char *gitstrchrnul(const char *s, int c)
-{
-	while (*s && *s != c)
-		s++;
-	return (char *)s;
-}
-#endif
-
-/*
- * Wrappers:
- */
-extern char *xstrdup(const char *str);
-extern void *xrealloc(void *ptr, size_t size) __attribute__((weak));
-
-
-static inline void *zalloc(size_t size)
-{
-	return calloc(1, size);
-}
-
-static inline int has_extension(const char *filename, const char *ext)
-{
-	size_t len = strlen(filename);
-	size_t extlen = strlen(ext);
-
-	return len > extlen && !memcmp(filename + len - extlen, ext, extlen);
-}
-
-/* Sane ctype - no locale, and works with signed chars */
-#undef isascii
-#undef isspace
-#undef isdigit
-#undef isxdigit
-#undef isalpha
-#undef isprint
-#undef isalnum
-#undef islower
-#undef isupper
-#undef tolower
-#undef toupper
-
-#ifndef NSEC_PER_MSEC
-#define NSEC_PER_MSEC	1000000L
-#endif
-
-int parse_nsec_time(const char *str, u64 *ptime);
-
-extern unsigned char sane_ctype[256];
-#define GIT_SPACE		0x01
-#define GIT_DIGIT		0x02
-#define GIT_ALPHA		0x04
-#define GIT_GLOB_SPECIAL	0x08
-#define GIT_REGEX_SPECIAL	0x10
-#define GIT_PRINT_EXTRA		0x20
-#define GIT_PRINT		0x3E
-#define sane_istest(x,mask) ((sane_ctype[(unsigned char)(x)] & (mask)) != 0)
-#define isascii(x) (((x) & ~0x7f) == 0)
-#define isspace(x) sane_istest(x,GIT_SPACE)
-#define isdigit(x) sane_istest(x,GIT_DIGIT)
-#define isxdigit(x)	\
-	(sane_istest(toupper(x), GIT_ALPHA | GIT_DIGIT) && toupper(x) < 'G')
-#define isalpha(x) sane_istest(x,GIT_ALPHA)
-#define isalnum(x) sane_istest(x,GIT_ALPHA | GIT_DIGIT)
-#define isprint(x) sane_istest(x,GIT_PRINT)
-#define islower(x) (sane_istest(x,GIT_ALPHA) && (x & 0x20))
-#define isupper(x) (sane_istest(x,GIT_ALPHA) && !(x & 0x20))
-#define tolower(x) sane_case((unsigned char)(x), 0x20)
-#define toupper(x) sane_case((unsigned char)(x), 0)
-
-static inline int sane_case(int x, int high)
-{
-	if (sane_istest(x, GIT_ALPHA))
-		x = (x & ~0x20) | high;
-	return x;
-}
-
-int mkdir_p(char *path, mode_t mode);
-int copyfile(const char *from, const char *to);
-
-s64 perf_atoll(const char *str);
-char **argv_split(const char *str, int *argcp);
-void argv_free(char **argv);
-bool strglobmatch(const char *str, const char *pat);
-bool strlazymatch(const char *str, const char *pat);
-int strtailcmp(const char *s1, const char *s2);
-char *strxfrchar(char *s, char from, char to);
-unsigned long convert_unit(unsigned long value, char *unit);
-int readn(int fd, void *buf, size_t size);
-
-struct perf_event_attr;
-
-void event_attr_init(struct perf_event_attr *attr);
-
-#define _STR(x) #x
-#define STR(x) _STR(x)
-
-/*
- *  Determine whether some value is a power of two, where zero is
- * *not* considered a power of two.
- */
-
-static inline __attribute__((const))
-bool is_power_of_2(unsigned long n)
-{
-	return (n != 0 && ((n & (n - 1)) == 0));
-}
-
-size_t hex_width(u64 v);
-int hex2u64(const char *ptr, u64 *val);
-
-char *ltrim(char *s);
-char *rtrim(char *s);
-
-void dump_stack(void);
-
-extern unsigned int page_size;
-
-void get_term_dimensions(struct winsize *ws);
-#endif /* GIT_COMPAT_UTIL_H */
diff --git a/src/tools/perf/util/values.c b/src/tools/perf/util/values.c
deleted file mode 100644
index 697c8b4..0000000
--- a/src/tools/perf/util/values.c
+++ /dev/null
@@ -1,232 +0,0 @@
-#include <stdlib.h>
-
-#include "util.h"
-#include "values.h"
-
-void perf_read_values_init(struct perf_read_values *values)
-{
-	values->threads_max = 16;
-	values->pid = malloc(values->threads_max * sizeof(*values->pid));
-	values->tid = malloc(values->threads_max * sizeof(*values->tid));
-	values->value = malloc(values->threads_max * sizeof(*values->value));
-	if (!values->pid || !values->tid || !values->value)
-		die("failed to allocate read_values threads arrays");
-	values->threads = 0;
-
-	values->counters_max = 16;
-	values->counterrawid = malloc(values->counters_max
-				      * sizeof(*values->counterrawid));
-	values->countername = malloc(values->counters_max
-				     * sizeof(*values->countername));
-	if (!values->counterrawid || !values->countername)
-		die("failed to allocate read_values counters arrays");
-	values->counters = 0;
-}
-
-void perf_read_values_destroy(struct perf_read_values *values)
-{
-	int i;
-
-	if (!values->threads_max || !values->counters_max)
-		return;
-
-	for (i = 0; i < values->threads; i++)
-		free(values->value[i]);
-	free(values->value);
-	free(values->pid);
-	free(values->tid);
-	free(values->counterrawid);
-	for (i = 0; i < values->counters; i++)
-		free(values->countername[i]);
-	free(values->countername);
-}
-
-static void perf_read_values__enlarge_threads(struct perf_read_values *values)
-{
-	values->threads_max *= 2;
-	values->pid = realloc(values->pid,
-			      values->threads_max * sizeof(*values->pid));
-	values->tid = realloc(values->tid,
-			      values->threads_max * sizeof(*values->tid));
-	values->value = realloc(values->value,
-				values->threads_max * sizeof(*values->value));
-	if (!values->pid || !values->tid || !values->value)
-		die("failed to enlarge read_values threads arrays");
-}
-
-static int perf_read_values__findnew_thread(struct perf_read_values *values,
-					    u32 pid, u32 tid)
-{
-	int i;
-
-	for (i = 0; i < values->threads; i++)
-		if (values->pid[i] == pid && values->tid[i] == tid)
-			return i;
-
-	if (values->threads == values->threads_max)
-		perf_read_values__enlarge_threads(values);
-
-	i = values->threads++;
-	values->pid[i] = pid;
-	values->tid[i] = tid;
-	values->value[i] = malloc(values->counters_max * sizeof(**values->value));
-	if (!values->value[i])
-		die("failed to allocate read_values counters array");
-
-	return i;
-}
-
-static void perf_read_values__enlarge_counters(struct perf_read_values *values)
-{
-	int i;
-
-	values->counters_max *= 2;
-	values->counterrawid = realloc(values->counterrawid,
-				       values->counters_max * sizeof(*values->counterrawid));
-	values->countername = realloc(values->countername,
-				      values->counters_max * sizeof(*values->countername));
-	if (!values->counterrawid || !values->countername)
-		die("failed to enlarge read_values counters arrays");
-
-	for (i = 0; i < values->threads; i++) {
-		values->value[i] = realloc(values->value[i],
-					   values->counters_max * sizeof(**values->value));
-		if (!values->value[i])
-			die("failed to enlarge read_values counters arrays");
-	}
-}
-
-static int perf_read_values__findnew_counter(struct perf_read_values *values,
-					     u64 rawid, const char *name)
-{
-	int i;
-
-	for (i = 0; i < values->counters; i++)
-		if (values->counterrawid[i] == rawid)
-			return i;
-
-	if (values->counters == values->counters_max)
-		perf_read_values__enlarge_counters(values);
-
-	i = values->counters++;
-	values->counterrawid[i] = rawid;
-	values->countername[i] = strdup(name);
-
-	return i;
-}
-
-void perf_read_values_add_value(struct perf_read_values *values,
-				u32 pid, u32 tid,
-				u64 rawid, const char *name, u64 value)
-{
-	int tindex, cindex;
-
-	tindex = perf_read_values__findnew_thread(values, pid, tid);
-	cindex = perf_read_values__findnew_counter(values, rawid, name);
-
-	values->value[tindex][cindex] = value;
-}
-
-static void perf_read_values__display_pretty(FILE *fp,
-					     struct perf_read_values *values)
-{
-	int i, j;
-	int pidwidth, tidwidth;
-	int *counterwidth;
-
-	counterwidth = malloc(values->counters * sizeof(*counterwidth));
-	if (!counterwidth)
-		die("failed to allocate counterwidth array");
-	tidwidth = 3;
-	pidwidth = 3;
-	for (j = 0; j < values->counters; j++)
-		counterwidth[j] = strlen(values->countername[j]);
-	for (i = 0; i < values->threads; i++) {
-		int width;
-
-		width = snprintf(NULL, 0, "%d", values->pid[i]);
-		if (width > pidwidth)
-			pidwidth = width;
-		width = snprintf(NULL, 0, "%d", values->tid[i]);
-		if (width > tidwidth)
-			tidwidth = width;
-		for (j = 0; j < values->counters; j++) {
-			width = snprintf(NULL, 0, "%" PRIu64, values->value[i][j]);
-			if (width > counterwidth[j])
-				counterwidth[j] = width;
-		}
-	}
-
-	fprintf(fp, "# %*s  %*s", pidwidth, "PID", tidwidth, "TID");
-	for (j = 0; j < values->counters; j++)
-		fprintf(fp, "  %*s", counterwidth[j], values->countername[j]);
-	fprintf(fp, "\n");
-
-	for (i = 0; i < values->threads; i++) {
-		fprintf(fp, "  %*d  %*d", pidwidth, values->pid[i],
-			tidwidth, values->tid[i]);
-		for (j = 0; j < values->counters; j++)
-			fprintf(fp, "  %*" PRIu64,
-				counterwidth[j], values->value[i][j]);
-		fprintf(fp, "\n");
-	}
-	free(counterwidth);
-}
-
-static void perf_read_values__display_raw(FILE *fp,
-					  struct perf_read_values *values)
-{
-	int width, pidwidth, tidwidth, namewidth, rawwidth, countwidth;
-	int i, j;
-
-	tidwidth = 3; /* TID */
-	pidwidth = 3; /* PID */
-	namewidth = 4; /* "Name" */
-	rawwidth = 3; /* "Raw" */
-	countwidth = 5; /* "Count" */
-
-	for (i = 0; i < values->threads; i++) {
-		width = snprintf(NULL, 0, "%d", values->pid[i]);
-		if (width > pidwidth)
-			pidwidth = width;
-		width = snprintf(NULL, 0, "%d", values->tid[i]);
-		if (width > tidwidth)
-			tidwidth = width;
-	}
-	for (j = 0; j < values->counters; j++) {
-		width = strlen(values->countername[j]);
-		if (width > namewidth)
-			namewidth = width;
-		width = snprintf(NULL, 0, "%" PRIx64, values->counterrawid[j]);
-		if (width > rawwidth)
-			rawwidth = width;
-	}
-	for (i = 0; i < values->threads; i++) {
-		for (j = 0; j < values->counters; j++) {
-			width = snprintf(NULL, 0, "%" PRIu64, values->value[i][j]);
-			if (width > countwidth)
-				countwidth = width;
-		}
-	}
-
-	fprintf(fp, "# %*s  %*s  %*s  %*s  %*s\n",
-		pidwidth, "PID", tidwidth, "TID",
-		namewidth, "Name", rawwidth, "Raw",
-		countwidth, "Count");
-	for (i = 0; i < values->threads; i++)
-		for (j = 0; j < values->counters; j++)
-			fprintf(fp, "  %*d  %*d  %*s  %*" PRIx64 "  %*" PRIu64,
-				pidwidth, values->pid[i],
-				tidwidth, values->tid[i],
-				namewidth, values->countername[j],
-				rawwidth, values->counterrawid[j],
-				countwidth, values->value[i][j]);
-}
-
-void perf_read_values_display(FILE *fp, struct perf_read_values *values, int raw)
-{
-	if (raw)
-		perf_read_values__display_raw(fp, values);
-	else
-		perf_read_values__display_pretty(fp, values);
-}
diff --git a/src/tools/perf/util/values.h b/src/tools/perf/util/values.h
deleted file mode 100644
index 2fa967e..0000000
--- a/src/tools/perf/util/values.h
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef __PERF_VALUES_H
-#define __PERF_VALUES_H
-
-#include "types.h"
-
-struct perf_read_values {
-	int threads;
-	int threads_max;
-	u32 *pid, *tid;
-	int counters;
-	int counters_max;
-	u64 *counterrawid;
-	char **countername;
-	u64 **value;
-};
-
-void perf_read_values_init(struct perf_read_values *values);
-void perf_read_values_destroy(struct perf_read_values *values);
-
-void perf_read_values_add_value(struct perf_read_values *values,
-				u32 pid, u32 tid,
-				u64 rawid, const char *name, u64 value);
-
-void perf_read_values_display(FILE *fp, struct perf_read_values *values,
-			      int raw);
-
-#endif /* __PERF_VALUES_H */
diff --git a/src/tools/perf/util/vdso.c b/src/tools/perf/util/vdso.c
deleted file mode 100644
index 3915982..0000000
--- a/src/tools/perf/util/vdso.c
+++ /dev/null
@@ -1,111 +0,0 @@
-
-#include <unistd.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <linux/kernel.h>
-
-#include "vdso.h"
-#include "util.h"
-#include "symbol.h"
-#include "linux/string.h"
-
-static bool vdso_found;
-static char vdso_file[] = "/tmp/perf-vdso.so-XXXXXX";
-
-static int find_vdso_map(void **start, void **end)
-{
-	FILE *maps;
-	char line[128];
-	int found = 0;
-
-	maps = fopen("/proc/self/maps", "r");
-	if (!maps) {
-		pr_err("vdso: cannot open maps\n");
-		return -1;
-	}
-
-	while (!found && fgets(line, sizeof(line), maps)) {
-		int m = -1;
-
-		/* We care only about private r-x mappings. */
-		if (2 != sscanf(line, "%p-%p r-xp %*x %*x:%*x %*u %n",
-				start, end, &m))
-			continue;
-		if (m < 0)
-			continue;
-
-		if (!strncmp(&line[m], VDSO__MAP_NAME,
-			     sizeof(VDSO__MAP_NAME) - 1))
-			found = 1;
-	}
-
-	fclose(maps);
-	return !found;
-}
-
-static char *get_file(void)
-{
-	char *vdso = NULL;
-	char *buf = NULL;
-	void *start, *end;
-	size_t size;
-	int fd;
-
-	if (vdso_found)
-		return vdso_file;
-
-	if (find_vdso_map(&start, &end))
-		return NULL;
-
-	size = end - start;
-
-	buf = memdup(start, size);
-	if (!buf)
-		return NULL;
-
-	fd = mkstemp(vdso_file);
-	if (fd < 0)
-		goto out;
-
-	if (size == (size_t) write(fd, buf, size))
-		vdso = vdso_file;
-
-	close(fd);
-
- out:
-	free(buf);
-
-	vdso_found = (vdso != NULL);
-	return vdso;
-}
-
-void vdso__exit(void)
-{
-	if (vdso_found)
-		unlink(vdso_file);
-}
-
-struct dso *vdso__dso_findnew(struct list_head *head)
-{
-	struct dso *dso = dsos__find(head, VDSO__MAP_NAME, true);
-
-	if (!dso) {
-		char *file;
-
-		file = get_file();
-		if (!file)
-			return NULL;
-
-		dso = dso__new(VDSO__MAP_NAME);
-		if (dso != NULL) {
-			dsos__add(head, dso);
-			dso__set_long_name(dso, file);
-		}
-	}
-
-	return dso;
-}
diff --git a/src/tools/perf/util/vdso.h b/src/tools/perf/util/vdso.h
deleted file mode 100644
index 0f76e7c..0000000
--- a/src/tools/perf/util/vdso.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef __PERF_VDSO__
-#define __PERF_VDSO__
-
-#include <linux/types.h>
-#include <string.h>
-#include <stdbool.h>
-
-#define VDSO__MAP_NAME "[vdso]"
-
-static inline bool is_vdso_map(const char *filename)
-{
-	return !strcmp(filename, VDSO__MAP_NAME);
-}
-
-struct dso *vdso__dso_findnew(struct list_head *head);
-void vdso__exit(void);
-
-#endif /* __PERF_VDSO__ */
diff --git a/src/tools/perf/util/wrapper.c b/src/tools/perf/util/wrapper.c
deleted file mode 100644
index 19f15b6..0000000
--- a/src/tools/perf/util/wrapper.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Various trivial helper wrappers around standard functions
- */
-#include "cache.h"
-
-/*
- * There's no pack memory to release - but stay close to the Git
- * version so wrap this away:
- */
-static inline void release_pack_memory(size_t size __maybe_unused,
-				       int flag __maybe_unused)
-{
-}
-
-char *xstrdup(const char *str)
-{
-	char *ret = strdup(str);
-	if (!ret) {
-		release_pack_memory(strlen(str) + 1, -1);
-		ret = strdup(str);
-		if (!ret)
-			die("Out of memory, strdup failed");
-	}
-	return ret;
-}
-
-void *xrealloc(void *ptr, size_t size)
-{
-	void *ret = realloc(ptr, size);
-	if (!ret && !size)
-		ret = realloc(ptr, 1);
-	if (!ret) {
-		release_pack_memory(size, -1);
-		ret = realloc(ptr, size);
-		if (!ret && !size)
-			ret = realloc(ptr, 1);
-		if (!ret)
-			die("Out of memory, realloc failed");
-	}
-	return ret;
-}
diff --git a/src/tools/perf/util/xyarray.c b/src/tools/perf/util/xyarray.c
deleted file mode 100644
index 22afbf6..0000000
--- a/src/tools/perf/util/xyarray.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include "xyarray.h"
-#include "util.h"
-
-struct xyarray *xyarray__new(int xlen, int ylen, size_t entry_size)
-{
-	size_t row_size = ylen * entry_size;
-	struct xyarray *xy = zalloc(sizeof(*xy) + xlen * row_size);
-
-	if (xy != NULL) {
-		xy->entry_size = entry_size;
-		xy->row_size   = row_size;
-	}
-
-	return xy;
-}
-
-void xyarray__delete(struct xyarray *xy)
-{
-	free(xy);
-}
diff --git a/src/tools/perf/util/xyarray.h b/src/tools/perf/util/xyarray.h
deleted file mode 100644
index c488a07..0000000
--- a/src/tools/perf/util/xyarray.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef _PERF_XYARRAY_H_
-#define _PERF_XYARRAY_H_ 1
-
-#include <sys/types.h>
-
-struct xyarray {
-	size_t row_size;
-	size_t entry_size;
-	char contents[];
-};
-
-struct xyarray *xyarray__new(int xlen, int ylen, size_t entry_size);
-void xyarray__delete(struct xyarray *xy);
-
-static inline void *xyarray__entry(struct xyarray *xy, int x, int y)
-{
-	return &xy->contents[x * xy->row_size + y * xy->entry_size];
-}
-
-#endif /* _PERF_XYARRAY_H_ */