Skip to content

Commit e5b18f4

Browse files
committed
Remote sense gdb stub, binja UI works with mame coleco
1 parent 3578bb5 commit e5b18f4

File tree

3 files changed

+45
-21
lines changed

3 files changed

+45
-21
lines changed

DebugAdapter.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class ADAPTER_TYPE(Enum):
2121
REMOTE_DBGENG = auto()
2222
REMOTE_GDB = auto()
2323
REMOTE_LLDB = auto()
24+
REMOTE_SENSE = auto()
2425

2526
@staticmethod
2627
def use_exec(adapter_type):
@@ -36,7 +37,8 @@ def use_connect(adapter_type):
3637
return adapter_type in [
3738
ADAPTER_TYPE.REMOTE_DBGENG,
3839
ADAPTER_TYPE.REMOTE_GDB,
39-
ADAPTER_TYPE.REMOTE_LLDB
40+
ADAPTER_TYPE.REMOTE_LLDB,
41+
ADAPTER_TYPE.REMOTE_SENSE
4042
]
4143

4244
@staticmethod
@@ -50,6 +52,7 @@ def can_use(adapter_type):
5052
ADAPTER_TYPE.REMOTE_DBGENG,
5153
ADAPTER_TYPE.REMOTE_GDB,
5254
ADAPTER_TYPE.REMOTE_LLDB,
55+
ADAPTER_TYPE.REMOTE_SENSE
5356
]
5457
elif system == 'Linux':
5558
return adapter_type in [
@@ -58,6 +61,7 @@ def can_use(adapter_type):
5861
ADAPTER_TYPE.REMOTE_DBGENG,
5962
ADAPTER_TYPE.REMOTE_GDB,
6063
ADAPTER_TYPE.REMOTE_LLDB,
64+
ADAPTER_TYPE.REMOTE_SENSE
6165
]
6266
elif system == 'Darwin':
6367
return adapter_type in [
@@ -66,6 +70,7 @@ def can_use(adapter_type):
6670
ADAPTER_TYPE.REMOTE_DBGENG,
6771
ADAPTER_TYPE.REMOTE_GDB,
6872
ADAPTER_TYPE.REMOTE_LLDB,
73+
ADAPTER_TYPE.REMOTE_SENSE
6974
]
7075
else:
7176
return False
@@ -93,6 +98,8 @@ def get_new_adapter(adapter_type = ADAPTER_TYPE.DEFAULT, **kwargs):
9398
return gdb.DebugAdapterGdb(**kwargs)
9499
elif adapter_type == ADAPTER_TYPE.LOCAL_LLDB or adapter_type == ADAPTER_TYPE.REMOTE_LLDB:
95100
return lldb.DebugAdapterLLDB(**kwargs)
101+
elif adapter_type == ADAPTER_TYPE.REMOTE_SENSE:
102+
return lldbDebugAdapterGdbLike(**kwargs)
96103
elif adapter_type == ADAPTER_TYPE.DEFAULT:
97104
return get_adapter_for_current_system(**kwargs)
98105
else:

binjaplug.py

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
from binaryninja import Architecture, BinaryView, Symbol, SymbolType, Type, Structure, StructureType, FunctionGraphType, LowLevelILOperation, MediumLevelILOperation, core_ui_enabled
1010

11-
from . import DebugAdapter, ProcessView, dbgeng, QueuedAdapter
11+
from . import DebugAdapter, ProcessView, dbgeng, gdblike, QueuedAdapter
1212

1313
if core_ui_enabled():
1414
try:
@@ -481,9 +481,7 @@ def ip(self):
481481
return self.registers['rip']
482482
elif self.remote_arch.name == 'x86':
483483
return self.registers['eip']
484-
elif self.remote_arch.name == 'aarch64':
485-
return self.registers['pc']
486-
elif self.remote_arch.name in ['arm', 'armv7']:
484+
elif self.remote_arch.name in ['aarch64', 'arm', 'armv7', 'Z80']:
487485
return self.registers['pc']
488486
else:
489487
raise NotImplementedError('unimplemented architecture %s' % self.remote_arch.name)
@@ -504,9 +502,7 @@ def stack_pointer(self):
504502
return self.registers['rsp']
505503
elif self.remote_arch.name == 'x86':
506504
return self.registers['esp']
507-
elif self.remote_arch.name == 'aarch64':
508-
return self.registers['sp']
509-
elif self.remote_arch.name in ['arm', 'armv7']:
505+
elif self.remote_arch.name in ['aarch64', 'arm', 'armv7', 'Z80']:
510506
return self.registers['sp']
511507
else:
512508
raise NotImplementedError('unimplemented architecture %s' % self.remote_arch.name)
@@ -668,20 +664,35 @@ def attach(self):
668664
raise Exception("Tried to attach but already debugging")
669665

670666
self.connecting = True
671-
self.adapter = DebugAdapter.get_new_adapter(self.adapter_type, stdout=self.on_stdout)
672-
if DebugAdapter.ADAPTER_TYPE.use_connect(self.adapter_type):
667+
668+
# can the remote sense create the appropriate adapter?
669+
if self.adapter_type == DebugAdapter.ADAPTER_TYPE.REMOTE_SENSE:
673670
try:
674-
self.adapter = QueuedAdapter.QueuedAdapter(self.adapter)
675-
self.adapter.setup()
676-
self.adapter.connect(self.remote_host, self.remote_port)
677-
self.connecting = False
671+
self.adapter = gdblike.connect_sense(self.remote_host, self.remote_port)
672+
if self.adapter:
673+
self.adapter = QueuedAdapter.QueuedAdapter(self.adapter)
674+
self.connecting = False
678675
except Exception as e:
679676
self.connecting = False
680677
self.adapter = None
681678
raise e
682-
else:
683-
self.connecting = False
684-
raise Exception("cannot connect to adapter of type %s" % self.adapter_type)
679+
680+
if self.connecting:
681+
self.adapter = DebugAdapter.get_new_adapter(self.adapter_type, stdout=self.on_stdout)
682+
683+
if DebugAdapter.ADAPTER_TYPE.use_connect(self.adapter_type):
684+
try:
685+
self.adapter = QueuedAdapter.QueuedAdapter(self.adapter)
686+
self.adapter.setup()
687+
self.adapter.connect(self.remote_host, self.remote_port)
688+
self.connecting = False
689+
except Exception as e:
690+
self.connecting = False
691+
self.adapter = None
692+
raise e
693+
else:
694+
self.connecting = False
695+
raise Exception("cannot connect to adapter of type %s" % self.adapter_type)
685696

686697
self.memory_view.update_base()
687698

mame_coleco.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,6 @@ def connect_continued(self, sock,connection):
5959
self.tid = 0
6060
self.target_pid_ = 0
6161

62-
def mem_modules(self, cache_ok=True):
63-
raise NotImplementedError('no module list on ColecoVision')
64-
6562
def go(self):
6663
self.reg_cache = {}
6764
(reason, reason_data) = self.go_generic('c')
@@ -74,6 +71,12 @@ def step_into(self):
7471
self.handle_stop(reason, reason_data)
7572
return (reason, reason_data)
7673

74+
# reg read
75+
def reg_read(self, name):
76+
# if IL evaluated (to compute next instruction), the disassembler gives uppercase register names
77+
# convert to lowercase names mame expects
78+
return gdblike.DebugAdapterGdbLike.reg_read(self, name.lower())
79+
7780
# thread stuff
7881
def thread_list(self):
7982
return [0]
@@ -86,7 +89,10 @@ def thread_select(self, tid):
8689
raise DebugAdapter.GeneralError('mame_coleco has only one implicit thread: 0')
8790

8891
#
89-
def mem_modules(self):
92+
def target_base(self):
93+
return 0x8000
94+
95+
def mem_modules(self, cache_ok=True):
9096
#[0000, 2000) - BIOS ROM
9197
#[2000, 4000) - Expansion Port
9298
#[4000, 6000) - Expansion Port

0 commit comments

Comments
 (0)