From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ben Widawsky Subject: [PATCH 06/10] i965: attach to a listening debugger Date: Sun, 17 Jul 2011 16:25:44 -0700 Message-ID: <1310945148-6777-7-git-send-email-ben@bwidawsk.net> References: <1310945148-6777-1-git-send-email-ben@bwidawsk.net> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1310945148-6777-1-git-send-email-ben@bwidawsk.net> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: intel-gfx-bounces+gcfxdi-intel-gfx=m.gmane.org@lists.freedesktop.org Errors-To: intel-gfx-bounces+gcfxdi-intel-gfx=m.gmane.org@lists.freedesktop.org To: intel-gfx@lists.freedesktop.org Cc: mesa-dev@lists.freedesktop.org, Ben Widawsky List-Id: intel-gfx@lists.freedesktop.org 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; } -- 1.7.6