1*6acc5c04SPhilippe Mathieu-Daudé# 2c900ef86SDr. David Alan Gilbert# GDB debugging support: aio/iohandler debug 3c900ef86SDr. David Alan Gilbert# 4c900ef86SDr. David Alan Gilbert# Copyright (c) 2015 Red Hat, Inc. 5c900ef86SDr. David Alan Gilbert# 6c900ef86SDr. David Alan Gilbert# Author: Dr. David Alan Gilbert <dgilbert@redhat.com> 7c900ef86SDr. David Alan Gilbert# 8c900ef86SDr. David Alan Gilbert# This work is licensed under the terms of the GNU GPL, version 2 or 9c900ef86SDr. David Alan Gilbert# later. See the COPYING file in the top-level directory. 10c900ef86SDr. David Alan Gilbert# 11c900ef86SDr. David Alan Gilbert 12c900ef86SDr. David Alan Gilbertimport gdb 13c900ef86SDr. David Alan Gilbertfrom qemugdb import coroutine 14c900ef86SDr. David Alan Gilbert 15c900ef86SDr. David Alan Gilbertdef isnull(ptr): 16c900ef86SDr. David Alan Gilbert return ptr == gdb.Value(0).cast(ptr.type) 17c900ef86SDr. David Alan Gilbert 18c900ef86SDr. David Alan Gilbertdef dump_aiocontext(context, verbose): 19c900ef86SDr. David Alan Gilbert '''Display a dump and backtrace for an aiocontext''' 20c900ef86SDr. David Alan Gilbert cur = context['aio_handlers']['lh_first'] 21c900ef86SDr. David Alan Gilbert # Get pointers to functions we're going to process specially 22c900ef86SDr. David Alan Gilbert sym_fd_coroutine_enter = gdb.parse_and_eval('fd_coroutine_enter') 23c900ef86SDr. David Alan Gilbert 24c900ef86SDr. David Alan Gilbert while not isnull(cur): 25c900ef86SDr. David Alan Gilbert entry = cur.dereference() 26c900ef86SDr. David Alan Gilbert gdb.write('----\n%s\n' % entry) 27c900ef86SDr. David Alan Gilbert if verbose and cur['io_read'] == sym_fd_coroutine_enter: 28c900ef86SDr. David Alan Gilbert coptr = (cur['opaque'].cast(gdb.lookup_type('FDYieldUntilData').pointer()))['co'] 29c900ef86SDr. David Alan Gilbert coptr = coptr.cast(gdb.lookup_type('CoroutineUContext').pointer()) 30c900ef86SDr. David Alan Gilbert coroutine.bt_jmpbuf(coptr['env']['__jmpbuf']) 31c900ef86SDr. David Alan Gilbert cur = cur['node']['le_next']; 32c900ef86SDr. David Alan Gilbert 33c900ef86SDr. David Alan Gilbert gdb.write('----\n') 34c900ef86SDr. David Alan Gilbert 35c900ef86SDr. David Alan Gilbertclass HandlersCommand(gdb.Command): 36c900ef86SDr. David Alan Gilbert '''Display aio handlers''' 37c900ef86SDr. David Alan Gilbert def __init__(self): 38c900ef86SDr. David Alan Gilbert gdb.Command.__init__(self, 'qemu handlers', gdb.COMMAND_DATA, 39c900ef86SDr. David Alan Gilbert gdb.COMPLETE_NONE) 40c900ef86SDr. David Alan Gilbert 41c900ef86SDr. David Alan Gilbert def invoke(self, arg, from_tty): 42c900ef86SDr. David Alan Gilbert verbose = False 43c900ef86SDr. David Alan Gilbert argv = gdb.string_to_argv(arg) 44c900ef86SDr. David Alan Gilbert 45c900ef86SDr. David Alan Gilbert if len(argv) > 0 and argv[0] == '--verbose': 46c900ef86SDr. David Alan Gilbert verbose = True 47c900ef86SDr. David Alan Gilbert argv.pop(0) 48c900ef86SDr. David Alan Gilbert 49c900ef86SDr. David Alan Gilbert if len(argv) > 1: 50c900ef86SDr. David Alan Gilbert gdb.write('usage: qemu handlers [--verbose] [handler]\n') 51c900ef86SDr. David Alan Gilbert return 52c900ef86SDr. David Alan Gilbert 53c900ef86SDr. David Alan Gilbert if len(argv) == 1: 54c900ef86SDr. David Alan Gilbert handlers_name = argv[0] 55c900ef86SDr. David Alan Gilbert else: 56c900ef86SDr. David Alan Gilbert handlers_name = 'qemu_aio_context' 57c900ef86SDr. David Alan Gilbert dump_aiocontext(gdb.parse_and_eval(handlers_name), verbose) 58