1#!/usr/bin/python 2# -*- coding: utf-8 -*- 3# GDB debugging support 4# 5# Copyright 2017 Linaro Ltd 6# 7# Author: Alex Bennée <alex.bennee@linaro.org> 8# 9# This work is licensed under the terms of the GNU GPL, version 2 or later. 10# See the COPYING file in the top-level directory. 11# 12# SPDX-License-Identifier: GPL-2.0-or-later 13 14# 'qemu timers' -- display the current timerlists 15 16import gdb 17 18class TimersCommand(gdb.Command): 19 '''Display the current QEMU timers''' 20 21 def __init__(self): 22 'Register the class as a gdb command' 23 gdb.Command.__init__(self, 'qemu timers', gdb.COMMAND_DATA, 24 gdb.COMPLETE_NONE) 25 26 def dump_timers(self, timer): 27 "Follow a timer and recursively dump each one in the list." 28 # timer should be of type QemuTimer 29 gdb.write(" timer %s/%s (cb:%s,opq:%s)\n" % ( 30 timer['expire_time'], 31 timer['scale'], 32 timer['cb'], 33 timer['opaque'])) 34 35 if int(timer['next']) > 0: 36 self.dump_timers(timer['next']) 37 38 39 def process_timerlist(self, tlist, ttype): 40 gdb.write("Processing %s timers\n" % (ttype)) 41 gdb.write(" clock %s is enabled:%s, last:%s\n" % ( 42 tlist['clock']['type'], 43 tlist['clock']['enabled'], 44 tlist['clock']['last'])) 45 if int(tlist['active_timers']) > 0: 46 self.dump_timers(tlist['active_timers']) 47 48 49 def invoke(self, arg, from_tty): 50 'Run the command' 51 main_timers = gdb.parse_and_eval("main_loop_tlg") 52 53 # This will break if QEMUClockType in timer.h is redfined 54 self.process_timerlist(main_timers['tl'][0], "Realtime") 55 self.process_timerlist(main_timers['tl'][1], "Virtual") 56 self.process_timerlist(main_timers['tl'][2], "Host") 57 self.process_timerlist(main_timers['tl'][3], "Virtual RT") 58