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