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 "[H[2J"
-
-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_ */
