Skip to content

Commit 8a18bc4

Browse files
Copilotxusheng6
andcommitted
Add API and FFI support for hardware breakpoints
Co-authored-by: xusheng6 <[email protected]>
1 parent 591d6cf commit 8a18bc4

File tree

4 files changed

+71
-0
lines changed

4 files changed

+71
-0
lines changed

api/debuggerapi.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,17 @@ namespace BinaryNinjaDebuggerAPI {
362362
};
363363

364364

365+
// Breakpoint types - used to specify the type of breakpoint to set
366+
enum DebugBreakpointType
367+
{
368+
SoftwareBreakpoint = 0, // Default software breakpoint
369+
HardwareExecuteBreakpoint = 1, // Hardware execution breakpoint
370+
HardwareReadBreakpoint = 2, // Hardware read watchpoint
371+
HardwareWriteBreakpoint = 3, // Hardware write watchpoint
372+
HardwareAccessBreakpoint = 4 // Hardware read/write watchpoint
373+
};
374+
375+
365376
struct ModuleNameAndOffset
366377
{
367378
std::string module;
@@ -647,6 +658,10 @@ namespace BinaryNinjaDebuggerAPI {
647658
bool ContainsBreakpoint(uint64_t address);
648659
bool ContainsBreakpoint(const ModuleNameAndOffset& breakpoint);
649660

661+
// Hardware breakpoint and watchpoint support
662+
bool AddHardwareBreakpoint(uint64_t address, DebugBreakpointType type, size_t size = 1);
663+
bool RemoveHardwareBreakpoint(uint64_t address, DebugBreakpointType type, size_t size = 1);
664+
650665
uint64_t IP();
651666
uint64_t GetLastIP();
652667
bool SetIP(uint64_t address);

api/debuggercontroller.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -766,6 +766,18 @@ bool DebuggerController::ContainsBreakpoint(const ModuleNameAndOffset& breakpoin
766766
}
767767

768768

769+
bool DebuggerController::AddHardwareBreakpoint(uint64_t address, DebugBreakpointType type, size_t size)
770+
{
771+
return BNDebuggerAddHardwareBreakpoint(m_object, address, (BNDebugBreakpointType)type, size);
772+
}
773+
774+
775+
bool DebuggerController::RemoveHardwareBreakpoint(uint64_t address, DebugBreakpointType type, size_t size)
776+
{
777+
return BNDebuggerRemoveHardwareBreakpoint(m_object, address, (BNDebugBreakpointType)type, size);
778+
}
779+
780+
769781
uint64_t DebuggerController::RelativeAddressToAbsolute(const ModuleNameAndOffset& address)
770782
{
771783
return BNDebuggerRelativeAddressToAbsolute(m_object, address.module.c_str(), address.offset);

api/ffi.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,16 @@ extern "C"
218218
} BNDebugAdapterTargetStatus;
219219

220220

221+
typedef enum BNDebugBreakpointType
222+
{
223+
BNSoftwareBreakpoint = 0, // Default software breakpoint
224+
BNHardwareExecuteBreakpoint = 1, // Hardware execution breakpoint
225+
BNHardwareReadBreakpoint = 2, // Hardware read watchpoint
226+
BNHardwareWriteBreakpoint = 3, // Hardware write watchpoint
227+
BNHardwareAccessBreakpoint = 4 // Hardware read/write watchpoint
228+
} BNDebugBreakpointType;
229+
230+
221231
typedef enum BNDebuggerEventType
222232
{
223233
LaunchEventType,
@@ -522,6 +532,12 @@ extern "C"
522532
DEBUGGER_FFI_API bool BNDebuggerContainsRelativeBreakpoint(
523533
BNDebuggerController* controller, const char* module, uint64_t offset);
524534

535+
// Hardware breakpoint and watchpoint support
536+
DEBUGGER_FFI_API bool BNDebuggerAddHardwareBreakpoint(BNDebuggerController* controller, uint64_t address,
537+
BNDebugBreakpointType type, size_t size);
538+
DEBUGGER_FFI_API bool BNDebuggerRemoveHardwareBreakpoint(BNDebuggerController* controller, uint64_t address,
539+
BNDebugBreakpointType type, size_t size);
540+
525541
DEBUGGER_FFI_API uint64_t BNDebuggerGetIP(BNDebuggerController* controller);
526542
DEBUGGER_FFI_API uint64_t BNDebuggerGetLastIP(BNDebuggerController* controller);
527543
DEBUGGER_FFI_API bool BNDebuggerSetIP(BNDebuggerController* controller, uint64_t address);

core/ffi.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -897,6 +897,34 @@ bool BNDebuggerContainsRelativeBreakpoint(BNDebuggerController* controller, cons
897897
}
898898

899899

900+
bool BNDebuggerAddHardwareBreakpoint(BNDebuggerController* controller, uint64_t address, BNDebugBreakpointType type, size_t size)
901+
{
902+
DebuggerState* state = controller->object->GetState();
903+
if (!state)
904+
return false;
905+
906+
DebugAdapter* adapter = state->GetAdapter();
907+
if (!adapter)
908+
return false;
909+
910+
return adapter->AddHardwareBreakpoint(address, (DebugBreakpointType)type, size);
911+
}
912+
913+
914+
bool BNDebuggerRemoveHardwareBreakpoint(BNDebuggerController* controller, uint64_t address, BNDebugBreakpointType type, size_t size)
915+
{
916+
DebuggerState* state = controller->object->GetState();
917+
if (!state)
918+
return false;
919+
920+
DebugAdapter* adapter = state->GetAdapter();
921+
if (!adapter)
922+
return false;
923+
924+
return adapter->RemoveHardwareBreakpoint(address, (DebugBreakpointType)type, size);
925+
}
926+
927+
900928
uint64_t BNDebuggerRelativeAddressToAbsolute(BNDebuggerController* controller, const char* module, uint64_t offset)
901929
{
902930
DebuggerState* state = controller->object->GetState();

0 commit comments

Comments
 (0)