tcg.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. #
  4. # GDB debugging support, TCG status
  5. #
  6. # Copyright 2016 Linaro Ltd
  7. #
  8. # Authors:
  9. # Alex Bennée <alex.bennee@linaro.org>
  10. #
  11. # This work is licensed under the terms of the GNU GPL, version 2. See
  12. # the COPYING file in the top-level directory.
  13. #
  14. # Contributions after 2012-01-13 are licensed under the terms of the
  15. # GNU GPL, version 2 or (at your option) any later version.
  16. # 'qemu tcg-lock-status' -- display the TCG lock status across threads
  17. import gdb
  18. class TCGLockStatusCommand(gdb.Command):
  19. '''Display TCG Execution Status'''
  20. def __init__(self):
  21. gdb.Command.__init__(self, 'qemu tcg-lock-status', gdb.COMMAND_DATA,
  22. gdb.COMPLETE_NONE)
  23. def invoke(self, arg, from_tty):
  24. gdb.write("Thread, BQL (iothread_mutex), Replay, Blocked?\n")
  25. for thread in gdb.inferiors()[0].threads():
  26. thread.switch()
  27. iothread = gdb.parse_and_eval("iothread_locked")
  28. replay = gdb.parse_and_eval("replay_locked")
  29. frame = gdb.selected_frame()
  30. if frame.name() == "__lll_lock_wait":
  31. frame.older().select()
  32. mutex = gdb.parse_and_eval("mutex")
  33. owner = gdb.parse_and_eval("mutex->__data.__owner")
  34. blocked = ("__lll_lock_wait waiting on %s from %d" %
  35. (mutex, owner))
  36. else:
  37. blocked = "not blocked"
  38. gdb.write("%d/%d, %s, %s, %s\n" % (thread.num, thread.ptid[1],
  39. iothread, replay, blocked))