From patchwork Thu Jul 31 13:06:24 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Alex_Benn=C3=A9e?= X-Patchwork-Id: 34644 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-pd0-f199.google.com (mail-pd0-f199.google.com [209.85.192.199]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 5EB0620792 for ; Thu, 31 Jul 2014 13:25:05 +0000 (UTC) Received: by mail-pd0-f199.google.com with SMTP id ft15sf15734407pdb.2 for ; Thu, 31 Jul 2014 06:25:01 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:date:message-id:in-reply-to :references:mime-version:cc:subject:precedence:list-id :list-unsubscribe:list-archive:list-post:list-help:list-subscribe :errors-to:sender:x-original-sender :x-original-authentication-results:mailing-list:content-type :content-transfer-encoding; bh=FBesAAyWv2jiLGXdRrkcnB5JUSWG7uCtOAvAd2s9BwU=; b=SCs34eM9ES9Haom6juqYbG9JJ2fTSoiFtrrb0QU6uQviOAc1en8569d7suJriJV8Uc Hht9atDY6+pM7gwjrHKdR2yRAaFWb50wfqyaxJ9foUGkfbBdYKqUfg2uTD+22xm4LPHi iWyMPLuv0SyqVOlwlKDXDFqAH+qwHGMdj2QtO4HqmYj6HsfP9xeg5KqPRyW9LUg4fgf8 R3RtxoKJ8EpnmrpUGSgWRdbof3gzOyIqpKPJmwBw1S0Ca3Cf1DmaXxdd8y2qB+JXFHS+ PC1JHvSjoIBrGhRBOiBGl+/krYE2QtquXxMdwYI9+uA4twCLsYT2ZABbfAe8OXDl5hkg ocYA== X-Gm-Message-State: ALoCoQkaNblwfroXOmhu0Cb4Aa67qwVER+XZSz7YZOOqJK0voq9a6gbKtXZxsFOlaYuZJXhsYYTn X-Received: by 10.66.150.162 with SMTP id uj2mr1079676pab.6.1406813101762; Thu, 31 Jul 2014 06:25:01 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.48.132 with SMTP id o4ls953148qga.40.gmail; Thu, 31 Jul 2014 06:25:01 -0700 (PDT) X-Received: by 10.221.41.135 with SMTP id tu7mr10886274vcb.70.1406813101598; Thu, 31 Jul 2014 06:25:01 -0700 (PDT) Received: from mail-vc0-f180.google.com (mail-vc0-f180.google.com [209.85.220.180]) by mx.google.com with ESMTPS id cu6si4331667vdc.20.2014.07.31.06.25.01 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 31 Jul 2014 06:25:01 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.180 as permitted sender) client-ip=209.85.220.180; Received: by mail-vc0-f180.google.com with SMTP id ij19so4164001vcb.11 for ; Thu, 31 Jul 2014 06:25:01 -0700 (PDT) X-Received: by 10.220.97.5 with SMTP id j5mr12538069vcn.16.1406813101502; Thu, 31 Jul 2014 06:25:01 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.221.37.5 with SMTP id tc5csp18088vcb; Thu, 31 Jul 2014 06:25:01 -0700 (PDT) X-Received: by 10.229.231.74 with SMTP id jp10mr18271502qcb.29.1406813100847; Thu, 31 Jul 2014 06:25:00 -0700 (PDT) Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id t7si5133279qgd.100.2014.07.31.06.25.00 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Thu, 31 Jul 2014 06:25:00 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) client-ip=2001:4830:134:3::11; Received: from localhost ([::1]:56660 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XCqLs-0005hr-D8 for patch@linaro.org; Thu, 31 Jul 2014 09:25:00 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51568) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XCq4G-000059-FE for qemu-devel@nongnu.org; Thu, 31 Jul 2014 09:06:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XCq46-0001Dq-60 for qemu-devel@nongnu.org; Thu, 31 Jul 2014 09:06:48 -0400 Received: from static.88-198-71-155.clients.your-server.de ([88.198.71.155]:50083 helo=socrates.bennee.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XCq45-0001Dg-UZ for qemu-devel@nongnu.org; Thu, 31 Jul 2014 09:06:38 -0400 Received: from localhost ([127.0.0.1] helo=zen.linaro.local) by socrates.bennee.com with esmtp (Exim 4.80) (envelope-from ) id 1XCqDw-0002HE-IZ; Thu, 31 Jul 2014 15:16:48 +0200 From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: qemu-devel@nongnu.org Date: Thu, 31 Jul 2014 14:06:24 +0100 Message-Id: <1406811992-6766-2-git-send-email-alex.bennee@linaro.org> X-Mailer: git-send-email 2.0.3 In-Reply-To: <1406811992-6766-1-git-send-email-alex.bennee@linaro.org> References: <1406811992-6766-1-git-send-email-alex.bennee@linaro.org> MIME-Version: 1.0 X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: alex.bennee@linaro.org X-SA-Exim-Scanned: No (on socrates.bennee.com); SAEximRunCond expanded to false X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 88.198.71.155 Cc: =?UTF-8?q?Alex=20Benn=C3=A9e?= , l@dorileo.org, Anthony Liguori Subject: [Qemu-devel] [PATCH v3 1/9] tcg: add ability to dump /tmp/perf-.map files X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: , List-Help: , List-Subscribe: , Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: qemu-devel-bounces+patch=linaro.org@nongnu.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: alex.bennee@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.180 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 This allows the perf tool to map samples to each individual translation block. This could be expanded for user space but currently it gives enough information to find any hotblocks by other means. Signed-off-by: Alex Bennée --- v2: - hoist up into translate-all.c - don't use pointless glib wrappers - use proper format types for portability - mark prologue/epilog area - rebase v3: - fix bracket for perf-map - find an include for the tb_enable_perfmap() declaration - checkpatch clean-ups diff --git a/include/qemu-common.h b/include/qemu-common.h index 6ef8282..ce57884 100644 --- a/include/qemu-common.h +++ b/include/qemu-common.h @@ -259,6 +259,8 @@ typedef struct PCIHostDeviceAddress { void tcg_exec_init(unsigned long tb_size); bool tcg_enabled(void); +void tb_enable_perfmap(void); + void cpu_exec_init_all(void); /* CPU save/load. */ diff --git a/qemu-options.hx b/qemu-options.hx index 1549625..3defba8 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -3348,6 +3348,16 @@ Dump json-encoded vmstate information for current machine type to file in @var{file} ETEXI +DEF("perfmap", 0, QEMU_OPTION_PERFMAP, \ + "-perfmap generate a /tmp/perf-${pid}.map file for perf\n", + QEMU_ARCH_ALL) +STEXI +@item -perfmap +@findex -perfmap +This will cause QEMU to generate a map file for Linux perf tools that will allow +basic profiling information to be broken down into basic blocks. +ETEXI + HXCOMM This is the last statement. Insert new options before this line! STEXI @end table diff --git a/translate-all.c b/translate-all.c index 8f7e11b..2af0774 100644 --- a/translate-all.c +++ b/translate-all.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "config.h" @@ -129,6 +130,24 @@ static void tb_link_page(TranslationBlock *tb, tb_page_addr_t phys_pc, tb_page_addr_t phys_page2); static TranslationBlock *tb_find_pc(uintptr_t tc_ptr); +static FILE *tb_perfmap; + +void tb_enable_perfmap(void) +{ + gchar *map_file = g_strdup_printf("/tmp/perf-%d.map", getpid()); + tb_perfmap = fopen(map_file, "w"); + g_free(map_file); +} + +static void tb_write_perfmap(tcg_insn_unit *start, int size, target_ulong pc) +{ + if (tb_perfmap) { + fprintf(tb_perfmap, + "%"PRIxPTR" %x subject-"TARGET_FMT_lx"\n", + (uintptr_t) start, size, pc); + } +} + void cpu_gen_init(void) { tcg_context_init(&tcg_ctx); @@ -184,6 +203,7 @@ int cpu_gen_code(CPUArchState *env, TranslationBlock *tb, int *gen_code_size_ptr s->code_out_len += gen_code_size; #endif + tb_write_perfmap(gen_code_buf, gen_code_size, tb->pc); #ifdef DEBUG_DISAS if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM)) { qemu_log("OUT: [size=%d]\n", gen_code_size); @@ -670,6 +690,12 @@ static inline void code_gen_alloc(size_t tb_size) tcg_ctx.code_gen_buffer_size - 1024; tcg_ctx.code_gen_buffer_size -= 1024; + if (tb_perfmap) { + fprintf(tb_perfmap, + "%"PRIxPTR" %x tcg-prologue-buffer\n", + (uintptr_t) tcg_ctx.code_gen_prologue, 1024); + } + tcg_ctx.code_gen_buffer_max_size = tcg_ctx.code_gen_buffer_size - (TCG_MAX_OP_SIZE * OPC_BUF_SIZE); tcg_ctx.code_gen_max_blocks = tcg_ctx.code_gen_buffer_size / diff --git a/vl.c b/vl.c index fe451aa..f07f6e0 100644 --- a/vl.c +++ b/vl.c @@ -118,6 +118,7 @@ int main(int argc, char **argv) #include "qapi/opts-visitor.h" #include "qom/object_interfaces.h" #include "qapi-event.h" +#include "qemu-common.h" #define DEFAULT_RAM_SIZE 128 @@ -3385,6 +3386,9 @@ int main(int argc, char **argv, char **envp) case QEMU_OPTION_D: log_file = optarg; break; + case QEMU_OPTION_PERFMAP: + tb_enable_perfmap(); + break; case QEMU_OPTION_s: add_device_config(DEV_GDB, "tcp::" DEFAULT_GDBSTUB_PORT); break;