[PATCH 2/6] perf header: Add ->process callbacks to most of features

2012-09-24 Thread Namhyung Kim
>From now on each feature information is processed and saved in perf
header so that it can be used wherever needed.  The BRANCH_STACK
feature is an exception since it needs nothing to be done.

Cc: Stephane Eranian 
Cc: Robert Richter 
Signed-off-by: Namhyung Kim 
---
 tools/perf/util/header.c | 319 +--
 1 file changed, 308 insertions(+), 11 deletions(-)

diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index ad72b2814ba8..d74b58d4105d 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -22,6 +22,7 @@
 #include "cpumap.h"
 #include "pmu.h"
 #include "vdso.h"
+#include "strbuf.h"
 
 static bool no_buildid_cache = false;
 
@@ -1673,6 +1674,99 @@ static int process_build_id(struct perf_file_section 
*section,
return 0;
 }
 
+static int process_hostname(struct perf_file_section *section __maybe_unused,
+   struct perf_header *ph, int feat __maybe_unused,
+   int fd, void *data __maybe_unused)
+{
+   ph->env.hostname = do_read_string(fd, ph);
+   return ph->env.hostname ? 0 : -ENOMEM;
+}
+
+static int process_osrelease(struct perf_file_section *section __maybe_unused,
+struct perf_header *ph, int feat __maybe_unused,
+int fd, void *data __maybe_unused)
+{
+   ph->env.os_release = do_read_string(fd, ph);
+   return ph->env.os_release ? 0 : -ENOMEM;
+}
+
+static int process_version(struct perf_file_section *section __maybe_unused,
+  struct perf_header *ph, int feat __maybe_unused,
+  int fd, void *data __maybe_unused)
+{
+   ph->env.version = do_read_string(fd, ph);
+   return ph->env.version ? 0 : -ENOMEM;
+}
+
+static int process_arch(struct perf_file_section *section __maybe_unused,
+   struct perf_header *ph, int feat __maybe_unused,
+   int fd, void *data __maybe_unused)
+{
+   ph->env.arch = do_read_string(fd, ph);
+   return ph->env.arch ? 0 : -ENOMEM;
+}
+
+static int process_nrcpus(struct perf_file_section *section __maybe_unused,
+ struct perf_header *ph, int feat __maybe_unused,
+ int fd, void *data __maybe_unused)
+{
+   size_t ret;
+   u32 nr;
+
+   ret = read(fd, , sizeof(nr));
+   if (ret != sizeof(nr))
+   return -1;
+
+   if (ph->needs_swap)
+   nr = bswap_32(nr);
+
+   ph->env.nr_cpus_online = nr;
+
+   ret = read(fd, , sizeof(nr));
+   if (ret != sizeof(nr))
+   return -1;
+
+   if (ph->needs_swap)
+   nr = bswap_32(nr);
+
+   ph->env.nr_cpus_avail = nr;
+   return 0;
+}
+
+static int process_cpudesc(struct perf_file_section *section __maybe_unused,
+  struct perf_header *ph, int feat __maybe_unused,
+  int fd, void *data __maybe_unused)
+{
+   ph->env.cpu_desc = do_read_string(fd, ph);
+   return ph->env.cpu_desc ? 0 : -ENOMEM;
+}
+
+static int process_cpuid(struct perf_file_section *section __maybe_unused,
+struct perf_header *ph, int feat __maybe_unused,
+int fd, void *data __maybe_unused)
+{
+   ph->env.cpuid = do_read_string(fd, ph);
+   return ph->env.cpuid ? 0 : -ENOMEM;
+}
+
+static int process_total_mem(struct perf_file_section *section __maybe_unused,
+struct perf_header *ph, int feat __maybe_unused,
+int fd, void *data __maybe_unused)
+{
+   uint64_t mem;
+   size_t ret;
+
+   ret = read(fd, , sizeof(mem));
+   if (ret != sizeof(mem))
+   return -1;
+
+   if (ph->needs_swap)
+   mem = bswap_64(mem);
+
+   ph->env.total_mem = mem;
+   return 0;
+}
+
 static char *read_cpuid(struct perf_header *ph, int fd)
 {
return do_read_string(fd, ph);
@@ -1728,6 +1822,208 @@ process_event_desc(struct perf_file_section *section 
__maybe_unused,
return 0;
 }
 
+static int process_cmdline(struct perf_file_section *section __maybe_unused,
+  struct perf_header *ph, int feat __maybe_unused,
+  int fd, void *data __maybe_unused)
+{
+   size_t ret;
+   char *str;
+   u32 nr, i;
+   struct strbuf sb;
+
+   ret = read(fd, , sizeof(nr));
+   if (ret != sizeof(nr))
+   return -1;
+
+   if (ph->needs_swap)
+   nr = bswap_32(nr);
+
+   ph->env.nr_cmdline = nr;
+   strbuf_init(, 128);
+
+   for (i = 0; i < nr; i++) {
+   str = do_read_string(fd, ph);
+   if (!str)
+   goto error;
+
+   /* include a NULL character at the end */
+   strbuf_add(, str, strlen(str) + 1);
+   free(str);
+   }
+   ph->env.cmdline = strbuf_detach(, NULL);
+   

[PATCH 2/6] perf header: Add -process callbacks to most of features

2012-09-24 Thread Namhyung Kim
From now on each feature information is processed and saved in perf
header so that it can be used wherever needed.  The BRANCH_STACK
feature is an exception since it needs nothing to be done.

Cc: Stephane Eranian eran...@google.com
Cc: Robert Richter robert.rich...@amd.com
Signed-off-by: Namhyung Kim namhy...@kernel.org
---
 tools/perf/util/header.c | 319 +--
 1 file changed, 308 insertions(+), 11 deletions(-)

diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index ad72b2814ba8..d74b58d4105d 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -22,6 +22,7 @@
 #include cpumap.h
 #include pmu.h
 #include vdso.h
+#include strbuf.h
 
 static bool no_buildid_cache = false;
 
@@ -1673,6 +1674,99 @@ static int process_build_id(struct perf_file_section 
*section,
return 0;
 }
 
+static int process_hostname(struct perf_file_section *section __maybe_unused,
+   struct perf_header *ph, int feat __maybe_unused,
+   int fd, void *data __maybe_unused)
+{
+   ph-env.hostname = do_read_string(fd, ph);
+   return ph-env.hostname ? 0 : -ENOMEM;
+}
+
+static int process_osrelease(struct perf_file_section *section __maybe_unused,
+struct perf_header *ph, int feat __maybe_unused,
+int fd, void *data __maybe_unused)
+{
+   ph-env.os_release = do_read_string(fd, ph);
+   return ph-env.os_release ? 0 : -ENOMEM;
+}
+
+static int process_version(struct perf_file_section *section __maybe_unused,
+  struct perf_header *ph, int feat __maybe_unused,
+  int fd, void *data __maybe_unused)
+{
+   ph-env.version = do_read_string(fd, ph);
+   return ph-env.version ? 0 : -ENOMEM;
+}
+
+static int process_arch(struct perf_file_section *section __maybe_unused,
+   struct perf_header *ph, int feat __maybe_unused,
+   int fd, void *data __maybe_unused)
+{
+   ph-env.arch = do_read_string(fd, ph);
+   return ph-env.arch ? 0 : -ENOMEM;
+}
+
+static int process_nrcpus(struct perf_file_section *section __maybe_unused,
+ struct perf_header *ph, int feat __maybe_unused,
+ int fd, void *data __maybe_unused)
+{
+   size_t ret;
+   u32 nr;
+
+   ret = read(fd, nr, sizeof(nr));
+   if (ret != sizeof(nr))
+   return -1;
+
+   if (ph-needs_swap)
+   nr = bswap_32(nr);
+
+   ph-env.nr_cpus_online = nr;
+
+   ret = read(fd, nr, sizeof(nr));
+   if (ret != sizeof(nr))
+   return -1;
+
+   if (ph-needs_swap)
+   nr = bswap_32(nr);
+
+   ph-env.nr_cpus_avail = nr;
+   return 0;
+}
+
+static int process_cpudesc(struct perf_file_section *section __maybe_unused,
+  struct perf_header *ph, int feat __maybe_unused,
+  int fd, void *data __maybe_unused)
+{
+   ph-env.cpu_desc = do_read_string(fd, ph);
+   return ph-env.cpu_desc ? 0 : -ENOMEM;
+}
+
+static int process_cpuid(struct perf_file_section *section __maybe_unused,
+struct perf_header *ph, int feat __maybe_unused,
+int fd, void *data __maybe_unused)
+{
+   ph-env.cpuid = do_read_string(fd, ph);
+   return ph-env.cpuid ? 0 : -ENOMEM;
+}
+
+static int process_total_mem(struct perf_file_section *section __maybe_unused,
+struct perf_header *ph, int feat __maybe_unused,
+int fd, void *data __maybe_unused)
+{
+   uint64_t mem;
+   size_t ret;
+
+   ret = read(fd, mem, sizeof(mem));
+   if (ret != sizeof(mem))
+   return -1;
+
+   if (ph-needs_swap)
+   mem = bswap_64(mem);
+
+   ph-env.total_mem = mem;
+   return 0;
+}
+
 static char *read_cpuid(struct perf_header *ph, int fd)
 {
return do_read_string(fd, ph);
@@ -1728,6 +1822,208 @@ process_event_desc(struct perf_file_section *section 
__maybe_unused,
return 0;
 }
 
+static int process_cmdline(struct perf_file_section *section __maybe_unused,
+  struct perf_header *ph, int feat __maybe_unused,
+  int fd, void *data __maybe_unused)
+{
+   size_t ret;
+   char *str;
+   u32 nr, i;
+   struct strbuf sb;
+
+   ret = read(fd, nr, sizeof(nr));
+   if (ret != sizeof(nr))
+   return -1;
+
+   if (ph-needs_swap)
+   nr = bswap_32(nr);
+
+   ph-env.nr_cmdline = nr;
+   strbuf_init(sb, 128);
+
+   for (i = 0; i  nr; i++) {
+   str = do_read_string(fd, ph);
+   if (!str)
+   goto error;
+
+   /* include a NULL character at the end */
+   strbuf_add(sb, str, strlen(str) + 1);
+   free(str);
+   }
+