diff options
author | Adrian Dudau <adrian.dudau@enea.com> | 2014-06-26 14:36:22 +0200 |
---|---|---|
committer | Adrian Dudau <adrian.dudau@enea.com> | 2014-06-26 15:32:53 +0200 |
commit | f4cf9fe05bb3f32fabea4e54dd92d368967a80da (patch) | |
tree | 487180fa9866985ea7b28e625651765d86f515c3 /meta/recipes-kernel/oprofile | |
download | poky-f4cf9fe05bb3f32fabea4e54dd92d368967a80da.tar.gz |
initial commit for Enea Linux 4.0
Migrated from the internal git server on the daisy-enea branch
Signed-off-by: Adrian Dudau <adrian.dudau@enea.com>
Diffstat (limited to 'meta/recipes-kernel/oprofile')
20 files changed, 1903 insertions, 0 deletions
diff --git a/meta/recipes-kernel/oprofile/oprofile.inc b/meta/recipes-kernel/oprofile/oprofile.inc new file mode 100644 index 0000000000..080219ed3d --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofile.inc | |||
@@ -0,0 +1,36 @@ | |||
1 | SUMMARY = "System-Wide Profiler" | ||
2 | DESCRIPTION = "OProfile is a system-wide profiler for Linux systems, capable \ | ||
3 | of profiling all running code at low overhead." | ||
4 | HOMEPAGE = "http://oprofile.sourceforge.net/news/" | ||
5 | BUGTRACKER = "http://sourceforge.net/tracker/?group_id=16191&atid=116191" | ||
6 | |||
7 | LICENSE = "LGPLv2.1+ & GPLv2" | ||
8 | LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f \ | ||
9 | file://libopagent/opagent.h;beginline=5;endline=26;md5=4f16f72c7a493d8a4704aa18d03d15c6 \ | ||
10 | file://daemon/liblegacy/p_module.h;beginline=2;endline=20;md5=fc23a43455edf185307274a99730b6e4" | ||
11 | |||
12 | SECTION = "devel" | ||
13 | |||
14 | DEPENDS = "popt binutils" | ||
15 | RDEPENDS_${PN} = "binutils-symlinks" | ||
16 | RRECOMMENDS_${PN} = "kernel-vmlinux" | ||
17 | |||
18 | FILES_${PN} = "${bindir} ${libdir}/${BPN}/lib*${SOLIBS} ${datadir}/${BPN}" | ||
19 | FILES_${PN}-dev += "${libdir}/${BPN}/lib*${SOLIBSDEV} ${libdir}/${BPN}/lib*.la" | ||
20 | FILES_${PN}-staticdev += "${libdir}/${BPN}/lib*.a" | ||
21 | |||
22 | INC_PR = "r2" | ||
23 | |||
24 | SRC_URI = "file://opstart.patch \ | ||
25 | file://oprofile-no-query-modules.patch \ | ||
26 | file://oprofile-root.patch \ | ||
27 | file://acinclude.m4" | ||
28 | |||
29 | inherit autotools-brokensep | ||
30 | |||
31 | EXTRA_OECONF = "--with-kernel=${STAGING_KERNEL_DIR} --without-x" | ||
32 | do_configure () { | ||
33 | find ${S} -wholename '${S}/.pc' -prune -o -type f -print | xargs sed -i 's#ROOTHOME#${ROOT_HOME}#' | ||
34 | cp ${WORKDIR}/acinclude.m4 ${S}/ | ||
35 | autotools_do_configure | ||
36 | } | ||
diff --git a/meta/recipes-kernel/oprofile/oprofile/0001-Add-rmb-definition-for-AArch64-architecture.patch b/meta/recipes-kernel/oprofile/oprofile/0001-Add-rmb-definition-for-AArch64-architecture.patch new file mode 100644 index 0000000000..a2385cd2b2 --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofile/0001-Add-rmb-definition-for-AArch64-architecture.patch | |||
@@ -0,0 +1,31 @@ | |||
1 | From 27edaef9c6d66dfc324630ef40cb27e78031eeeb Mon Sep 17 00:00:00 2001 | ||
2 | From: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org> | ||
3 | Date: Tue, 15 Jan 2013 07:37:33 +0100 | ||
4 | Subject: [PATCH] Add rmb() definition for AArch64 architecture | ||
5 | |||
6 | Signed-off-by: Marcin Juszkiewicz <marcin.juszkiewicz@linaro.org> | ||
7 | |||
8 | Upstream-Status: backport | ||
9 | --- | ||
10 | libperf_events/operf_utils.h | 5 +++++ | ||
11 | 1 file changed, 5 insertions(+) | ||
12 | |||
13 | diff --git a/libperf_events/operf_utils.h b/libperf_events/operf_utils.h | ||
14 | index 815d51d..2df00b7 100644 | ||
15 | --- a/libperf_events/operf_utils.h | ||
16 | +++ b/libperf_events/operf_utils.h | ||
17 | @@ -148,6 +148,11 @@ void op_release_resources(void); | ||
18 | #define cpu_relax() asm volatile("":::"memory") | ||
19 | #endif | ||
20 | |||
21 | +#ifdef __aarch64__ | ||
22 | +#define rmb() asm volatile("dmb ld" ::: "memory") | ||
23 | +#define cpu_relax() asm volatile("yield" ::: "memory") | ||
24 | +#endif | ||
25 | + | ||
26 | #ifdef __mips__ | ||
27 | #include <asm/unistd.h> | ||
28 | #define rmb() asm volatile( \ | ||
29 | -- | ||
30 | 1.8.0 | ||
31 | |||
diff --git a/meta/recipes-kernel/oprofile/oprofile/0001-Allow-ppc64-events-to-be-specified-with-or-without-_.patch b/meta/recipes-kernel/oprofile/oprofile/0001-Allow-ppc64-events-to-be-specified-with-or-without-_.patch new file mode 100644 index 0000000000..d19948a4f8 --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofile/0001-Allow-ppc64-events-to-be-specified-with-or-without-_.patch | |||
@@ -0,0 +1,208 @@ | |||
1 | Upstream-Status: Accepted | ||
2 | |||
3 | From 36028035555297695f52e856f21920012fd64f79 Mon Sep 17 00:00:00 2001 | ||
4 | From: Maynard Johnson <maynardj@us.ibm.com> | ||
5 | Date: Fri, 11 Jan 2013 13:29:57 -0600 | ||
6 | Subject: [PATCH] Allow ppc64 events to be specified with or without _GRP<n> | ||
7 | suffix | ||
8 | |||
9 | All events for IBM PowerPC server processors (except CYCLES) have | ||
10 | a _GRP<n> suffix. This is because the legacy opcontrol profiler | ||
11 | can only profile events in the same group (i.e., having the same | ||
12 | _GRP<n> suffix). But operf has no such restriction because it | ||
13 | can multiplex events; thus, so we should allow the user to pass | ||
14 | event names without the _GRP<n> suffix. | ||
15 | |||
16 | Signed-off-by: Maynard Johnson <maynardj@us.ibm.com> | ||
17 | --- | ||
18 | doc/operf.1.in | 6 +++ | ||
19 | doc/oprofile.xml | 12 +++++- | ||
20 | pe_profiling/operf.cpp | 107 ++++++++++++++++++++++++++++++++++++++++++++++++ | ||
21 | utils/ophelp.c | 4 ++ | ||
22 | 4 files changed, 127 insertions(+), 2 deletions(-) | ||
23 | |||
24 | diff --git a/doc/operf.1.in b/doc/operf.1.in | ||
25 | index b109324..03027ca 100644 | ||
26 | --- a/doc/operf.1.in | ||
27 | +++ b/doc/operf.1.in | ||
28 | @@ -110,6 +110,12 @@ be specified using the symbolic name. If no unit mask is specified, 0x0 will be | ||
29 | used as the default. | ||
30 | .P | ||
31 | .RS | ||
32 | +On IBM PowerPC systems, events may be specified with or without the | ||
33 | +.I _GRP<n> | ||
34 | +suffix. If no group number suffix is given, one will be automatically | ||
35 | +assigned; thus, OProfile post-processing tools will always show real event | ||
36 | +names that include the group number suffix. | ||
37 | +.P | ||
38 | When no event specification is given, the default event for the running | ||
39 | processor type will be used for profiling. | ||
40 | Use | ||
41 | diff --git a/doc/oprofile.xml b/doc/oprofile.xml | ||
42 | index 0ae2b0b..0f74726 100644 | ||
43 | --- a/doc/oprofile.xml | ||
44 | +++ b/doc/oprofile.xml | ||
45 | @@ -1106,10 +1106,18 @@ shown by the output of <command>ophelp</command>. Unit masks with "extra:" para | ||
46 | specified using the symbolic name. | ||
47 | </para> | ||
48 | <note><para> | ||
49 | -When using legacy mode <command>opcontrol</command> on PowerPC platforms, all events specified must be in the same group; | ||
50 | +When using legacy mode <command>opcontrol</command> on IBM PowerPC platforms, all events specified must be in the same group; | ||
51 | i.e., the group number appended to the event name (e.g. <constant><<emphasis>some-event-name</emphasis>>_GRP9 | ||
52 | </constant>) must be the same. | ||
53 | -</para></note> | ||
54 | +</para> | ||
55 | +<para> | ||
56 | +When profiling with <command>operf</command> on IBM PowerPC platforms, the above restriction | ||
57 | +regarding the same group number does not apply, and events may be | ||
58 | +specified with or without the group number suffix. If no group number suffix is given, one will be automatically | ||
59 | +assigned; thus, OProfile post-processing tools will always show real event | ||
60 | +names that include the group number suffix. | ||
61 | +</para> | ||
62 | +</note> | ||
63 | <para> | ||
64 | If OProfile is using timer-interrupt mode, there is no event configuration possible. | ||
65 | </para> | ||
66 | diff --git a/pe_profiling/operf.cpp b/pe_profiling/operf.cpp | ||
67 | index 4416b29..a776e71 100644 | ||
68 | --- a/pe_profiling/operf.cpp | ||
69 | +++ b/pe_profiling/operf.cpp | ||
70 | @@ -1146,6 +1146,108 @@ static void _get_event_code(operf_event_t * event) | ||
71 | event->evt_code = config; | ||
72 | } | ||
73 | |||
74 | +#if (defined(__powerpc__) || defined(__powerpc64__)) | ||
75 | +/* All ppc64 events (except CYCLES) have a _GRP<n> suffix. This is | ||
76 | + * because the legacy opcontrol profiler can only profile events in | ||
77 | + * the same group (i.e., having the same _GRP<n> suffix). But operf | ||
78 | + * can multiplex events, so we should allow the user to pass event | ||
79 | + * names without the _GRP<n> suffix. | ||
80 | + * | ||
81 | + * If event name is not CYCLES or does not have a _GRP<n> suffix, | ||
82 | + * we'll call ophelp and scan the list of events, searching for one | ||
83 | + * that matches up to the _GRP<n> suffix. If we don't find a match, | ||
84 | + * then we'll exit with the expected error message for invalid event name. | ||
85 | + */ | ||
86 | +static string _handle_powerpc_event_spec(string event_spec) | ||
87 | +{ | ||
88 | + FILE * fp; | ||
89 | + char line[MAX_INPUT]; | ||
90 | + size_t grp_pos; | ||
91 | + string evt, retval, err_msg; | ||
92 | + size_t evt_name_len; | ||
93 | + bool first_non_cyc_evt_found = false; | ||
94 | + bool event_found = false; | ||
95 | + char event_name[OP_MAX_EVT_NAME_LEN], event_spec_str[OP_MAX_EVT_NAME_LEN + 20], * count_str; | ||
96 | + string cmd = OP_BINDIR; | ||
97 | + cmd += "/ophelp"; | ||
98 | + | ||
99 | + strncpy(event_spec_str, event_spec.c_str(), event_spec.length() + 1); | ||
100 | + | ||
101 | + strncpy(event_name, strtok(event_spec_str, ":"), OP_MAX_EVT_NAME_LEN); | ||
102 | + count_str = strtok(NULL, ":"); | ||
103 | + if (!count_str) { | ||
104 | + err_msg = "Invalid count for event "; | ||
105 | + goto out; | ||
106 | + } | ||
107 | + | ||
108 | + if (!strcmp("CYCLES", event_name)) { | ||
109 | + event_found = true; | ||
110 | + goto out; | ||
111 | + } | ||
112 | + | ||
113 | + evt = event_name; | ||
114 | + // Need to make sure the event name truly has a _GRP<n> suffix. | ||
115 | + grp_pos = evt.rfind("_GRP"); | ||
116 | + if ((grp_pos != string::npos) && ((evt = evt.substr(grp_pos, string::npos))).length() > 4) { | ||
117 | + unsigned long value; | ||
118 | + char * end; | ||
119 | + value = strtoul(evt.substr(4, string::npos).c_str(), &end, 0); | ||
120 | + if (end && (*end == '\0')) { | ||
121 | + // Valid group number found after _GRP, so we can skip to the end. | ||
122 | + event_found = true; | ||
123 | + goto out; | ||
124 | + } | ||
125 | + } | ||
126 | + | ||
127 | + // If we get here, it implies the user passed a non-CYCLES event without a GRP suffix. | ||
128 | + // Lets try to find a valid suffix for it. | ||
129 | + fp = popen(cmd.c_str(), "r"); | ||
130 | + if (fp == NULL) { | ||
131 | + cerr << "Unable to execute ophelp to get info for event " | ||
132 | + << event_spec << endl; | ||
133 | + exit(EXIT_FAILURE); | ||
134 | + } | ||
135 | + evt_name_len = strlen(event_name); | ||
136 | + err_msg = "Cannot find event "; | ||
137 | + while (fgets(line, MAX_INPUT, fp)) { | ||
138 | + if (!first_non_cyc_evt_found) { | ||
139 | + if (!strncmp(line, "PM_", 3)) | ||
140 | + first_non_cyc_evt_found = true; | ||
141 | + else | ||
142 | + continue; | ||
143 | + } | ||
144 | + if (line[0] == ' ' || line[0] == '\t') | ||
145 | + continue; | ||
146 | + if (!strncmp(line, event_name, evt_name_len)) { | ||
147 | + // Found a potential match. Check if it's a perfect match. | ||
148 | + string save_event_name = event_name; | ||
149 | + size_t full_evt_len = index(line, ':') - line; | ||
150 | + memset(event_name, '\0', OP_MAX_EVT_NAME_LEN); | ||
151 | + strncpy(event_name, line, full_evt_len); | ||
152 | + string candidate = event_name; | ||
153 | + if (candidate.rfind("_GRP") == evt_name_len) { | ||
154 | + event_found = true; | ||
155 | + break; | ||
156 | + } else { | ||
157 | + memset(event_name, '\0', OP_MAX_EVT_NAME_LEN); | ||
158 | + strncpy(event_name, save_event_name.c_str(), evt_name_len); | ||
159 | + } | ||
160 | + } | ||
161 | + } | ||
162 | + pclose(fp); | ||
163 | + | ||
164 | +out: | ||
165 | + if (!event_found) { | ||
166 | + cerr << err_msg << event_name << endl; | ||
167 | + cerr << "Error retrieving info for event " | ||
168 | + << event_spec << endl; | ||
169 | + exit(EXIT_FAILURE); | ||
170 | + } | ||
171 | + retval = event_name; | ||
172 | + return retval + ":" + count_str; | ||
173 | +} | ||
174 | +#endif | ||
175 | + | ||
176 | static void _process_events_list(void) | ||
177 | { | ||
178 | string cmd = OP_BINDIR; | ||
179 | @@ -1154,6 +1256,11 @@ static void _process_events_list(void) | ||
180 | FILE * fp; | ||
181 | string full_cmd = cmd; | ||
182 | string event_spec = operf_options::evts[i]; | ||
183 | + | ||
184 | +#if (defined(__powerpc__) || defined(__powerpc64__)) | ||
185 | + event_spec = _handle_powerpc_event_spec(event_spec); | ||
186 | +#endif | ||
187 | + | ||
188 | if (operf_options::callgraph) { | ||
189 | full_cmd += " --callgraph=1 "; | ||
190 | } | ||
191 | diff --git a/utils/ophelp.c b/utils/ophelp.c | ||
192 | index 53a5dde..63895c8 100644 | ||
193 | --- a/utils/ophelp.c | ||
194 | +++ b/utils/ophelp.c | ||
195 | @@ -652,6 +652,10 @@ int main(int argc, char const * argv[]) | ||
196 | case CPU_PPC64_POWER7: | ||
197 | case CPU_PPC64_IBM_COMPAT_V1: | ||
198 | event_doc = | ||
199 | + "When using operf, events may be specified without a '_GRP<n>' suffix.\n" | ||
200 | + "If _GRP<n> (i.e., group number) is not specified, one will be automatically\n" | ||
201 | + "selected for use by the profiler. OProfile post-processing tools will\n" | ||
202 | + "always show real event names that include the group number suffix.\n\n" | ||
203 | "Documentation for IBM POWER7 can be obtained at:\n" | ||
204 | "http://www.power.org/events/Power7/\n" | ||
205 | "No public performance monitoring doc available for older processors.\n"; | ||
206 | -- | ||
207 | 1.7.9.7 | ||
208 | |||
diff --git a/meta/recipes-kernel/oprofile/oprofile/0001-Change-configure-to-look-for-libpfm4-function-first-.patch b/meta/recipes-kernel/oprofile/oprofile/0001-Change-configure-to-look-for-libpfm4-function-first-.patch new file mode 100644 index 0000000000..eeec755cb9 --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofile/0001-Change-configure-to-look-for-libpfm4-function-first-.patch | |||
@@ -0,0 +1,49 @@ | |||
1 | Upstream-Status: Backport | ||
2 | |||
3 | From 414f4dba2d77f3014755aa58937efb22a4789e9f Mon Sep 17 00:00:00 2001 | ||
4 | From: Maynard Johnson <maynardj@us.ibm.com> | ||
5 | Date: Fri, 21 Dec 2012 08:27:37 -0600 | ||
6 | Subject: [PATCH] Change configure to look for libpfm4 function first; then | ||
7 | fallback to libpfm3 | ||
8 | |||
9 | This change only affects ppc64 architecture, since it's the only | ||
10 | architecture that uses libpfm to obtain the event hex code to pass | ||
11 | to perf_event_open. | ||
12 | |||
13 | There were bugs in libpfm3 pertaining to POWER7 event definitions that | ||
14 | have been fixed in libpfm4. So it's likely that some IBM POWER7 users | ||
15 | may want to install libpfm4 and build oprofile to link with it. For | ||
16 | example, if libpfm4 were installed in /usr/local, the user would invoke | ||
17 | oprofile's configure thusly: | ||
18 | |||
19 | LDFLAGS="-L/usr/local/lib64" CPPFLAGS="-I/usr/local/include" ./configure | ||
20 | |||
21 | But if the user happens to also have libpfm3 already installed in /usr, | ||
22 | then the current order of config tests would result in choosing the libpfm3 | ||
23 | library. This logic seems wrong. The configure checking should go from most | ||
24 | recent to older library versions. This patch changes the order of checking | ||
25 | so the libpfm4 library would be found first. | ||
26 | |||
27 | Signed-off-by: Maynard Johnson <maynardj@us.ibm.com> | ||
28 | --- | ||
29 | configure.ac | 4 ++-- | ||
30 | 1 file changed, 2 insertions(+), 2 deletions(-) | ||
31 | |||
32 | diff --git a/configure.ac b/configure.ac | ||
33 | index 3078393..a9b1ee4 100644 | ||
34 | --- a/configure.ac | ||
35 | +++ b/configure.ac | ||
36 | @@ -160,8 +160,8 @@ if test "$HAVE_PERF_EVENTS" = "1"; then | ||
37 | arch="`uname -m`" | ||
38 | if test "$arch" = "ppc64" || test "$arch" = "ppc"; then | ||
39 | AC_CHECK_HEADER(perfmon/pfmlib.h,,[AC_MSG_ERROR([pfmlib.h not found; usually provided in papi devel package])]) | ||
40 | - AC_CHECK_LIB(pfm,pfm_get_event_name, HAVE_LIBPFM3='1'; HAVE_LIBPFM='1', [ | ||
41 | - AC_CHECK_LIB(pfm,pfm_get_os_event_encoding, HAVE_LIBPFM3='0'; HAVE_LIBPFM='1', | ||
42 | + AC_CHECK_LIB(pfm,pfm_get_os_event_encoding, HAVE_LIBPFM3='0'; HAVE_LIBPFM='1', [ | ||
43 | + AC_CHECK_LIB(pfm, pfm_get_event_name, HAVE_LIBPFM3='1'; HAVE_LIBPFM='1', | ||
44 | [AC_MSG_ERROR([libpfm not found; usually provided in papi devel package])])]) | ||
45 | PFM_LIB="-lpfm" | ||
46 | AC_DEFINE_UNQUOTED(HAVE_LIBPFM3, $HAVE_LIBPFM3, [Define to 1 if using libpfm3; 0 if using newer libpfm]) | ||
47 | -- | ||
48 | 1.7.9.7 | ||
49 | |||
diff --git a/meta/recipes-kernel/oprofile/oprofile/0001-Fix-PPC64-specific-libpfm-usage-so-it-doesn-t-break-.patch b/meta/recipes-kernel/oprofile/oprofile/0001-Fix-PPC64-specific-libpfm-usage-so-it-doesn-t-break-.patch new file mode 100644 index 0000000000..6f5b1c00ee --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofile/0001-Fix-PPC64-specific-libpfm-usage-so-it-doesn-t-break-.patch | |||
@@ -0,0 +1,132 @@ | |||
1 | Upstream-Status: Accepted | ||
2 | |||
3 | From 8e36ad01ceb1257d05773b684dbe9358aecd3f71 Mon Sep 17 00:00:00 2001 | ||
4 | From: Maynard Johnson <maynardj@us.ibm.com> | ||
5 | Date: Tue, 26 Feb 2013 13:41:27 -0600 | ||
6 | Subject: [PATCH] Fix PPC64-specific libpfm usage so it doesn't break ppc32 | ||
7 | architecture | ||
8 | |||
9 | The configure check to determine whether we should use libpfm or not | ||
10 | is intended only for the ppc64 architecture, but was incorrectly | ||
11 | hitting on the ppc32 architecture, too. Not only that, but it was using | ||
12 | 'uname' which is not a good idea in cross-compile situtations. | ||
13 | |||
14 | Then, aside from that, we had several instances in the source code | ||
15 | of the following: | ||
16 | #if (defined(__powerpc__) || defined(__powerpc64__)) | ||
17 | which incorrectly included ppc32 architecutre also, when it was intended | ||
18 | for use as PPC64 architecture. | ||
19 | |||
20 | This patch fixes both errors. | ||
21 | |||
22 | Signed-off-by: Maynard Johnson <maynardj@us.ibm.com | ||
23 | --- | ||
24 | configure.ac | 5 ++--- | ||
25 | libperf_events/operf_utils.cpp | 4 ++-- | ||
26 | libperf_events/operf_utils.h | 6 ++++++ | ||
27 | pe_profiling/operf.cpp | 10 +++++----- | ||
28 | 4 files changed, 15 insertions(+), 10 deletions(-) | ||
29 | |||
30 | diff --git a/configure.ac b/configure.ac | ||
31 | index a9b1ee4..a0da98c 100644 | ||
32 | --- a/configure.ac | ||
33 | +++ b/configure.ac | ||
34 | @@ -154,11 +154,10 @@ else | ||
35 | fi | ||
36 | |||
37 | AC_DEFINE_UNQUOTED(HAVE_PERF_EVENTS, $HAVE_PERF_EVENTS, [Kernel support for perf_events exists]) | ||
38 | - | ||
39 | +AC_CANONICAL_HOST | ||
40 | if test "$HAVE_PERF_EVENTS" = "1"; then | ||
41 | PFM_LIB= | ||
42 | - arch="`uname -m`" | ||
43 | - if test "$arch" = "ppc64" || test "$arch" = "ppc"; then | ||
44 | + if test "$host_cpu" = "powerpc64"; then | ||
45 | AC_CHECK_HEADER(perfmon/pfmlib.h,,[AC_MSG_ERROR([pfmlib.h not found; usually provided in papi devel package])]) | ||
46 | AC_CHECK_LIB(pfm,pfm_get_os_event_encoding, HAVE_LIBPFM3='0'; HAVE_LIBPFM='1', [ | ||
47 | AC_CHECK_LIB(pfm, pfm_get_event_name, HAVE_LIBPFM3='1'; HAVE_LIBPFM='1', | ||
48 | diff --git a/libperf_events/operf_utils.cpp b/libperf_events/operf_utils.cpp | ||
49 | index da964fd..a17200b 100644 | ||
50 | --- a/libperf_events/operf_utils.cpp | ||
51 | +++ b/libperf_events/operf_utils.cpp | ||
52 | @@ -83,7 +83,7 @@ static event_t comm_event; | ||
53 | * the following method is to map the operf-record event value to a value that | ||
54 | * opreport can understand. | ||
55 | */ | ||
56 | -#if (defined(__powerpc__) || defined(__powerpc64__)) | ||
57 | +#if PPC64_ARCH | ||
58 | #define NIL_CODE ~0U | ||
59 | |||
60 | #if HAVE_LIBPFM3 | ||
61 | @@ -716,7 +716,7 @@ static void __handle_sample_event(event_t * event, u64 sample_type) | ||
62 | } else if (event->header.misc == PERF_RECORD_MISC_USER) { | ||
63 | in_kernel = false; | ||
64 | } | ||
65 | -#if (defined(__powerpc__) || defined(__powerpc64__)) | ||
66 | +#if PPC64_ARCH | ||
67 | else if (event->header.misc == PERF_RECORD_MISC_HYPERVISOR) { | ||
68 | #define MAX_HYPERVISOR_ADDRESS 0xfffffffULL | ||
69 | if (data.ip > MAX_HYPERVISOR_ADDRESS) { | ||
70 | diff --git a/libperf_events/operf_utils.h b/libperf_events/operf_utils.h | ||
71 | index 2df00b7..ddf05ed 100644 | ||
72 | --- a/libperf_events/operf_utils.h | ||
73 | +++ b/libperf_events/operf_utils.h | ||
74 | @@ -45,6 +45,12 @@ extern bool throttled; | ||
75 | #define MMAP_WINDOW_SZ (32 * 1024 * 1024ULL) | ||
76 | #endif | ||
77 | |||
78 | +/* A macro to be used for ppc64 architecture-specific code. The '__powerpc__' macro | ||
79 | + * is defined for both ppc64 and ppc32 architectures, so we must further qualify by | ||
80 | + * including the 'HAVE_LIBPFM' macro, since that macro will be defined only for ppc64. | ||
81 | + */ | ||
82 | +#define PPC64_ARCH (HAVE_LIBPFM) && ((defined(__powerpc__) || defined(__powerpc64__))) | ||
83 | + | ||
84 | extern unsigned int op_nr_counters; | ||
85 | |||
86 | static inline size_t align_64bit(u64 x) | ||
87 | diff --git a/pe_profiling/operf.cpp b/pe_profiling/operf.cpp | ||
88 | index e7c2eab..e1190c2 100644 | ||
89 | --- a/pe_profiling/operf.cpp | ||
90 | +++ b/pe_profiling/operf.cpp | ||
91 | @@ -1177,7 +1177,7 @@ static void _get_event_code(operf_event_t * event) | ||
92 | event->evt_code = config; | ||
93 | } | ||
94 | |||
95 | -#if (defined(__powerpc__) || defined(__powerpc64__)) | ||
96 | +#if PPC64_ARCH | ||
97 | /* All ppc64 events (except CYCLES) have a _GRP<n> suffix. This is | ||
98 | * because the legacy opcontrol profiler can only profile events in | ||
99 | * the same group (i.e., having the same _GRP<n> suffix). But operf | ||
100 | @@ -1287,7 +1287,7 @@ static void _process_events_list(void) | ||
101 | string full_cmd = cmd; | ||
102 | string event_spec = operf_options::evts[i]; | ||
103 | |||
104 | -#if (defined(__powerpc__) || defined(__powerpc64__)) | ||
105 | +#if PPC64_ARCH | ||
106 | event_spec = _handle_powerpc_event_spec(event_spec); | ||
107 | #endif | ||
108 | |||
109 | @@ -1357,9 +1357,9 @@ static void _process_events_list(void) | ||
110 | _get_event_code(&event); | ||
111 | events.push_back(event); | ||
112 | } | ||
113 | -#if (defined(__powerpc__) || defined(__powerpc64__)) | ||
114 | +#if PPC64_ARCH | ||
115 | { | ||
116 | - /* This section of code is for architectures such as ppc[64] for which | ||
117 | + /* This section of code is soley for the ppc64 architecture for which | ||
118 | * the oprofile event code needs to be converted to the appropriate event | ||
119 | * code to pass to the perf_event_open syscall. | ||
120 | */ | ||
121 | @@ -1404,7 +1404,7 @@ static void get_default_event(void) | ||
122 | _get_event_code(&dft_evt); | ||
123 | events.push_back(dft_evt); | ||
124 | |||
125 | -#if (defined(__powerpc__) || defined(__powerpc64__)) | ||
126 | +#if PPC64_ARCH | ||
127 | { | ||
128 | /* This section of code is for architectures such as ppc[64] for which | ||
129 | * the oprofile event code needs to be converted to the appropriate event | ||
130 | -- | ||
131 | 1.7.9.7 | ||
132 | |||
diff --git a/meta/recipes-kernel/oprofile/oprofile/0001-Fix-up-configure-to-handle-architectures-that-do-not.patch b/meta/recipes-kernel/oprofile/oprofile/0001-Fix-up-configure-to-handle-architectures-that-do-not.patch new file mode 100644 index 0000000000..5e6d5de355 --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofile/0001-Fix-up-configure-to-handle-architectures-that-do-not.patch | |||
@@ -0,0 +1,163 @@ | |||
1 | Upstream-Status: Backport | ||
2 | |||
3 | From ca6d916a6f8f0f8abbb4c9b6a97dd1a1615bb124 Mon Sep 17 00:00:00 2001 | ||
4 | From: Maynard Johnson <maynardj@us.ibm.com> | ||
5 | Date: Wed, 5 Dec 2012 10:16:35 -0600 | ||
6 | Subject: [PATCH] Fix up configure to handle architectures that do not | ||
7 | implement perf_event_open | ||
8 | |||
9 | This patch fixes the following problems: | ||
10 | |||
11 | 1) The configure script allows the user to pass a location to kernel | ||
12 | headers (via --with-kernel option) such that, even if the running | ||
13 | kernel does not have perf_events support, it may be possible to | ||
14 | build operf (e.g., in cross-compile environments). But the message | ||
15 | 'This kernel does not have perf_events support; falling back to legacy | ||
16 | oprofile' was being displayed inappropriately in such cases. This | ||
17 | patch changes the configure script so that the "falling back to | ||
18 | legacy oprofile" message will only be displayed if we're running | ||
19 | on a kernel that does not have perf_events support AND the user | ||
20 | did not pass specify the "--with-kernel" option. | ||
21 | |||
22 | 2) Some architectures don't even implement the perf_event_open syscall, so the | ||
23 | configure script must do more than checking kernel version and whether or not | ||
24 | perf_event.h is present in order to decide if perf_events is supported. | ||
25 | This patch provides that extra capability. | ||
26 | |||
27 | These problems were reported by Tony Jones <tonyj@suse.com>. | ||
28 | |||
29 | Signed-off-by: Maynard Johnson <maynardj@us.ibm.com> | ||
30 | --- | ||
31 | configure.ac | 74 +++++++++++++++++++++++++++++----------- | ||
32 | utils/op_perf_events_checker.c | 6 ++-- | ||
33 | 2 files changed, 58 insertions(+), 22 deletions(-) | ||
34 | |||
35 | diff --git a/configure.ac b/configure.ac | ||
36 | index 5c3d13d..89336ee 100644 | ||
37 | --- a/configure.ac | ||
38 | +++ b/configure.ac | ||
39 | @@ -70,34 +70,66 @@ KERNELDIR=$withval) | ||
40 | |||
41 | |||
42 | dnl Check kernel version for perf_events supported | ||
43 | -AC_MSG_CHECKING([kernel version supports perf_events]) | ||
44 | if test "$KERNELDIR" != ""; then | ||
45 | KINC="$KERNELDIR/include" | ||
46 | -fi | ||
47 | -AX_KERNEL_VERSION(2, 6, 31, <=, kernel_has_perf_events_support="yes", | ||
48 | -kernel_has_perf_events_support="no") | ||
49 | - | ||
50 | -if test "$kernel_has_perf_events_support" = "no"; then | ||
51 | - AC_MSG_RESULT([This kernel does not have perf_events support; falling back to legacy oprofile]) | ||
52 | + PERF_EVENT_FLAGS=" -I$KERNELDIR/include" | ||
53 | + AC_SUBST(PERF_EVENT_FLAGS) | ||
54 | + PERF_EVENT_H="$KERNELDIR/include/linux/perf_event.h" | ||
55 | else | ||
56 | - AC_MSG_RESULT([This kernel has perf_events support]) | ||
57 | + PERF_EVENT_H="/usr/include/linux/perf_event.h" | ||
58 | fi | ||
59 | |||
60 | -if test "$KERNELDIR" == ""; then | ||
61 | - PERF_EVENT_H="/usr/include/linux/perf_event.h" | ||
62 | +PERF_EVENT_H_EXISTS="no" | ||
63 | +kernel_may_have_perf_events_support="no" | ||
64 | +AX_KERNEL_VERSION(2, 6, 31, <=, kernel_may_have_perf_events_support="yes", | ||
65 | +kernel_has_perf_events_support="no") | ||
66 | + | ||
67 | +dnl The AX_KERNEL_VERSION macro may return kernel_may_have_perf_events_support="yes", | ||
68 | +dnl indicating a partial answer. Some architectures do not implement the Performance | ||
69 | +dnl Events Kernel Subsystem even with kernel versions > 2.6.31 -- i.e., not even | ||
70 | +dnl implementing the perf_event_open syscall to return ENOSYS. So the check below | ||
71 | +dnl will identify and handle such situations. | ||
72 | + | ||
73 | +if test "$kernel_may_have_perf_events_support" = "yes"; then | ||
74 | + AC_CHECK_HEADER($PERF_EVENT_H,PERF_EVENT_H_EXISTS="yes") | ||
75 | + AC_MSG_CHECKING([kernel supports perf_events]) | ||
76 | + if test "$PERF_EVENT_H_EXISTS" = "yes"; then | ||
77 | + rm -f test-for-PERF_EVENT_OPEN | ||
78 | + AC_LANG_CONFTEST( | ||
79 | + [AC_LANG_PROGRAM([[#include <linux/perf_event.h> | ||
80 | + #include <asm/unistd.h> | ||
81 | + #include <sys/types.h> | ||
82 | + #include <string.h> | ||
83 | + ]], | ||
84 | + [[struct perf_event_attr attr; | ||
85 | + pid_t pid; | ||
86 | + memset(&attr, 0, sizeof(attr)); | ||
87 | + attr.size = sizeof(attr); | ||
88 | + attr.sample_type = PERF_SAMPLE_IP; | ||
89 | + pid = getpid(); | ||
90 | + syscall(__NR_perf_event_open, &attr, pid, 0, -1, 0); | ||
91 | + ]]) | ||
92 | + ]) | ||
93 | + $CC conftest.$ac_ext $CFLAGS $LDFLAGS $LIBS $PERF_EVENT_FLAGS -o test-for-PERF_EVENT_OPEN > /dev/null 2>&1 | ||
94 | + if test -f test-for-PERF_EVENT_OPEN; then | ||
95 | + kernel_has_perf_events_support="yes" | ||
96 | + AC_MSG_RESULT(yes) | ||
97 | + else | ||
98 | + AC_MSG_RESULT(no) | ||
99 | + kernel_has_perf_events_support="no" | ||
100 | + fi | ||
101 | + else | ||
102 | + AC_MSG_RESULT(unknown -- perf_event.h not found) | ||
103 | + fi | ||
104 | else | ||
105 | - PERF_EVENT_H="$KERNELDIR/include/linux/perf_event.h" | ||
106 | + AC_MSG_RESULT(kernel supports perf_events... no) | ||
107 | + kernel_has_perf_events_support="no" | ||
108 | fi | ||
109 | -AC_CHECK_HEADER($PERF_EVENT_H,PERF_EVENT_H_EXISTS="yes") | ||
110 | -AM_CONDITIONAL(BUILD_FOR_PERF_EVENT, test -n "$PERF_EVENT_H_EXISTS") | ||
111 | -if test "$PERF_EVENT_H_EXISTS" = "yes"; then | ||
112 | - HAVE_PERF_EVENTS='1' | ||
113 | |||
114 | - if test "$KERNELDIR" != ""; then | ||
115 | - PERF_EVENT_FLAGS=" -I$KERNELDIR/include" | ||
116 | - AC_SUBST(PERF_EVENT_FLAGS) | ||
117 | - fi | ||
118 | +AM_CONDITIONAL(BUILD_FOR_PERF_EVENT, test "$kernel_has_perf_events_support" = "yes") | ||
119 | |||
120 | +if test "$kernel_has_perf_events_support" = "yes"; then | ||
121 | + HAVE_PERF_EVENTS='1' | ||
122 | AC_MSG_CHECKING([whether PERF_RECORD_MISC_GUEST_KERNEL is defined in perf_event.h]) | ||
123 | rm -f test-for-PERF_GUEST | ||
124 | AC_LANG_CONFTEST( | ||
125 | @@ -117,7 +149,9 @@ if test "$PERF_EVENT_H_EXISTS" = "yes"; then | ||
126 | rm -f test-for-PERF_GUEST* | ||
127 | else | ||
128 | HAVE_PERF_EVENTS='0' | ||
129 | + AC_MSG_RESULT([No perf_events support available; falling back to legacy oprofile]) | ||
130 | fi | ||
131 | + | ||
132 | AC_DEFINE_UNQUOTED(HAVE_PERF_EVENTS, $HAVE_PERF_EVENTS, [Kernel support for perf_events exists]) | ||
133 | |||
134 | if test "$HAVE_PERF_EVENTS" = "1"; then | ||
135 | @@ -433,7 +467,7 @@ elif test "`getent passwd oprofile 2>/dev/null`" == "" || \ | ||
136 | fi | ||
137 | fi | ||
138 | |||
139 | -if test "$PERF_EVENT_H_EXISTS" != "yes" && test "$kernel_has_perf_events_support" = "yes"; then | ||
140 | +if test "$PERF_EVENT_H_EXISTS" != "yes" && test "$kernel_may_have_perf_events_support" = "yes"; then | ||
141 | echo "Warning: perf_event.h not found. Either install the kernel headers package or" | ||
142 | echo "use the --with-kernel option if you want the non-root, single application" | ||
143 | echo "profiling support provided by operf." | ||
144 | diff --git a/utils/op_perf_events_checker.c b/utils/op_perf_events_checker.c | ||
145 | index 519cafa..74a410e 100644 | ||
146 | --- a/utils/op_perf_events_checker.c | ||
147 | +++ b/utils/op_perf_events_checker.c | ||
148 | @@ -49,8 +49,10 @@ int main(int argc, char **argv) | ||
149 | } | ||
150 | |||
151 | #if HAVE_PERF_EVENTS | ||
152 | - /* If perf_events syscall is not implemented, the syscall below will fail | ||
153 | - * with ENOSYS (38). If implemented, but the processor type on which this | ||
154 | + /* Even if the perf_event_open syscall is implemented, the architecture may still | ||
155 | + * not provide a full implementation of the perf_events subsystem, in which case, | ||
156 | + * the syscall below will fail with ENOSYS (38). If the perf_events subsystem is | ||
157 | + * implemented for the architecture, but the processor type on which this | ||
158 | * program is running is not supported by perf_events, the syscall returns | ||
159 | * ENOENT (2). | ||
160 | */ | ||
161 | -- | ||
162 | 1.7.9.7 | ||
163 | |||
diff --git a/meta/recipes-kernel/oprofile/oprofile/0001-Handle-early-perf_events-kernel-without-PERF_RECORD_.patch b/meta/recipes-kernel/oprofile/oprofile/0001-Handle-early-perf_events-kernel-without-PERF_RECORD_.patch new file mode 100644 index 0000000000..894e99aec8 --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofile/0001-Handle-early-perf_events-kernel-without-PERF_RECORD_.patch | |||
@@ -0,0 +1,107 @@ | |||
1 | Upstream-Status: Backport | ||
2 | |||
3 | From dbe24f5f0d98b1fe5517d2b137b4c59766e536ad Mon Sep 17 00:00:00 2001 | ||
4 | From: Maynard Johnson <maynardj@us.ibm.com> | ||
5 | Date: Mon, 19 Nov 2012 15:16:37 -0600 | ||
6 | Subject: [PATCH] Handle early perf_events kernel without | ||
7 | PERF_RECORD_MISC_GUEST* macros | ||
8 | |||
9 | In very early versions of perf_events kernel subsystem, the | ||
10 | PERF_RECORD_MISC_GUEST_KERNEL and PERF_RECORD_MISC_GUEST_USER | ||
11 | macros (in perf_event.h) were not yet defined. This patch adds | ||
12 | a configure check to determine when it's OK for source code to refer | ||
13 | to those macros. | ||
14 | |||
15 | This patch also does some minor cleanup of the configure script | ||
16 | help and warning messages relating to the --with-kernel option. | ||
17 | |||
18 | Signed-off-by: Maynard Johnson <maynardj@us.ibm.com> | ||
19 | --- | ||
20 | configure.ac | 32 ++++++++++++++++++++++++++------ | ||
21 | libperf_events/operf_utils.cpp | 2 ++ | ||
22 | 2 files changed, 28 insertions(+), 6 deletions(-) | ||
23 | |||
24 | diff --git a/configure.ac b/configure.ac | ||
25 | index 7449854..18d1169 100644 | ||
26 | --- a/configure.ac | ||
27 | +++ b/configure.ac | ||
28 | @@ -60,12 +60,12 @@ test "$LD" || AC_ERROR(ld not found) | ||
29 | |||
30 | # --with-kernel for cross compilation | ||
31 | AC_ARG_WITH(kernel, | ||
32 | -[AS_HELP_STRING([--with-kernel=dir], [Path to kernel include directory (...include/linux/perf_event.h) to use. | ||
33 | +[AS_HELP_STRING([--with-kernel=dir], [Path to kernel include directory (e.g. /tmp/linux-xyz) to use. | ||
34 | If this option is not specified, configure will look for kernel header files in the usual installation location | ||
35 | -for a kernel-headers package -- /usr/include. Use this option in cross-compile enviroments | ||
36 | +for a kernel-headers package -- /usr. Use this option in cross-compile enviroments | ||
37 | or in situations where the host system does not support perf_events but you wish to build binaries | ||
38 | -for a target system that does support perf_events. Because of OProfile's use of syscalls, be sure that the | ||
39 | -kernel headers used match the architecture of the intended target system.])], | ||
40 | +for a target system that does support perf_events. Because of OProfile's use of syscalls, | ||
41 | +kernel headers used during build must match the architecture of the intended target system.])], | ||
42 | KERNELDIR=$withval) | ||
43 | |||
44 | |||
45 | @@ -92,10 +92,29 @@ AC_CHECK_HEADER($PERF_EVENT_H,PERF_EVENT_H_EXISTS="yes") | ||
46 | AM_CONDITIONAL(BUILD_FOR_PERF_EVENT, test -n "$PERF_EVENT_H_EXISTS") | ||
47 | if test "$PERF_EVENT_H_EXISTS" = "yes"; then | ||
48 | HAVE_PERF_EVENTS='1' | ||
49 | + | ||
50 | if test "$KERNELDIR" != ""; then | ||
51 | PERF_EVENT_FLAGS=" -I$KERNELDIR/include" | ||
52 | AC_SUBST(PERF_EVENT_FLAGS) | ||
53 | fi | ||
54 | + | ||
55 | + AC_MSG_CHECKING([whether PERF_RECORD_MISC_GUEST_KERNEL is defined in perf_event.h]) | ||
56 | + rm -f test-for-PERF_GUEST | ||
57 | + AC_LANG_CONFTEST( | ||
58 | + [AC_LANG_PROGRAM([[#include <linux/perf_event.h>]], | ||
59 | + [[unsigned int pr_guest_kern = PERF_RECORD_MISC_GUEST_KERNEL; | ||
60 | + unsigned int pr_guest_user = PERF_RECORD_MISC_GUEST_USER;]]) | ||
61 | + ]) | ||
62 | + $CC conftest.$ac_ext $CFLAGS $LDFLAGS $LIBS $PERF_EVENT_FLAGS -o test-for-PERF_GUEST > /dev/null 2>&1 | ||
63 | + if test -f test-for-PERF_GUEST; then | ||
64 | + echo "yes" | ||
65 | + HAVE_PERF_GUEST_MACROS='1' | ||
66 | + else | ||
67 | + echo "no" | ||
68 | + HAVE_PERF_GUEST_MACROS='0' | ||
69 | + fi | ||
70 | + AC_DEFINE_UNQUOTED(HAVE_PERF_GUEST_MACROS, $HAVE_PERF_GUEST_MACROS, [PERF_RECORD_MISC_GUEST_KERNEL is defined in perf_event.h]) | ||
71 | + rm -f test-for-PERF_GUEST* | ||
72 | else | ||
73 | HAVE_PERF_EVENTS='0' | ||
74 | fi | ||
75 | @@ -416,7 +435,8 @@ elif test "`getent passwd oprofile 2>/dev/null`" == "" || \ | ||
76 | fi | ||
77 | |||
78 | if test "$PERF_EVENT_H_EXISTS" != "yes" && test "$kernel_has_perf_events_support" = "yes"; then | ||
79 | - echo "Warning: perf_event.h not found. Please install the kernel headers package if you" | ||
80 | - echo " want non-root support built into OProfile." | ||
81 | + echo "Warning: perf_event.h not found. Either install the kernel headers package or" | ||
82 | + echo "use the --with-kernel option if you want the non-root, single application" | ||
83 | + echo "profiling support provided by operf." | ||
84 | fi | ||
85 | |||
86 | diff --git a/libperf_events/operf_utils.cpp b/libperf_events/operf_utils.cpp | ||
87 | index 06cd566..470cfba 100644 | ||
88 | --- a/libperf_events/operf_utils.cpp | ||
89 | +++ b/libperf_events/operf_utils.cpp | ||
90 | @@ -732,12 +732,14 @@ static void __handle_sample_event(event_t * event, u64 sample_type) | ||
91 | case PERF_RECORD_MISC_HYPERVISOR: | ||
92 | domain = "hypervisor"; | ||
93 | break; | ||
94 | +#if HAVE_PERF_GUEST_MACROS | ||
95 | case PERF_RECORD_MISC_GUEST_KERNEL: | ||
96 | domain = "guest OS"; | ||
97 | break; | ||
98 | case PERF_RECORD_MISC_GUEST_USER: | ||
99 | domain = "guest user"; | ||
100 | break; | ||
101 | +#endif | ||
102 | default: | ||
103 | domain = "unknown"; | ||
104 | break; | ||
105 | -- | ||
106 | 1.7.9.7 | ||
107 | |||
diff --git a/meta/recipes-kernel/oprofile/oprofile/0001-OProfile-doesn-t-build-for-32-bit-ppc-the-operf_util.patch b/meta/recipes-kernel/oprofile/oprofile/0001-OProfile-doesn-t-build-for-32-bit-ppc-the-operf_util.patch new file mode 100644 index 0000000000..0f609df0e2 --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofile/0001-OProfile-doesn-t-build-for-32-bit-ppc-the-operf_util.patch | |||
@@ -0,0 +1,32 @@ | |||
1 | Upstream-Status: Backport | ||
2 | |||
3 | From fa889ea74b6b931e241a8cd57e90edc23cd7ab03 Mon Sep 17 00:00:00 2001 | ||
4 | From: William Cohen <wcohen@redhat.com> | ||
5 | Date: Mon, 15 Oct 2012 15:09:55 -0500 | ||
6 | Subject: [PATCH] OProfile doesn't build for 32-bit ppc; the operf_utils.cpp | ||
7 | compile fails. Need to be able to build the 32-bit ppc | ||
8 | version of oprofile to provide the 32-bit ppc java support | ||
9 | libraries. The configure only handles the case of ppc64 | ||
10 | with perf support. | ||
11 | |||
12 | Signed-off-by: William Cohen <wcohen@redhat.com> | ||
13 | --- | ||
14 | configure.ac | 2 +- | ||
15 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
16 | |||
17 | diff --git a/configure.ac b/configure.ac | ||
18 | index b739133..7449854 100644 | ||
19 | --- a/configure.ac | ||
20 | +++ b/configure.ac | ||
21 | @@ -104,7 +104,7 @@ AC_DEFINE_UNQUOTED(HAVE_PERF_EVENTS, $HAVE_PERF_EVENTS, [Kernel support for perf | ||
22 | if test "$HAVE_PERF_EVENTS" = "1"; then | ||
23 | PFM_LIB= | ||
24 | arch="`uname -m`" | ||
25 | - if test "$arch" = "ppc64"; then | ||
26 | + if test "$arch" = "ppc64" || test "$arch" = "ppc"; then | ||
27 | AC_CHECK_HEADER(perfmon/pfmlib.h,,[AC_MSG_ERROR([pfmlib.h not found; usually provided in papi devel package])]) | ||
28 | AC_CHECK_LIB(pfm,pfm_get_event_name, HAVE_LIBPFM3='1'; HAVE_LIBPFM='1', [ | ||
29 | AC_CHECK_LIB(pfm,pfm_get_os_event_encoding, HAVE_LIBPFM3='0'; HAVE_LIBPFM='1', | ||
30 | -- | ||
31 | 1.7.9.7 | ||
32 | |||
diff --git a/meta/recipes-kernel/oprofile/oprofile/0001-ophelp-lists-events-Fix-doc-URL-for-ppc64-arch.patch b/meta/recipes-kernel/oprofile/oprofile/0001-ophelp-lists-events-Fix-doc-URL-for-ppc64-arch.patch new file mode 100644 index 0000000000..b155cacd4a --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofile/0001-ophelp-lists-events-Fix-doc-URL-for-ppc64-arch.patch | |||
@@ -0,0 +1,36 @@ | |||
1 | Upstream-Status: Accepted | ||
2 | |||
3 | From 735d9eb0322b34b3d26302a1dac173100d718d35 Mon Sep 17 00:00:00 2001 | ||
4 | From: Maynard Johnson <maynardj@us.ibm.com> | ||
5 | Date: Thu, 10 Jan 2013 14:24:26 -0600 | ||
6 | Subject: [PATCH] ophelp lists events: Fix doc URL for ppc64 arch | ||
7 | |||
8 | When ophelp is used to list available events, it displays | ||
9 | some help text before the event list to direct the user | ||
10 | where to find more info. For the ppc64 architecture, a | ||
11 | stale URL was listed. This patch fixes that URL. | ||
12 | |||
13 | Signed-off-by: Maynard Johnson <maynardj@us.ibm.com> | ||
14 | --- | ||
15 | utils/ophelp.c | 5 +++-- | ||
16 | 1 file changed, 3 insertions(+), 2 deletions(-) | ||
17 | |||
18 | diff --git a/utils/ophelp.c b/utils/ophelp.c | ||
19 | index f48697b..827f2d0 100644 | ||
20 | --- a/utils/ophelp.c | ||
21 | +++ b/utils/ophelp.c | ||
22 | @@ -652,8 +652,9 @@ int main(int argc, char const * argv[]) | ||
23 | case CPU_PPC64_POWER7: | ||
24 | case CPU_PPC64_IBM_COMPAT_V1: | ||
25 | event_doc = | ||
26 | - "Obtain PowerPC64 processor documentation at:\n" | ||
27 | - "http://www-306.ibm.com/chips/techlib/techlib.nsf/productfamilies/PowerPC\n"; | ||
28 | + "Documentation for IBM POWER7 can be obtained at:\n" | ||
29 | + "http://www.power.org/events/Power7/\n" | ||
30 | + "No public performance monitoring doc available for older processors.\n"; | ||
31 | break; | ||
32 | |||
33 | case CPU_PPC64_CELL: | ||
34 | -- | ||
35 | 1.7.9.7 | ||
36 | |||
diff --git a/meta/recipes-kernel/oprofile/oprofile/acinclude.m4 b/meta/recipes-kernel/oprofile/oprofile/acinclude.m4 new file mode 100644 index 0000000000..95ecd91b5e --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofile/acinclude.m4 | |||
@@ -0,0 +1,581 @@ | |||
1 | dnl AX_KERNEL_OPTION(option, action-if-found, action-if-not-found) | ||
2 | dnl see if autoconf.h defines the option | ||
3 | AC_DEFUN([AX_KERNEL_OPTION], [ | ||
4 | SAVE_CFLAGS=$CFLAGS | ||
5 | CFLAGS="-I$KINC -O2 -D__KERNEL__" | ||
6 | AC_TRY_COMPILE( [#include <linux/config.h>], | ||
7 | [ | ||
8 | #ifndef $1 | ||
9 | break_me_hard(\\\); | ||
10 | #endif | ||
11 | ],[$2],[$3],) | ||
12 | CFLAGS=$SAVE_CFLAGS | ||
13 | ]) | ||
14 | |||
15 | dnl Handle the 2.4 module inside module/ | ||
16 | AC_DEFUN([AX_CONFIG_MODULE], | ||
17 | [ | ||
18 | if test ! -f $KINC/linux/autoconf.h; then | ||
19 | AC_MSG_ERROR([no suitably configured kernel include tree found]) | ||
20 | fi | ||
21 | |||
22 | dnl --- Get Linux kernel version and compile parameters --- | ||
23 | |||
24 | AC_SUBST(KVERS) | ||
25 | AC_MSG_CHECKING([for kernel version]) | ||
26 | dnl it's like this to handle mandrake's fubar version.h - bug #471448 | ||
27 | eval KVERS=`gcc -I$KINC -E -dM $KINC/linux/version.h | grep -w UTS_RELEASE | awk '{print $[]3}'` | ||
28 | AC_MSG_RESULT([$KVERS]) | ||
29 | case "$KVERS" in | ||
30 | 2.2.*|2.4.*) ;; | ||
31 | *) AC_MSG_ERROR([Unsupported kernel version]) | ||
32 | esac | ||
33 | |||
34 | dnl Check for the minimal kernel version supported | ||
35 | AC_MSG_CHECKING([kernel version]) | ||
36 | AX_KERNEL_VERSION(2, 2, 10, <=, AC_MSG_RESULT([ok]), AC_MSG_ERROR([check html documentation install section])) | ||
37 | |||
38 | dnl linux/spinlock.h added at some point in past | ||
39 | AC_MSG_CHECKING([for $KINC/linux/spinlock.h]) | ||
40 | if test -f $KINC/linux/spinlock.h; then | ||
41 | EXTRA_CFLAGS_MODULE="$EXTRA_CFLAGS_MODULE -DHAVE_LINUX_SPINLOCK_HEADER" | ||
42 | AC_MSG_RESULT([yes]) | ||
43 | else | ||
44 | AC_MSG_RESULT([no]) | ||
45 | fi | ||
46 | |||
47 | AC_MSG_CHECKING([for rtc_lock]) | ||
48 | gcc -I$KINC -E $KINC/linux/mc146818rtc.h | grep rtc_lock >/dev/null | ||
49 | if test "$?" -eq 0; then | ||
50 | EXTRA_CFLAGS_MODULE="$EXTRA_CFLAGS_MODULE -DRTC_LOCK" | ||
51 | AC_MSG_RESULT([yes]) | ||
52 | else | ||
53 | AC_MSG_RESULT([no]) | ||
54 | fi | ||
55 | |||
56 | arch="unknown" | ||
57 | AC_MSG_CHECKING(for x86-64 architecture) | ||
58 | AX_KERNEL_OPTION(CONFIG_X86_64, x8664=1, x8664=0) | ||
59 | AX_MSG_RESULT_YN($x8664) | ||
60 | BUILD_HAMMER=no | ||
61 | if test "$x8664" -eq 1; then | ||
62 | arch="x86" | ||
63 | BUILD_HAMMER=yes | ||
64 | else | ||
65 | AC_MSG_CHECKING(for x86 architecture) | ||
66 | AX_KERNEL_OPTION(CONFIG_X86, x86=1, x86=0) | ||
67 | AX_KERNEL_OPTION(CONFIG_X86_WP_WORKS_OK, x86=1, x86=$x86) | ||
68 | AX_MSG_RESULT_YN($x86) | ||
69 | test "$x86" = 1 && arch="x86" | ||
70 | |||
71 | if test "$arch" = "unknown"; then | ||
72 | AC_MSG_CHECKING(for ia64 architecture) | ||
73 | AX_KERNEL_OPTION(CONFIG_IA64, ia64=1, ia64=0) | ||
74 | AX_MSG_RESULT_YN($ia64) | ||
75 | test "$ia64" = 1 && arch="ia64" | ||
76 | fi | ||
77 | |||
78 | fi | ||
79 | AC_SUBST(BUILD_HAMMER) | ||
80 | |||
81 | test "$arch" = "unknown" && AC_MSG_ERROR(Unsupported architecture) | ||
82 | |||
83 | dnl check to see if kernel verion appropriate for arch | ||
84 | AC_MSG_CHECKING(arch/kernel version combination) | ||
85 | case "$arch" in | ||
86 | ia64) | ||
87 | AX_KERNEL_VERSION(2, 4, 18, <, AC_MSG_RESULT([ok]), | ||
88 | AC_MSG_ERROR([unsupported arch/kernel])) ;; | ||
89 | *) AC_MSG_RESULT([ok]) | ||
90 | esac | ||
91 | |||
92 | dnl for now we do not support PREEMPT patch | ||
93 | AC_MSG_CHECKING([for preempt patch]) | ||
94 | AX_KERNEL_OPTION(CONFIG_PREEMPT,preempt=1,preempt=0) | ||
95 | AX_MSG_RESULT_YN([$preempt]) | ||
96 | test "$preempt" = 0 || AC_MSG_ERROR([unsupported kernel configuration : CONFIG_PREEMPT]) | ||
97 | |||
98 | AC_SUBST(KINC) | ||
99 | |||
100 | MODINSTALLDIR=/lib/modules/$KVERS | ||
101 | |||
102 | OPROFILE_MODULE_ARCH=$arch | ||
103 | AC_SUBST(OPROFILE_MODULE_ARCH) | ||
104 | ] | ||
105 | ) | ||
106 | |||
107 | dnl AX_MSG_RESULT_YN(a) | ||
108 | dnl results "yes" iff a==1, "no" else | ||
109 | AC_DEFUN([AX_MSG_RESULT_YN], [x=no | ||
110 | test "x$1" = "x1" && x=yes | ||
111 | AC_MSG_RESULT($x)]) | ||
112 | |||
113 | dnl AX_MALLOC_ATTRIBUTE - see if gcc will take __attribute__((malloc)) | ||
114 | AC_DEFUN([AX_MALLOC_ATTRIBUTE], | ||
115 | [ | ||
116 | AC_MSG_CHECKING([whether malloc attribute is understood]) | ||
117 | SAVE_CFLAGS=$CFLAGS | ||
118 | CFLAGS="-Werror $CFLAGS" | ||
119 | AC_TRY_COMPILE(,[ | ||
120 | void monkey() __attribute__((malloc)); | ||
121 | ],AC_MSG_RESULT([yes]); AC_DEFINE(MALLOC_ATTRIBUTE_OK, 1, [whether malloc attribute is understood]), AC_MSG_RESULT([no])) | ||
122 | CFLAGS=$SAVE_CFLAGS | ||
123 | ] | ||
124 | ) | ||
125 | |||
126 | dnl builtin_expect is used in module we can't add that in config.h | ||
127 | AC_DEFUN([AX_BUILTIN_EXPECT], | ||
128 | [ | ||
129 | AC_MSG_CHECKING([whether __builtin_expect is understood]) | ||
130 | SAVE_CFLAGS=$CFLAGS | ||
131 | CFLAGS="-Werror $CFLAGS" | ||
132 | AC_TRY_LINK(,[ | ||
133 | int i; | ||
134 | if (__builtin_expect(i, 0)) { } | ||
135 | ], | ||
136 | AC_MSG_RESULT([yes]); EXTRA_CFLAGS_MODULE="$EXTRA_CFLAGS_MODULE -DEXPECT_OK", | ||
137 | AC_MSG_RESULT([no]);) | ||
138 | CFLAGS=$SAVE_CFLAGS | ||
139 | ] | ||
140 | ) | ||
141 | |||
142 | dnl AX_EXTRA_DIRS - Let user specify extra dirs for include/libs | ||
143 | AC_DEFUN([AX_EXTRA_DIRS], | ||
144 | [ | ||
145 | AC_ARG_WITH(extra-includes, | ||
146 | [ --with-extra-includes=DIR add extra include paths], | ||
147 | use_extra_includes="$withval", | ||
148 | use_extra_includes=NO | ||
149 | ) | ||
150 | if test -n "$use_extra_includes" && \ | ||
151 | test "$use_extra_includes" != "NO"; then | ||
152 | ac_save_ifs=$IFS | ||
153 | IFS=':' | ||
154 | for dir in $use_extra_includes; do | ||
155 | extra_includes="$extra_includes -I$dir" | ||
156 | done | ||
157 | IFS=$ac_save_ifs | ||
158 | CPPFLAGS="$CPPFLAGS $extra_includes" | ||
159 | fi | ||
160 | |||
161 | AC_ARG_WITH(extra-libs, | ||
162 | [ --with-extra-libs=DIR add extra library paths], | ||
163 | use_extra_libs=$withval, | ||
164 | use_extra_libs=NO | ||
165 | ) | ||
166 | if test -n "$use_extra_libs" && \ | ||
167 | test "$use_extra_libs" != "NO"; then | ||
168 | ac_save_ifs=$IFS | ||
169 | IFS=':' | ||
170 | for dir in $use_extra_libs; do | ||
171 | extra_libraries="$extra_libraries -L$dir" | ||
172 | done | ||
173 | IFS=$ac_save_ifs | ||
174 | LDFLAGS="$LDFLAGS $extra_libraries" | ||
175 | fi | ||
176 | ] | ||
177 | ) | ||
178 | |||
179 | dnl AX_POPT_CONST - check popt prototype | ||
180 | AC_DEFUN([AX_POPT_CONST], | ||
181 | [ | ||
182 | AC_MSG_CHECKING([popt prototype]) | ||
183 | SAVE_CXXFLAGS=$CXXFLAGS | ||
184 | CXXFLAGS="-Werror $CXXFLAGS" | ||
185 | AC_TRY_COMPILE([#include <popt.h>], | ||
186 | [ | ||
187 | int c; char **v; | ||
188 | poptGetContext(0, c, v, 0, 0); | ||
189 | ], | ||
190 | AC_MSG_RESULT([takes char **]);, | ||
191 | AC_MSG_RESULT([takes const char **]); AC_DEFINE(CONST_POPT, 1, [whether popt prototype takes a const char **])) | ||
192 | CXXFLAGS="$SAVE_CXXFLAGS" | ||
193 | ] | ||
194 | ) | ||
195 | |||
196 | dnl AX_CHECK_SSTREAM - check if local sstream is needed to compile OK | ||
197 | AC_DEFUN([AX_CHECK_SSTREAM], | ||
198 | [ | ||
199 | AC_MSG_CHECKING([whether to use included sstream]) | ||
200 | AC_TRY_COMPILE([#include <sstream>], [], | ||
201 | AC_MSG_RESULT([no]);, | ||
202 | AC_MSG_RESULT([yes]); OP_CXXFLAGS="$OP_CXXFLAGS -I\${top_srcdir}/include") | ||
203 | ] | ||
204 | ) | ||
205 | |||
206 | dnl AX_CHECK_TYPEDEF(typedef_name, type, action-if-true, action-if-false) | ||
207 | dnl exec action-if-true if typedef_name is a typedef to type else exec | ||
208 | dnl action-if-false | ||
209 | dnl currently work only with type typedef'ed in stddef.h | ||
210 | AC_DEFUN([AX_CHECK_TYPEDEF], [ | ||
211 | dnl AC_LANG_PUSH(C) not in autoconf 2.13 | ||
212 | AC_LANG_SAVE | ||
213 | AC_LANG_C | ||
214 | SAVE_CFLAGS=$CFLAGS | ||
215 | CFLAGS="-Werror $CFLAGS" | ||
216 | |||
217 | AC_TRY_COMPILE( | ||
218 | [ | ||
219 | #include <stddef.h> | ||
220 | ], | ||
221 | [ | ||
222 | typedef void (*fct1)($1); | ||
223 | typedef void (*fct2)($2); | ||
224 | fct1 f1 = 0; | ||
225 | fct2 f2 = 0; | ||
226 | if (f1 == f2) {} | ||
227 | ], | ||
228 | [$3],[$4]) | ||
229 | |||
230 | CFLAGS=$SAVE_CFLAGS | ||
231 | AC_LANG_RESTORE | ||
232 | ]) | ||
233 | |||
234 | |||
235 | dnl AX_TYPEDEFED_NAME(typedef_name, candidate_list, var_name) | ||
236 | dnl set var_name to the typedef name of $1 which must be in canditate_list | ||
237 | dnl else produce a fatal error | ||
238 | AC_DEFUN([AX_TYPEDEFED_NAME], [ | ||
239 | AC_MSG_CHECKING([type of $1]) | ||
240 | for f in $2; do | ||
241 | AX_CHECK_TYPEDEF($1, $f, $3="$f", $3="") | ||
242 | if test -n "${$3}"; then | ||
243 | break | ||
244 | fi | ||
245 | done | ||
246 | if test -n "${$3}"; then | ||
247 | AC_MSG_RESULT([${$3}]) | ||
248 | else | ||
249 | AC_MSG_ERROR([not found]) | ||
250 | fi | ||
251 | ]) | ||
252 | |||
253 | dnl find a binary in the path | ||
254 | AC_DEFUN([QT_FIND_PATH], | ||
255 | [ | ||
256 | AC_MSG_CHECKING([for $1]) | ||
257 | AC_CACHE_VAL(qt_cv_path_$1, | ||
258 | [ | ||
259 | qt_cv_path_$1="NONE" | ||
260 | if test -n "$$2"; then | ||
261 | qt_cv_path_$1="$$2"; | ||
262 | else | ||
263 | dirs="$3" | ||
264 | qt_save_IFS=$IFS | ||
265 | IFS=':' | ||
266 | for dir in $PATH; do | ||
267 | dirs="$dirs $dir" | ||
268 | done | ||
269 | IFS=$qt_save_IFS | ||
270 | |||
271 | for dir in $dirs; do | ||
272 | if test -x "$dir/$1"; then | ||
273 | if test -n "$5"; then | ||
274 | evalstr="$dir/$1 $5 2>&1 " | ||
275 | if eval $evalstr; then | ||
276 | qt_cv_path_$1="$dir/$1" | ||
277 | break | ||
278 | fi | ||
279 | else | ||
280 | qt_cv_path_$1="$dir/$1" | ||
281 | break | ||
282 | fi | ||
283 | fi | ||
284 | done | ||
285 | fi | ||
286 | ]) | ||
287 | |||
288 | if test -z "$qt_cv_path_$1" || test "$qt_cv_path_$1" = "NONE"; then | ||
289 | AC_MSG_RESULT(not found) | ||
290 | $4 | ||
291 | else | ||
292 | AC_MSG_RESULT($qt_cv_path_$1) | ||
293 | $2=$qt_cv_path_$1 | ||
294 | fi | ||
295 | ]) | ||
296 | |||
297 | dnl Find the uic compiler on the path or in qt_cv_dir | ||
298 | AC_DEFUN([QT_FIND_UIC], | ||
299 | [ | ||
300 | QT_FIND_PATH(uic, ac_uic, $qt_cv_dir/bin) | ||
301 | if test -z "$ac_uic" -a "$FATAL" = 1; then | ||
302 | AC_MSG_ERROR([uic binary not found in \$PATH or $qt_cv_dir/bin !]) | ||
303 | fi | ||
304 | ]) | ||
305 | |||
306 | dnl Find the right moc in path/qt_cv_dir | ||
307 | AC_DEFUN([QT_FIND_MOC], | ||
308 | [ | ||
309 | QT_FIND_PATH(moc2, ac_moc2, $qt_cv_dir/bin) | ||
310 | QT_FIND_PATH(moc, ac_moc1, $qt_cv_dir/bin) | ||
311 | |||
312 | if test -n "$ac_moc1" -a -n "$ac_moc2"; then | ||
313 | dnl found both. Prefer Qt3's if it exists else moc2 | ||
314 | $ac_moc1 -v 2>&1 | grep "Qt 3" >/dev/null | ||
315 | if test "$?" = 0; then | ||
316 | ac_moc=$ac_moc1; | ||
317 | else | ||
318 | ac_moc=$ac_moc2; | ||
319 | fi | ||
320 | else | ||
321 | if test -n "$ac_moc1"; then | ||
322 | ac_moc=$ac_moc1; | ||
323 | else | ||
324 | ac_moc=$ac_moc2; | ||
325 | fi | ||
326 | fi | ||
327 | |||
328 | if test -z "$ac_moc" -a "$FATAL" = 1; then | ||
329 | AC_MSG_ERROR([moc binary not found in \$PATH or $qt_cv_dir/bin !]) | ||
330 | fi | ||
331 | ]) | ||
332 | |||
333 | dnl check a particular libname | ||
334 | AC_DEFUN([QT_TRY_LINK], | ||
335 | [ | ||
336 | SAVE_LIBS="$LIBS" | ||
337 | LIBS="$LIBS $1" | ||
338 | AC_TRY_LINK([ | ||
339 | #include <qglobal.h> | ||
340 | #include <qstring.h> | ||
341 | ], | ||
342 | [ | ||
343 | QString s("mangle_failure"); | ||
344 | #if (QT_VERSION < 221) | ||
345 | break_me_(\\\); | ||
346 | #endif | ||
347 | ], | ||
348 | qt_cv_libname=$1, | ||
349 | ) | ||
350 | LIBS="$SAVE_LIBS" | ||
351 | ]) | ||
352 | |||
353 | dnl check we can do a compile | ||
354 | AC_DEFUN([QT_CHECK_COMPILE], | ||
355 | [ | ||
356 | AC_MSG_CHECKING([for Qt library name]) | ||
357 | |||
358 | AC_CACHE_VAL(qt_cv_libname, | ||
359 | [ | ||
360 | AC_LANG_CPLUSPLUS | ||
361 | SAVE_CXXFLAGS=$CXXFLAGS | ||
362 | CXXFLAGS="$CXXFLAGS $QT_INCLUDES $QT_LDFLAGS" | ||
363 | |||
364 | for libname in -lqt-mt -lqt3 -lqt2 -lqt; | ||
365 | do | ||
366 | QT_TRY_LINK($libname) | ||
367 | if test -n "$qt_cv_libname"; then | ||
368 | break; | ||
369 | fi | ||
370 | done | ||
371 | |||
372 | CXXFLAGS=$SAVE_CXXFLAGS | ||
373 | ]) | ||
374 | |||
375 | if test -z "$qt_cv_libname"; then | ||
376 | AC_MSG_RESULT([failed]) | ||
377 | if test "$FATAL" = 1 ; then | ||
378 | AC_MSG_ERROR([Cannot compile a simple Qt executable. Check you have the right \$QTDIR !]) | ||
379 | fi | ||
380 | else | ||
381 | AC_MSG_RESULT([$qt_cv_libname]) | ||
382 | fi | ||
383 | ]) | ||
384 | |||
385 | dnl get Qt version we're using | ||
386 | AC_DEFUN([QT_GET_VERSION], | ||
387 | [ | ||
388 | AC_CACHE_CHECK([Qt version],lyx_cv_qtversion, | ||
389 | [ | ||
390 | AC_LANG_CPLUSPLUS | ||
391 | SAVE_CPPFLAGS=$CPPFLAGS | ||
392 | CPPFLAGS="$CPPFLAGS $QT_INCLUDES" | ||
393 | |||
394 | cat > conftest.$ac_ext <<EOF | ||
395 | #line __oline__ "configure" | ||
396 | #include "confdefs.h" | ||
397 | #include <qglobal.h> | ||
398 | "%%%"QT_VERSION_STR"%%%" | ||
399 | EOF | ||
400 | lyx_cv_qtversion=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | \ | ||
401 | grep '^"%%%"' 2>/dev/null | \ | ||
402 | sed -e 's/"%%%"//g' -e 's/"//g'` | ||
403 | rm -f conftest.$ac_ext | ||
404 | CPPFLAGS=$SAVE_CPPFLAGS | ||
405 | ]) | ||
406 | |||
407 | QT_VERSION=$lyx_cv_qtversion | ||
408 | AC_SUBST(QT_VERSION) | ||
409 | ]) | ||
410 | |||
411 | dnl start here | ||
412 | AC_DEFUN([QT_DO_IT_ALL], | ||
413 | [ | ||
414 | dnl Please leave this alone. I use this file in | ||
415 | dnl oprofile. | ||
416 | FATAL=0 | ||
417 | |||
418 | AC_ARG_WITH(qt-dir, [ --with-qt-dir where the root of Qt is installed ], | ||
419 | [ qt_cv_dir=`eval echo "$withval"/` ]) | ||
420 | |||
421 | AC_ARG_WITH(qt-includes, [ --with-qt-includes where the Qt includes are. ], | ||
422 | [ qt_cv_includes=`eval echo "$withval"` ]) | ||
423 | |||
424 | AC_ARG_WITH(qt-libraries, [ --with-qt-libraries where the Qt library is installed.], | ||
425 | [ qt_cv_libraries=`eval echo "$withval"` ]) | ||
426 | |||
427 | dnl pay attention to $QTDIR unless overridden | ||
428 | if test -z "$qt_cv_dir"; then | ||
429 | qt_cv_dir=$QTDIR | ||
430 | fi | ||
431 | |||
432 | dnl derive inc/lib if needed | ||
433 | if test -n "$qt_cv_dir"; then | ||
434 | if test -z "$qt_cv_includes"; then | ||
435 | qt_cv_includes=$qt_cv_dir/include | ||
436 | fi | ||
437 | if test -z "$qt_cv_libraries"; then | ||
438 | qt_cv_libraries=$qt_cv_dir/lib | ||
439 | fi | ||
440 | fi | ||
441 | |||
442 | dnl flags for compilation | ||
443 | QT_INCLUDES= | ||
444 | QT_LDFLAGS= | ||
445 | if test -n "$qt_cv_includes"; then | ||
446 | QT_INCLUDES="-I$qt_cv_includes" | ||
447 | fi | ||
448 | if test -n "$qt_cv_libraries"; then | ||
449 | QT_LDFLAGS="-L$qt_cv_libraries" | ||
450 | fi | ||
451 | AC_SUBST(QT_INCLUDES) | ||
452 | AC_SUBST(QT_LDFLAGS) | ||
453 | |||
454 | QT_FIND_MOC | ||
455 | MOC=$ac_moc | ||
456 | AC_SUBST(MOC) | ||
457 | QT_FIND_UIC | ||
458 | UIC=$ac_uic | ||
459 | AC_SUBST(UIC) | ||
460 | |||
461 | QT_CHECK_COMPILE | ||
462 | |||
463 | QT_LIB=$qt_cv_libname; | ||
464 | AC_SUBST(QT_LIB) | ||
465 | |||
466 | if test -n "$qt_cv_libname"; then | ||
467 | QT_GET_VERSION | ||
468 | fi | ||
469 | ]) | ||
470 | |||
471 | dnl AX_CXXFLAGS_OPTIONS(var-name, option) | ||
472 | dnl add option to var-name if $CXX support it. | ||
473 | AC_DEFUN([AX_CHECK_PRECOMPILED_HEADER], [ | ||
474 | AC_MSG_CHECKING([whether ${CXX} support precompiled header]) | ||
475 | AC_LANG_SAVE | ||
476 | AC_LANG_CPLUSPLUS | ||
477 | SAVE_CXXFLAGS=$CXXFLAGS | ||
478 | dnl we consider than if -Winvalid-pch is accepted pch will works ... | ||
479 | CXXFLAGS=-Winvalid-pch | ||
480 | dnl but we don't want -Winvalid-pch else compilation will fail due -Werror and | ||
481 | dnl the fact than some pch will be invalid for the given compilation option | ||
482 | AC_TRY_COMPILE(,[;],AC_MSG_RESULT([yes]); $1="${$1} -include bits/stdc++.h", AC_MSG_RESULT([no])) | ||
483 | CXXFLAGS=$SAVE_CXXFLAGS | ||
484 | AC_LANG_RESTORE | ||
485 | ]) | ||
486 | |||
487 | dnl AX_CHECK_DOCBOOK | ||
488 | AC_DEFUN([AX_CHECK_DOCBOOK], [ | ||
489 | # It's just rude to go over the net to build | ||
490 | XSLTPROC_FLAGS=--nonet | ||
491 | DOCBOOK_ROOT= | ||
492 | if test ! -f /etc/xml/catalog; then | ||
493 | for i in /usr/share/sgml/docbook/stylesheet/xsl/nwalsh /usr/share/sgml/docbook/xsl-stylesheets/; | ||
494 | do | ||
495 | if test -d "$i"; then | ||
496 | DOCBOOK_ROOT=$i | ||
497 | fi | ||
498 | done | ||
499 | |||
500 | # Last resort - try net | ||
501 | if test -z "$DOCBOOK_ROOT"; then | ||
502 | XSLTPROC_FLAGS= | ||
503 | fi | ||
504 | else | ||
505 | XML_CATALOG=/etc/xml/catalog | ||
506 | CAT_ENTRY_START='<!--' | ||
507 | CAT_ENTRY_END='-->' | ||
508 | fi | ||
509 | |||
510 | AC_CHECK_PROG(XSLTPROC,xsltproc,xsltproc,) | ||
511 | XSLTPROC_WORKS=no | ||
512 | if test -n "$XSLTPROC"; then | ||
513 | AC_MSG_CHECKING([whether xsltproc works]) | ||
514 | |||
515 | if test -n "$XML_CATALOG"; then | ||
516 | DB_FILE="http://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xsl" | ||
517 | else | ||
518 | DB_FILE="$DOCBOOK_ROOT/docbook.xsl" | ||
519 | fi | ||
520 | |||
521 | $XSLTPROC $XSLTPROC_FLAGS $DB_FILE >/dev/null 2>&1 << END | ||
522 | <?xml version="1.0" encoding='ISO-8859-1'?> | ||
523 | <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"> | ||
524 | <book id="test"> | ||
525 | </book> | ||
526 | END | ||
527 | if test "$?" = 0; then | ||
528 | XSLTPROC_WORKS=yes | ||
529 | fi | ||
530 | AC_MSG_RESULT($XSLTPROC_WORKS) | ||
531 | fi | ||
532 | AM_CONDITIONAL(have_xsltproc, test "$XSLTPROC_WORKS" = "yes") | ||
533 | |||
534 | AC_SUBST(XML_CATALOG) | ||
535 | AC_SUBST(XSLTPROC_FLAGS) | ||
536 | AC_SUBST(DOCBOOK_ROOT) | ||
537 | AC_SUBST(CAT_ENTRY_START) | ||
538 | AC_SUBST(CAT_ENTRY_END) | ||
539 | ]) | ||
540 | |||
541 | dnl AX_CFLAGS_OPTIONS(var-name, option) | ||
542 | dnl add option to var-name if $CC support it. | ||
543 | AC_DEFUN([AX_CFLAGS_OPTION], [ | ||
544 | AC_MSG_CHECKING([whether ${CC} $2 is understood]) | ||
545 | AC_LANG_SAVE | ||
546 | AC_LANG_C | ||
547 | SAVE_CFLAGS=$CFLAGS | ||
548 | CFLAGS=$2 | ||
549 | AC_TRY_COMPILE(,[;],AC_MSG_RESULT([yes]); $1="${$1} $2",AC_MSG_RESULT([no])) | ||
550 | CFLAGS=$SAVE_CFLAGS | ||
551 | AC_LANG_RESTORE | ||
552 | ]) | ||
553 | |||
554 | |||
555 | dnl AX_CXXFLAGS_OPTIONS(var-name, option) | ||
556 | dnl add option to var-name if $CXX support it. | ||
557 | AC_DEFUN([AX_CXXFLAGS_OPTION], [ | ||
558 | AC_MSG_CHECKING([whether ${CXX} $2 is understood]) | ||
559 | AC_LANG_SAVE | ||
560 | AC_LANG_CPLUSPLUS | ||
561 | SAVE_CXXFLAGS=$CXXFLAGS | ||
562 | CXXFLAGS=$2 | ||
563 | AC_TRY_COMPILE(,[;],AC_MSG_RESULT([yes]); $1="${$1} $2",AC_MSG_RESULT([no])) | ||
564 | CXXFLAGS=$SAVE_CXXFLAGS | ||
565 | AC_LANG_RESTORE | ||
566 | ]) | ||
567 | |||
568 | dnl AX_COPY_IF_CHANGE(source, dest) | ||
569 | dnl copy source to dest if they don't compare equally or if dest doesn't exist | ||
570 | AC_DEFUN([AX_COPY_IF_CHANGE], [ | ||
571 | if test -r $2; then | ||
572 | if cmp $1 $2 > /dev/null; then | ||
573 | echo $2 is unchanged | ||
574 | else | ||
575 | cp -f $1 $2 | ||
576 | fi | ||
577 | else | ||
578 | cp -f $1 $2 | ||
579 | fi | ||
580 | ]) | ||
581 | |||
diff --git a/meta/recipes-kernel/oprofile/oprofile/oprofile-no-query-modules.patch b/meta/recipes-kernel/oprofile/oprofile/oprofile-no-query-modules.patch new file mode 100644 index 0000000000..c9d7cd63e7 --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofile/oprofile-no-query-modules.patch | |||
@@ -0,0 +1,29 @@ | |||
1 | disable portions which use query_module on 2.6 kernel this is not available | ||
2 | in OE we dont support 2.4 anyway | ||
3 | |||
4 | |||
5 | Upstream-Status: Pending | ||
6 | Signed-off-by: Khem Raj <raj.khem@gmail.com> | ||
7 | |||
8 | Index: oprofile-0.9.6/daemon/liblegacy/opd_kernel.c | ||
9 | =================================================================== | ||
10 | --- oprofile-0.9.6.orig/daemon/liblegacy/opd_kernel.c 2009-11-24 07:25:17.000000000 -0800 | ||
11 | +++ oprofile-0.9.6/daemon/liblegacy/opd_kernel.c 2011-07-18 10:08:39.863798825 -0700 | ||
12 | @@ -270,6 +270,9 @@ | ||
13 | */ | ||
14 | static void opd_drop_module_sample(unsigned long eip) | ||
15 | { | ||
16 | + verbprintf(vmodule, "query_module not available on linux-2.6: %s\n", strerror(EPERM)); | ||
17 | + | ||
18 | +#if 0 | ||
19 | char * module_names; | ||
20 | char * name; | ||
21 | size_t size = 1024; | ||
22 | @@ -307,6 +310,7 @@ | ||
23 | |||
24 | if (module_names) | ||
25 | free(module_names); | ||
26 | +#endif | ||
27 | } | ||
28 | |||
29 | |||
diff --git a/meta/recipes-kernel/oprofile/oprofile/oprofile-root.patch b/meta/recipes-kernel/oprofile/oprofile/oprofile-root.patch new file mode 100644 index 0000000000..f3fe4c9cb3 --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofile/oprofile-root.patch | |||
@@ -0,0 +1,113 @@ | |||
1 | Change hardcoded /root to /home/root | ||
2 | |||
3 | Upstream-Status: inappropriate [OE specific] | ||
4 | |||
5 | Signed-off-by: Mark Hatle <mark.hatle@windriver.com> | ||
6 | |||
7 | Replace "/home/root" with stub "ROOTHOME", then substitute it with | ||
8 | real root home directory which is configured dymanically. | ||
9 | |||
10 | Signed-off-by: Kang Kai <kai.kang@windriver.com> | ||
11 | |||
12 | diff -ur oprofile-0.9.7.orig/doc/opcontrol.1.in oprofile-0.9.7/doc/opcontrol.1.in | ||
13 | --- oprofile-0.9.7.orig/doc/opcontrol.1.in 2011-07-04 21:25:04.000000000 -0500 | ||
14 | +++ oprofile-0.9.7/doc/opcontrol.1.in 2012-07-02 14:02:16.358865420 -0500 | ||
15 | @@ -171,7 +171,7 @@ | ||
16 | |||
17 | .SH FILES | ||
18 | .TP | ||
19 | -.I /root/.oprofile/daemonrc | ||
20 | +.I ROOTHOME/.oprofile/daemonrc | ||
21 | Configuration file for opcontrol | ||
22 | .TP | ||
23 | .I /var/lib/oprofile/samples/ | ||
24 | diff -ur oprofile-0.9.7.orig/doc/oprofile.1 oprofile-0.9.7/doc/oprofile.1 | ||
25 | --- oprofile-0.9.7.orig/doc/oprofile.1 2011-08-12 10:23:27.000000000 -0500 | ||
26 | +++ oprofile-0.9.7/doc/oprofile.1 2012-07-02 14:02:29.295862358 -0500 | ||
27 | @@ -150,7 +150,7 @@ | ||
28 | .I $HOME/.oprofile/ | ||
29 | Configuration files | ||
30 | .TP | ||
31 | -.I /root/.oprofile/daemonrc | ||
32 | +.I ROOTHOME/.oprofile/daemonrc | ||
33 | Configuration file for opcontrol | ||
34 | .TP | ||
35 | .I /opt/oprofile-0.9.7-rc3/share/oprofile/ | ||
36 | diff -ur oprofile-0.9.7.orig/doc/oprofile.1.in oprofile-0.9.7/doc/oprofile.1.in | ||
37 | --- oprofile-0.9.7.orig/doc/oprofile.1.in 2011-07-04 21:25:04.000000000 -0500 | ||
38 | +++ oprofile-0.9.7/doc/oprofile.1.in 2012-07-02 14:01:35.812004623 -0500 | ||
39 | @@ -150,7 +150,7 @@ | ||
40 | .I $HOME/.oprofile/ | ||
41 | Configuration files | ||
42 | .TP | ||
43 | -.I /root/.oprofile/daemonrc | ||
44 | +.I ROOTHOME/.oprofile/daemonrc | ||
45 | Configuration file for opcontrol | ||
46 | .TP | ||
47 | .I @prefix@/share/oprofile/ | ||
48 | diff -ur oprofile-0.9.7.orig/doc/oprofile.html oprofile-0.9.7/doc/oprofile.html | ||
49 | --- oprofile-0.9.7.orig/doc/oprofile.html 2011-07-04 21:32:35.000000000 -0500 | ||
50 | +++ oprofile-0.9.7/doc/oprofile.html 2012-07-02 14:04:59.804018961 -0500 | ||
51 | @@ -1394,7 +1394,7 @@ | ||
52 | <dd> | ||
53 | <p> | ||
54 | Followed by list arguments for profiling set up. List of arguments | ||
55 | - saved in <code class="filename">/root/.oprofile/daemonrc</code>. | ||
56 | + saved in <code class="filename">ROOTHOME/.oprofile/daemonrc</code>. | ||
57 | Giving this option is not necessary; you can just directly pass one | ||
58 | of the setup options, e.g. <span class="command"><strong>opcontrol --no-vmlinux</strong></span>. | ||
59 | </p> | ||
60 | @@ -1430,7 +1430,7 @@ | ||
61 | <dd> | ||
62 | <p> | ||
63 | Start data collection with either arguments provided by <code class="option">--setup</code> | ||
64 | - or information saved in <code class="filename">/root/.oprofile/daemonrc</code>. Specifying | ||
65 | + or information saved in <code class="filename">ROOTHOME/.oprofile/daemonrc</code>. Specifying | ||
66 | the addition <code class="option">--verbose</code> makes the daemon generate lots of debug data | ||
67 | whilst it is running. | ||
68 | </p> | ||
69 | diff -ur oprofile-0.9.7.orig/doc/oprofile.xml oprofile-0.9.7/doc/oprofile.xml | ||
70 | --- oprofile-0.9.7.orig/doc/oprofile.xml 2011-07-04 21:25:04.000000000 -0500 | ||
71 | +++ oprofile-0.9.7/doc/oprofile.xml 2012-07-02 14:02:03.543019283 -0500 | ||
72 | @@ -568,7 +568,7 @@ | ||
73 | <term><option>--setup</option></term> | ||
74 | <listitem><para> | ||
75 | Followed by list arguments for profiling set up. List of arguments | ||
76 | - saved in <filename>/root/.oprofile/daemonrc</filename>. | ||
77 | + saved in <filename>ROOTHOME/.oprofile/daemonrc</filename>. | ||
78 | Giving this option is not necessary; you can just directly pass one | ||
79 | of the setup options, e.g. <command>opcontrol --no-vmlinux</command>. | ||
80 | </para></listitem> | ||
81 | @@ -592,7 +592,7 @@ | ||
82 | <term><option>--start</option></term> | ||
83 | <listitem><para> | ||
84 | Start data collection with either arguments provided by <option>--setup</option> | ||
85 | - or information saved in <filename>/root/.oprofile/daemonrc</filename>. Specifying | ||
86 | + or information saved in <filename>ROOTHOME/.oprofile/daemonrc</filename>. Specifying | ||
87 | the addition <option>--verbose</option> makes the daemon generate lots of debug data | ||
88 | whilst it is running. | ||
89 | </para></listitem> | ||
90 | diff -ur oprofile-0.9.7.orig/gui/oprof_start_util.cpp oprofile-0.9.7/gui/oprof_start_util.cpp | ||
91 | --- oprofile-0.9.7.orig/gui/oprof_start_util.cpp 2011-07-04 21:25:04.000000000 -0500 | ||
92 | +++ oprofile-0.9.7/gui/oprof_start_util.cpp 2012-07-02 13:55:21.041876096 -0500 | ||
93 | @@ -39,7 +39,7 @@ | ||
94 | // return the ~ expansion suffixed with a '/' | ||
95 | string const get_config_dir() | ||
96 | { | ||
97 | - return "/root"; | ||
98 | + return "ROOTHOME"; | ||
99 | } | ||
100 | |||
101 | string daemon_pid; | ||
102 | diff -ur oprofile-0.9.7.orig/utils/opcontrol oprofile-0.9.7/utils/opcontrol | ||
103 | --- oprofile-0.9.7.orig/utils/opcontrol 2011-07-20 14:36:48.000000000 -0500 | ||
104 | +++ oprofile-0.9.7/utils/opcontrol 2012-07-02 13:55:06.232872688 -0500 | ||
105 | @@ -384,7 +384,7 @@ | ||
106 | OPROFILED="$OPDIR/oprofiled" | ||
107 | |||
108 | # location for daemon setup information | ||
109 | - SETUP_DIR="/root/.oprofile" | ||
110 | + SETUP_DIR="ROOTHOME/.oprofile" | ||
111 | SETUP_FILE="$SETUP_DIR/daemonrc" | ||
112 | SEC_SETUP_FILE="$SETUP_DIR/daemonrc_new" | ||
113 | |||
diff --git a/meta/recipes-kernel/oprofile/oprofile/opstart.patch b/meta/recipes-kernel/oprofile/oprofile/opstart.patch new file mode 100644 index 0000000000..8696f4ef4d --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofile/opstart.patch | |||
@@ -0,0 +1,245 @@ | |||
1 | Upstream-Status: Pending | ||
2 | |||
3 | The patch gives a low overhead way of starting/stopping oprofile which | ||
4 | doesn't involve script exection. | ||
5 | |||
6 | (written by RP in OpenedHand days) | ||
7 | |||
8 | diff --git a/utils/Makefile.am b/utils/Makefile.am | ||
9 | index d34b060..dff15f9 100644 | ||
10 | --- oprofile.orig/utils/Makefile.am | ||
11 | +++ oprofile/utils/Makefile.am | ||
12 | @@ -7,7 +7,7 @@ AM_LDFLAGS = @OP_LDFLAGS@ | ||
13 | |||
14 | LIBS=@POPT_LIBS@ @LIBERTY_LIBS@ | ||
15 | |||
16 | -bin_PROGRAMS = ophelp op-check-perfevents | ||
17 | +bin_PROGRAMS = ophelp op-check-perfevents opstart | ||
18 | dist_bin_SCRIPTS = opcontrol | ||
19 | |||
20 | op_check_perfevents_SOURCES = op_perf_events_checker.c | ||
21 | @@ -15,3 +15,10 @@ op_check_perfevents_CPPFLAGS = ${AM_CFLAGS} @PERF_EVENT_FLAGS@ | ||
22 | |||
23 | ophelp_SOURCES = ophelp.c | ||
24 | ophelp_LDADD = ../libop/libop.a ../libutil/libutil.a | ||
25 | + | ||
26 | +opstart_SOURCES = opstart.c | ||
27 | + | ||
28 | +install-exec-local: | ||
29 | + cd $(DESTDIR)/$(bindir) && \ | ||
30 | + rm -f opstop && \ | ||
31 | + $(LN_S) opstart opstop | ||
32 | Index: oprofile/utils/opstart.c | ||
33 | =================================================================== | ||
34 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
35 | +++ oprofile/utils/opstart.c 2008-07-02 15:14:07.000000000 +0100 | ||
36 | @@ -0,0 +1,110 @@ | ||
37 | +/** | ||
38 | + * @file opstart.c | ||
39 | + * Start/Stop oprofile | ||
40 | + * | ||
41 | + * @remark Copyright 2007 Openedhand Ltd. | ||
42 | + * @remark Read the file COPYING | ||
43 | + * | ||
44 | + * @author Richard Purdie | ||
45 | + */ | ||
46 | + | ||
47 | +#include <signal.h> | ||
48 | +#include <stdio.h> | ||
49 | +#include <stdlib.h> | ||
50 | +#include <string.h> | ||
51 | +#include <unistd.h> | ||
52 | +#include <sys/types.h> | ||
53 | +#include <sys/stat.h> | ||
54 | + | ||
55 | +int main(const int argc, const char* argv[]) | ||
56 | +{ | ||
57 | + const char *enable = "/dev/oprofile/enable"; | ||
58 | + const char *lockfile; | ||
59 | + unsigned long dpid; | ||
60 | + struct stat sbuf; | ||
61 | + FILE *lfile, *efile; | ||
62 | + int sig, enb, err; | ||
63 | + | ||
64 | + if (argc >= 2) { | ||
65 | + printf("Error: Invalid options.\n"); | ||
66 | + return 1; | ||
67 | + } | ||
68 | + | ||
69 | + lockfile = getenv("LOCK_FILE"); | ||
70 | + if (!lockfile) | ||
71 | + lockfile = "/var/lib/oprofile/lock"; | ||
72 | + | ||
73 | + /* Add SESSION_DIR support? */ | ||
74 | + | ||
75 | + if (geteuid()) { | ||
76 | + printf("Error: This program must be run as root.\n"); | ||
77 | + return 1; | ||
78 | + } | ||
79 | + | ||
80 | + if (stat(enable, &sbuf)) { | ||
81 | + printf("Error: Could not find /dev/oprofile/enable, the" | ||
82 | + " kernel module probably isn't loaded.\n"); | ||
83 | + printf("This binary only works with 2.6 kernels and oprofile" | ||
84 | + " must have been initialised with 'opcontrol --start-daemon'.\n"); | ||
85 | + return 1; | ||
86 | + } | ||
87 | + | ||
88 | + if (stat(lockfile, &sbuf)) { | ||
89 | + printf("Error: Could not find lockfile %s.\n", lockfile); | ||
90 | + printf("The oprofile daemon must be running (oprofile must" | ||
91 | + " have been initialised with 'opcontrol --start-daemon').\n"); | ||
92 | + return 1; | ||
93 | + } | ||
94 | + | ||
95 | + lfile = fopen(lockfile, "r"); | ||
96 | + if (!lfile) { | ||
97 | + printf("Error opening lockfile %s.\n", lockfile); | ||
98 | + return 1; | ||
99 | + } | ||
100 | + | ||
101 | + err = fscanf(lfile, "%lud", (unsigned long *) &dpid); | ||
102 | + if (err != 1) { | ||
103 | + printf("Error reading pid from lockfile %s.\n", lockfile); | ||
104 | + return 1; | ||
105 | + } | ||
106 | + fclose(lfile); | ||
107 | + | ||
108 | + efile = fopen(enable, "r"); | ||
109 | + if (!efile) { | ||
110 | + printf("Error opening %s.\n", enable); | ||
111 | + return 1; | ||
112 | + } | ||
113 | + | ||
114 | + if (strstr(argv[0], "opstart")) { | ||
115 | + printf("Starting Profiler\n"); | ||
116 | + sig = SIGUSR1; | ||
117 | + enb = 1; | ||
118 | + } else if (strstr(argv[0], "opstop")) { | ||
119 | + printf("Stopping Oprofile.\n"); | ||
120 | + printf("You need to run 'opcontrol --dump' when the session" | ||
121 | + " is finished.\n"); | ||
122 | + sig = SIGUSR2; | ||
123 | + enb = 0; | ||
124 | + } else { | ||
125 | + printf("Error: Please call as 'opstart' or 'opstop'\n"); | ||
126 | + return 1; | ||
127 | + } | ||
128 | + | ||
129 | + err = kill(dpid, 0); | ||
130 | + if (err) { | ||
131 | + printf("Error sending signal to oprofiled. Stale lockfile" | ||
132 | + " (%s) ?\n", lockfile); | ||
133 | + return 1; | ||
134 | + } | ||
135 | + | ||
136 | + fprintf(efile, "%d\n", enb); | ||
137 | + err = kill(dpid, sig); | ||
138 | + if (err) { | ||
139 | + printf("Error sending signal to oprofiled. Stale lockfile" | ||
140 | + " (%s) ?\n", lockfile); | ||
141 | + return 1; | ||
142 | + } | ||
143 | + | ||
144 | + return 0; | ||
145 | +} | ||
146 | + | ||
147 | Index: oprofile/configure.ac | ||
148 | =================================================================== | ||
149 | --- oprofile.orig/configure.ac 2008-07-02 15:13:58.000000000 +0100 | ||
150 | +++ oprofile/configure.ac 2008-07-02 15:17:37.000000000 +0100 | ||
151 | @@ -16,6 +16,7 @@ | ||
152 | AM_CONFIG_HEADER(config.h) | ||
153 | |||
154 | AC_PROG_RANLIB | ||
155 | +AC_PROG_LN_S | ||
156 | AC_PROG_LIBTOOL | ||
157 | |||
158 | dnl for the man page | ||
159 | @@ -241,6 +242,8 @@ | ||
160 | doc/xsl/catalog-1.xml \ | ||
161 | doc/oprofile.1 \ | ||
162 | doc/opcontrol.1 \ | ||
163 | + doc/opstart.1 \ | ||
164 | + doc/opstop.1 \ | ||
165 | doc/ophelp.1 \ | ||
166 | doc/opreport.1 \ | ||
167 | doc/opannotate.1 \ | ||
168 | Index: oprofile/doc/Makefile.am | ||
169 | =================================================================== | ||
170 | --- oprofile.orig/doc/Makefile.am 2008-07-02 15:13:59.000000000 +0100 | ||
171 | +++ oprofile/doc/Makefile.am 2008-07-02 15:14:07.000000000 +0100 | ||
172 | @@ -11,6 +11,8 @@ | ||
173 | man_MANS = \ | ||
174 | oprofile.1 \ | ||
175 | opcontrol.1 \ | ||
176 | + opstart.1 \ | ||
177 | + opstop.1 \ | ||
178 | opreport.1 \ | ||
179 | opannotate.1 \ | ||
180 | opgprof.1 \ | ||
181 | Index: oprofile/doc/opstart.1.in | ||
182 | =================================================================== | ||
183 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
184 | +++ oprofile/doc/opstart.1.in 2008-07-02 15:14:07.000000000 +0100 | ||
185 | @@ -0,0 +1,27 @@ | ||
186 | +.TH OPSTART 1 "@DATE@" "oprofile @VERSION@" | ||
187 | +.UC 4 | ||
188 | +.SH NAME | ||
189 | +opstart \- start OProfile profiling | ||
190 | +.SH SYNOPSIS | ||
191 | +.br | ||
192 | +.B opstart | ||
193 | +.SH DESCRIPTION | ||
194 | +.B opstart | ||
195 | +is a simple optimised command to start profiling with 2.6 Linux kernels. | ||
196 | +OProfile should have already been initialised by calling "opcontrol --start-daemon". | ||
197 | + | ||
198 | +.SH ENVIRONMENT | ||
199 | +No special environment variables are recognised by opstart. | ||
200 | + | ||
201 | +.SH FILES | ||
202 | +.TP | ||
203 | +.I /var/lib/oprofile/samples/ | ||
204 | +The location of the generated sample files. | ||
205 | + | ||
206 | +.SH VERSION | ||
207 | +.TP | ||
208 | +This man page is current for @PACKAGE@-@VERSION@. | ||
209 | + | ||
210 | +.SH SEE ALSO | ||
211 | +.BR @OP_DOCDIR@, | ||
212 | +.BR oprofile(1) | ||
213 | Index: oprofile/doc/opstop.1.in | ||
214 | =================================================================== | ||
215 | --- /dev/null 1970-01-01 00:00:00.000000000 +0000 | ||
216 | +++ oprofile/doc/opstop.1.in 2008-07-02 15:14:07.000000000 +0100 | ||
217 | @@ -0,0 +1,28 @@ | ||
218 | +.TH OPSTOP 1 "@DATE@" "oprofile @VERSION@" | ||
219 | +.UC 4 | ||
220 | +.SH NAME | ||
221 | +opstop \- stop OProfile profiling | ||
222 | +.SH SYNOPSIS | ||
223 | +.br | ||
224 | +.B opstop | ||
225 | +.SH DESCRIPTION | ||
226 | +.B opstop | ||
227 | +is a simple optimsed command to stop profiling with 2.6 Linux kernels. | ||
228 | +You need to run "opcontrol --dump" before being able to view a profile | ||
229 | +with opreport. | ||
230 | + | ||
231 | +.SH ENVIRONMENT | ||
232 | +No special environment variables are recognised by opstop. | ||
233 | + | ||
234 | +.SH FILES | ||
235 | +.TP | ||
236 | +.I /var/lib/oprofile/samples/ | ||
237 | +The location of the generated sample files. | ||
238 | + | ||
239 | +.SH VERSION | ||
240 | +.TP | ||
241 | +This man page is current for @PACKAGE@-@VERSION@. | ||
242 | + | ||
243 | +.SH SEE ALSO | ||
244 | +.BR @OP_DOCDIR@, | ||
245 | +.BR oprofile(1) | ||
diff --git a/meta/recipes-kernel/oprofile/oprofile_0.9.8.bb b/meta/recipes-kernel/oprofile/oprofile_0.9.8.bb new file mode 100644 index 0000000000..e8329cd79c --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofile_0.9.8.bb | |||
@@ -0,0 +1,22 @@ | |||
1 | require oprofile.inc | ||
2 | |||
3 | PR = "${INC_PR}.3" | ||
4 | |||
5 | DEPENDS += "virtual/kernel" | ||
6 | DEPENDS_append_powerpc64 = " libpfm4" | ||
7 | |||
8 | SRC_URI += "${SOURCEFORGE_MIRROR}/${BPN}/${BPN}-${PV}.tar.gz \ | ||
9 | file://0001-Add-rmb-definition-for-AArch64-architecture.patch \ | ||
10 | file://0001-OProfile-doesn-t-build-for-32-bit-ppc-the-operf_util.patch \ | ||
11 | file://0001-Handle-early-perf_events-kernel-without-PERF_RECORD_.patch \ | ||
12 | file://0001-Fix-up-configure-to-handle-architectures-that-do-not.patch \ | ||
13 | file://0001-Change-configure-to-look-for-libpfm4-function-first-.patch \ | ||
14 | file://0001-ophelp-lists-events-Fix-doc-URL-for-ppc64-arch.patch \ | ||
15 | file://0001-Allow-ppc64-events-to-be-specified-with-or-without-_.patch \ | ||
16 | file://0001-Fix-PPC64-specific-libpfm-usage-so-it-doesn-t-break-.patch" | ||
17 | |||
18 | SRC_URI[md5sum] = "6d127023af1dd1cf24e15411229f3cc8" | ||
19 | SRC_URI[sha256sum] = "ab45900fa1a23e5d5badf3c0a55f26c17efe6e184efcf00b371433751fa761bc" | ||
20 | |||
21 | S = "${WORKDIR}/oprofile-${PV}" | ||
22 | |||
diff --git a/meta/recipes-kernel/oprofile/oprofile_git.bb b/meta/recipes-kernel/oprofile/oprofile_git.bb new file mode 100644 index 0000000000..ca562db121 --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofile_git.bb | |||
@@ -0,0 +1,11 @@ | |||
1 | require oprofile.inc | ||
2 | |||
3 | SRCREV = "88f43190d412d28ebf5c75a76ba20343d0fe4c41" | ||
4 | PV = "0.9.7+git${SRCPV}" | ||
5 | PR = "${INC_PR}.0" | ||
6 | |||
7 | SRC_URI += "git://oprofile.git.sourceforge.net/gitroot/${BPN}/${BPN}" | ||
8 | |||
9 | S = "${WORKDIR}/git" | ||
10 | |||
11 | DEFAULT_PREFERENCE = "-1" | ||
diff --git a/meta/recipes-kernel/oprofile/oprofileui-server/init b/meta/recipes-kernel/oprofile/oprofileui-server/init new file mode 100755 index 0000000000..2544ea4ac0 --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofileui-server/init | |||
@@ -0,0 +1,37 @@ | |||
1 | #!/bin/sh | ||
2 | ### BEGIN INIT INFO | ||
3 | # Provides: oprofile-server | ||
4 | # Required-Start: $network | ||
5 | # Required-Stop: $network | ||
6 | # Default-Start: 2 3 4 5 | ||
7 | # Default-Stop: 0 1 6 | ||
8 | # Short-Description: OProfileUI server | ||
9 | # Description: | ||
10 | ### END INIT INFO | ||
11 | |||
12 | . /etc/init.d/functions | ||
13 | |||
14 | case "$1" in | ||
15 | start) | ||
16 | echo "Starting OProfileUI server" | ||
17 | . /etc/profile | ||
18 | /usr/bin/oprofile-server & | ||
19 | ;; | ||
20 | |||
21 | stop) | ||
22 | echo "Stopping OProfileUI server" | ||
23 | killproc oprofile-server | ||
24 | ;; | ||
25 | |||
26 | restart) | ||
27 | $0 stop | ||
28 | sleep 1 | ||
29 | $0 start | ||
30 | ;; | ||
31 | |||
32 | *) | ||
33 | echo "usage: $0 { start | stop | restart }" | ||
34 | ;; | ||
35 | esac | ||
36 | |||
37 | exit 0 | ||
diff --git a/meta/recipes-kernel/oprofile/oprofileui-server/oprofileui-server.service b/meta/recipes-kernel/oprofile/oprofileui-server/oprofileui-server.service new file mode 100644 index 0000000000..1a2cbe62ea --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofileui-server/oprofileui-server.service | |||
@@ -0,0 +1,6 @@ | |||
1 | [Unit] | ||
2 | Description=OProfileUI Server | ||
3 | After=network.target | ||
4 | |||
5 | [Service] | ||
6 | ExecStart=/bin/sh -c ". @SYSCONFDIR@/profile; @BINDIR@/oprofile-server" | ||
diff --git a/meta/recipes-kernel/oprofile/oprofileui-server_git.bb b/meta/recipes-kernel/oprofile/oprofileui-server_git.bb new file mode 100644 index 0000000000..dbb559965a --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofileui-server_git.bb | |||
@@ -0,0 +1,32 @@ | |||
1 | require oprofileui.inc | ||
2 | |||
3 | SRCREV = "f168b8bfdc63660033de1739c6ddad1abd97c379" | ||
4 | PV = "0.0+git${SRCPV}" | ||
5 | |||
6 | S = "${WORKDIR}/git" | ||
7 | |||
8 | SRC_URI = "git://git.yoctoproject.org/oprofileui \ | ||
9 | file://init \ | ||
10 | file://oprofileui-server.service " | ||
11 | |||
12 | EXTRA_OECONF += "--disable-client --enable-server" | ||
13 | |||
14 | RDEPENDS_${PN} = "oprofile" | ||
15 | |||
16 | do_install_append() { | ||
17 | install -d ${D}${sysconfdir}/init.d | ||
18 | install -m 0755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/oprofileui-server | ||
19 | |||
20 | install -d ${D}${systemd_unitdir}/system | ||
21 | install -m 0644 ${WORKDIR}/oprofileui-server.service ${D}${systemd_unitdir}/system/ | ||
22 | sed -i -e 's,@SYSCONFDIR@,${sysconfdir},g' \ | ||
23 | -e 's,@BINDIR@,${bindir},g' ${D}${systemd_unitdir}/system/oprofileui-server.service | ||
24 | } | ||
25 | |||
26 | inherit update-rc.d systemd | ||
27 | |||
28 | INITSCRIPT_NAME = "oprofileui-server" | ||
29 | INITSCRIPT_PARAMS = "start 99 5 2 . stop 20 0 1 6 ." | ||
30 | |||
31 | SYSTEMD_SERVICE_${PN} = "oprofileui-server.service" | ||
32 | SYSTEMD_AUTO_ENABLE = "disable" | ||
diff --git a/meta/recipes-kernel/oprofile/oprofileui.inc b/meta/recipes-kernel/oprofile/oprofileui.inc new file mode 100644 index 0000000000..6d59e47213 --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofileui.inc | |||
@@ -0,0 +1,16 @@ | |||
1 | SUMMARY = "User Interface for the System-Wide Profiler" | ||
2 | DESCRIPTION = "User interface for the OProfile tool" | ||
3 | HOMEPAGE = "http://labs.o-hand.com/oprofileui/" | ||
4 | BUGTRACKER = "http://bugzilla.yoctoproject.org/" | ||
5 | |||
6 | SECTION = "x11" | ||
7 | |||
8 | LICENSE = "GPLv2" | ||
9 | LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f" | ||
10 | |||
11 | DEPENDS = "glib-2.0 avahi" | ||
12 | |||
13 | inherit autotools pkgconfig | ||
14 | |||
15 | EXTRA_OECONF = "--with-avahi" | ||
16 | |||
diff --git a/meta/recipes-kernel/oprofile/oprofileui_git.bb b/meta/recipes-kernel/oprofile/oprofileui_git.bb new file mode 100644 index 0000000000..316c61a696 --- /dev/null +++ b/meta/recipes-kernel/oprofile/oprofileui_git.bb | |||
@@ -0,0 +1,17 @@ | |||
1 | require oprofileui.inc | ||
2 | |||
3 | DEPENDS += "gtk+ libglade libxml2 avahi-ui gconf" | ||
4 | |||
5 | SRCREV = "f168b8bfdc63660033de1739c6ddad1abd97c379" | ||
6 | PV = "0.0+git${SRCPV}" | ||
7 | |||
8 | S = "${WORKDIR}/git" | ||
9 | |||
10 | SRC_URI = "git://git.yoctoproject.org/oprofileui" | ||
11 | |||
12 | EXTRA_OECONF += "--enable-client --disable-server" | ||
13 | |||
14 | PACKAGES =+ "oprofileui-viewer" | ||
15 | |||
16 | FILES_oprofileui-viewer = "${bindir}/oparchconv ${bindir}/oprofile-viewer ${datadir}/applications/ ${datadir}/oprofileui/ ${datadir}/icons" | ||
17 | RDEPENDS_oprofileui-viewer = "oprofile" | ||