From patchwork Sun Jul 17 23:25:44 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Widawsky X-Patchwork-Id: 984952 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by demeter1.kernel.org (8.14.4/8.14.4) with ESMTP id p6HNW52s003790 for ; Sun, 17 Jul 2011 23:32:25 GMT Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 72C1B9EC15 for ; Sun, 17 Jul 2011 16:32:05 -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 9D5379E8E1; Sun, 17 Jul 2011 16:25:51 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by cloud01.chad-versace.us (Postfix) with ESMTP id EC21F1D424F; Sun, 17 Jul 2011 23:28:20 +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 Si1wO9RNyTZH; Sun, 17 Jul 2011 23:28:15 +0000 (UTC) Received: from localhost.localdomain (pool-96-250-39-22.nycmny.fios.verizon.net [96.250.39.22]) by cloud01.chad-versace.us (Postfix) with ESMTPSA id A5F871D42F2; Sun, 17 Jul 2011 23:27:55 +0000 (UTC) From: Ben Widawsky To: intel-gfx@lists.freedesktop.org Date: Sun, 17 Jul 2011 16:25:44 -0700 Message-Id: <1310945148-6777-7-git-send-email-ben@bwidawsk.net> X-Mailer: git-send-email 1.7.6 In-Reply-To: <1310945148-6777-1-git-send-email-ben@bwidawsk.net> References: <1310945148-6777-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 (demeter1.kernel.org [140.211.167.41]); Sun, 17 Jul 2011 23:32:25 +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..05fc832 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 intel_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; }