From 8a857b2154871b711e9e4f646619d8b4f698877e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 12 Apr 2025 15:32:27 -0700 Subject: [PATCH] use set/unset breakpoint events to build bp entities in ctrl entity tree --- src/ctrl/ctrl.mdesk | 3 +- src/ctrl/ctrl_core.c | 28 ++++++++++ src/ctrl/ctrl_core.h | 95 +++++++++++++++++----------------- src/ctrl/generated/ctrl.meta.c | 6 ++- src/ctrl/generated/ctrl.meta.h | 5 +- 5 files changed, 85 insertions(+), 52 deletions(-) diff --git a/src/ctrl/ctrl.mdesk b/src/ctrl/ctrl.mdesk index 98a97412..5665654d 100644 --- a/src/ctrl/ctrl.mdesk +++ b/src/ctrl/ctrl.mdesk @@ -14,7 +14,8 @@ CTRL_EntityKindTable: {Module module "Module" } {EntryPoint entry_point "Entry Point" } {DebugInfoPath debug_info_path "Debug Info Path" } - {PendingThreadName pending_thread_name "Pending Thread Name" } + {PendingThreadName pending_thread_name "Pending Thread Name" } + {Breakpoint breakpoint "Breakpoint" } } @enum CTRL_EntityKind: diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 5ae8b19f..7738a9ad 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1312,6 +1312,30 @@ ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list) ctrl_entity_equip_string(store, debug_info_path, event->string); debug_info_path->timestamp = event->timestamp; }break; + + //- rjf: dynamic, program-created breakpoints + case CTRL_EventKind_SetBreakpoint: + { + CTRL_Entity *process = ctrl_entity_from_handle(store, event->parent); + CTRL_Entity *bp = ctrl_entity_alloc(store, process, CTRL_EntityKind_Breakpoint, Arch_Null, ctrl_handle_zero(), 0); + bp->vaddr_range = event->vaddr_rng; + bp->bp_flags = event->bp_flags; + }break; + case CTRL_EventKind_UnsetBreakpoint: + { + CTRL_Entity *process = ctrl_entity_from_handle(store, event->parent); + for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next) + { + if(child->kind == CTRL_EntityKind_Breakpoint && + child->vaddr_range.min == event->vaddr_rng.min && + child->vaddr_range.max == event->vaddr_rng.max && + child->bp_flags == event->bp_flags) + { + ctrl_entity_release(store, child); + break; + } + } + }break; } } } @@ -4369,6 +4393,8 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, { CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); out_evt->kind = CTRL_EventKind_SetBreakpoint; + out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); + out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); out_evt->vaddr_rng = r1u64(event->address, event->address+event->size); out_evt->bp_flags = ctrl_user_breakpoint_flags_from_dmn_trap_flags(event->flags); }break; @@ -4376,6 +4402,8 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, { CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts); out_evt->kind = CTRL_EventKind_UnsetBreakpoint; + out_evt->entity = ctrl_handle_make(CTRL_MachineID_Local, event->thread); + out_evt->parent = ctrl_handle_make(CTRL_MachineID_Local, event->process); out_evt->vaddr_rng = r1u64(event->address, event->address+event->size); out_evt->bp_flags = ctrl_user_breakpoint_flags_from_dmn_trap_flags(event->flags); }break; diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 3ded38c1..7edda053 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -12,6 +12,53 @@ typedef U64 CTRL_MachineID; #define CTRL_MachineID_Local (1) +//////////////////////////////// +//~ rjf: User Breakpoint Types + +typedef U32 CTRL_UserBreakpointFlags; +enum +{ + CTRL_UserBreakpointFlag_BreakOnWrite = (1<<0), + CTRL_UserBreakpointFlag_BreakOnRead = (1<<1), + CTRL_UserBreakpointFlag_BreakOnExecute = (1<<2), +}; + +typedef enum CTRL_UserBreakpointKind +{ + CTRL_UserBreakpointKind_Null, + CTRL_UserBreakpointKind_FileNameAndLineColNumber, + CTRL_UserBreakpointKind_Expression, + CTRL_UserBreakpointKind_COUNT +} +CTRL_UserBreakpointKind; + +typedef struct CTRL_UserBreakpoint CTRL_UserBreakpoint; +struct CTRL_UserBreakpoint +{ + CTRL_UserBreakpointKind kind; + CTRL_UserBreakpointFlags flags; + U64 id; + String8 string; + TxtPt pt; + U64 size; + String8 condition; +}; + +typedef struct CTRL_UserBreakpointNode CTRL_UserBreakpointNode; +struct CTRL_UserBreakpointNode +{ + CTRL_UserBreakpointNode *next; + CTRL_UserBreakpoint v; +}; + +typedef struct CTRL_UserBreakpointList CTRL_UserBreakpointList; +struct CTRL_UserBreakpointList +{ + CTRL_UserBreakpointNode *first; + CTRL_UserBreakpointNode *last; + U64 count; +}; + //////////////////////////////// //~ rjf: Entity Handle Types @@ -62,6 +109,7 @@ struct CTRL_Entity Rng1U64 vaddr_range; U64 stack_base; U64 timestamp; + CTRL_UserBreakpointFlags bp_flags; String8 string; }; @@ -256,53 +304,6 @@ struct CTRL_Spoof U64 new_ip_value; }; -//////////////////////////////// -//~ rjf: User Breakpoint Types - -typedef U32 CTRL_UserBreakpointFlags; -enum -{ - CTRL_UserBreakpointFlag_BreakOnWrite = (1<<0), - CTRL_UserBreakpointFlag_BreakOnRead = (1<<1), - CTRL_UserBreakpointFlag_BreakOnExecute = (1<<2), -}; - -typedef enum CTRL_UserBreakpointKind -{ - CTRL_UserBreakpointKind_Null, - CTRL_UserBreakpointKind_FileNameAndLineColNumber, - CTRL_UserBreakpointKind_Expression, - CTRL_UserBreakpointKind_COUNT -} -CTRL_UserBreakpointKind; - -typedef struct CTRL_UserBreakpoint CTRL_UserBreakpoint; -struct CTRL_UserBreakpoint -{ - CTRL_UserBreakpointKind kind; - CTRL_UserBreakpointFlags flags; - U64 id; - String8 string; - TxtPt pt; - U64 size; - String8 condition; -}; - -typedef struct CTRL_UserBreakpointNode CTRL_UserBreakpointNode; -struct CTRL_UserBreakpointNode -{ - CTRL_UserBreakpointNode *next; - CTRL_UserBreakpoint v; -}; - -typedef struct CTRL_UserBreakpointList CTRL_UserBreakpointList; -struct CTRL_UserBreakpointList -{ - CTRL_UserBreakpointNode *first; - CTRL_UserBreakpointNode *last; - U64 count; -}; - //////////////////////////////// //~ rjf: Evaluation Spaces diff --git a/src/ctrl/generated/ctrl.meta.c b/src/ctrl/generated/ctrl.meta.c index 4b45ed27..87ed9c81 100644 --- a/src/ctrl/generated/ctrl.meta.c +++ b/src/ctrl/generated/ctrl.meta.c @@ -4,7 +4,7 @@ //- GENERATED CODE C_LINKAGE_BEGIN -String8 ctrl_entity_kind_code_name_table[9] = +String8 ctrl_entity_kind_code_name_table[10] = { {0}, str8_lit_comp("root"), @@ -15,9 +15,10 @@ str8_lit_comp("module"), str8_lit_comp("entry_point"), str8_lit_comp("debug_info_path"), str8_lit_comp("pending_thread_name"), +str8_lit_comp("breakpoint"), }; -String8 ctrl_entity_kind_display_string_table[9] = +String8 ctrl_entity_kind_display_string_table[10] = { {0}, str8_lit_comp("Root"), @@ -28,6 +29,7 @@ str8_lit_comp("Module"), str8_lit_comp("EntryPoint"), str8_lit_comp("DebugInfoPath"), str8_lit_comp("PendingThreadName"), +str8_lit_comp("Breakpoint"), }; U32 ctrl_exception_code_kind_code_table[38] = diff --git a/src/ctrl/generated/ctrl.meta.h b/src/ctrl/generated/ctrl.meta.h index 8c5e9a3a..14dfc6a8 100644 --- a/src/ctrl/generated/ctrl.meta.h +++ b/src/ctrl/generated/ctrl.meta.h @@ -17,6 +17,7 @@ CTRL_EntityKind_Module, CTRL_EntityKind_EntryPoint, CTRL_EntityKind_DebugInfoPath, CTRL_EntityKind_PendingThreadName, +CTRL_EntityKind_Breakpoint, CTRL_EntityKind_COUNT, } CTRL_EntityKind; @@ -64,8 +65,8 @@ CTRL_ExceptionCodeKind_COUNT, } CTRL_ExceptionCodeKind; C_LINKAGE_BEGIN -extern String8 ctrl_entity_kind_code_name_table[9]; -extern String8 ctrl_entity_kind_display_string_table[9]; +extern String8 ctrl_entity_kind_code_name_table[10]; +extern String8 ctrl_entity_kind_display_string_table[10]; extern U32 ctrl_exception_code_kind_code_table[38]; extern String8 ctrl_exception_code_kind_display_string_table[38]; extern String8 ctrl_exception_code_kind_lowercase_code_string_table[38];