From ad6cd36832165317bee01afe00131bfccfaf1e89 Mon Sep 17 00:00:00 2001 From: Josh Boyer Date: Mon, 19 Nov 2012 14:17:23 -0500 Subject: [PATCH] Add various patches to fix perf build on non-x86 arches --- kernel.spec | 14 +- perf-uapi-fixes2.patch | 1132 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1144 insertions(+), 2 deletions(-) create mode 100644 perf-uapi-fixes2.patch diff --git a/kernel.spec b/kernel.spec index 6954628df..33e9b927e 100644 --- a/kernel.spec +++ b/kernel.spec @@ -62,7 +62,7 @@ Summary: The Linux kernel # For non-released -rc kernels, this will be appended after the rcX and # gitX tags, so a 3 here would become part of release "0.rcX.gitX.3" # -%global baserelease 1 +%global baserelease 2 %global fedora_build %{baserelease} # base_sublevel is the kernel version we're starting with and patching @@ -538,7 +538,10 @@ BuildRequires: sparse >= 0.4.1 %endif %if %{with_perf} BuildRequires: elfutils-devel zlib-devel binutils-devel newt-devel python-devel perl(ExtUtils::Embed) bison -BuildRequires: audit-libs-devel libunwind-devel +BuildRequires: audit-libs-devel +%ifnarch s390 s390x +BuildRequires: libunwind-devel +%endif %endif %if %{with_tools} BuildRequires: pciutils-devel gettext @@ -764,6 +767,8 @@ Patch22067: selinux-Fix-sel_netnode_insert-suspicious-rcu-dereference.patch Patch22070: irqnr-build.patch Patch22071: uapi-prefix-fix.patch +Patch22073: perf-uapi-fixes2.patch + # END OF PATCH DEFINITIONS %endif @@ -1471,6 +1476,8 @@ ApplyPatch selinux-Fix-sel_netnode_insert-suspicious-rcu-dereference.patch ApplyPatch irqnr-build.patch ApplyPatch uapi-prefix-fix.patch +ApplyPatch perf-uapi-fixes2.patch + # END OF PATCH APPLICATIONS %endif @@ -2338,6 +2345,9 @@ fi # ||----w | # || || %changelog +* Mon Nov 19 2012 Josh Boyer +- Add various patches to fix perf build on non-x86 arches + * Mon Nov 19 2012 Josh Boyer - 3.7.0-0.rc6.git1.1 - Linux v3.7-rc6-21-g3587b1b - Reenable debugging options. diff --git a/perf-uapi-fixes2.patch b/perf-uapi-fixes2.patch new file mode 100644 index 000000000..d7bdfab21 --- /dev/null +++ b/perf-uapi-fixes2.patch @@ -0,0 +1,1132 @@ +From ef79375f0f77e13a42eb3adf858fdd26b21f453a Mon Sep 17 00:00:00 2001 +From: Xiao Guangrong +Date: Thu, 15 Nov 2012 14:17:01 +0800 +Subject: [PATCH 1/7] perf kvm: rename perf_kvm to perf_kvm_stat + +Then, let it only be used in 'perf kvm stat' + +Signed-off-by: Xiao Guangrong +--- + tools/perf/builtin-kvm.c | 111 +++++++++++++++++++++++++---------------------- + 1 file changed, 60 insertions(+), 51 deletions(-) + +diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c +index 260abc5..7bd8358 100644 +--- a/tools/perf/builtin-kvm.c ++++ b/tools/perf/builtin-kvm.c +@@ -58,7 +58,7 @@ struct kvm_event_key { + }; + + +-struct perf_kvm; ++struct perf_kvm_stat; + + struct kvm_events_ops { + bool (*is_begin_event)(struct perf_evsel *evsel, +@@ -66,7 +66,7 @@ struct kvm_events_ops { + 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 *kvm, struct event_key *key, ++ void (*decode_key)(struct perf_kvm_stat *kvm, struct event_key *key, + char decode[20]); + const char *name; + }; +@@ -79,7 +79,7 @@ struct exit_reasons_table { + #define EVENTS_BITS 12 + #define EVENTS_CACHE_SIZE (1UL << EVENTS_BITS) + +-struct perf_kvm { ++struct perf_kvm_stat { + struct perf_tool tool; + struct perf_session *session; + +@@ -146,7 +146,7 @@ static struct exit_reasons_table svm_exit_reasons[] = { + SVM_EXIT_REASONS + }; + +-static const char *get_exit_reason(struct perf_kvm *kvm, u64 exit_code) ++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; +@@ -162,7 +162,7 @@ static const char *get_exit_reason(struct perf_kvm *kvm, u64 exit_code) + return "UNKNOWN"; + } + +-static void exit_event_decode_key(struct perf_kvm *kvm, ++static void exit_event_decode_key(struct perf_kvm_stat *kvm, + struct event_key *key, + char decode[20]) + { +@@ -228,7 +228,7 @@ static bool mmio_event_end(struct perf_evsel *evsel, struct perf_sample *sample, + return false; + } + +-static void mmio_event_decode_key(struct perf_kvm *kvm __maybe_unused, ++static void mmio_event_decode_key(struct perf_kvm_stat *kvm __maybe_unused, + struct event_key *key, + char decode[20]) + { +@@ -271,7 +271,7 @@ static bool ioport_event_end(struct perf_evsel *evsel, + return kvm_entry_event(evsel); + } + +-static void ioport_event_decode_key(struct perf_kvm *kvm __maybe_unused, ++static void ioport_event_decode_key(struct perf_kvm_stat *kvm __maybe_unused, + struct event_key *key, + char decode[20]) + { +@@ -286,7 +286,7 @@ static struct kvm_events_ops ioport_events = { + .name = "IO Port Access" + }; + +-static bool register_kvm_events_ops(struct perf_kvm *kvm) ++static bool register_kvm_events_ops(struct perf_kvm_stat *kvm) + { + bool ret = true; + +@@ -311,7 +311,7 @@ struct vcpu_event_record { + }; + + +-static void init_kvm_event_record(struct perf_kvm *kvm) ++static void init_kvm_event_record(struct perf_kvm_stat *kvm) + { + int i; + +@@ -360,7 +360,7 @@ static struct kvm_event *kvm_alloc_init_event(struct event_key *key) + return event; + } + +-static struct kvm_event *find_create_kvm_event(struct perf_kvm *kvm, ++static struct kvm_event *find_create_kvm_event(struct perf_kvm_stat *kvm, + struct event_key *key) + { + struct kvm_event *event; +@@ -381,7 +381,7 @@ static struct kvm_event *find_create_kvm_event(struct perf_kvm *kvm, + return event; + } + +-static bool handle_begin_event(struct perf_kvm *kvm, ++static bool handle_begin_event(struct perf_kvm_stat *kvm, + struct vcpu_event_record *vcpu_record, + struct event_key *key, u64 timestamp) + { +@@ -425,7 +425,7 @@ static bool update_kvm_event(struct kvm_event *event, int vcpu_id, + return true; + } + +-static bool handle_end_event(struct perf_kvm *kvm, ++static bool handle_end_event(struct perf_kvm_stat *kvm, + struct vcpu_event_record *vcpu_record, + struct event_key *key, + u64 timestamp) +@@ -486,7 +486,7 @@ struct vcpu_event_record *per_vcpu_record(struct thread *thread, + return thread->priv; + } + +-static bool handle_kvm_event(struct perf_kvm *kvm, ++static bool handle_kvm_event(struct perf_kvm_stat *kvm, + struct thread *thread, + struct perf_evsel *evsel, + struct perf_sample *sample) +@@ -541,7 +541,7 @@ static struct kvm_event_key keys[] = { + { NULL, NULL } + }; + +-static bool select_key(struct perf_kvm *kvm) ++static bool select_key(struct perf_kvm_stat *kvm) + { + int i; + +@@ -577,7 +577,8 @@ static void insert_to_result(struct rb_root *result, struct kvm_event *event, + rb_insert_color(&event->rb, result); + } + +-static void update_total_count(struct perf_kvm *kvm, struct kvm_event *event) ++static void ++update_total_count(struct perf_kvm_stat *kvm, struct kvm_event *event) + { + int vcpu = kvm->trace_vcpu; + +@@ -590,7 +591,7 @@ static bool event_is_valid(struct kvm_event *event, int vcpu) + return !!get_event_count(event, vcpu); + } + +-static void sort_result(struct perf_kvm *kvm) ++static void sort_result(struct perf_kvm_stat *kvm) + { + unsigned int i; + int vcpu = kvm->trace_vcpu; +@@ -627,7 +628,7 @@ static void print_vcpu_info(int vcpu) + pr_info("VCPU %d:\n\n", vcpu); + } + +-static void print_result(struct perf_kvm *kvm) ++static void print_result(struct perf_kvm_stat *kvm) + { + char decode[20]; + struct kvm_event *event; +@@ -670,7 +671,8 @@ static int process_sample_event(struct perf_tool *tool, + struct machine *machine) + { + struct thread *thread = machine__findnew_thread(machine, sample->tid); +- struct perf_kvm *kvm = container_of(tool, struct perf_kvm, tool); ++ struct perf_kvm_stat *kvm = container_of(tool, struct perf_kvm_stat, ++ tool); + + if (thread == NULL) { + pr_debug("problem processing %d event, skipping it.\n", +@@ -701,7 +703,7 @@ static int get_cpu_isa(struct perf_session *session) + return isa; + } + +-static int read_events(struct perf_kvm *kvm) ++static int read_events(struct perf_kvm_stat *kvm) + { + int ret; + +@@ -750,7 +752,7 @@ static bool verify_vcpu(int vcpu) + return true; + } + +-static int kvm_events_report_vcpu(struct perf_kvm *kvm) ++static int kvm_events_report_vcpu(struct perf_kvm_stat *kvm) + { + int ret = -EINVAL; + int vcpu = kvm->trace_vcpu; +@@ -798,7 +800,8 @@ static const char * const record_args[] = { + _p; \ + }) + +-static int kvm_events_record(struct perf_kvm *kvm, int argc, const char **argv) ++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; +@@ -821,7 +824,8 @@ static int kvm_events_record(struct perf_kvm *kvm, int argc, const char **argv) + return cmd_record(i, rec_argv, NULL); + } + +-static int kvm_events_report(struct perf_kvm *kvm, int argc, const char **argv) ++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", +@@ -864,24 +868,36 @@ static void print_kvm_stat_usage(void) + printf("\nOtherwise, it is the alias of 'perf stat':\n"); + } + +-static int kvm_cmd_stat(struct perf_kvm *kvm, int argc, const char **argv) ++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); ++ return kvm_events_record(&kvm, argc - 1, argv + 1); + + if (!strncmp(argv[1], "rep", 3)) +- return kvm_events_report(kvm, argc - 1 , argv + 1); ++ return kvm_events_report(&kvm, argc - 1 , argv + 1); + + perf_stat: + return cmd_stat(argc, argv, NULL); + } + +-static int __cmd_record(struct perf_kvm *kvm, int argc, const char **argv) ++static int __cmd_record(const char *file_name, int argc, const char **argv) + { + int rec_argc, i = 0, j; + const char **rec_argv; +@@ -890,7 +906,7 @@ static int __cmd_record(struct perf_kvm *kvm, int argc, const char **argv) + rec_argv = calloc(rec_argc + 1, sizeof(char *)); + rec_argv[i++] = strdup("record"); + rec_argv[i++] = strdup("-o"); +- rec_argv[i++] = strdup(kvm->file_name); ++ rec_argv[i++] = strdup(file_name); + for (j = 1; j < argc; j++, i++) + rec_argv[i] = argv[j]; + +@@ -899,7 +915,7 @@ static int __cmd_record(struct perf_kvm *kvm, int argc, const char **argv) + return cmd_record(i, rec_argv, NULL); + } + +-static int __cmd_report(struct perf_kvm *kvm, int argc, const char **argv) ++static int __cmd_report(const char *file_name, int argc, const char **argv) + { + int rec_argc, i = 0, j; + const char **rec_argv; +@@ -908,7 +924,7 @@ static int __cmd_report(struct perf_kvm *kvm, int argc, const char **argv) + rec_argv = calloc(rec_argc + 1, sizeof(char *)); + rec_argv[i++] = strdup("report"); + rec_argv[i++] = strdup("-i"); +- rec_argv[i++] = strdup(kvm->file_name); ++ rec_argv[i++] = strdup(file_name); + for (j = 1; j < argc; j++, i++) + rec_argv[i] = argv[j]; + +@@ -917,7 +933,8 @@ static int __cmd_report(struct perf_kvm *kvm, int argc, const char **argv) + return cmd_report(i, rec_argv, NULL); + } + +-static int __cmd_buildid_list(struct perf_kvm *kvm, int argc, const char **argv) ++static int ++__cmd_buildid_list(const char *file_name, int argc, const char **argv) + { + int rec_argc, i = 0, j; + const char **rec_argv; +@@ -926,7 +943,7 @@ static int __cmd_buildid_list(struct perf_kvm *kvm, int argc, const char **argv) + rec_argv = calloc(rec_argc + 1, sizeof(char *)); + rec_argv[i++] = strdup("buildid-list"); + rec_argv[i++] = strdup("-i"); +- rec_argv[i++] = strdup(kvm->file_name); ++ rec_argv[i++] = strdup(file_name); + for (j = 1; j < argc; j++, i++) + rec_argv[i] = argv[j]; + +@@ -937,20 +954,12 @@ static int __cmd_buildid_list(struct perf_kvm *kvm, int argc, const char **argv) + + int cmd_kvm(int argc, const char **argv, const char *prefix __maybe_unused) + { +- struct perf_kvm kvm = { +- .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", +- }; ++ const char *file_name; + + const struct option kvm_options[] = { +- OPT_STRING('i', "input", &kvm.file_name, "file", ++ OPT_STRING('i', "input", &file_name, "file", + "Input file name"), +- OPT_STRING('o', "output", &kvm.file_name, "file", ++ OPT_STRING('o', "output", &file_name, "file", + "Output file name"), + OPT_BOOLEAN(0, "guest", &perf_guest, + "Collect guest os data"), +@@ -985,32 +994,32 @@ int cmd_kvm(int argc, const char **argv, const char *prefix __maybe_unused) + if (!perf_host) + perf_guest = 1; + +- if (!kvm.file_name) { ++ if (!file_name) { + if (perf_host && !perf_guest) +- kvm.file_name = strdup("perf.data.host"); ++ file_name = strdup("perf.data.host"); + else if (!perf_host && perf_guest) +- kvm.file_name = strdup("perf.data.guest"); ++ file_name = strdup("perf.data.guest"); + else +- kvm.file_name = strdup("perf.data.kvm"); ++ file_name = strdup("perf.data.kvm"); + +- if (!kvm.file_name) { ++ if (!file_name) { + pr_err("Failed to allocate memory for filename\n"); + return -ENOMEM; + } + } + + if (!strncmp(argv[0], "rec", 3)) +- return __cmd_record(&kvm, argc, argv); ++ return __cmd_record(file_name, argc, argv); + else if (!strncmp(argv[0], "rep", 3)) +- return __cmd_report(&kvm, argc, argv); ++ 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(&kvm, argc, argv); ++ return __cmd_buildid_list(file_name, argc, argv); + else if (!strncmp(argv[0], "stat", 4)) +- return kvm_cmd_stat(&kvm, argc, argv); ++ return kvm_cmd_stat(file_name, argc, argv); + else + usage_with_options(kvm_usage, kvm_options); + +-- +1.7.12.1 + + +From afb33bc55fb0d038ae8d8e6970ce01cb1180fc9d Mon Sep 17 00:00:00 2001 +From: Xiao Guangrong +Date: Mon, 19 Nov 2012 16:19:21 +0800 +Subject: [PATCH 2/7] perf kvm: fix building perf kvm on PowerPC + +On 11/15/2012 06:46 PM, David Howells wrote: +> Xiao Guangrong wrote: +> +>> Now, 'perf kvm stat' is only supported on x86, let its code depend +>> on ARCH_X86 to fix building it on other architectures +> +> Other parts of perf do this sort of thing: +> +> #if defined(__x86_64__) || defined(__i386__) +> + +Yes, thanks for you point it out, David! How about this one? + +Subject: [PATCH 2/2] perf kvm: fix building perf kvm on PowerPC + +Now, 'perf kvm stat' is only supported on x86, let its code depend +on ARCH_X86 to fix building it on other architectures + +Signed-off-by: Xiao Guangrong +--- + tools/perf/builtin-kvm.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c +index 7bd8358..6d103a9 100644 +--- a/tools/perf/builtin-kvm.c ++++ b/tools/perf/builtin-kvm.c +@@ -22,6 +22,7 @@ + #include + #include + ++#if defined(__i386__) || defined(__x86_64__) + #include "../../arch/x86/include/asm/svm.h" + #include "../../arch/x86/include/asm/vmx.h" + #include "../../arch/x86/include/asm/kvm.h" +@@ -896,6 +897,7 @@ static int kvm_cmd_stat(const char *file_name, int argc, const char **argv) + perf_stat: + return cmd_stat(argc, argv, NULL); + } ++#endif + + static int __cmd_record(const char *file_name, int argc, const char **argv) + { +@@ -1018,8 +1020,10 @@ int cmd_kvm(int argc, const char **argv, const char *prefix __maybe_unused) + 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); + +-- +1.7.12.1 + + +From da7616139c67ee09d223706514a92b25ef113ee3 Mon Sep 17 00:00:00 2001 +From: David Howells +Date: Mon, 5 Nov 2012 14:33:42 +0000 +Subject: [PATCH 3/7] x86: Export asm/{svm.h,vmx.h,perf_regs.h} + +Export asm/{svm.h,vmx.h,perf_regs.h} so that they can be disintegrated. + +It looks from previous commits that the first two should have been exported, +but the header-y lines weren't added to the Kbuild. + +I'm guessing that asm/perf_regs.h should be exported too. + +Signed-off-by: David Howells +--- + arch/x86/include/asm/Kbuild | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/arch/x86/include/asm/Kbuild b/arch/x86/include/asm/Kbuild +index 66e5f0e..79fd8a3 100644 +--- a/arch/x86/include/asm/Kbuild ++++ b/arch/x86/include/asm/Kbuild +@@ -12,6 +12,7 @@ header-y += mce.h + header-y += msr-index.h + header-y += msr.h + header-y += mtrr.h ++header-y += perf_regs.h + header-y += posix_types_32.h + header-y += posix_types_64.h + header-y += posix_types_x32.h +@@ -19,8 +20,10 @@ header-y += prctl.h + header-y += processor-flags.h + header-y += ptrace-abi.h + header-y += sigcontext32.h ++header-y += svm.h + header-y += ucontext.h + header-y += vm86.h ++header-y += vmx.h + header-y += vsyscall.h + + genhdr-y += unistd_32.h +-- +1.7.12.1 + + +From 0d7cd7aa2500f2f4dd5b8d3cb365bbb1874f10d2 Mon Sep 17 00:00:00 2001 +From: David Howells +Date: Mon, 5 Nov 2012 15:15:22 +0000 +Subject: [PATCH 4/7] UAPI: Export and disintegrate linux/hw_breakpoint.h + +Export and UAPI disintegrate linux/hw_breakpoint.h, which I think should've +been exported previously so that perf can access the bits. + +Signed-off-by: David Howells +--- + include/linux/hw_breakpoint.h | 31 +------------------------------ + include/uapi/linux/Kbuild | 1 + + include/uapi/linux/hw_breakpoint.h | 30 ++++++++++++++++++++++++++++++ + 3 files changed, 32 insertions(+), 30 deletions(-) + create mode 100644 include/uapi/linux/hw_breakpoint.h + +diff --git a/include/linux/hw_breakpoint.h b/include/linux/hw_breakpoint.h +index 6ae9c63..0464c85 100644 +--- a/include/linux/hw_breakpoint.h ++++ b/include/linux/hw_breakpoint.h +@@ -1,35 +1,8 @@ + #ifndef _LINUX_HW_BREAKPOINT_H + #define _LINUX_HW_BREAKPOINT_H + +-enum { +- HW_BREAKPOINT_LEN_1 = 1, +- HW_BREAKPOINT_LEN_2 = 2, +- HW_BREAKPOINT_LEN_4 = 4, +- HW_BREAKPOINT_LEN_8 = 8, +-}; +- +-enum { +- HW_BREAKPOINT_EMPTY = 0, +- HW_BREAKPOINT_R = 1, +- HW_BREAKPOINT_W = 2, +- HW_BREAKPOINT_RW = HW_BREAKPOINT_R | HW_BREAKPOINT_W, +- HW_BREAKPOINT_X = 4, +- HW_BREAKPOINT_INVALID = HW_BREAKPOINT_RW | HW_BREAKPOINT_X, +-}; +- +-enum bp_type_idx { +- TYPE_INST = 0, +-#ifdef CONFIG_HAVE_MIXED_BREAKPOINTS_REGS +- TYPE_DATA = 0, +-#else +- TYPE_DATA = 1, +-#endif +- TYPE_MAX +-}; +- +-#ifdef __KERNEL__ +- + #include ++#include + + #ifdef CONFIG_HAVE_HW_BREAKPOINT + +@@ -151,6 +124,4 @@ static inline struct arch_hw_breakpoint *counter_arch_bp(struct perf_event *bp) + } + + #endif /* CONFIG_HAVE_HW_BREAKPOINT */ +-#endif /* __KERNEL__ */ +- + #endif /* _LINUX_HW_BREAKPOINT_H */ +diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild +index e194387..19e765f 100644 +--- a/include/uapi/linux/Kbuild ++++ b/include/uapi/linux/Kbuild +@@ -415,3 +415,4 @@ header-y += wireless.h + header-y += x25.h + header-y += xattr.h + header-y += xfrm.h ++header-y += hw_breakpoint.h +diff --git a/include/uapi/linux/hw_breakpoint.h b/include/uapi/linux/hw_breakpoint.h +new file mode 100644 +index 0000000..b04000a +--- /dev/null ++++ b/include/uapi/linux/hw_breakpoint.h +@@ -0,0 +1,30 @@ ++#ifndef _UAPI_LINUX_HW_BREAKPOINT_H ++#define _UAPI_LINUX_HW_BREAKPOINT_H ++ ++enum { ++ HW_BREAKPOINT_LEN_1 = 1, ++ HW_BREAKPOINT_LEN_2 = 2, ++ HW_BREAKPOINT_LEN_4 = 4, ++ HW_BREAKPOINT_LEN_8 = 8, ++}; ++ ++enum { ++ HW_BREAKPOINT_EMPTY = 0, ++ HW_BREAKPOINT_R = 1, ++ HW_BREAKPOINT_W = 2, ++ HW_BREAKPOINT_RW = HW_BREAKPOINT_R | HW_BREAKPOINT_W, ++ HW_BREAKPOINT_X = 4, ++ HW_BREAKPOINT_INVALID = HW_BREAKPOINT_RW | HW_BREAKPOINT_X, ++}; ++ ++enum bp_type_idx { ++ TYPE_INST = 0, ++#ifdef CONFIG_HAVE_MIXED_BREAKPOINTS_REGS ++ TYPE_DATA = 0, ++#else ++ TYPE_DATA = 1, ++#endif ++ TYPE_MAX ++}; ++ ++#endif /* _UAPI_LINUX_HW_BREAKPOINT_H */ +-- +1.7.12.1 + + +From fe8c6a916b2cab61db535d64d653f859b337fede Mon Sep 17 00:00:00 2001 +From: David Howells +Date: Mon, 5 Nov 2012 15:15:24 +0000 +Subject: [PATCH 5/7] tools: Define a Makefile function to do subdir + processing + +Define a Makefile function that can be called with $(call ...) to wrap the +subdir make invocations in tools/Makefile. + +This will allow us in the next patch to insert bits in there to honour O= +flags when called from the top-level Makefile. + +Signed-off-by: David Howells +--- + tools/Makefile | 24 ++++++++++++------------ + tools/scripts/Makefile.include | 8 ++++++++ + 2 files changed, 20 insertions(+), 12 deletions(-) + +diff --git a/tools/Makefile b/tools/Makefile +index 3ae4394..1f9a529 100644 +--- a/tools/Makefile ++++ b/tools/Makefile +@@ -31,44 +31,44 @@ help: + @echo ' clean: a summary clean target to clean _all_ folders' + + cpupower: FORCE +- $(QUIET_SUBDIR0)power/$@/ $(QUIET_SUBDIR1) ++ $(call descend,power/$@) + + firewire lguest perf usb virtio vm: FORCE +- $(QUIET_SUBDIR0)$@/ $(QUIET_SUBDIR1) ++ $(call descend,$@) + + selftests: FORCE +- $(QUIET_SUBDIR0)testing/$@/ $(QUIET_SUBDIR1) ++ $(call descend,testing/$@) + + turbostat x86_energy_perf_policy: FORCE +- $(QUIET_SUBDIR0)power/x86/$@/ $(QUIET_SUBDIR1) ++ $(call descend,power/x86/$@) + + cpupower_install: +- $(QUIET_SUBDIR0)power/$(@:_install=)/ $(QUIET_SUBDIR1) install ++ $(call descend,power/$(@:_install=),install) + + firewire_install lguest_install perf_install usb_install virtio_install vm_install: +- $(QUIET_SUBDIR0)$(@:_install=)/ $(QUIET_SUBDIR1) install ++ $(call descend,$(@:_install=),install) + + selftests_install: +- $(QUIET_SUBDIR0)testing/$(@:_clean=)/ $(QUIET_SUBDIR1) install ++ $(call descend,testing/$(@:_clean=),install) + + turbostat_install x86_energy_perf_policy_install: +- $(QUIET_SUBDIR0)power/x86/$(@:_install=)/ $(QUIET_SUBDIR1) install ++ $(call descend,power/x86/$(@:_install=),install) + + install: cpupower_install firewire_install lguest_install perf_install \ + selftests_install turbostat_install usb_install virtio_install \ + vm_install x86_energy_perf_policy_install + + cpupower_clean: +- $(QUIET_SUBDIR0)power/cpupower/ $(QUIET_SUBDIR1) clean ++ $(call descend,power/cpupower,clean) + + firewire_clean lguest_clean perf_clean usb_clean virtio_clean vm_clean: +- $(QUIET_SUBDIR0)$(@:_clean=)/ $(QUIET_SUBDIR1) clean ++ $(call descend,$(@:_clean=),clean) + + selftests_clean: +- $(QUIET_SUBDIR0)testing/$(@:_clean=)/ $(QUIET_SUBDIR1) clean ++ $(call descend,testing/$(@:_clean=),clean) + + turbostat_clean x86_energy_perf_policy_clean: +- $(QUIET_SUBDIR0)power/x86/$(@:_clean=)/ $(QUIET_SUBDIR1) clean ++ $(call descend,power/x86/$(@:_clean=),clean) + + clean: cpupower_clean firewire_clean lguest_clean perf_clean selftests_clean \ + turbostat_clean usb_clean virtio_clean vm_clean \ +diff --git a/tools/scripts/Makefile.include b/tools/scripts/Makefile.include +index 96ce80a..4a9e317 100644 +--- a/tools/scripts/Makefile.include ++++ b/tools/scripts/Makefile.include +@@ -41,6 +41,14 @@ else + NO_SUBDIR = : + endif + ++# ++# Define a callable command for descending to a new directory ++# ++# Call by doing: $(call descend,directory[,target]) ++# ++descend = \ ++ $(QUIET_SUBDIR0)$(1) $(QUIET_SUBDIR1) $(2) ++ + QUIET_SUBDIR0 = +$(MAKE) -C # space to separate -C and subdir + QUIET_SUBDIR1 = + +-- +1.7.12.1 + + +From 148e4a394ba91d46b311d2d108f1a541b337103f Mon Sep 17 00:00:00 2001 +From: David Howells +Date: Mon, 5 Nov 2012 21:02:08 +0000 +Subject: [PATCH 6/7] tools: Honour the O= flag when tool build called from a + higher Makefile + +Honour the O= flag that was passed to a higher level Makefile and then passed +down as part of a tool build. + +To make this work, the top-level Makefile passes the original O= flag and +subdir=tools to the tools/Makefile, and that in turn passes +subdir=$(O)/$(subdir)/foodir when building tool foo in directory +$(O)/$(subdir)/foodir (where the intervening slashes aren't added if an +element is missing). + +For example, take perf. This is found in tools/perf/. Assume we're building +into directory ~/zebra/, so we pass O=~/zebra to make. Dependening on where +we run the build from, we see: + + make run in dir $(OUTPUT) dir + ======================= ================== + linux ~/zebra/tools/perf/ + linux/tools ~/zebra/perf/ + linux/tools/perf ~/zebra/ + +and if O= is not set, we get: + + make run in dir $(OUTPUT) dir + ======================= ================== + linux linux/tools/perf/ + linux/tools linux/tools/perf/ + linux/tools/perf linux/tools/perf/ + +The output directories are created by the descend function if they don't +already exist. + +Signed-off-by: David Howells +--- + Makefile | 6 ++++-- + tools/scripts/Makefile.include | 17 +++++++++++++---- + 2 files changed, 17 insertions(+), 6 deletions(-) + +diff --git a/Makefile b/Makefile +index 9f6ca12..fda5b97 100644 +--- a/Makefile ++++ b/Makefile +@@ -1321,10 +1321,12 @@ kernelversion: + + # Clear a bunch of variables before executing the submake + tools/: FORCE +- $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= -C $(src)/tools/ ++ $(Q)mkdir -p $(objtree)/tools ++ $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= O=$(objtree) subdir=tools -C $(src)/tools/ + + tools/%: FORCE +- $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= -C $(src)/tools/ $* ++ $(Q)mkdir -p $(objtree)/tools ++ $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= O=$(objtree) subdir=tools -C $(src)/tools/ $* + + # Single targets + # --------------------------------------------------------------------------- +diff --git a/tools/scripts/Makefile.include b/tools/scripts/Makefile.include +index 4a9e317..87467b1 100644 +--- a/tools/scripts/Makefile.include ++++ b/tools/scripts/Makefile.include +@@ -1,8 +1,11 @@ +-ifeq ("$(origin O)", "command line") ++ifeq ($(origin O), command line) + dummy := $(if $(shell test -d $(O) || echo $(O)),$(error O=$(O) does not exist),) + ABSOLUTE_O := $(shell cd $(O) ; pwd) +- OUTPUT := $(ABSOLUTE_O)/ ++ OUTPUT := $(ABSOLUTE_O)/$(if $(subdir),$(subdir)/) + COMMAND_O := O=$(ABSOLUTE_O) ++ifeq ($(objtree),) ++ objtree := $(O) ++endif + endif + + ifneq ($(OUTPUT),) +@@ -47,9 +50,10 @@ endif + # Call by doing: $(call descend,directory[,target]) + # + descend = \ +- $(QUIET_SUBDIR0)$(1) $(QUIET_SUBDIR1) $(2) ++ +mkdir -p $(OUTPUT)$(1) && \ ++ $(MAKE) $(COMMAND_O) subdir=$(if $(subdir),$(subdir)/$(1),$(1)) $(PRINT_DIR) -C $(1) + +-QUIET_SUBDIR0 = +$(MAKE) -C # space to separate -C and subdir ++QUIET_SUBDIR0 = +$(MAKE) $(COMMAND_O) -C # space to separate -C and subdir + QUIET_SUBDIR1 = + + ifneq ($(findstring $(MAKEFLAGS),s),s) +@@ -64,5 +68,10 @@ ifndef V + $(MAKE) $(PRINT_DIR) -C $$subdir + QUIET_FLEX = @echo ' ' FLEX $@; + QUIET_BISON = @echo ' ' BISON $@; ++ ++ descend = \ ++ @echo ' ' DESCEND $(1); \ ++ mkdir -p $(OUTPUT)$(1) && \ ++ $(MAKE) $(COMMAND_O) subdir=$(if $(subdir),$(subdir)/$(1),$(1)) $(PRINT_DIR) -C $(1) + endif + endif +-- +1.7.12.1 + + +From 2ed84acacff79f3b469fb53627dd042c53f2fcaa Mon Sep 17 00:00:00 2001 +From: David Howells +Date: Mon, 5 Nov 2012 23:03:12 +0000 +Subject: [PATCH 7/7] perf: Make perf build for x86 with UAPI disintegration + applied + +Make perf build for x86 once the UAPI disintegration patches for that arch +have been applied by adding the appropriate -I flags - in the right order - +and then converting some #includes that use ../.. notation to find main kernel +headerfiles to use and instead. + +Note that -Iarch/foo/include/uapi is present _before_ -Iarch/foo/include. +This makes sure we get the userspace version of the pt_regs struct. Ideally, +we wouldn't have the latter -I flag at all, but unfortunately we want +asm/svm.h and asm/vmx.h in buildin-kvm.c and these aren't part of the UAPI - +at least not for x86. I wonder if the bits outside of the __KERNEL__ guards +*should* be transferred there. + +I note also that perf seems to do its dependency handling manually by listing +all the header files it might want to use in LIB_H in the Makefile. Can this +be changed to use -MD? + +Signed-off-by: David Howells +--- + tools/perf/Makefile | 26 +++++++++++++++++++++++++- + tools/perf/arch/x86/include/perf_regs.h | 2 +- + tools/perf/builtin-kvm.c | 6 +++--- + tools/perf/builtin-test.c | 2 +- + tools/perf/perf.h | 16 +++------------- + tools/perf/util/evsel.c | 4 ++-- + tools/perf/util/evsel.h | 2 +- + tools/perf/util/header.h | 2 +- + tools/perf/util/parse-events-test.c | 2 +- + tools/perf/util/parse-events.c | 2 +- + tools/perf/util/parse-events.h | 2 +- + tools/perf/util/pmu.h | 2 +- + tools/perf/util/session.h | 2 +- + 13 files changed, 42 insertions(+), 28 deletions(-) + +diff --git a/tools/perf/Makefile b/tools/perf/Makefile +index 00deed4d..4d4b54f 100644 +--- a/tools/perf/Makefile ++++ b/tools/perf/Makefile +@@ -169,7 +169,31 @@ endif + + ### --- END CONFIGURATION SECTION --- + +-BASIC_CFLAGS = -Iutil/include -Iarch/$(ARCH)/include -I$(OUTPUT)util -I$(TRACE_EVENT_DIR) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE ++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 ++ ++BASIC_CFLAGS = \ ++ -Iutil/include \ ++ -Iarch/$(ARCH)/include \ ++ $(if $(objtree),-I$(objtree)/arch/$(ARCH)/include/generated/uapi) \ ++ -I$(srctree)/arch/$(ARCH)/include/uapi \ ++ -I$(srctree)/arch/$(ARCH)/include \ ++ $(if $(objtree),-I$(objtree)/include/generated/uapi) \ ++ -I$(srctree)/include/uapi \ ++ -I$(OUTPUT)util \ ++ -I$(TRACE_EVENT_DIR) \ ++ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE + BASIC_LDFLAGS = + + # Guard against environment variables +diff --git a/tools/perf/arch/x86/include/perf_regs.h b/tools/perf/arch/x86/include/perf_regs.h +index 46fc9f1..7fcdcdb 100644 +--- a/tools/perf/arch/x86/include/perf_regs.h ++++ b/tools/perf/arch/x86/include/perf_regs.h +@@ -3,7 +3,7 @@ + + #include + #include "../../util/types.h" +-#include "../../../../../arch/x86/include/asm/perf_regs.h" ++#include + + #ifndef ARCH_X86_64 + #define PERF_REGS_MASK ((1ULL << PERF_REG_X86_32_MAX) - 1) +diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c +index 6d103a9..283b439 100644 +--- a/tools/perf/builtin-kvm.c ++++ b/tools/perf/builtin-kvm.c +@@ -23,9 +23,9 @@ + #include + + #if defined(__i386__) || defined(__x86_64__) +-#include "../../arch/x86/include/asm/svm.h" +-#include "../../arch/x86/include/asm/vmx.h" +-#include "../../arch/x86/include/asm/kvm.h" ++#include ++#include ++#include + + struct event_key { + #define INVALID_KEY (~0ULL) +diff --git a/tools/perf/builtin-test.c b/tools/perf/builtin-test.c +index 484f26c..3626a01 100644 +--- a/tools/perf/builtin-test.c ++++ b/tools/perf/builtin-test.c +@@ -15,7 +15,7 @@ + #include "util/thread_map.h" + #include "util/pmu.h" + #include "event-parse.h" +-#include "../../include/linux/hw_breakpoint.h" ++#include "../../include/uapi/linux/hw_breakpoint.h" + + #include + +diff --git a/tools/perf/perf.h b/tools/perf/perf.h +index c50985e..238f923 100644 +--- a/tools/perf/perf.h ++++ b/tools/perf/perf.h +@@ -5,8 +5,9 @@ struct winsize; + + void get_term_dimensions(struct winsize *ws); + ++#include ++ + #if defined(__i386__) +-#include "../../arch/x86/include/asm/unistd.h" + #define rmb() asm volatile("lock; addl $0,0(%%esp)" ::: "memory") + #define cpu_relax() asm volatile("rep; nop" ::: "memory"); + #define CPUINFO_PROC "model name" +@@ -16,7 +17,6 @@ void get_term_dimensions(struct winsize *ws); + #endif + + #if defined(__x86_64__) +-#include "../../arch/x86/include/asm/unistd.h" + #define rmb() asm volatile("lfence" ::: "memory") + #define cpu_relax() asm volatile("rep; nop" ::: "memory"); + #define CPUINFO_PROC "model name" +@@ -26,20 +26,17 @@ void get_term_dimensions(struct winsize *ws); + #endif + + #ifdef __powerpc__ +-#include "../../arch/powerpc/include/asm/unistd.h" + #define rmb() asm volatile ("sync" ::: "memory") + #define cpu_relax() asm volatile ("" ::: "memory"); + #define CPUINFO_PROC "cpu" + #endif + + #ifdef __s390__ +-#include "../../arch/s390/include/asm/unistd.h" + #define rmb() asm volatile("bcr 15,0" ::: "memory") + #define cpu_relax() asm volatile("" ::: "memory"); + #endif + + #ifdef __sh__ +-#include "../../arch/sh/include/asm/unistd.h" + #if defined(__SH4A__) || defined(__SH5__) + # define rmb() asm volatile("synco" ::: "memory") + #else +@@ -50,35 +47,30 @@ void get_term_dimensions(struct winsize *ws); + #endif + + #ifdef __hppa__ +-#include "../../arch/parisc/include/asm/unistd.h" + #define rmb() asm volatile("" ::: "memory") + #define cpu_relax() asm volatile("" ::: "memory"); + #define CPUINFO_PROC "cpu" + #endif + + #ifdef __sparc__ +-#include "../../arch/sparc/include/uapi/asm/unistd.h" + #define rmb() asm volatile("":::"memory") + #define cpu_relax() asm volatile("":::"memory") + #define CPUINFO_PROC "cpu" + #endif + + #ifdef __alpha__ +-#include "../../arch/alpha/include/asm/unistd.h" + #define rmb() asm volatile("mb" ::: "memory") + #define cpu_relax() asm volatile("" ::: "memory") + #define CPUINFO_PROC "cpu model" + #endif + + #ifdef __ia64__ +-#include "../../arch/ia64/include/asm/unistd.h" + #define rmb() asm volatile ("mf" ::: "memory") + #define cpu_relax() asm volatile ("hint @pause" ::: "memory") + #define CPUINFO_PROC "model name" + #endif + + #ifdef __arm__ +-#include "../../arch/arm/include/asm/unistd.h" + /* + * Use the __kuser_memory_barrier helper in the CPU helper page. See + * arch/arm/kernel/entry-armv.S in the kernel source for details. +@@ -89,13 +81,11 @@ void get_term_dimensions(struct winsize *ws); + #endif + + #ifdef __aarch64__ +-#include "../../arch/arm64/include/asm/unistd.h" + #define rmb() asm volatile("dmb ld" ::: "memory") + #define cpu_relax() asm volatile("yield" ::: "memory") + #endif + + #ifdef __mips__ +-#include "../../arch/mips/include/asm/unistd.h" + #define rmb() asm volatile( \ + ".set mips2\n\t" \ + "sync\n\t" \ +@@ -112,7 +102,7 @@ void get_term_dimensions(struct winsize *ws); + #include + #include + +-#include "../../include/uapi/linux/perf_event.h" ++#include + #include "util/types.h" + #include + +diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c +index 618d411..d144d46 100644 +--- a/tools/perf/util/evsel.c ++++ b/tools/perf/util/evsel.c +@@ -18,8 +18,8 @@ + #include "cpumap.h" + #include "thread_map.h" + #include "target.h" +-#include "../../../include/linux/hw_breakpoint.h" +-#include "../../../include/uapi/linux/perf_event.h" ++#include ++#include + #include "perf_regs.h" + + #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) +diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h +index 6f94d6d..bb84275 100644 +--- a/tools/perf/util/evsel.h ++++ b/tools/perf/util/evsel.h +@@ -3,7 +3,7 @@ + + #include + #include +-#include "../../../include/uapi/linux/perf_event.h" ++#include + #include "types.h" + #include "xyarray.h" + #include "cgroup.h" +diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h +index 879d215..9bc0078 100644 +--- a/tools/perf/util/header.h ++++ b/tools/perf/util/header.h +@@ -1,7 +1,7 @@ + #ifndef __PERF_HEADER_H + #define __PERF_HEADER_H + +-#include "../../../include/uapi/linux/perf_event.h" ++#include + #include + #include + #include "types.h" +diff --git a/tools/perf/util/parse-events-test.c b/tools/perf/util/parse-events-test.c +index 516ecd9..6ef213b 100644 +--- a/tools/perf/util/parse-events-test.c ++++ b/tools/perf/util/parse-events-test.c +@@ -3,7 +3,7 @@ + #include "evsel.h" + #include "evlist.h" + #include "sysfs.h" +-#include "../../../include/linux/hw_breakpoint.h" ++#include + + #define TEST_ASSERT_VAL(text, cond) \ + do { \ +diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c +index 75c7b0f..6b6d03e 100644 +--- a/tools/perf/util/parse-events.c ++++ b/tools/perf/util/parse-events.c +@@ -1,4 +1,4 @@ +-#include "../../../include/linux/hw_breakpoint.h" ++#include + #include "util.h" + #include "../perf.h" + #include "evlist.h" +diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h +index 839230c..2820c40 100644 +--- a/tools/perf/util/parse-events.h ++++ b/tools/perf/util/parse-events.h +@@ -7,7 +7,7 @@ + #include + #include + #include "types.h" +-#include "../../../include/uapi/linux/perf_event.h" ++#include + #include "types.h" + + struct list_head; +diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h +index 39f3aba..fdeb8ac 100644 +--- a/tools/perf/util/pmu.h ++++ b/tools/perf/util/pmu.h +@@ -2,7 +2,7 @@ + #define __PMU_H + + #include +-#include "../../../include/uapi/linux/perf_event.h" ++#include + + enum { + PERF_PMU_FORMAT_VALUE_CONFIG, +diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h +index dd64261..0eae00a 100644 +--- a/tools/perf/util/session.h ++++ b/tools/perf/util/session.h +@@ -7,7 +7,7 @@ + #include "symbol.h" + #include "thread.h" + #include +-#include "../../../include/uapi/linux/perf_event.h" ++#include + + struct sample_queue; + struct ip_callchain; +-- +1.7.12.1 +