|
@@ -119,3 +119,38 @@ def is_target_arch(arch):
|
|
|
if target_arch is None:
|
|
|
target_arch = gdb.execute("show architecture", to_string=True)
|
|
|
return arch in target_arch
|
|
|
+
|
|
|
+
|
|
|
+GDBSERVER_QEMU = 0
|
|
|
+GDBSERVER_KGDB = 1
|
|
|
+gdbserver_type = None
|
|
|
+
|
|
|
+
|
|
|
+def get_gdbserver_type():
|
|
|
+ def exit_handler(event):
|
|
|
+ global gdbserver_type
|
|
|
+ gdbserver_type = None
|
|
|
+ gdb.events.exited.disconnect(exit_handler)
|
|
|
+
|
|
|
+ def probe_qemu():
|
|
|
+ try:
|
|
|
+ return gdb.execute("monitor info version", to_string=True) != ""
|
|
|
+ except:
|
|
|
+ return False
|
|
|
+
|
|
|
+ def probe_kgdb():
|
|
|
+ try:
|
|
|
+ thread_info = gdb.execute("info thread 2", to_string=True)
|
|
|
+ return "shadowCPU0" in thread_info
|
|
|
+ except:
|
|
|
+ return False
|
|
|
+
|
|
|
+ global gdbserver_type
|
|
|
+ if gdbserver_type is None:
|
|
|
+ if probe_qemu():
|
|
|
+ gdbserver_type = GDBSERVER_QEMU
|
|
|
+ elif probe_kgdb():
|
|
|
+ gdbserver_type = GDBSERVER_KGDB
|
|
|
+ if not gdbserver_type is None and hasattr(gdb, 'events'):
|
|
|
+ gdb.events.exited.connect(exit_handler)
|
|
|
+ return gdbserver_type
|