forked from AlexAltea/orbital-qemu
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
scripts/qemu-gdb/timers.py: new helper to dump timer state
This introduces the qemu-gdb command "qemu timers" which will dump the state of the main timers in the system. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
- Loading branch information
Showing
2 changed files
with
56 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
#!/usr/bin/python | ||
# GDB debugging support | ||
# | ||
# Copyright 2017 Linaro Ltd | ||
# | ||
# Author: Alex Bennée <alex.bennee@linaro.org> | ||
# | ||
# This work is licensed under the terms of the GNU GPL, version 2. See | ||
# the COPYING file in the top-level directory. | ||
|
||
# 'qemu timers' -- display the current timerlists | ||
|
||
import gdb | ||
|
||
class TimersCommand(gdb.Command): | ||
'''Display the current QEMU timers''' | ||
|
||
def __init__(self): | ||
'Register the class as a gdb command' | ||
gdb.Command.__init__(self, 'qemu timers', gdb.COMMAND_DATA, | ||
gdb.COMPLETE_NONE) | ||
|
||
def dump_timers(self, timer): | ||
"Follow a timer and recursively dump each one in the list." | ||
# timer should be of type QemuTimer | ||
gdb.write(" timer %s/%s (cb:%s,opq:%s)\n" % ( | ||
timer['expire_time'], | ||
timer['scale'], | ||
timer['cb'], | ||
timer['opaque'])) | ||
|
||
if int(timer['next']) > 0: | ||
self.dump_timers(timer['next']) | ||
|
||
|
||
def process_timerlist(self, tlist, ttype): | ||
gdb.write("Processing %s timers\n" % (ttype)) | ||
gdb.write(" clock %s is enabled:%s, last:%s\n" % ( | ||
tlist['clock']['type'], | ||
tlist['clock']['enabled'], | ||
tlist['clock']['last'])) | ||
if int(tlist['active_timers']) > 0: | ||
self.dump_timers(tlist['active_timers']) | ||
|
||
|
||
def invoke(self, arg, from_tty): | ||
'Run the command' | ||
main_timers = gdb.parse_and_eval("main_loop_tlg") | ||
|
||
# This will break if QEMUClockType in timer.h is redfined | ||
self.process_timerlist(main_timers['tl'][0], "Realtime") | ||
self.process_timerlist(main_timers['tl'][1], "Virtual") | ||
self.process_timerlist(main_timers['tl'][2], "Host") | ||
self.process_timerlist(main_timers['tl'][3], "Virtual RT") |