1df3ca223SAlex Bennéefrom __future__ import print_function 2df3ca223SAlex Bennée# 3df3ca223SAlex Bennée# A very simple smoke test for debugging the SHA1 userspace test on 4df3ca223SAlex Bennée# each target. 5df3ca223SAlex Bennée# 6df3ca223SAlex Bennée# This is launched via tests/guest-debug/run-test.py 7df3ca223SAlex Bennée# 8df3ca223SAlex Bennée 9df3ca223SAlex Bennéeimport gdb 10df3ca223SAlex Bennéeimport sys 11df3ca223SAlex Bennée 12df3ca223SAlex Bennéeinitial_vlen = 0 13df3ca223SAlex Bennéefailcount = 0 14df3ca223SAlex Bennée 15df3ca223SAlex Bennéedef report(cond, msg): 16df3ca223SAlex Bennée "Report success/fail of test" 17df3ca223SAlex Bennée if cond: 18df3ca223SAlex Bennée print("PASS: %s" % (msg)) 19df3ca223SAlex Bennée else: 20df3ca223SAlex Bennée print("FAIL: %s" % (msg)) 21df3ca223SAlex Bennée global failcount 22df3ca223SAlex Bennée failcount += 1 23df3ca223SAlex Bennée 24df3ca223SAlex Bennéedef check_break(sym_name): 25df3ca223SAlex Bennée "Setup breakpoint, continue and check we stopped." 26df3ca223SAlex Bennée sym, ok = gdb.lookup_symbol(sym_name) 27df3ca223SAlex Bennée bp = gdb.Breakpoint(sym_name) 28df3ca223SAlex Bennée 29df3ca223SAlex Bennée gdb.execute("c") 30df3ca223SAlex Bennée 31df3ca223SAlex Bennée # hopefully we came back 32df3ca223SAlex Bennée end_pc = gdb.parse_and_eval('$pc') 33df3ca223SAlex Bennée report(bp.hit_count == 1, 34df3ca223SAlex Bennée "break @ %s (%s %d hits)" % (end_pc, sym.value(), bp.hit_count)) 35df3ca223SAlex Bennée 36df3ca223SAlex Bennée bp.delete() 37df3ca223SAlex Bennée 38df3ca223SAlex Bennéedef run_test(): 39df3ca223SAlex Bennée "Run through the tests one by one" 40df3ca223SAlex Bennée 41df3ca223SAlex Bennée check_break("SHA1Init") 42df3ca223SAlex Bennée 43*1cb8d12fSAlex Bennée # Check step and inspect values. We do a double next after the 44*1cb8d12fSAlex Bennée # breakpoint as depending on the version of gdb we may step the 45*1cb8d12fSAlex Bennée # preamble and not the first actual line of source. 46*1cb8d12fSAlex Bennée gdb.execute("next") 47df3ca223SAlex Bennée gdb.execute("next") 48df3ca223SAlex Bennée val_ctx = gdb.parse_and_eval("context->state[0]") 49df3ca223SAlex Bennée exp_ctx = 0x67452301 50df3ca223SAlex Bennée report(int(val_ctx) == exp_ctx, "context->state[0] == %x" % exp_ctx); 51df3ca223SAlex Bennée 52df3ca223SAlex Bennée gdb.execute("next") 53df3ca223SAlex Bennée val_ctx = gdb.parse_and_eval("context->state[1]") 54df3ca223SAlex Bennée exp_ctx = 0xEFCDAB89 55df3ca223SAlex Bennée report(int(val_ctx) == exp_ctx, "context->state[1] == %x" % exp_ctx); 56df3ca223SAlex Bennée 57df3ca223SAlex Bennée # finally check we don't barf inspecting registers 58df3ca223SAlex Bennée gdb.execute("info registers") 59df3ca223SAlex Bennée 60df3ca223SAlex Bennée# 61df3ca223SAlex Bennée# This runs as the script it sourced (via -x, via run-test.py) 62df3ca223SAlex Bennée# 63df3ca223SAlex Bennéetry: 64df3ca223SAlex Bennée inferior = gdb.selected_inferior() 65df3ca223SAlex Bennée arch = inferior.architecture() 66df3ca223SAlex Bennée print("ATTACHED: %s" % arch.name()) 67df3ca223SAlex Bennéeexcept (gdb.error, AttributeError): 68df3ca223SAlex Bennée print("SKIPPING (not connected)", file=sys.stderr) 69df3ca223SAlex Bennée exit(0) 70df3ca223SAlex Bennée 718ec6f331SAlex Bennéeif gdb.parse_and_eval('$pc') == 0: 728ec6f331SAlex Bennée print("SKIP: PC not set") 738ec6f331SAlex Bennée exit(0) 748ec6f331SAlex Bennée 75df3ca223SAlex Bennéetry: 76df3ca223SAlex Bennée # These are not very useful in scripts 77df3ca223SAlex Bennée gdb.execute("set pagination off") 78df3ca223SAlex Bennée gdb.execute("set confirm off") 79df3ca223SAlex Bennée 80df3ca223SAlex Bennée # Run the actual tests 81df3ca223SAlex Bennée run_test() 82df3ca223SAlex Bennéeexcept (gdb.error): 83df3ca223SAlex Bennée print ("GDB Exception: %s" % (sys.exc_info()[0])) 84df3ca223SAlex Bennée failcount += 1 85df3ca223SAlex Bennée pass 86df3ca223SAlex Bennée 87df3ca223SAlex Bennéeprint("All tests complete: %d failures" % failcount) 88df3ca223SAlex Bennéeexit(failcount) 89