1c00506aaSAlex Bennéefrom __future__ import print_function 2c00506aaSAlex Bennée# 37893e42dSPhilippe Mathieu-Daudé# Test some of the system debug features with the multiarch memory 4c00506aaSAlex Bennée# test. It is a port of the original vmlinux focused test case but 5c00506aaSAlex Bennée# using the "memory" test instead. 6c00506aaSAlex Bennée# 7c00506aaSAlex Bennée# This is launched via tests/guest-debug/run-test.py 8c00506aaSAlex Bennée# 9c00506aaSAlex Bennée 10c00506aaSAlex Bennéeimport gdb 11c00506aaSAlex Bennéeimport sys 12*4d48c1bcSIlya Leoshkevichfrom test_gdbstub import main, report 13c00506aaSAlex Bennée 14c00506aaSAlex Bennée 15c00506aaSAlex Bennéedef check_step(): 16c00506aaSAlex Bennée "Step an instruction, check it moved." 17c00506aaSAlex Bennée start_pc = gdb.parse_and_eval('$pc') 18c00506aaSAlex Bennée gdb.execute("si") 19c00506aaSAlex Bennée end_pc = gdb.parse_and_eval('$pc') 20c00506aaSAlex Bennée 21c00506aaSAlex Bennée return not (start_pc == end_pc) 22c00506aaSAlex Bennée 23c00506aaSAlex Bennée 24c00506aaSAlex Bennée# 25c00506aaSAlex Bennée# Currently it's hard to create a hbreak with the pure python API and 26c00506aaSAlex Bennée# manually matching PC to symbol address is a bit flaky thanks to 27c00506aaSAlex Bennée# function prologues. However internally QEMU's gdbstub treats them 28c00506aaSAlex Bennée# the same as normal breakpoints so it will do for now. 29c00506aaSAlex Bennée# 30c00506aaSAlex Bennéedef check_break(sym_name): 31c00506aaSAlex Bennée "Setup breakpoint, continue and check we stopped." 32c00506aaSAlex Bennée sym, ok = gdb.lookup_symbol(sym_name) 33c00506aaSAlex Bennée bp = gdb.Breakpoint(sym_name, gdb.BP_BREAKPOINT) 34c00506aaSAlex Bennée 35c00506aaSAlex Bennée gdb.execute("c") 36c00506aaSAlex Bennée 37c00506aaSAlex Bennée # hopefully we came back 38c00506aaSAlex Bennée end_pc = gdb.parse_and_eval('$pc') 39c00506aaSAlex Bennée report(bp.hit_count == 1, 40c00506aaSAlex Bennée "break @ %s (%s %d hits)" % (end_pc, sym.value(), bp.hit_count)) 41c00506aaSAlex Bennée 42c00506aaSAlex Bennée bp.delete() 43c00506aaSAlex Bennée 44c00506aaSAlex Bennée 45c00506aaSAlex Bennéedef do_one_watch(sym, wtype, text): 46c00506aaSAlex Bennée 47c00506aaSAlex Bennée wp = gdb.Breakpoint(sym, gdb.BP_WATCHPOINT, wtype) 48c00506aaSAlex Bennée gdb.execute("c") 49c00506aaSAlex Bennée report_str = "%s for %s" % (text, sym) 50c00506aaSAlex Bennée 51c00506aaSAlex Bennée if wp.hit_count > 0: 52c00506aaSAlex Bennée report(True, report_str) 53c00506aaSAlex Bennée wp.delete() 54c00506aaSAlex Bennée else: 55c00506aaSAlex Bennée report(False, report_str) 56c00506aaSAlex Bennée 57c00506aaSAlex Bennée 58c00506aaSAlex Bennéedef check_watches(sym_name): 59c00506aaSAlex Bennée "Watch a symbol for any access." 60c00506aaSAlex Bennée 61c00506aaSAlex Bennée # Should hit for any read 62c00506aaSAlex Bennée do_one_watch(sym_name, gdb.WP_ACCESS, "awatch") 63c00506aaSAlex Bennée 64c00506aaSAlex Bennée # Again should hit for reads 65c00506aaSAlex Bennée do_one_watch(sym_name, gdb.WP_READ, "rwatch") 66c00506aaSAlex Bennée 67c00506aaSAlex Bennée # Finally when it is written 68c00506aaSAlex Bennée do_one_watch(sym_name, gdb.WP_WRITE, "watch") 69c00506aaSAlex Bennée 70c00506aaSAlex Bennée 71c00506aaSAlex Bennéedef run_test(): 72c00506aaSAlex Bennée "Run through the tests one by one" 73c00506aaSAlex Bennée 74c00506aaSAlex Bennée print("Checking we can step the first few instructions") 75c00506aaSAlex Bennée step_ok = 0 76c00506aaSAlex Bennée for i in range(3): 77c00506aaSAlex Bennée if check_step(): 78c00506aaSAlex Bennée step_ok += 1 79c00506aaSAlex Bennée 80c00506aaSAlex Bennée report(step_ok == 3, "single step in boot code") 81c00506aaSAlex Bennée 82c00506aaSAlex Bennée # If we get here we have missed some of the other breakpoints. 83c00506aaSAlex Bennée print("Setup catch-all for _exit") 84c00506aaSAlex Bennée cbp = gdb.Breakpoint("_exit", gdb.BP_BREAKPOINT) 85c00506aaSAlex Bennée 86c00506aaSAlex Bennée check_break("main") 87c00506aaSAlex Bennée check_watches("test_data[128]") 88c00506aaSAlex Bennée 89c00506aaSAlex Bennée report(cbp.hit_count == 0, "didn't reach backstop") 90c00506aaSAlex Bennée 91c00506aaSAlex Bennée 92*4d48c1bcSIlya Leoshkevichmain(run_test) 93