From patchwork Wed Jul 13 20:51:48 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Widawsky X-Patchwork-Id: 973372 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by demeter2.kernel.org (8.14.4/8.14.4) with ESMTP id p6DKwnu4029363 for ; Wed, 13 Jul 2011 20:59:09 GMT Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5C1DEA0B82 for ; Wed, 13 Jul 2011 13:58:49 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from cloud01.chad-versace.us (184-106-247-128.static.cloud-ips.com [184.106.247.128]) by gabe.freedesktop.org (Postfix) with ESMTP id 1293CA0B0F; Wed, 13 Jul 2011 13:52:21 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by cloud01.chad-versace.us (Postfix) with ESMTP id CE8491D42F1; Wed, 13 Jul 2011 20:54:46 +0000 (UTC) X-Virus-Scanned: amavisd-new at static.cloud-ips.com X-Spam-Flag: NO X-Spam-Score: -1 X-Spam-Level: X-Spam-Status: No, score=-1 tagged_above=-100 required=5 tests=[ALL_TRUSTED=-1] autolearn=ham Received: from cloud01.chad-versace.us ([127.0.0.1]) by localhost (cloud01.static.cloud-ips.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id sNMPvwcbAlVR; Wed, 13 Jul 2011 20:54:31 +0000 (UTC) Received: from localhost.localdomain (jfdmzpr03-ext.jf.intel.com [134.134.139.72]) by cloud01.chad-versace.us (Postfix) with ESMTPSA id 013FA1D42FF; Wed, 13 Jul 2011 20:53:59 +0000 (UTC) From: Ben Widawsky To: intel-gfx@lists.freedesktop.org Date: Wed, 13 Jul 2011 13:51:48 -0700 Message-Id: <1310590312-21669-7-git-send-email-ben@bwidawsk.net> X-Mailer: git-send-email 1.7.6 In-Reply-To: <1310590312-21669-1-git-send-email-ben@bwidawsk.net> References: <1310590312-21669-1-git-send-email-ben@bwidawsk.net> Cc: mesa-dev@lists.freedesktop.org, Ben Widawsky Subject: [Intel-gfx] [PATCH 06/10] i965: attach to a listening debugger X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: intel-gfx-bounces+patchwork-intel-gfx=patchwork.kernel.org@lists.freedesktop.org Errors-To: intel-gfx-bounces+patchwork-intel-gfx=patchwork.kernel.org@lists.freedesktop.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter2.kernel.org [140.211.167.43]); Wed, 13 Jul 2011 20:59:09 +0000 (UTC) Use unix domain sockets to connect to a debugger and send the information the debugger will use to properly handle debug events. Signed-off-by: Ben Widawsky --- src/mesa/drivers/dri/i965/brw_wm_debug.c | 85 ++++++++++++++++++++++++++++- 1 files changed, 82 insertions(+), 3 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_wm_debug.c b/src/mesa/drivers/dri/i965/brw_wm_debug.c index cacb24a..a231d87 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_debug.c +++ b/src/mesa/drivers/dri/i965/brw_wm_debug.c @@ -175,12 +175,82 @@ void brw_wm_print_program( struct brw_wm_compile *c, } #define SCRATCH_SIZE (512 * 1024) +#ifndef NO_DEBUGGER_LISTENING +#include +#include +#include +#include "intel_debug.h" + +static int +attach_to_debugger() +{ + struct sockaddr_un addr; + int fd, ret; + + fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd == -1) + return -1; + + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + strncpy(addr.sun_path, SHADER_DEBUG_SOCKET, sizeof(addr.sun_path) - 1); + + ret = connect(fd, &addr, sizeof(addr)); + if (ret) + return ret; + + return fd; +} + +static int +start_debugger(int fd, int flink_handle) +{ + struct debug_handshake dh; + int reply, ret; + + dh.version = DEBUG_HANDSHAKE_VERSION; + dh.flink_handle = flink_handle; + dh.per_thread_scratch = SCRATCH_SIZE; + ret = write(fd, &dh, sizeof(dh)); + if (ret != sizeof(dh)) { + ret = -1; + goto done; + } + + ret = read(fd, &reply, sizeof(reply)); + if (ret != sizeof(reply)) { + ret = -1; + goto done; + } + + if (strncmp(DEBUG_HANDSHAKE_ACK, (char *)&reply, strlen(DEBUG_HANDSHAKE_ACK))) { + ret = 1; + goto done; + } + + ret = 0; + +done: + close(fd); + return ret; +} +#endif + void brw_wm_init_debug( struct brw_context *brw ) { struct intel_context *intel = &brw->intel; uint32_t name; + int debugger_fd; int ret; + /* Simple system routines do not need a debugger present */ + #ifndef NO_DEBUGGER_LISTENING + if ((debugger_fd = attach_to_debugger()) < 0) { + fprintf(stderr, "Failed to attach to debugger\n"); + return; + } + #endif + /* In the debug case, we allocate the buffer now because we'll need to attach * with the debugger at a later time when flink will not work (the ring / * struct_mutex are likely to be frozen). If we make the buffer visible early @@ -192,12 +262,21 @@ void brw_wm_init_debug( struct brw_context *brw ) 4096); assert(brw->wm.scratch_bo); + ret = drm_intel_bo_flink(brw->wm.scratch_bo, &name); + assert(ret == 0); + + #ifndef NO_DEBUGGER_LISTENING + ret = start_debugger(debugger_fd, name); + if (ret != 0) { + drm_intel_bo_unreference(brw->wm.scratch_bo); + return; + } + #endif + + /* Put a nice pattern in the buffer to hopefully help detect errors */ drm_intel_bo_map(brw->wm.scratch_bo, 0); memset(brw->wm.scratch_bo->virtual, 0xa5, SCRATCH_SIZE * brw->wm_max_threads); drm_intel_bo_unmap(brw->wm.scratch_bo); - ret = drm_intel_bo_flink(brw->wm.scratch_bo, &name); - assert(ret == 0); - brw->wm.debugging = true; }