entity parameter tree equipment; architecture -> arch

This commit is contained in:
Ryan Fleury
2024-08-29 13:16:50 -07:00
parent df6150c811
commit 9932a30ef9
42 changed files with 395 additions and 342 deletions
+13 -13
View File
@@ -399,23 +399,23 @@ txt_rng_contains(TxtRng r, TxtPt pt)
//~ rjf: Toolchain/Environment Enum Functions //~ rjf: Toolchain/Environment Enum Functions
internal U64 internal U64
bit_size_from_arch(Architecture arch) bit_size_from_arch(Arch arch)
{ {
// TODO(rjf): metacode // TODO(rjf): metacode
U64 arch_bitsize = 0; U64 arch_bitsize = 0;
switch(arch) switch(arch)
{ {
case Architecture_x64: arch_bitsize = 64; break; case Arch_x64: arch_bitsize = 64; break;
case Architecture_x86: arch_bitsize = 32; break; case Arch_x86: arch_bitsize = 32; break;
case Architecture_arm64: arch_bitsize = 64; break; case Arch_arm64: arch_bitsize = 64; break;
case Architecture_arm32: arch_bitsize = 32; break; case Arch_arm32: arch_bitsize = 32; break;
default: break; default: break;
} }
return arch_bitsize; return arch_bitsize;
} }
internal U64 internal U64
max_instruction_size_from_arch(Architecture arch) max_instruction_size_from_arch(Arch arch)
{ {
// TODO(rjf): make this real // TODO(rjf): make this real
return 64; return 64;
@@ -434,17 +434,17 @@ operating_system_from_context(void){
return os; return os;
} }
internal Architecture internal Arch
architecture_from_context(void){ arch_from_context(void){
Architecture arch = Architecture_Null; Arch arch = Arch_Null;
#if ARCH_X64 #if ARCH_X64
arch = Architecture_x64; arch = Arch_x64;
#elif ARCH_X86 #elif ARCH_X86
arch = Architecture_x86; arch = Arch_x86;
#elif ARCH_ARM64 #elif ARCH_ARM64
arch = Architecture_arm64; arch = Arch_arm64;
#elif ARCH_ARM32 #elif ARCH_ARM32
arch = Architecture_arm32; arch = Arch_arm32;
#endif #endif
return arch; return arch;
} }
+11 -11
View File
@@ -439,16 +439,16 @@ typedef enum OperatingSystem
} }
OperatingSystem; OperatingSystem;
typedef enum Architecture typedef enum Arch
{ {
Architecture_Null, Arch_Null,
Architecture_x64, Arch_x64,
Architecture_x86, Arch_x86,
Architecture_arm64, Arch_arm64,
Architecture_arm32, Arch_arm32,
Architecture_COUNT, Arch_COUNT,
} }
Architecture; Arch;
typedef enum Compiler typedef enum Compiler
{ {
@@ -779,11 +779,11 @@ internal B32 txt_rng_contains(TxtRng r, TxtPt pt);
//////////////////////////////// ////////////////////////////////
//~ rjf: Toolchain/Environment Enum Functions //~ rjf: Toolchain/Environment Enum Functions
internal U64 bit_size_from_arch(Architecture arch); internal U64 bit_size_from_arch(Arch arch);
internal U64 max_instruction_size_from_arch(Architecture arch); internal U64 max_instruction_size_from_arch(Arch arch);
internal OperatingSystem operating_system_from_context(void); internal OperatingSystem operating_system_from_context(void);
internal Architecture architecture_from_context(void); internal Arch arch_from_context(void);
internal Compiler compiler_from_context(void); internal Compiler compiler_from_context(void);
//////////////////////////////// ////////////////////////////////
+2 -2
View File
@@ -1459,7 +1459,7 @@ string_from_operating_system(OperatingSystem os){
} }
internal String8 internal String8
string_from_architecture(Architecture arch){ string_from_arch(Arch arch){
local_persist String8 strings[] = { local_persist String8 strings[] = {
str8_lit_comp("Null"), str8_lit_comp("Null"),
str8_lit_comp("x64"), str8_lit_comp("x64"),
@@ -1468,7 +1468,7 @@ string_from_architecture(Architecture arch){
str8_lit_comp("arm32"), str8_lit_comp("arm32"),
}; };
String8 result = str8_lit("error"); String8 result = str8_lit("error");
if (arch < Architecture_COUNT){ if (arch < Arch_COUNT){
result = strings[arch]; result = strings[arch];
} }
return(result); return(result);
+1 -1
View File
@@ -315,7 +315,7 @@ internal String32 str32_from_8(Arena *arena, String8 in);
internal String8 string_from_dimension(Dimension dimension); internal String8 string_from_dimension(Dimension dimension);
internal String8 string_from_side(Side side); internal String8 string_from_side(Side side);
internal String8 string_from_operating_system(OperatingSystem os); internal String8 string_from_operating_system(OperatingSystem os);
internal String8 string_from_architecture(Architecture arch); internal String8 string_from_arch(Arch arch);
//////////////////////////////// ////////////////////////////////
//~ rjf: Time Types -> String //~ rjf: Time Types -> String
+30 -30
View File
@@ -520,8 +520,8 @@ ctrl_entity_store_alloc(void)
store->arena = arena; store->arena = arena;
store->hash_slots_count = 1024; store->hash_slots_count = 1024;
store->hash_slots = push_array(arena, CTRL_EntityHashSlot, store->hash_slots_count); store->hash_slots = push_array(arena, CTRL_EntityHashSlot, store->hash_slots_count);
CTRL_Entity *root = store->root = ctrl_entity_alloc(store, &ctrl_entity_nil, CTRL_EntityKind_Root, Architecture_Null, 0, dmn_handle_zero(), 0); CTRL_Entity *root = store->root = ctrl_entity_alloc(store, &ctrl_entity_nil, CTRL_EntityKind_Root, Arch_Null, 0, dmn_handle_zero(), 0);
CTRL_Entity *local_machine = ctrl_entity_alloc(store, root, CTRL_EntityKind_Machine, architecture_from_context(), CTRL_MachineID_Local, dmn_handle_zero(), 0); CTRL_Entity *local_machine = ctrl_entity_alloc(store, root, CTRL_EntityKind_Machine, arch_from_context(), CTRL_MachineID_Local, dmn_handle_zero(), 0);
(void)local_machine; (void)local_machine;
return store; return store;
} }
@@ -628,7 +628,7 @@ ctrl_entity_string_release(CTRL_EntityStore *store, String8 string)
//- rjf: entity construction/deletion //- rjf: entity construction/deletion
internal CTRL_Entity * internal CTRL_Entity *
ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Architecture arch, CTRL_MachineID machine_id, DMN_Handle handle, U64 id) ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Arch arch, CTRL_MachineID machine_id, DMN_Handle handle, U64 id)
{ {
CTRL_Entity *entity = &ctrl_entity_nil; CTRL_Entity *entity = &ctrl_entity_nil;
{ {
@@ -883,7 +883,7 @@ ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list)
CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath); CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath);
if(debug_info_path == &ctrl_entity_nil) if(debug_info_path == &ctrl_entity_nil)
{ {
debug_info_path = ctrl_entity_alloc(store, module, CTRL_EntityKind_DebugInfoPath, Architecture_Null, 0, dmn_handle_zero(), 0); debug_info_path = ctrl_entity_alloc(store, module, CTRL_EntityKind_DebugInfoPath, Arch_Null, 0, dmn_handle_zero(), 0);
} }
ctrl_entity_equip_string(store, debug_info_path, event->string); ctrl_entity_equip_string(store, debug_info_path, event->string);
debug_info_path->timestamp = event->timestamp; debug_info_path->timestamp = event->timestamp;
@@ -901,12 +901,12 @@ ctrl_init(void)
Arena *arena = arena_alloc(); Arena *arena = arena_alloc();
ctrl_state = push_array(arena, CTRL_State, 1); ctrl_state = push_array(arena, CTRL_State, 1);
ctrl_state->arena = arena; ctrl_state->arena = arena;
for(Architecture arch = (Architecture)0; arch < Architecture_COUNT; arch = (Architecture)(arch+1)) for(Arch arch = (Arch)0; arch < Arch_COUNT; arch = (Arch)(arch+1))
{ {
String8 *reg_names = regs_reg_code_string_table_from_architecture(arch); String8 *reg_names = regs_reg_code_string_table_from_arch(arch);
U64 reg_count = regs_reg_code_count_from_architecture(arch); U64 reg_count = regs_reg_code_count_from_arch(arch);
String8 *alias_names = regs_alias_code_string_table_from_architecture(arch); String8 *alias_names = regs_alias_code_string_table_from_arch(arch);
U64 alias_count = regs_alias_code_count_from_architecture(arch); U64 alias_count = regs_alias_code_count_from_arch(arch);
ctrl_state->arch_string2reg_tables[arch] = e_string2num_map_make(ctrl_state->arena, 256); ctrl_state->arch_string2reg_tables[arch] = e_string2num_map_make(ctrl_state->arena, 256);
ctrl_state->arch_string2alias_tables[arch] = e_string2num_map_make(ctrl_state->arena, 256); ctrl_state->arch_string2alias_tables[arch] = e_string2num_map_make(ctrl_state->arena, 256);
for(U64 idx = 1; idx < reg_count; idx += 1) for(U64 idx = 1; idx < reg_count; idx += 1)
@@ -1452,8 +1452,8 @@ ctrl_query_cached_reg_block_from_thread(Arena *arena, CTRL_EntityStore *store, C
{ {
CTRL_ThreadRegCache *cache = &ctrl_state->thread_reg_cache; CTRL_ThreadRegCache *cache = &ctrl_state->thread_reg_cache;
CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(store, machine_id, thread); CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(store, machine_id, thread);
Architecture arch = thread_entity->arch; Arch arch = thread_entity->arch;
U64 reg_block_size = regs_block_size_from_architecture(arch); U64 reg_block_size = regs_block_size_from_arch(arch);
U64 hash = ctrl_hash_from_machine_id_handle(machine_id, thread); U64 hash = ctrl_hash_from_machine_id_handle(machine_id, thread);
U64 slot_idx = hash%cache->slots_count; U64 slot_idx = hash%cache->slots_count;
U64 stripe_idx = slot_idx%cache->stripes_count; U64 stripe_idx = slot_idx%cache->stripes_count;
@@ -1552,7 +1552,7 @@ ctrl_query_cached_rip_from_thread(CTRL_EntityStore *store, CTRL_MachineID machin
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(store, machine_id, thread); CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(store, machine_id, thread);
Architecture arch = thread_entity->arch; Arch arch = thread_entity->arch;
void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, store, machine_id, thread); void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, store, machine_id, thread);
U64 result = regs_rip_from_arch_block(arch, block); U64 result = regs_rip_from_arch_block(arch, block);
scratch_end(scratch); scratch_end(scratch);
@@ -1564,7 +1564,7 @@ ctrl_query_cached_rsp_from_thread(CTRL_EntityStore *store, CTRL_MachineID machin
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(store, machine_id, thread); CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(store, machine_id, thread);
Architecture arch = thread_entity->arch; Arch arch = thread_entity->arch;
void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, store, machine_id, thread); void *block = ctrl_query_cached_reg_block_from_thread(scratch.arena, store, machine_id, thread);
U64 result = regs_rsp_from_arch_block(arch, block); U64 result = regs_rsp_from_arch_block(arch, block);
scratch_end(scratch); scratch_end(scratch);
@@ -1718,7 +1718,7 @@ ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_MachineID machine_id
//- rjf: unwind deep copier //- rjf: unwind deep copier
internal CTRL_Unwind internal CTRL_Unwind
ctrl_unwind_deep_copy(Arena *arena, Architecture arch, CTRL_Unwind *src) ctrl_unwind_deep_copy(Arena *arena, Arch arch, CTRL_Unwind *src)
{ {
CTRL_Unwind dst = {0}; CTRL_Unwind dst = {0};
{ {
@@ -1726,7 +1726,7 @@ ctrl_unwind_deep_copy(Arena *arena, Architecture arch, CTRL_Unwind *src)
dst.frames.count = src->frames.count; dst.frames.count = src->frames.count;
dst.frames.v = push_array(arena, CTRL_UnwindFrame, dst.frames.count); dst.frames.v = push_array(arena, CTRL_UnwindFrame, dst.frames.count);
MemoryCopy(dst.frames.v, src->frames.v, sizeof(dst.frames.v[0])*dst.frames.count); MemoryCopy(dst.frames.v, src->frames.v, sizeof(dst.frames.v[0])*dst.frames.count);
U64 block_size = regs_block_size_from_architecture(arch); U64 block_size = regs_block_size_from_arch(arch);
for(U64 idx = 0; idx < dst.frames.count; idx += 1) for(U64 idx = 0; idx < dst.frames.count; idx += 1)
{ {
dst.frames.v[idx].regs = push_array_no_zero(arena, U8, block_size); dst.frames.v[idx].regs = push_array_no_zero(arena, U8, block_size);
@@ -2585,13 +2585,13 @@ ctrl_unwind_step__pe_x64(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN
//- rjf: abstracted unwind step //- rjf: abstracted unwind step
internal CTRL_UnwindStepResult internal CTRL_UnwindStepResult
ctrl_unwind_step(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle process, DMN_Handle module, Architecture arch, void *reg_block, U64 endt_us) ctrl_unwind_step(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle process, DMN_Handle module, Arch arch, void *reg_block, U64 endt_us)
{ {
CTRL_UnwindStepResult result = {0}; CTRL_UnwindStepResult result = {0};
switch(arch) switch(arch)
{ {
default:{}break; default:{}break;
case Architecture_x64: case Arch_x64:
{ {
result = ctrl_unwind_step__pe_x64(store, machine_id, process, module, (REGS_RegBlockX64 *)reg_block, endt_us); result = ctrl_unwind_step__pe_x64(store, machine_id, process, module, (REGS_RegBlockX64 *)reg_block, endt_us);
}break; }break;
@@ -2612,12 +2612,12 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID ma
//- rjf: unpack args //- rjf: unpack args
CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(store, machine_id, thread); CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(store, machine_id, thread);
CTRL_Entity *process_entity = thread_entity->parent; CTRL_Entity *process_entity = thread_entity->parent;
Architecture arch = thread_entity->arch; Arch arch = thread_entity->arch;
U64 arch_reg_block_size = regs_block_size_from_architecture(arch); U64 arch_reg_block_size = regs_block_size_from_arch(arch);
//- rjf: grab initial register block //- rjf: grab initial register block
void *regs_block = ctrl_query_cached_reg_block_from_thread(scratch.arena, store, machine_id, thread); void *regs_block = ctrl_query_cached_reg_block_from_thread(scratch.arena, store, machine_id, thread);
B32 regs_block_good = (arch != Architecture_Null && regs_block != 0); B32 regs_block_good = (arch != Arch_Null && regs_block != 0);
//- rjf: loop & unwind //- rjf: loop & unwind
CTRL_UnwindFrameNode *first_frame_node = 0; CTRL_UnwindFrameNode *first_frame_node = 0;
@@ -2721,13 +2721,13 @@ ctrl_reg_gen(void)
//- rjf: name -> register/alias hash tables, for eval //- rjf: name -> register/alias hash tables, for eval
internal E_String2NumMap * internal E_String2NumMap *
ctrl_string2reg_from_arch(Architecture arch) ctrl_string2reg_from_arch(Arch arch)
{ {
return &ctrl_state->arch_string2reg_tables[arch]; return &ctrl_state->arch_string2reg_tables[arch];
} }
internal E_String2NumMap * internal E_String2NumMap *
ctrl_string2alias_from_arch(Architecture arch) ctrl_string2alias_from_arch(Arch arch)
{ {
return &ctrl_state->arch_string2alias_tables[arch]; return &ctrl_state->arch_string2alias_tables[arch];
} }
@@ -3415,7 +3415,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg,
log_infof("process: [%I64u]\n", ev->process.u64[0]); log_infof("process: [%I64u]\n", ev->process.u64[0]);
log_infof("thread: [%I64u]\n", ev->thread.u64[0]); log_infof("thread: [%I64u]\n", ev->thread.u64[0]);
log_infof("module: [%I64u]\n", ev->module.u64[0]); log_infof("module: [%I64u]\n", ev->module.u64[0]);
log_infof("arch: %S\n", string_from_architecture(ev->arch)); log_infof("arch: %S\n", string_from_arch(ev->arch));
log_infof("address: 0x%I64x\n", ev->address); log_infof("address: 0x%I64x\n", ev->address);
log_infof("string: \"%S\"\n", ev->string); log_infof("string: \"%S\"\n", ev->string);
log_infof("ip_vaddr: 0x%I64x\n", ev->instruction_pointer); log_infof("ip_vaddr: 0x%I64x\n", ev->instruction_pointer);
@@ -3498,7 +3498,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg,
RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, ids[0]); RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, ids[0]);
U64 global_var_voff = global_var->voff; U64 global_var_voff = global_var->voff;
U64 global_var_vaddr = global_var->voff + module->vaddr_range.min; U64 global_var_vaddr = global_var->voff + module->vaddr_range.min;
Architecture arch = process->arch; Arch arch = process->arch;
U64 addr_size = bit_size_from_arch(arch)/8; U64 addr_size = bit_size_from_arch(arch)/8;
dmn_process_read(ev->process, r1u64(global_var_vaddr, global_var_vaddr+addr_size), &asan_shadow_base_vaddr); dmn_process_read(ev->process, r1u64(global_var_vaddr, global_var_vaddr+addr_size), &asan_shadow_base_vaddr);
asan_shadow_variable_exists_but_is_zero = (asan_shadow_base_vaddr == 0); asan_shadow_variable_exists_but_is_zero = (asan_shadow_base_vaddr == 0);
@@ -3557,7 +3557,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg,
if(do_spoof) ProfScope("prep spoof") if(do_spoof) ProfScope("prep spoof")
{ {
CTRL_Entity *spoof_process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, spoof->process); CTRL_Entity *spoof_process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, spoof->process);
Architecture arch = spoof_process->arch; Arch arch = spoof_process->arch;
size_of_spoof = bit_size_from_arch(arch)/8; size_of_spoof = bit_size_from_arch(arch)/8;
dmn_process_read(spoof_process->handle, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value); dmn_process_read(spoof_process->handle, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value);
} }
@@ -3623,8 +3623,8 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg,
if(spoof != 0) if(spoof != 0)
{ {
CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, spoof->thread); CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, spoof->thread);
Architecture arch = thread->arch; Arch arch = thread->arch;
void *regs_block = push_array(scratch.arena, U8, regs_block_size_from_architecture(arch)); void *regs_block = push_array(scratch.arena, U8, regs_block_size_from_arch(arch));
dmn_thread_read_reg_block(spoof->thread, regs_block); dmn_thread_read_reg_block(spoof->thread, regs_block);
U64 spoof_thread_rip = regs_rip_from_arch_block(arch, regs_block); U64 spoof_thread_rip = regs_rip_from_arch_block(arch, regs_block);
if(spoof_thread_rip == spoof->new_ip_value) if(spoof_thread_rip == spoof->new_ip_value)
@@ -3812,7 +3812,7 @@ ctrl_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range)
case CTRL_EntityKind_Thread: case CTRL_EntityKind_Thread:
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
U64 regs_size = regs_block_size_from_architecture(entity->arch); U64 regs_size = regs_block_size_from_arch(entity->arch);
void *regs = ctrl_query_cached_reg_block_from_thread(scratch.arena, ctrl_state->ctrl_thread_entity_store, entity->machine_id, entity->handle); void *regs = ctrl_query_cached_reg_block_from_thread(scratch.arena, ctrl_state->ctrl_thread_entity_store, entity->machine_id, entity->handle);
Rng1U64 legal_range = r1u64(0, regs_size); Rng1U64 legal_range = r1u64(0, regs_size);
Rng1U64 read_range = intersect_1u64(legal_range, range); Rng1U64 read_range = intersect_1u64(legal_range, range);
@@ -3862,7 +3862,7 @@ ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg)
for(String8Node *n = msg->entry_points.first; n != 0; n = n->next) for(String8Node *n = msg->entry_points.first; n != 0; n = n->next)
{ {
String8 string = n->string; String8 string = n->string;
CTRL_Entity *entry = ctrl_entity_alloc(ctrl_state->ctrl_thread_entity_store, ctrl_state->ctrl_thread_entity_store->root, CTRL_EntityKind_EntryPoint, Architecture_Null, 0, dmn_handle_zero(), (U64)id); CTRL_Entity *entry = ctrl_entity_alloc(ctrl_state->ctrl_thread_entity_store, ctrl_state->ctrl_thread_entity_store->root, CTRL_EntityKind_EntryPoint, Arch_Null, 0, dmn_handle_zero(), (U64)id);
ctrl_entity_equip_string(ctrl_state->ctrl_thread_entity_store, entry, string); ctrl_entity_equip_string(ctrl_state->ctrl_thread_entity_store, entry, string);
} }
} }
@@ -4548,7 +4548,7 @@ ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg)
// //
CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->thread); CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->thread);
CTRL_Entity *process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->process); CTRL_Entity *process = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, event->process);
Architecture arch = thread->arch; Arch arch = thread->arch;
U64 thread_rip_vaddr = dmn_rip_from_thread(event->thread); U64 thread_rip_vaddr = dmn_rip_from_thread(event->thread);
CTRL_Entity *module = &ctrl_entity_nil; CTRL_Entity *module = &ctrl_entity_nil;
{ {
+9 -9
View File
@@ -63,7 +63,7 @@ struct CTRL_Entity
CTRL_Entity *prev; CTRL_Entity *prev;
CTRL_Entity *parent; CTRL_Entity *parent;
CTRL_EntityKind kind; CTRL_EntityKind kind;
Architecture arch; Arch arch;
CTRL_MachineID machine_id; CTRL_MachineID machine_id;
DMN_Handle handle; DMN_Handle handle;
U64 id; U64 id;
@@ -371,7 +371,7 @@ struct CTRL_Event
CTRL_MachineID machine_id; CTRL_MachineID machine_id;
DMN_Handle entity; DMN_Handle entity;
DMN_Handle parent; DMN_Handle parent;
Architecture arch; Arch arch;
U64 u64_code; U64 u64_code;
U32 entity_id; U32 entity_id;
Rng1U64 vaddr_rng; Rng1U64 vaddr_rng;
@@ -562,8 +562,8 @@ struct CTRL_State
CTRL_WakeupFunctionType *wakeup_hook; CTRL_WakeupFunctionType *wakeup_hook;
// rjf: name -> register/alias hash tables for eval // rjf: name -> register/alias hash tables for eval
E_String2NumMap arch_string2reg_tables[Architecture_COUNT]; E_String2NumMap arch_string2reg_tables[Arch_COUNT];
E_String2NumMap arch_string2alias_tables[Architecture_COUNT]; E_String2NumMap arch_string2alias_tables[Arch_COUNT];
// rjf: caches // rjf: caches
CTRL_ProcessMemoryCache process_memory_cache; CTRL_ProcessMemoryCache process_memory_cache;
@@ -696,7 +696,7 @@ internal String8 ctrl_entity_string_alloc(CTRL_EntityStore *store, String8 strin
internal void ctrl_entity_string_release(CTRL_EntityStore *store, String8 string); internal void ctrl_entity_string_release(CTRL_EntityStore *store, String8 string);
//- rjf: entity construction/deletion //- rjf: entity construction/deletion
internal CTRL_Entity *ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Architecture arch, CTRL_MachineID machine_id, DMN_Handle handle, U64 id); internal CTRL_Entity *ctrl_entity_alloc(CTRL_EntityStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Arch arch, CTRL_MachineID machine_id, DMN_Handle handle, U64 id);
internal void ctrl_entity_release(CTRL_EntityStore *store, CTRL_Entity *entity); internal void ctrl_entity_release(CTRL_EntityStore *store, CTRL_Entity *entity);
//- rjf: entity equipment //- rjf: entity equipment
@@ -763,14 +763,14 @@ internal String8 ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_Mac
//~ rjf: Unwinding Functions //~ rjf: Unwinding Functions
//- rjf: unwind deep copier //- rjf: unwind deep copier
internal CTRL_Unwind ctrl_unwind_deep_copy(Arena *arena, Architecture arch, CTRL_Unwind *src); internal CTRL_Unwind ctrl_unwind_deep_copy(Arena *arena, Arch arch, CTRL_Unwind *src);
//- rjf: [x64] //- rjf: [x64]
internal REGS_Reg64 *ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg); internal REGS_Reg64 *ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg);
internal CTRL_UnwindStepResult ctrl_unwind_step__pe_x64(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle process_handle, DMN_Handle module, REGS_RegBlockX64 *regs, U64 endt_us); internal CTRL_UnwindStepResult ctrl_unwind_step__pe_x64(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle process_handle, DMN_Handle module, REGS_RegBlockX64 *regs, U64 endt_us);
//- rjf: abstracted unwind step //- rjf: abstracted unwind step
internal CTRL_UnwindStepResult ctrl_unwind_step(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle process_handle, DMN_Handle module, Architecture arch, void *reg_block, U64 endt_us); internal CTRL_UnwindStepResult ctrl_unwind_step(CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle process_handle, DMN_Handle module, Arch arch, void *reg_block, U64 endt_us);
//- rjf: abstracted full unwind //- rjf: abstracted full unwind
internal CTRL_Unwind ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread, U64 endt_us); internal CTRL_Unwind ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID machine_id, DMN_Handle thread, U64 endt_us);
@@ -789,8 +789,8 @@ internal U64 ctrl_mem_gen(void);
internal U64 ctrl_reg_gen(void); internal U64 ctrl_reg_gen(void);
//- rjf: name -> register/alias hash tables, for eval //- rjf: name -> register/alias hash tables, for eval
internal E_String2NumMap *ctrl_string2reg_from_arch(Architecture arch); internal E_String2NumMap *ctrl_string2reg_from_arch(Arch arch);
internal E_String2NumMap *ctrl_string2alias_from_arch(Architecture arch); internal E_String2NumMap *ctrl_string2alias_from_arch(Arch arch);
//////////////////////////////// ////////////////////////////////
//~ rjf: Control-Thread Functions //~ rjf: Control-Thread Functions
+9 -9
View File
@@ -10,7 +10,7 @@
#endif #endif
internal DASM_Inst internal DASM_Inst
dasm_inst_from_code(Arena *arena, Architecture arch, U64 vaddr, String8 code, DASM_Syntax syntax) dasm_inst_from_code(Arena *arena, Arch arch, U64 vaddr, String8 code, DASM_Syntax syntax)
{ {
DASM_Inst inst = {0}; DASM_Inst inst = {0};
switch(arch) switch(arch)
@@ -18,8 +18,8 @@ dasm_inst_from_code(Arena *arena, Architecture arch, U64 vaddr, String8 code, DA
default:{}break; default:{}break;
//- rjf: x86/x64 disassembly //- rjf: x86/x64 disassembly
case Architecture_x86: case Arch_x86:
case Architecture_x64: case Arch_x64:
{ {
// rjf: determine zydis formatter style // rjf: determine zydis formatter style
ZydisFormatterStyle style = ZYDIS_FORMATTER_STYLE_INTEL; ZydisFormatterStyle style = ZYDIS_FORMATTER_STYLE_INTEL;
@@ -138,7 +138,7 @@ dasm_inst_from_code(Arena *arena, Architecture arch, U64 vaddr, String8 code, DA
//~ rjf: Control Flow Analysis //~ rjf: Control Flow Analysis
internal DASM_CtrlFlowInfo internal DASM_CtrlFlowInfo
dasm_ctrl_flow_info_from_arch_vaddr_code(Arena *arena, DASM_InstFlags exit_points_mask, Architecture arch, U64 vaddr, String8 code) dasm_ctrl_flow_info_from_arch_vaddr_code(Arena *arena, DASM_InstFlags exit_points_mask, Arch arch, U64 vaddr, String8 code)
{ {
Temp scratch = scratch_begin(&arena, 1); Temp scratch = scratch_begin(&arena, 1);
DASM_CtrlFlowInfo info = {0}; DASM_CtrlFlowInfo info = {0};
@@ -395,7 +395,7 @@ dasm_info_from_hash_params(DASM_Scope *scope, U128 hash, DASM_Params *params)
{ {
log_infof("hash: [0x%I64x 0x%I64x]\n", hash.u64[0], hash.u64[1]); log_infof("hash: [0x%I64x 0x%I64x]\n", hash.u64[0], hash.u64[1]);
log_infof("vaddr: 0x%I64x\n", params->vaddr); log_infof("vaddr: 0x%I64x\n", params->vaddr);
log_infof("arch: %S\n", string_from_architecture(params->arch)); log_infof("arch: %S\n", string_from_arch(params->arch));
log_infof("style_flags: 0x%x\n", params->style_flags); log_infof("style_flags: 0x%x\n", params->style_flags);
log_infof("syntax: %i\n", params->syntax); log_infof("syntax: %i\n", params->syntax);
log_infof("base_vaddr: 0x%I64x\n", params->base_vaddr); log_infof("base_vaddr: 0x%I64x\n", params->base_vaddr);
@@ -459,7 +459,7 @@ dasm_u2p_enqueue_req(U128 hash, DASM_Params *params, U64 endt_us)
{ {
U64 unconsumed_size = dasm_shared->u2p_ring_write_pos - dasm_shared->u2p_ring_read_pos; U64 unconsumed_size = dasm_shared->u2p_ring_write_pos - dasm_shared->u2p_ring_read_pos;
U64 available_size = dasm_shared->u2p_ring_size - unconsumed_size; U64 available_size = dasm_shared->u2p_ring_size - unconsumed_size;
if(available_size >= sizeof(hash)+sizeof(U64)+sizeof(Architecture)+sizeof(DASM_StyleFlags)+sizeof(DASM_Syntax)+sizeof(U64)+sizeof(U64)+params->dbgi_key.path.size+sizeof(U64)) if(available_size >= sizeof(hash)+sizeof(U64)+sizeof(Arch)+sizeof(DASM_StyleFlags)+sizeof(DASM_Syntax)+sizeof(U64)+sizeof(U64)+params->dbgi_key.path.size+sizeof(U64))
{ {
good = 1; good = 1;
dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, &hash); dasm_shared->u2p_ring_write_pos += ring_write_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_write_pos, &hash);
@@ -494,7 +494,7 @@ dasm_u2p_dequeue_req(Arena *arena, U128 *hash_out, DASM_Params *params_out)
OS_MutexScope(dasm_shared->u2p_ring_mutex) for(;;) OS_MutexScope(dasm_shared->u2p_ring_mutex) for(;;)
{ {
U64 unconsumed_size = dasm_shared->u2p_ring_write_pos - dasm_shared->u2p_ring_read_pos; U64 unconsumed_size = dasm_shared->u2p_ring_write_pos - dasm_shared->u2p_ring_read_pos;
if(unconsumed_size >= sizeof(*hash_out)+sizeof(U64)+sizeof(Architecture)+sizeof(DASM_StyleFlags)+sizeof(DASM_Syntax)+sizeof(U64)+sizeof(U64)+sizeof(U64)) if(unconsumed_size >= sizeof(*hash_out)+sizeof(U64)+sizeof(Arch)+sizeof(DASM_StyleFlags)+sizeof(DASM_Syntax)+sizeof(U64)+sizeof(U64)+sizeof(U64))
{ {
dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, hash_out); dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, hash_out);
dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, &params_out->vaddr); dasm_shared->u2p_ring_read_pos += ring_read_struct(dasm_shared->u2p_ring_base, dasm_shared->u2p_ring_size, dasm_shared->u2p_ring_read_pos, &params_out->vaddr);
@@ -576,8 +576,8 @@ dasm_parse_thread__entry_point(void *p)
default:{}break; default:{}break;
//- rjf: x86/x64 decoding //- rjf: x86/x64 decoding
case Architecture_x64: case Arch_x64:
case Architecture_x86: case Arch_x86:
{ {
// rjf: disassemble // rjf: disassemble
RDI_SourceFile *last_file = &rdi_nil_element_union.source_file; RDI_SourceFile *last_file = &rdi_nil_element_union.source_file;
+3 -3
View File
@@ -93,7 +93,7 @@ typedef struct DASM_Params DASM_Params;
struct DASM_Params struct DASM_Params
{ {
U64 vaddr; U64 vaddr;
Architecture arch; Arch arch;
DASM_StyleFlags style_flags; DASM_StyleFlags style_flags;
DASM_Syntax syntax; DASM_Syntax syntax;
U64 base_vaddr; U64 base_vaddr;
@@ -280,12 +280,12 @@ global DASM_Shared *dasm_shared = 0;
//////////////////////////////// ////////////////////////////////
//~ rjf: Instruction Decoding/Disassembling Type Functions //~ rjf: Instruction Decoding/Disassembling Type Functions
internal DASM_Inst dasm_inst_from_code(Arena *arena, Architecture arch, U64 vaddr, String8 code, DASM_Syntax syntax); internal DASM_Inst dasm_inst_from_code(Arena *arena, Arch arch, U64 vaddr, String8 code, DASM_Syntax syntax);
//////////////////////////////// ////////////////////////////////
//~ rjf: Control Flow Analysis //~ rjf: Control Flow Analysis
internal DASM_CtrlFlowInfo dasm_ctrl_flow_info_from_arch_vaddr_code(Arena *arena, DASM_InstFlags exit_points_mask, Architecture arch, U64 vaddr, String8 code); internal DASM_CtrlFlowInfo dasm_ctrl_flow_info_from_arch_vaddr_code(Arena *arena, DASM_InstFlags exit_points_mask, Arch arch, U64 vaddr, String8 code);
//////////////////////////////// ////////////////////////////////
//~ rjf: Parameter Type Functions //~ rjf: Parameter Type Functions
+3 -1
View File
@@ -27,6 +27,8 @@ D_EntityKindTable:
{ {
{Nil nil nils 0 0 0 0 0 0 0 0 0 0 0 "Label" Null "Nil" } {Nil nil nils 0 0 0 0 0 0 0 0 0 0 0 "Label" Null "Nil" }
{Root root roots 0 0 0 0 0 0 0 0 0 0 0 "Label" Null "Root" } {Root root roots 0 0 0 0 0 0 0 0 0 0 0 "Label" Null "Root" }
//- rjf: machines
{Machine machine machines 0 1 0 1 0 0 0 0 0 0 0 "Label" Machine "Machine" } {Machine machine machines 0 1 0 1 0 0 0 0 0 0 0 "Label" Machine "Machine" }
//- rjf: filesystem modeling //- rjf: filesystem modeling
@@ -59,7 +61,7 @@ D_EntityKindTable:
{WorkingDirectory working_directory working_directories 0 0 0 0 0 0 0 0 1 1 0 "Execution Path" Null "Working Directory" } {WorkingDirectory working_directory working_directories 0 0 0 0 0 0 0 0 1 1 0 "Execution Path" Null "Working Directory" }
{EntryPoint entry_point entry_points 0 0 0 0 0 0 0 0 0 1 0 "Symbol Name" Null "Entry Point" } {EntryPoint entry_point entry_points 0 0 0 0 0 0 0 0 0 1 0 "Symbol Name" Null "Entry Point" }
//- rjf: view containers (windows, panels, views) //- rjf: frontend containers (windows, panels, views)
{Window window windows 1 0 0 0 0 0 1 0 0 1 1 "Label" Window "Window" } {Window window windows 1 0 0 0 0 0 1 0 0 1 1 "Label" Window "Window" }
{Panel panel panels 1 0 0 0 0 0 1 0 0 1 1 "Label" XSplit "Panel" } {Panel panel panels 1 0 0 0 0 0 1 0 0 1 1 "Label" XSplit "Panel" }
{View view views 1 0 0 0 0 0 1 0 0 1 1 "Label" Null "View" } {View view views 1 0 0 0 0 0 1 0 0 1 1 "Label" Null "View" }
+62 -19
View File
@@ -1281,6 +1281,7 @@ d_entity_alloc(D_Entity *parent, D_EntityKind kind)
entity->id = d_state->entities_id_gen; entity->id = d_state->entities_id_gen;
entity->gen += 1; entity->gen += 1;
entity->alloc_time_us = os_now_microseconds(); entity->alloc_time_us = os_now_microseconds();
entity->params_root = &md_nil_node;
// rjf: initialize to deleted, record history, then "undelete" if this allocation can be undone // rjf: initialize to deleted, record history, then "undelete" if this allocation can be undone
if(user_defined_lifetime) if(user_defined_lifetime)
@@ -1352,6 +1353,10 @@ d_entity_release(D_Entity *entity)
{ {
d_name_release(task->e->string); d_name_release(task->e->string);
} }
if(task->e->params_arena != 0)
{
arena_release(task->e->params_arena);
}
d_state->kind_alloc_gens[task->e->kind] += 1; d_state->kind_alloc_gens[task->e->kind] += 1;
} }
@@ -1478,7 +1483,7 @@ d_entity_equip_ctrl_handle(D_Entity *entity, DMN_Handle handle)
} }
internal void internal void
d_entity_equip_arch(D_Entity *entity, Architecture arch) d_entity_equip_arch(D_Entity *entity, Arch arch)
{ {
d_require_entity_nonnil(entity, return); d_require_entity_nonnil(entity, return);
d_state_delta_history_push_struct_delta(d_state_delta_history(), &entity->arch, .guard_entity = entity); d_state_delta_history_push_struct_delta(d_state_delta_history(), &entity->arch, .guard_entity = entity);
@@ -1560,6 +1565,44 @@ d_entity_equip_namef(D_Entity *entity, char *fmt, ...)
scratch_end(scratch); scratch_end(scratch);
} }
//- rjf: params tree equipment
internal void
d_entity_equip_params(D_Entity *entity, MD_Node *params)
{
if(entity->params_arena == 0)
{
entity->params_arena = arena_alloc();
}
arena_clear(entity->params_arena);
entity->params_root = md_tree_copy(entity->params_arena, params);
}
internal void
d_entity_equip_param(D_Entity *entity, String8 key, String8 value)
{
Temp scratch = scratch_begin(0, 0);
{
MD_Node *params = md_tree_copy(scratch.arena, entity->params_root);
MD_Node *key_node = md_child_from_string(params, key, 0);
if(md_node_is_nil(key_node))
{
key_node = md_push_node(scratch.arena, MD_NodeKind_Main, MD_NodeFlag_Identifier, key, key, 0);
md_node_push_child(params, key_node);
}
MD_TokenizeResult value_tokenize = md_tokenize_from_text(scratch.arena, value);
MD_ParseResult value_parse = md_parse_from_text_tokens(scratch.arena, str8_zero(), value, value_tokenize.tokens);
for(MD_EachNode(child, value_parse.root->first))
{
child->parent = key_node;
}
key_node->first = value_parse.root->first;
key_node->last = value_parse.root->last;
d_entity_equip_params(entity, params);
}
scratch_end(scratch);
}
//- rjf: opening folders/files & maintaining the entity model of the filesystem //- rjf: opening folders/files & maintaining the entity model of the filesystem
internal D_Entity * internal D_Entity *
@@ -2208,7 +2251,7 @@ d_trap_net_from_thread__step_over_inst(Arena *arena, D_Entity *thread)
// rjf: thread => unpacked info // rjf: thread => unpacked info
D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process);
Architecture arch = d_architecture_from_entity(thread); Arch arch = d_arch_from_entity(thread);
U64 ip_vaddr = ctrl_query_cached_rip_from_thread(d_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); U64 ip_vaddr = ctrl_query_cached_rip_from_thread(d_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle);
// rjf: ip => machine code // rjf: ip => machine code
@@ -2248,7 +2291,7 @@ d_trap_net_from_thread__step_over_line(Arena *arena, D_Entity *thread)
D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process);
D_Entity *module = d_module_from_thread(thread); D_Entity *module = d_module_from_thread(thread);
DI_Key dbgi_key = d_dbgi_key_from_module(module); DI_Key dbgi_key = d_dbgi_key_from_module(module);
Architecture arch = d_architecture_from_entity(thread); Arch arch = d_arch_from_entity(thread);
U64 ip_vaddr = ctrl_query_cached_rip_from_thread(d_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); U64 ip_vaddr = ctrl_query_cached_rip_from_thread(d_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle);
log_infof("ip_vaddr: 0x%I64x\n", ip_vaddr); log_infof("ip_vaddr: 0x%I64x\n", ip_vaddr);
log_infof("dbgi_key: {%S, 0x%I64x}\n", dbgi_key.path, dbgi_key.min_timestamp); log_infof("dbgi_key: {%S, 0x%I64x}\n", dbgi_key.path, dbgi_key.min_timestamp);
@@ -2409,7 +2452,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, D_Entity *thread)
D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process);
D_Entity *module = d_module_from_thread(thread); D_Entity *module = d_module_from_thread(thread);
DI_Key dbgi_key = d_dbgi_key_from_module(module); DI_Key dbgi_key = d_dbgi_key_from_module(module);
Architecture arch = d_architecture_from_entity(thread); Arch arch = d_arch_from_entity(thread);
U64 ip_vaddr = ctrl_query_cached_rip_from_thread(d_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); U64 ip_vaddr = ctrl_query_cached_rip_from_thread(d_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle);
// rjf: ip => line vaddr range // rjf: ip => line vaddr range
@@ -3093,8 +3136,8 @@ d_tls_base_vaddr_from_process_root_rip(D_Entity *process, U64 root_vaddr, U64 ri
return base_vaddr; return base_vaddr;
} }
internal Architecture internal Arch
d_architecture_from_entity(D_Entity *entity) d_arch_from_entity(D_Entity *entity)
{ {
return entity->arch; return entity->arch;
} }
@@ -3173,7 +3216,7 @@ d_module_from_thread_candidates(D_Entity *thread, D_EntityList *candidates)
internal D_Unwind internal D_Unwind
d_unwind_from_ctrl_unwind(Arena *arena, DI_Scope *di_scope, D_Entity *process, CTRL_Unwind *base_unwind) d_unwind_from_ctrl_unwind(Arena *arena, DI_Scope *di_scope, D_Entity *process, CTRL_Unwind *base_unwind)
{ {
Architecture arch = d_architecture_from_entity(process); Arch arch = d_arch_from_entity(process);
D_Unwind result = {0}; D_Unwind result = {0};
result.frames.concrete_frame_count = base_unwind->frames.count; result.frames.concrete_frame_count = base_unwind->frames.count;
result.frames.total_frame_count = result.frames.concrete_frame_count; result.frames.total_frame_count = result.frames.concrete_frame_count;
@@ -3486,7 +3529,7 @@ d_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range)
if(frame_idx < unwind.frames.count) if(frame_idx < unwind.frames.count)
{ {
CTRL_UnwindFrame *f = &unwind.frames.v[frame_idx]; CTRL_UnwindFrame *f = &unwind.frames.v[frame_idx];
U64 regs_size = regs_block_size_from_architecture(e_interpret_ctx->reg_arch); U64 regs_size = regs_block_size_from_arch(e_interpret_ctx->reg_arch);
Rng1U64 legal_range = r1u64(0, regs_size); Rng1U64 legal_range = r1u64(0, regs_size);
Rng1U64 read_range = intersect_1u64(legal_range, range); Rng1U64 read_range = intersect_1u64(legal_range, range);
U64 read_size = dim_1u64(read_range); U64 read_size = dim_1u64(read_range);
@@ -3555,7 +3598,7 @@ d_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range)
if(frame_idx < unwind.frames.count) if(frame_idx < unwind.frames.count)
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
U64 regs_size = regs_block_size_from_architecture(d_architecture_from_entity(entity)); U64 regs_size = regs_block_size_from_arch(d_arch_from_entity(entity));
Rng1U64 legal_range = r1u64(0, regs_size); Rng1U64 legal_range = r1u64(0, regs_size);
Rng1U64 write_range = intersect_1u64(legal_range, range); Rng1U64 write_range = intersect_1u64(legal_range, range);
U64 write_size = dim_1u64(write_range); U64 write_size = dim_1u64(write_range);
@@ -5224,15 +5267,15 @@ d_lang_kind_from_eval_params(E_Eval eval, MD_Node *params)
return lang_kind; return lang_kind;
} }
internal Architecture internal Arch
d_architecture_from_eval_params(E_Eval eval, MD_Node *params) d_arch_from_eval_params(E_Eval eval, MD_Node *params)
{ {
Architecture arch = Architecture_Null; Arch arch = Arch_Null;
MD_Node *arch_node = md_child_from_string(params, str8_lit("arch"), 0); MD_Node *arch_node = md_child_from_string(params, str8_lit("arch"), 0);
String8 arch_kind_string = arch_node->first->string; String8 arch_kind_string = arch_node->first->string;
if(str8_match(arch_kind_string, str8_lit("x64"), StringMatchFlag_CaseInsensitive)) if(str8_match(arch_kind_string, str8_lit("x64"), StringMatchFlag_CaseInsensitive))
{ {
arch = Architecture_x64; arch = Arch_x64;
} }
return arch; return arch;
} }
@@ -8310,7 +8353,7 @@ d_begin_frame(Arena *arena, D_CmdList *cmds, F32 dt)
//- rjf: unpack eval-dependent info //- rjf: unpack eval-dependent info
D_Entity *process = d_entity_from_handle(d_regs()->process); D_Entity *process = d_entity_from_handle(d_regs()->process);
D_Entity *thread = d_entity_from_handle(d_regs()->thread); D_Entity *thread = d_entity_from_handle(d_regs()->thread);
Architecture arch = d_architecture_from_entity(thread); Arch arch = d_arch_from_entity(thread);
U64 unwind_count = d_regs()->unwind_count; U64 unwind_count = d_regs()->unwind_count;
U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count);
CTRL_Unwind unwind = d_query_cached_unwind_from_thread(thread); CTRL_Unwind unwind = d_query_cached_unwind_from_thread(thread);
@@ -8330,7 +8373,7 @@ d_begin_frame(Arena *arena, D_CmdList *cmds, F32 dt)
{ {
D_Entity *m = n->entity; D_Entity *m = n->entity;
DI_Key dbgi_key = d_dbgi_key_from_module(m); DI_Key dbgi_key = d_dbgi_key_from_module(m);
eval_modules[eval_module_idx].arch = d_architecture_from_entity(m); eval_modules[eval_module_idx].arch = d_arch_from_entity(m);
eval_modules[eval_module_idx].rdi = di_rdi_from_key(d_state->frame_di_scope, &dbgi_key, 0); eval_modules[eval_module_idx].rdi = di_rdi_from_key(d_state->frame_di_scope, &dbgi_key, 0);
eval_modules[eval_module_idx].vaddr_range = m->vaddr_rng; eval_modules[eval_module_idx].vaddr_range = m->vaddr_rng;
eval_modules[eval_module_idx].space = d_eval_space_from_entity(d_entity_ancestor_from_kind(m, D_EntityKind_Process)); eval_modules[eval_module_idx].space = d_eval_space_from_entity(d_entity_ancestor_from_kind(m, D_EntityKind_Process));
@@ -8423,12 +8466,12 @@ d_begin_frame(Arena *arena, D_CmdList *cmds, F32 dt)
{ {
e_member_list_push_new(scratch.arena, &entity_members, .name = str8_lit("Enabled"), .off = 0, .type_key = e_type_key_basic(E_TypeKind_S64)); e_member_list_push_new(scratch.arena, &entity_members, .name = str8_lit("Enabled"), .off = 0, .type_key = e_type_key_basic(E_TypeKind_S64));
e_member_list_push_new(scratch.arena, &entity_members, .name = str8_lit("Hit Count"),.off = 0+8, .type_key = e_type_key_basic(E_TypeKind_U64)); e_member_list_push_new(scratch.arena, &entity_members, .name = str8_lit("Hit Count"),.off = 0+8, .type_key = e_type_key_basic(E_TypeKind_U64));
e_member_list_push_new(scratch.arena, &entity_members, .name = str8_lit("Label"), .off = 0+8+8, .type_key = e_type_key_cons_ptr(architecture_from_context(), e_type_key_basic(E_TypeKind_Char8))); e_member_list_push_new(scratch.arena, &entity_members, .name = str8_lit("Label"), .off = 0+8+8, .type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_Char8)));
e_member_list_push_new(scratch.arena, &entity_members, .name = str8_lit("Location"), .off = 0+8+8+8, .type_key = e_type_key_cons_ptr(architecture_from_context(), e_type_key_basic(E_TypeKind_Char8))); e_member_list_push_new(scratch.arena, &entity_members, .name = str8_lit("Location"), .off = 0+8+8+8, .type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_Char8)));
e_member_list_push_new(scratch.arena, &entity_members, .name = str8_lit("Condition"),.off = 0+8+8+8+8,.type_key = e_type_key_cons_ptr(architecture_from_context(), e_type_key_basic(E_TypeKind_Char8))); e_member_list_push_new(scratch.arena, &entity_members, .name = str8_lit("Condition"),.off = 0+8+8+8+8,.type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_Char8)));
} }
E_MemberArray entity_members_array = e_member_array_from_list(scratch.arena, &entity_members); E_MemberArray entity_members_array = e_member_array_from_list(scratch.arena, &entity_members);
E_TypeKey entity_type = e_type_key_cons(.arch = architecture_from_context(), E_TypeKey entity_type = e_type_key_cons(.arch = arch_from_context(),
.kind = E_TypeKind_Struct, .kind = E_TypeKind_Struct,
.name = str8_lit("Entity"), .name = str8_lit("Entity"),
.members = entity_members_array.v, .members = entity_members_array.v,
+12 -4
View File
@@ -289,7 +289,7 @@ struct D_Entity
// rjf: ctrl equipment // rjf: ctrl equipment
CTRL_MachineID ctrl_machine_id; CTRL_MachineID ctrl_machine_id;
DMN_Handle ctrl_handle; DMN_Handle ctrl_handle;
Architecture arch; Arch arch;
U32 ctrl_id; U32 ctrl_id;
U64 stack_base; U64 stack_base;
Rng1U64 vaddr_rng; Rng1U64 vaddr_rng;
@@ -297,6 +297,10 @@ struct D_Entity
// rjf: string equipment // rjf: string equipment
String8 string; String8 string;
// rjf: parameter tree
Arena *params_arena;
MD_Node *params_root;
}; };
typedef struct D_EntityNode D_EntityNode; typedef struct D_EntityNode D_EntityNode;
@@ -1251,7 +1255,7 @@ internal void d_entity_equip_timestamp(D_Entity *entity, U64 timestamp);
//- rjf: control layer correllation equipment //- rjf: control layer correllation equipment
internal void d_entity_equip_ctrl_machine_id(D_Entity *entity, CTRL_MachineID machine_id); internal void d_entity_equip_ctrl_machine_id(D_Entity *entity, CTRL_MachineID machine_id);
internal void d_entity_equip_ctrl_handle(D_Entity *entity, DMN_Handle handle); internal void d_entity_equip_ctrl_handle(D_Entity *entity, DMN_Handle handle);
internal void d_entity_equip_arch(D_Entity *entity, Architecture arch); internal void d_entity_equip_arch(D_Entity *entity, Arch arch);
internal void d_entity_equip_ctrl_id(D_Entity *entity, U32 id); internal void d_entity_equip_ctrl_id(D_Entity *entity, U32 id);
internal void d_entity_equip_stack_base(D_Entity *entity, U64 stack_base); internal void d_entity_equip_stack_base(D_Entity *entity, U64 stack_base);
internal void d_entity_equip_vaddr_rng(D_Entity *entity, Rng1U64 range); internal void d_entity_equip_vaddr_rng(D_Entity *entity, Rng1U64 range);
@@ -1261,6 +1265,10 @@ internal void d_entity_equip_vaddr(D_Entity *entity, U64 vaddr);
internal void d_entity_equip_name(D_Entity *entity, String8 name); internal void d_entity_equip_name(D_Entity *entity, String8 name);
internal void d_entity_equip_namef(D_Entity *entity, char *fmt, ...); internal void d_entity_equip_namef(D_Entity *entity, char *fmt, ...);
//- rjf: params tree equipment
internal void d_entity_equip_params(D_Entity *entity, MD_Node *params);
internal void d_entity_equip_param(D_Entity *entity, String8 key, String8 value);
//- rjf: opening folders/files & maintaining the entity model of the filesystem //- rjf: opening folders/files & maintaining the entity model of the filesystem
internal D_Entity *d_entity_from_path(String8 path, D_EntityFromPathFlags flags); internal D_Entity *d_entity_from_path(String8 path, D_EntityFromPathFlags flags);
@@ -1341,7 +1349,7 @@ internal D_LineList d_lines_from_file_path_line_num(Arena *arena, String8 file_p
internal D_Entity *d_module_from_process_vaddr(D_Entity *process, U64 vaddr); internal D_Entity *d_module_from_process_vaddr(D_Entity *process, U64 vaddr);
internal D_Entity *d_module_from_thread(D_Entity *thread); internal D_Entity *d_module_from_thread(D_Entity *thread);
internal U64 d_tls_base_vaddr_from_process_root_rip(D_Entity *process, U64 root_vaddr, U64 rip_vaddr); internal U64 d_tls_base_vaddr_from_process_root_rip(D_Entity *process, U64 root_vaddr, U64 rip_vaddr);
internal Architecture d_architecture_from_entity(D_Entity *entity); internal Arch d_arch_from_entity(D_Entity *entity);
internal E_String2NumMap *d_push_locals_map_from_dbgi_key_voff(Arena *arena, DI_Scope *scope, DI_Key *dbgi_key, U64 voff); internal E_String2NumMap *d_push_locals_map_from_dbgi_key_voff(Arena *arena, DI_Scope *scope, DI_Key *dbgi_key, U64 voff);
internal E_String2NumMap *d_push_member_map_from_dbgi_key_voff(Arena *arena, DI_Scope *scope, DI_Key *dbgi_key, U64 voff); internal E_String2NumMap *d_push_member_map_from_dbgi_key_voff(Arena *arena, DI_Scope *scope, DI_Key *dbgi_key, U64 voff);
internal B32 d_set_thread_rip(D_Entity *thread, U64 vaddr); internal B32 d_set_thread_rip(D_Entity *thread, U64 vaddr);
@@ -1456,7 +1464,7 @@ internal E_TypeKey d_type_key_from_params(MD_Node *params);
internal E_Value d_value_from_params_key(MD_Node *params, String8 key); internal E_Value d_value_from_params_key(MD_Node *params, String8 key);
internal Rng1U64 d_range_from_eval_params(E_Eval eval, MD_Node *params); internal Rng1U64 d_range_from_eval_params(E_Eval eval, MD_Node *params);
internal TXT_LangKind d_lang_kind_from_eval_params(E_Eval eval, MD_Node *params); internal TXT_LangKind d_lang_kind_from_eval_params(E_Eval eval, MD_Node *params);
internal Architecture d_architecture_from_eval_params(E_Eval eval, MD_Node *params); internal Arch d_arch_from_eval_params(E_Eval eval, MD_Node *params);
internal Vec2S32 d_dim2s32_from_eval_params(E_Eval eval, MD_Node *params); internal Vec2S32 d_dim2s32_from_eval_params(E_Eval eval, MD_Node *params);
internal R_Tex2DFormat d_tex2dformat_from_eval_params(E_Eval eval, MD_Node *params); internal R_Tex2DFormat d_tex2dformat_from_eval_params(E_Eval eval, MD_Node *params);
+11 -11
View File
@@ -4612,11 +4612,11 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, D_CmdList *cmds)
//- rjf: gather registers //- rjf: gather registers
if(ws->autocomp_lister_params.flags & DF_AutoCompListerFlag_Registers) if(ws->autocomp_lister_params.flags & DF_AutoCompListerFlag_Registers)
{ {
Architecture arch = d_architecture_from_entity(thread); Arch arch = d_arch_from_entity(thread);
U64 reg_names_count = regs_reg_code_count_from_architecture(arch); U64 reg_names_count = regs_reg_code_count_from_arch(arch);
U64 alias_names_count = regs_alias_code_count_from_architecture(arch); U64 alias_names_count = regs_alias_code_count_from_arch(arch);
String8 *reg_names = regs_reg_code_string_table_from_architecture(arch); String8 *reg_names = regs_reg_code_string_table_from_arch(arch);
String8 *alias_names = regs_alias_code_string_table_from_architecture(arch); String8 *alias_names = regs_alias_code_string_table_from_arch(arch);
for(U64 idx = 0; idx < reg_names_count; idx += 1) for(U64 idx = 0; idx < reg_names_count; idx += 1)
{ {
if(reg_names[idx].size != 0) if(reg_names[idx].size != 0)
@@ -4699,12 +4699,12 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, D_CmdList *cmds)
//- rjf: gather architectures //- rjf: gather architectures
if(ws->autocomp_lister_params.flags & DF_AutoCompListerFlag_Architectures) if(ws->autocomp_lister_params.flags & DF_AutoCompListerFlag_Architectures)
{ {
for(EachNonZeroEnumVal(Architecture, arch)) for(EachNonZeroEnumVal(Arch, arch))
{ {
DF_AutoCompListerItem item = {0}; DF_AutoCompListerItem item = {0};
{ {
item.string = string_from_architecture(arch); item.string = string_from_arch(arch);
item.kind_string = str8_lit("Architecture"); item.kind_string = str8_lit("Arch");
item.matches = fuzzy_match_find(scratch.arena, query, item.string); item.matches = fuzzy_match_find(scratch.arena, query, item.string);
} }
if(query.size == 0 || item.matches.count != 0) if(query.size == 0 || item.matches.count != 0)
@@ -9998,8 +9998,8 @@ df_entity_tooltips(D_Entity *entity)
{ {
String8 display_string = d_display_string_from_entity(scratch.arena, entity); String8 display_string = d_display_string_from_entity(scratch.arena, entity);
U64 rip_vaddr = d_query_cached_rip_from_thread(entity); U64 rip_vaddr = d_query_cached_rip_from_thread(entity);
Architecture arch = d_architecture_from_entity(entity); Arch arch = d_arch_from_entity(entity);
String8 arch_str = string_from_architecture(arch); String8 arch_str = string_from_arch(arch);
U32 pid_or_tid = entity->ctrl_id; U32 pid_or_tid = entity->ctrl_id;
if(display_string.size != 0) UI_PrefWidth(ui_children_sum(1)) UI_Row if(display_string.size != 0) UI_PrefWidth(ui_children_sum(1)) UI_Row
{ {
@@ -10045,7 +10045,7 @@ df_entity_tooltips(D_Entity *entity)
} }
UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_children_sum(1)) UI_Row
{ {
UI_PrefWidth(ui_em(18.f, 1.f)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_labelf("Architecture: "); UI_PrefWidth(ui_em(18.f, 1.f)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_labelf("Arch: ");
UI_PrefWidth(ui_text_dim(10, 1)) ui_label(arch_str); UI_PrefWidth(ui_text_dim(10, 1)) ui_label(arch_str);
} }
ui_spacer(ui_em(1.5f, 1.f)); ui_spacer(ui_em(1.5f, 1.f));
+17 -17
View File
@@ -985,7 +985,7 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d
// //
FNT_Tag code_font = df_font_from_slot(DF_FontSlot_Code); FNT_Tag code_font = df_font_from_slot(DF_FontSlot_Code);
D_Entity *thread = d_entity_from_handle(d_regs()->thread); D_Entity *thread = d_entity_from_handle(d_regs()->thread);
Architecture arch = d_architecture_from_entity(thread); Arch arch = d_arch_from_entity(thread);
CTRL_Unwind base_unwind = d_query_cached_unwind_from_thread(thread); CTRL_Unwind base_unwind = d_query_cached_unwind_from_thread(thread);
D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process); D_Entity *process = d_entity_ancestor_from_kind(thread, D_EntityKind_Process);
D_Unwind rich_unwind = d_unwind_from_ctrl_unwind(scratch.arena, di_scope, process, &base_unwind); D_Unwind rich_unwind = d_unwind_from_ctrl_unwind(scratch.arena, di_scope, process, &base_unwind);
@@ -1107,12 +1107,12 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d
{ {
e_member_list_push_new(scratch.arena, &bp_members, .name = str8_lit("Enabled"), .off = 0, .type_key = e_type_key_basic(E_TypeKind_S64)); e_member_list_push_new(scratch.arena, &bp_members, .name = str8_lit("Enabled"), .off = 0, .type_key = e_type_key_basic(E_TypeKind_S64));
e_member_list_push_new(scratch.arena, &bp_members, .name = str8_lit("Hit Count"),.off = 0+8, .type_key = e_type_key_basic(E_TypeKind_U64)); e_member_list_push_new(scratch.arena, &bp_members, .name = str8_lit("Hit Count"),.off = 0+8, .type_key = e_type_key_basic(E_TypeKind_U64));
e_member_list_push_new(scratch.arena, &bp_members, .name = str8_lit("Label"), .off = 0+8+8, .type_key = e_type_key_cons_ptr(architecture_from_context(), e_type_key_basic(E_TypeKind_Char8))); e_member_list_push_new(scratch.arena, &bp_members, .name = str8_lit("Label"), .off = 0+8+8, .type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_Char8)));
e_member_list_push_new(scratch.arena, &bp_members, .name = str8_lit("Location"), .off = 0+8+8+8, .type_key = e_type_key_cons_ptr(architecture_from_context(), e_type_key_basic(E_TypeKind_Char8))); e_member_list_push_new(scratch.arena, &bp_members, .name = str8_lit("Location"), .off = 0+8+8+8, .type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_Char8)));
e_member_list_push_new(scratch.arena, &bp_members, .name = str8_lit("Condition"),.off = 0+8+8+8+8,.type_key = e_type_key_cons_ptr(architecture_from_context(), e_type_key_basic(E_TypeKind_Char8))); e_member_list_push_new(scratch.arena, &bp_members, .name = str8_lit("Condition"),.off = 0+8+8+8+8,.type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_Char8)));
} }
E_MemberArray bp_members_array = e_member_array_from_list(scratch.arena, &bp_members); E_MemberArray bp_members_array = e_member_array_from_list(scratch.arena, &bp_members);
E_TypeKey bp_type = e_type_key_cons(.arch = architecture_from_context(), .kind = E_TypeKind_Struct, .name = str8_lit("Breakpoint"), .members = bp_members_array.v, .count = bp_members_array.count); E_TypeKey bp_type = e_type_key_cons(.arch = arch_from_context(), .kind = E_TypeKind_Struct, .name = str8_lit("Breakpoint"), .members = bp_members_array.v, .count = bp_members_array.count);
E_Expr *bp_expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); E_Expr *bp_expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
bp_expr->type_key = bp_type; bp_expr->type_key = bp_type;
bp_expr->mode = E_Mode_Offset; bp_expr->mode = E_Mode_Offset;
@@ -1147,7 +1147,7 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d
e_member_list_push_new(scratch.arena, &wp_members, .name = str8_lit("Location"), .off = 0, .type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_Char8), 256)); e_member_list_push_new(scratch.arena, &wp_members, .name = str8_lit("Location"), .off = 0, .type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_Char8), 256));
} }
E_MemberArray wp_members_array = e_member_array_from_list(scratch.arena, &wp_members); E_MemberArray wp_members_array = e_member_array_from_list(scratch.arena, &wp_members);
E_TypeKey wp_type = e_type_key_cons(.arch = architecture_from_context(), .kind = E_TypeKind_Struct, .name = str8_lit("Watch Pin"), .members = wp_members_array.v, .count = wp_members_array.count); E_TypeKey wp_type = e_type_key_cons(.arch = arch_from_context(), .kind = E_TypeKind_Struct, .name = str8_lit("Watch Pin"), .members = wp_members_array.v, .count = wp_members_array.count);
E_Expr *wp_expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); E_Expr *wp_expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
wp_expr->type_key = wp_type; wp_expr->type_key = wp_type;
wp_expr->mode = E_Mode_Offset; wp_expr->mode = E_Mode_Offset;
@@ -1235,11 +1235,11 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d
case DF_WatchViewFillKind_Registers: case DF_WatchViewFillKind_Registers:
{ {
D_Entity *thread = d_entity_from_handle(d_regs()->thread); D_Entity *thread = d_entity_from_handle(d_regs()->thread);
Architecture arch = d_architecture_from_entity(thread); Arch arch = d_arch_from_entity(thread);
U64 reg_count = regs_reg_code_count_from_architecture(arch); U64 reg_count = regs_reg_code_count_from_arch(arch);
String8 *reg_strings = regs_reg_code_string_table_from_architecture(arch); String8 *reg_strings = regs_reg_code_string_table_from_arch(arch);
U64 alias_count = regs_alias_code_count_from_architecture(arch); U64 alias_count = regs_alias_code_count_from_arch(arch);
String8 *alias_strings = regs_alias_code_string_table_from_architecture(arch); String8 *alias_strings = regs_alias_code_string_table_from_arch(arch);
U64 num = 1; U64 num = 1;
for(U64 reg_idx = 1; reg_idx < reg_count; reg_idx += 1, num += 1) for(U64 reg_idx = 1; reg_idx < reg_count; reg_idx += 1, num += 1)
{ {
@@ -6651,7 +6651,7 @@ DF_VIEW_CMD_FUNCTION_DEF(disasm)
space = d_eval_space_from_entity(d_entity_from_handle(d_regs()->process)); space = d_eval_space_from_entity(d_entity_from_handle(d_regs()->process));
} }
Rng1U64 range = d_range_from_eval_params(eval, params); Rng1U64 range = d_range_from_eval_params(eval, params);
Architecture arch = d_architecture_from_eval_params(eval, params); Arch arch = d_arch_from_eval_params(eval, params);
D_Entity *space_entity = d_entity_from_eval_space(space); D_Entity *space_entity = d_entity_from_eval_space(space);
D_Entity *dasm_module = &d_nil_entity; D_Entity *dasm_module = &d_nil_entity;
DI_Key dbgi_key = {0}; DI_Key dbgi_key = {0};
@@ -6661,7 +6661,7 @@ DF_VIEW_CMD_FUNCTION_DEF(disasm)
default:{}break; default:{}break;
case D_EntityKind_Process: case D_EntityKind_Process:
{ {
arch = d_architecture_from_entity(space_entity); arch = d_arch_from_entity(space_entity);
dasm_module = d_module_from_process_vaddr(space_entity, range.min); dasm_module = d_module_from_process_vaddr(space_entity, range.min);
dbgi_key = d_dbgi_key_from_module(dasm_module); dbgi_key = d_dbgi_key_from_module(dasm_module);
base_vaddr = dasm_module->vaddr_rng.min; base_vaddr = dasm_module->vaddr_rng.min;
@@ -6680,7 +6680,7 @@ DF_VIEW_CMD_FUNCTION_DEF(disasm)
} }
DASM_Info dasm_info = dasm_info_from_key_params(dasm_scope, dasm_key, &dasm_params, &dasm_data_hash); DASM_Info dasm_info = dasm_info_from_key_params(dasm_scope, dasm_key, &dasm_params, &dasm_data_hash);
d_regs()->text_key = dasm_info.text_key; d_regs()->text_key = dasm_info.text_key;
d_regs()->lang_kind = txt_lang_kind_from_architecture(arch); d_regs()->lang_kind = txt_lang_kind_from_arch(arch);
U128 dasm_text_hash = {0}; U128 dasm_text_hash = {0};
TXT_TextInfo dasm_text_info = txt_text_info_from_key_lang(txt_scope, d_regs()->text_key, d_regs()->lang_kind, &dasm_text_hash); TXT_TextInfo dasm_text_info = txt_text_info_from_key_lang(txt_scope, d_regs()->text_key, d_regs()->lang_kind, &dasm_text_hash);
String8 dasm_text_data = hs_data_from_hash(hs_scope, dasm_text_hash); String8 dasm_text_data = hs_data_from_hash(hs_scope, dasm_text_hash);
@@ -6783,7 +6783,7 @@ DF_VIEW_UI_FUNCTION_DEF(disasm)
space = d_eval_space_from_entity(d_entity_from_handle(d_regs()->process)); space = d_eval_space_from_entity(d_entity_from_handle(d_regs()->process));
} }
Rng1U64 range = d_range_from_eval_params(eval, params); Rng1U64 range = d_range_from_eval_params(eval, params);
Architecture arch = d_architecture_from_eval_params(eval, params); Arch arch = d_arch_from_eval_params(eval, params);
D_Entity *space_entity = d_entity_from_eval_space(space); D_Entity *space_entity = d_entity_from_eval_space(space);
D_Entity *dasm_module = &d_nil_entity; D_Entity *dasm_module = &d_nil_entity;
DI_Key dbgi_key = {0}; DI_Key dbgi_key = {0};
@@ -6793,7 +6793,7 @@ DF_VIEW_UI_FUNCTION_DEF(disasm)
default:{}break; default:{}break;
case D_EntityKind_Process: case D_EntityKind_Process:
{ {
arch = d_architecture_from_entity(space_entity); arch = d_arch_from_entity(space_entity);
dasm_module = d_module_from_process_vaddr(space_entity, range.min); dasm_module = d_module_from_process_vaddr(space_entity, range.min);
dbgi_key = d_dbgi_key_from_module(dasm_module); dbgi_key = d_dbgi_key_from_module(dasm_module);
base_vaddr = dasm_module->vaddr_rng.min; base_vaddr = dasm_module->vaddr_rng.min;
@@ -6812,7 +6812,7 @@ DF_VIEW_UI_FUNCTION_DEF(disasm)
} }
DASM_Info dasm_info = dasm_info_from_key_params(dasm_scope, dasm_key, &dasm_params, &dasm_data_hash); DASM_Info dasm_info = dasm_info_from_key_params(dasm_scope, dasm_key, &dasm_params, &dasm_data_hash);
d_regs()->text_key = dasm_info.text_key; d_regs()->text_key = dasm_info.text_key;
d_regs()->lang_kind = txt_lang_kind_from_architecture(arch); d_regs()->lang_kind = txt_lang_kind_from_arch(arch);
U128 dasm_text_hash = {0}; U128 dasm_text_hash = {0};
TXT_TextInfo dasm_text_info = txt_text_info_from_key_lang(txt_scope, d_regs()->text_key, d_regs()->lang_kind, &dasm_text_hash); TXT_TextInfo dasm_text_info = txt_text_info_from_key_lang(txt_scope, d_regs()->text_key, d_regs()->lang_kind, &dasm_text_hash);
String8 dasm_text_data = hs_data_from_hash(hs_scope, dasm_text_hash); String8 dasm_text_data = hs_data_from_hash(hs_scope, dasm_text_hash);
+4 -4
View File
@@ -131,8 +131,8 @@ dmn_rip_from_thread(DMN_Handle thread)
U64 result = 0; U64 result = 0;
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
{ {
Architecture arch = dmn_arch_from_thread(thread); Arch arch = dmn_arch_from_thread(thread);
U64 reg_block_size = regs_block_size_from_architecture(arch); U64 reg_block_size = regs_block_size_from_arch(arch);
void *reg_block = push_array(scratch.arena, U8, reg_block_size); void *reg_block = push_array(scratch.arena, U8, reg_block_size);
dmn_thread_read_reg_block(thread, reg_block); dmn_thread_read_reg_block(thread, reg_block);
result = regs_rip_from_arch_block(arch, reg_block); result = regs_rip_from_arch_block(arch, reg_block);
@@ -147,8 +147,8 @@ dmn_rsp_from_thread(DMN_Handle thread)
U64 result = 0; U64 result = 0;
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
{ {
Architecture arch = dmn_arch_from_thread(thread); Arch arch = dmn_arch_from_thread(thread);
U64 reg_block_size = regs_block_size_from_architecture(arch); U64 reg_block_size = regs_block_size_from_arch(arch);
void *reg_block = push_array(scratch.arena, U8, reg_block_size); void *reg_block = push_array(scratch.arena, U8, reg_block_size);
dmn_thread_read_reg_block(thread, reg_block); dmn_thread_read_reg_block(thread, reg_block);
result = regs_rsp_from_arch_block(arch, reg_block); result = regs_rsp_from_arch_block(arch, reg_block);
+2 -2
View File
@@ -68,7 +68,7 @@ struct DMN_Event
DMN_Handle process; DMN_Handle process;
DMN_Handle thread; DMN_Handle thread;
DMN_Handle module; DMN_Handle module;
Architecture arch; Arch arch;
U64 address; U64 address;
U64 size; U64 size;
String8 string; String8 string;
@@ -228,7 +228,7 @@ internal B32 dmn_process_write(DMN_Handle process, Rng1U64 range, void *src);
#define dmn_process_write_struct(process, vaddr, ptr) dmn_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr) #define dmn_process_write_struct(process, vaddr, ptr) dmn_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr)
//- rjf: threads //- rjf: threads
internal Architecture dmn_arch_from_thread(DMN_Handle handle); internal Arch dmn_arch_from_thread(DMN_Handle handle);
internal U64 dmn_stack_base_vaddr_from_thread(DMN_Handle handle); internal U64 dmn_stack_base_vaddr_from_thread(DMN_Handle handle);
internal U64 dmn_tls_root_vaddr_from_thread(DMN_Handle handle); internal U64 dmn_tls_root_vaddr_from_thread(DMN_Handle handle);
internal B32 dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block); internal B32 dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block);
+1 -1
View File
@@ -131,7 +131,7 @@ dmn_process_write(DMN_Handle process, Rng1U64 range, void *src)
//- rjf: threads //- rjf: threads
internal Architecture internal Arch
dmn_arch_from_thread(DMN_Handle handle) dmn_arch_from_thread(DMN_Handle handle)
{ {
} }
+28 -28
View File
@@ -115,10 +115,10 @@ demon_lnx_open_memory_fd_for_pid(pid_t pid){
return(result); return(result);
} }
internal Architecture internal Arch
demon_lnx_arch_from_pid(pid_t pid){ demon_lnx_arch_from_pid(pid_t pid){
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
Architecture result = Architecture_Null; Arch result = Arch_Null;
// exe path // exe path
String8 exe_path = demon_lnx_executable_path_from_pid(scratch.arena, pid); String8 exe_path = demon_lnx_executable_path_from_pid(scratch.arena, pid);
@@ -168,22 +168,22 @@ demon_lnx_arch_from_pid(pid_t pid){
switch (ehdr.e_machine){ switch (ehdr.e_machine){
case SYMS_ElfMachineKind_386: case SYMS_ElfMachineKind_386:
{ {
result = Architecture_x86; result = Arch_x86;
}break; }break;
case SYMS_ElfMachineKind_ARM: case SYMS_ElfMachineKind_ARM:
{ {
result = Architecture_arm32; result = Arch_arm32;
}break; }break;
case SYMS_ElfMachineKind_X86_64: case SYMS_ElfMachineKind_X86_64:
{ {
result = Architecture_x64; result = Arch_x64;
}break; }break;
case SYMS_ElfMachineKind_AARCH64: case SYMS_ElfMachineKind_AARCH64:
{ {
result = Architecture_arm64; result = Arch_arm64;
}break; }break;
} }
@@ -192,9 +192,9 @@ demon_lnx_arch_from_pid(pid_t pid){
} }
internal DEMON_LNX_ProcessAux internal DEMON_LNX_ProcessAux
demon_lnx_aux_from_pid(pid_t pid, Architecture arch){ demon_lnx_aux_from_pid(pid_t pid, Arch arch){
DEMON_LNX_ProcessAux result = {0}; DEMON_LNX_ProcessAux result = {0};
B32 addr_32bit = (arch == Architecture_x86 || arch == Architecture_arm32); B32 addr_32bit = (arch == Arch_x86 || arch == Arch_arm32);
// open aux data // open aux data
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
@@ -300,8 +300,8 @@ demon_lnx_phdr_info_from_memory(int memory_fd, B32 is_32bit, U64 phvaddr, U64 ph
internal DEMON_LNX_ModuleNode* internal DEMON_LNX_ModuleNode*
demon_lnx_module_list_from_process(Arena *arena, DEMON_Entity *process){ demon_lnx_module_list_from_process(Arena *arena, DEMON_Entity *process){
Architecture arch = (Architecture)process->arch; Arch arch = (Arch)process->arch;
B32 is_32bit = (arch == Architecture_x86 || arch == Architecture_arm32); B32 is_32bit = (arch == Arch_x86 || arch == Arch_arm32);
int memory_fd = (int)process->ext_u64; int memory_fd = (int)process->ext_u64;
// aux from pid // aux from pid
@@ -839,11 +839,11 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){
U8 *trap_swap_bytes = 0; U8 *trap_swap_bytes = 0;
if (result.first == 0){ if (result.first == 0){
// TODO(allen): per-Architecture implementation of single steps // TODO(allen): per-Arch implementation of single steps
// set single step bit // set single step bit
if (single_step_thread != 0){ if (single_step_thread != 0){
switch (single_step_thread->arch){ switch (single_step_thread->arch){
case Architecture_x86: case Arch_x86:
{ {
// TODO(allen): possibly buggy // TODO(allen): possibly buggy
SYMS_RegX86 regs = {0}; SYMS_RegX86 regs = {0};
@@ -852,7 +852,7 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){
demon_os_write_regs_x86(single_step_thread, &regs); demon_os_write_regs_x86(single_step_thread, &regs);
}break; }break;
case Architecture_x64: case Arch_x64:
{ {
// TODO(allen): possibly buggy // TODO(allen): possibly buggy
SYMS_RegX64 regs = {0}; SYMS_RegX64 regs = {0};
@@ -863,7 +863,7 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){
} }
} }
// TODO(allen): per-Architecture implementation of traps // TODO(allen): per-Arch implementation of traps
trap_swap_bytes = push_array_no_zero(scratch.arena, U8, controls->trap_count); trap_swap_bytes = push_array_no_zero(scratch.arena, U8, controls->trap_count);
{ {
@@ -980,13 +980,13 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){
union{ SYMS_RegX86 x86; SYMS_RegX64 x64; } regs = {0}; union{ SYMS_RegX86 x86; SYMS_RegX64 x64; } regs = {0};
switch (thread->arch){ switch (thread->arch){
case Architecture_x86: case Arch_x86:
{ {
demon_os_read_regs_x86(thread, &regs.x86); demon_os_read_regs_x86(thread, &regs.x86);
instruction_pointer = regs.x86.eip.u32; instruction_pointer = regs.x86.eip.u32;
}break; }break;
case Architecture_x64: case Arch_x64:
{ {
demon_os_read_regs_x64(thread, &regs.x64); demon_os_read_regs_x64(thread, &regs.x64);
instruction_pointer = regs.x64.rip.u64; instruction_pointer = regs.x64.rip.u64;
@@ -1052,7 +1052,7 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){
// this stuff in the log to make sense of it still. // this stuff in the log to make sense of it still.
} }
else{ else{
Architecture arch = demon_lnx_arch_from_pid(new_pid); Arch arch = demon_lnx_arch_from_pid(new_pid);
// process entity // process entity
DEMON_Entity *new_process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, new_pid); DEMON_Entity *new_process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, new_pid);
@@ -1105,14 +1105,14 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){
if (e_kind == DEMON_EventKind_Breakpoint){ if (e_kind == DEMON_EventKind_Breakpoint){
// TODO(allen): possibly buggy // TODO(allen): possibly buggy
switch (thread->arch){ switch (thread->arch){
case Architecture_x86: case Arch_x86:
{ {
instruction_pointer -= 1; instruction_pointer -= 1;
regs.x86.eip.u32 = instruction_pointer; regs.x86.eip.u32 = instruction_pointer;
demon_os_write_regs_x86(thread, &regs.x86); demon_os_write_regs_x86(thread, &regs.x86);
}break; }break;
case Architecture_x64: case Arch_x64:
{ {
instruction_pointer -= 1; instruction_pointer -= 1;
regs.x64.rip.u64 = instruction_pointer; regs.x64.rip.u64 = instruction_pointer;
@@ -1336,7 +1336,7 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){
// cleanup // cleanup
if (did_run){ if (did_run){
// TODO(allen): per-Architecture // TODO(allen): per-Arch
// unset traps // unset traps
{ {
DEMON_OS_Trap *trap = controls->traps; DEMON_OS_Trap *trap = controls->traps;
@@ -1348,7 +1348,7 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){
} }
} }
// TODO(allen): per-Architecture // TODO(allen): per-Arch
// unset single step bit // unset single step bit
// the single step bit is automatically unset whenever we single step // the single step bit is automatically unset whenever we single step
// but if *something else* happened, it will still be there ready to // but if *something else* happened, it will still be there ready to
@@ -1356,7 +1356,7 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){
if (single_step_thread != 0){ if (single_step_thread != 0){
// TODO(allen): possibly buggy // TODO(allen): possibly buggy
switch (single_step_thread->arch){ switch (single_step_thread->arch){
case Architecture_x86: case Arch_x86:
{ {
SYMS_RegX86 regs = {0}; SYMS_RegX86 regs = {0};
demon_os_read_regs_x86(single_step_thread, &regs); demon_os_read_regs_x86(single_step_thread, &regs);
@@ -1364,7 +1364,7 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){
demon_os_write_regs_x86(single_step_thread, &regs); demon_os_write_regs_x86(single_step_thread, &regs);
}break; }break;
case Architecture_x64: case Arch_x64:
{ {
SYMS_RegX64 regs = {0}; SYMS_RegX64 regs = {0};
demon_os_read_regs_x64(single_step_thread, &regs); demon_os_read_regs_x64(single_step_thread, &regs);
@@ -1555,7 +1555,7 @@ demon_os_launch_process(OS_LaunchOptions *options){
else{ else{
result = pid; result = pid;
Architecture arch = demon_lnx_arch_from_pid(pid); Arch arch = demon_lnx_arch_from_pid(pid);
// process entity // process entity
DEMON_Entity *process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, pid); DEMON_Entity *process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, pid);
@@ -1688,7 +1688,7 @@ demon_os_attach_process(U32 pid){
// initialize new entities on success // initialize new entities on success
if (result){ if (result){
Architecture arch = demon_lnx_arch_from_pid(the_process->pid); Arch arch = demon_lnx_arch_from_pid(the_process->pid);
// process entity // process entity
DEMON_Entity *process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, the_process->pid); DEMON_Entity *process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, the_process->pid);
@@ -1816,15 +1816,15 @@ internal U64
demon_os_tls_root_vaddr_from_thread(DEMON_Entity *thread){ demon_os_tls_root_vaddr_from_thread(DEMON_Entity *thread){
U64 result = 0; U64 result = 0;
switch (thread->arch){ switch (thread->arch){
case Architecture_x64: case Arch_x64:
case Architecture_x86: case Arch_x86:
{ {
U32 fsbase = 0; U32 fsbase = 0;
pid_t tid = (pid_t)thread->id; pid_t tid = (pid_t)thread->id;
if (ptrace(PT_GETFSBASE, tid, (void*)&fsbase, 0) != -1){ if (ptrace(PT_GETFSBASE, tid, (void*)&fsbase, 0) != -1){
result = (U64)fsbase; result = (U64)fsbase;
} }
if (thread->arch == Architecture_x64){ if (thread->arch == Arch_x64){
result += 8; result += 8;
} }
else{ else{
+2 -2
View File
@@ -198,8 +198,8 @@ internal B32 demon_lnx_attach_pid(Arena *arena, pid_t pid, DEM
internal String8 demon_lnx_executable_path_from_pid(Arena *arena, pid_t pid); internal String8 demon_lnx_executable_path_from_pid(Arena *arena, pid_t pid);
internal int demon_lnx_open_memory_fd_for_pid(pid_t pid); internal int demon_lnx_open_memory_fd_for_pid(pid_t pid);
internal Architecture demon_lnx_arch_from_pid(pid_t pid); internal Arch demon_lnx_arch_from_pid(pid_t pid);
internal DEMON_LNX_ProcessAux demon_lnx_aux_from_pid(pid_t pid, Architecture arch); internal DEMON_LNX_ProcessAux demon_lnx_aux_from_pid(pid_t pid, Arch arch);
internal DEMON_LNX_PhdrInfo demon_lnx_phdr_info_from_memory(int memory_fd, B32 is_32bit, internal DEMON_LNX_PhdrInfo demon_lnx_phdr_info_from_memory(int memory_fd, B32 is_32bit,
U64 phvaddr, U64 phstride, U64 phcount); U64 phvaddr, U64 phstride, U64 phcount);
internal DEMON_LNX_ModuleNode* demon_lnx_module_list_from_process(Arena *arena, DEMON_Entity *process); internal DEMON_LNX_ModuleNode* demon_lnx_module_list_from_process(Arena *arena, DEMON_Entity *process);
+50 -50
View File
@@ -492,23 +492,23 @@ dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr)
if(got_coff_header) if(got_coff_header)
{ {
U64 optional_size_off = 0; U64 optional_size_off = 0;
Architecture arch = Architecture_Null; Arch arch = Arch_Null;
switch(coff_header.machine) switch(coff_header.machine)
{ {
case COFF_MachineType_X86: case COFF_MachineType_X86:
{ {
arch = Architecture_x86; arch = Arch_x86;
optional_size_off = OffsetOf(PE_OptionalHeader32, sizeof_image); optional_size_off = OffsetOf(PE_OptionalHeader32, sizeof_image);
}break; }break;
case COFF_MachineType_X64: case COFF_MachineType_X64:
{ {
arch = Architecture_x64; arch = Arch_x64;
optional_size_off = OffsetOf(PE_OptionalHeader32Plus, sizeof_image); optional_size_off = OffsetOf(PE_OptionalHeader32Plus, sizeof_image);
}break; }break;
default: default:
{}break; {}break;
} }
if(arch != Architecture_Null) if(arch != Arch_Null)
{ {
U64 optional_off = coff_header_off + sizeof(coff_header); U64 optional_off = coff_header_off + sizeof(coff_header);
U32 size = 0; U32 size = 0;
@@ -577,7 +577,7 @@ dmn_w32_xsave_tag_word_from_real_tag_word(U16 ftw)
} }
internal B32 internal B32
dmn_w32_thread_read_reg_block(Architecture arch, HANDLE thread, void *reg_block) dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block)
{ {
B32 result = 0; B32 result = 0;
ProfBeginFunction(); ProfBeginFunction();
@@ -586,17 +586,17 @@ dmn_w32_thread_read_reg_block(Architecture arch, HANDLE thread, void *reg_block)
//////////////////////////// ////////////////////////////
//- rjf: unimplemented win32/arch combos //- rjf: unimplemented win32/arch combos
// //
case Architecture_Null: case Arch_Null:
case Architecture_COUNT: case Arch_COUNT:
{}break; {}break;
case Architecture_arm64: case Arch_arm64:
case Architecture_arm32: case Arch_arm32:
{NotImplemented;}break; {NotImplemented;}break;
//////////////////////////// ////////////////////////////
//- rjf: x86 //- rjf: x86
// //
case Architecture_x86: case Arch_x86:
{ {
REGS_RegBlockX86 *dst = (REGS_RegBlockX86 *)reg_block; REGS_RegBlockX86 *dst = (REGS_RegBlockX86 *)reg_block;
@@ -679,7 +679,7 @@ dmn_w32_thread_read_reg_block(Architecture arch, HANDLE thread, void *reg_block)
//////////////////////////// ////////////////////////////
//- rjf: x64 //- rjf: x64
// //
case Architecture_x64: case Arch_x64:
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
REGS_RegBlockX64 *dst = (REGS_RegBlockX64 *)reg_block; REGS_RegBlockX64 *dst = (REGS_RegBlockX64 *)reg_block;
@@ -871,7 +871,7 @@ dmn_w32_thread_read_reg_block(Architecture arch, HANDLE thread, void *reg_block)
} }
internal B32 internal B32
dmn_w32_thread_write_reg_block(Architecture arch, HANDLE thread, void *reg_block) dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block)
{ {
B32 result = 0; B32 result = 0;
ProfBeginFunction(); ProfBeginFunction();
@@ -880,17 +880,17 @@ dmn_w32_thread_write_reg_block(Architecture arch, HANDLE thread, void *reg_block
//////////////////////////// ////////////////////////////
//- rjf: unimplemented win32/arch combos //- rjf: unimplemented win32/arch combos
// //
case Architecture_Null: case Arch_Null:
case Architecture_COUNT: case Arch_COUNT:
{}break; {}break;
case Architecture_arm64: case Arch_arm64:
case Architecture_arm32: case Arch_arm32:
{NotImplemented;}break; {NotImplemented;}break;
//////////////////////////// ////////////////////////////
//- rjf: x86 //- rjf: x86
// //
case Architecture_x86: case Arch_x86:
{ {
REGS_RegBlockX86 *src = (REGS_RegBlockX86 *)reg_block; REGS_RegBlockX86 *src = (REGS_RegBlockX86 *)reg_block;
@@ -958,7 +958,7 @@ dmn_w32_thread_write_reg_block(Architecture arch, HANDLE thread, void *reg_block
//////////////////////////// ////////////////////////////
//- rjf: x64 //- rjf: x64
// //
case Architecture_x64: case Arch_x64:
{ {
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
REGS_RegBlockX64 *src = (REGS_RegBlockX64 *)reg_block; REGS_RegBlockX64 *src = (REGS_RegBlockX64 *)reg_block;
@@ -1450,11 +1450,11 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls)
if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero()))
{ {
DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread);
Architecture arch = thread->arch; Arch arch = thread->arch;
switch(arch) switch(arch)
{ {
default:{}break; default:{}break;
case Architecture_x64: case Arch_x64:
{ {
U32 ctx_flags = DMN_W32_CTX_X64|DMN_W32_CTX_INTEL_CONTROL; U32 ctx_flags = DMN_W32_CTX_X64|DMN_W32_CTX_INTEL_CONTROL;
DWORD size = 0; DWORD size = 0;
@@ -1477,19 +1477,19 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls)
if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) ProfScope("set single step bit") if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) ProfScope("set single step bit")
{ {
DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread);
Architecture arch = thread->arch; Arch arch = thread->arch;
switch(arch) switch(arch)
{ {
//- rjf: unimplemented win32/arch combos //- rjf: unimplemented win32/arch combos
case Architecture_Null: case Arch_Null:
case Architecture_COUNT: case Arch_COUNT:
{}break; {}break;
case Architecture_arm64: case Arch_arm64:
case Architecture_arm32: case Arch_arm32:
{NotImplemented;}break; {NotImplemented;}break;
//- rjf: x86 //- rjf: x86
case Architecture_x86: case Arch_x86:
{ {
REGS_RegBlockX86 regs = {0}; REGS_RegBlockX86 regs = {0};
dmn_thread_read_reg_block(ctrls->single_step_thread, &regs); dmn_thread_read_reg_block(ctrls->single_step_thread, &regs);
@@ -1498,7 +1498,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls)
}break; }break;
//- rjf: x64 //- rjf: x64
case Architecture_x64: case Arch_x64:
{ {
if(!GetThreadContext(thread->handle, single_step_thread_ctx)) if(!GetThreadContext(thread->handle, single_step_thread_ctx))
{ {
@@ -2095,7 +2095,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls)
default: default:
{ {
Temp temp = temp_begin(scratch.arena); Temp temp = temp_begin(scratch.arena);
U64 regs_block_size = regs_block_size_from_architecture(thread->arch); U64 regs_block_size = regs_block_size_from_arch(thread->arch);
void *regs_block = push_array(scratch.arena, U8, regs_block_size); void *regs_block = push_array(scratch.arena, U8, regs_block_size);
if(dmn_w32_thread_read_reg_block(thread->arch, thread->handle, regs_block)) if(dmn_w32_thread_read_reg_block(thread->arch, thread->handle, regs_block))
{ {
@@ -2106,7 +2106,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls)
}break; }break;
//- rjf: x64 (fastpath) //- rjf: x64 (fastpath)
case Architecture_x64: case Arch_x64:
{ {
CONTEXT *ctx = 0; CONTEXT *ctx = 0;
U32 ctx_flags = DMN_W32_CTX_X64|DMN_W32_CTX_INTEL_CONTROL; U32 ctx_flags = DMN_W32_CTX_X64|DMN_W32_CTX_INTEL_CONTROL;
@@ -2464,26 +2464,26 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls)
if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) ProfScope("unset single step bit") if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) ProfScope("unset single step bit")
{ {
DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread); DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread);
Architecture arch = thread->arch; Arch arch = thread->arch;
switch(arch) switch(arch)
{ {
//- rjf: unimplemented win32/arch combos //- rjf: unimplemented win32/arch combos
case Architecture_Null: case Arch_Null:
case Architecture_COUNT: case Arch_COUNT:
{}break; {}break;
case Architecture_arm64: case Arch_arm64:
case Architecture_arm32: case Arch_arm32:
{NotImplemented;}break; {NotImplemented;}break;
//- rjf: x86/64 //- rjf: x86/64
case Architecture_x86: case Arch_x86:
{ {
REGS_RegBlockX86 regs = {0}; REGS_RegBlockX86 regs = {0};
dmn_thread_read_reg_block(ctrls->single_step_thread, &regs); dmn_thread_read_reg_block(ctrls->single_step_thread, &regs);
regs.eflags.u32 &= ~0x100; regs.eflags.u32 &= ~0x100;
dmn_thread_write_reg_block(ctrls->single_step_thread, &regs); dmn_thread_write_reg_block(ctrls->single_step_thread, &regs);
}break; }break;
case Architecture_x64: case Arch_x64:
{ {
if(!GetThreadContext(thread->handle, single_step_thread_ctx)) if(!GetThreadContext(thread->handle, single_step_thread_ctx))
{ {
@@ -2737,10 +2737,10 @@ dmn_process_write(DMN_Handle process, Rng1U64 range, void *src)
//- rjf: threads //- rjf: threads
internal Architecture internal Arch
dmn_arch_from_thread(DMN_Handle handle) dmn_arch_from_thread(DMN_Handle handle)
{ {
Architecture arch = Architecture_Null; Arch arch = Arch_Null;
DMN_AccessScope DMN_AccessScope
{ {
DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle); DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle);
@@ -2762,18 +2762,18 @@ dmn_stack_base_vaddr_from_thread(DMN_Handle handle)
U64 tlb = thread->thread.thread_local_base; U64 tlb = thread->thread.thread_local_base;
switch(thread->arch) switch(thread->arch)
{ {
case Architecture_Null: case Arch_Null:
case Architecture_COUNT: case Arch_COUNT:
{}break; {}break;
case Architecture_arm64: case Arch_arm64:
case Architecture_arm32: case Arch_arm32:
{NotImplemented;}break; {NotImplemented;}break;
case Architecture_x64: case Arch_x64:
{ {
U64 stack_base_addr = tlb + 0x8; U64 stack_base_addr = tlb + 0x8;
dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+8), &result); dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+8), &result);
}break; }break;
case Architecture_x86: case Arch_x86:
{ {
U64 stack_base_addr = tlb + 0x4; U64 stack_base_addr = tlb + 0x4;
dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+4), &result); dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+4), &result);
@@ -2796,17 +2796,17 @@ dmn_tls_root_vaddr_from_thread(DMN_Handle handle)
result = entity->thread.thread_local_base; result = entity->thread.thread_local_base;
switch(entity->arch) switch(entity->arch)
{ {
case Architecture_Null: case Arch_Null:
case Architecture_COUNT: case Arch_COUNT:
{}break; {}break;
case Architecture_arm64: case Arch_arm64:
case Architecture_arm32: case Arch_arm32:
{NotImplemented;}break; {NotImplemented;}break;
case Architecture_x64: case Arch_x64:
{ {
result += 88; result += 88;
}break; }break;
case Architecture_x86: case Arch_x86:
{ {
result += 44; result += 44;
}break; }break;
+4 -4
View File
@@ -106,7 +106,7 @@ struct DMN_W32_Entity
U32 gen; U32 gen;
U64 id; U64 id;
HANDLE handle; HANDLE handle;
Architecture arch; Arch arch;
union union
{ {
struct struct
@@ -174,7 +174,7 @@ struct DMN_W32_InjectedBreak
typedef struct DMN_W32_ImageInfo DMN_W32_ImageInfo; typedef struct DMN_W32_ImageInfo DMN_W32_ImageInfo;
struct DMN_W32_ImageInfo struct DMN_W32_ImageInfo
{ {
Architecture arch; Arch arch;
U32 size; U32 size;
}; };
@@ -277,8 +277,8 @@ internal DMN_W32_ImageInfo dmn_w32_image_info_from_process_base_vaddr(HANDLE pro
//- rjf: threads //- rjf: threads
internal U16 dmn_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave); internal U16 dmn_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave);
internal U16 dmn_w32_xsave_tag_word_from_real_tag_word(U16 ftw); internal U16 dmn_w32_xsave_tag_word_from_real_tag_word(U16 ftw);
internal B32 dmn_w32_thread_read_reg_block(Architecture arch, HANDLE thread, void *reg_block); internal B32 dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block);
internal B32 dmn_w32_thread_write_reg_block(Architecture arch, HANDLE thread, void *reg_block); internal B32 dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block);
//- rjf: remote thread injection //- rjf: remote thread injection
internal DWORD dmn_w32_inject_thread(HANDLE process, U64 start_address); internal DWORD dmn_w32_inject_thread(HANDLE process, U64 start_address);
+1 -1
View File
@@ -102,7 +102,7 @@ e_dynamically_typed_eval_from_eval(E_Eval eval)
if(e_space_read(eval.space, &class_base_vaddr, r1u64(ptr_vaddr, ptr_vaddr+addr_size)) && if(e_space_read(eval.space, &class_base_vaddr, r1u64(ptr_vaddr, ptr_vaddr+addr_size)) &&
e_space_read(eval.space, &vtable_vaddr, r1u64(class_base_vaddr, class_base_vaddr+addr_size))) e_space_read(eval.space, &vtable_vaddr, r1u64(class_base_vaddr, class_base_vaddr+addr_size)))
{ {
Architecture arch = e_type_state->ctx->primary_module->arch; Arch arch = e_type_state->ctx->primary_module->arch;
U32 rdi_idx = 0; U32 rdi_idx = 0;
RDI_Parsed *rdi = 0; RDI_Parsed *rdi = 0;
U64 module_base = 0; U64 module_base = 0;
+1 -1
View File
@@ -110,7 +110,7 @@ struct E_Module
{ {
RDI_Parsed *rdi; RDI_Parsed *rdi;
Rng1U64 vaddr_range; Rng1U64 vaddr_range;
Architecture arch; Arch arch;
E_Space space; E_Space space;
}; };
+1 -1
View File
@@ -163,7 +163,7 @@ e_interpret(String8 bytecode)
U8 byte_size = (imm.u64&0x00FF00)>>8; U8 byte_size = (imm.u64&0x00FF00)>>8;
U8 byte_off = (imm.u64&0xFF0000)>>16; U8 byte_off = (imm.u64&0xFF0000)>>16;
REGS_RegCode base_reg_code = regs_reg_code_from_arch_rdi_code(e_interpret_ctx->reg_arch, rdi_reg_code); REGS_RegCode base_reg_code = regs_reg_code_from_arch_rdi_code(e_interpret_ctx->reg_arch, rdi_reg_code);
REGS_Rng rng = regs_reg_code_rng_table_from_architecture(e_interpret_ctx->reg_arch)[base_reg_code]; REGS_Rng rng = regs_reg_code_rng_table_from_arch(e_interpret_ctx->reg_arch)[base_reg_code];
U64 off = (U64)rng.byte_off + byte_off; U64 off = (U64)rng.byte_off + byte_off;
U64 size = (U64)byte_size; U64 size = (U64)byte_size;
B32 good_read = e_space_read(e_interpret_ctx->reg_space, &nval, r1u64(off, off+size)); B32 good_read = e_space_read(e_interpret_ctx->reg_space, &nval, r1u64(off, off+size));
+1 -1
View File
@@ -26,7 +26,7 @@ struct E_InterpretCtx
E_SpaceRWFunction *space_read; E_SpaceRWFunction *space_read;
E_SpaceRWFunction *space_write; E_SpaceRWFunction *space_write;
E_Space primary_space; E_Space primary_space;
Architecture reg_arch; Arch reg_arch;
E_Space reg_space; E_Space reg_space;
U64 reg_unwind_count; U64 reg_unwind_count;
U64 *module_base; U64 *module_base;
+5 -5
View File
@@ -1292,7 +1292,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
E_TypeKey type_key = zero_struct; E_TypeKey type_key = zero_struct;
String8 local_lookup_string = token_string; String8 local_lookup_string = token_string;
E_Space space = {0}; E_Space space = {0};
Architecture arch = Architecture_Null; Arch arch = Arch_Null;
//- rjf: identifiers surrounded by ``s should have those `s stripped //- rjf: identifiers surrounded by ``s should have those `s stripped
if(local_lookup_string.size >= 2 && if(local_lookup_string.size >= 2 &&
@@ -1594,7 +1594,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
} }
else if(reg_code != 0) else if(reg_code != 0)
{ {
REGS_Rng reg_rng = regs_reg_code_rng_table_from_architecture(e_parse_ctx->primary_module->arch)[reg_code]; REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(e_parse_ctx->primary_module->arch)[reg_code];
E_OpList oplist = {0}; E_OpList oplist = {0};
e_oplist_push_uconst(arena, &oplist, reg_rng.byte_off); e_oplist_push_uconst(arena, &oplist, reg_rng.byte_off);
atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str);
@@ -1606,8 +1606,8 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
} }
else if(alias_code != 0) else if(alias_code != 0)
{ {
REGS_Slice alias_slice = regs_alias_code_slice_table_from_architecture(e_parse_ctx->primary_module->arch)[alias_code]; REGS_Slice alias_slice = regs_alias_code_slice_table_from_arch(e_parse_ctx->primary_module->arch)[alias_code];
REGS_Rng alias_reg_rng = regs_reg_code_rng_table_from_architecture(e_parse_ctx->primary_module->arch)[alias_slice.code]; REGS_Rng alias_reg_rng = regs_reg_code_rng_table_from_arch(e_parse_ctx->primary_module->arch)[alias_slice.code];
E_OpList oplist = {0}; E_OpList oplist = {0};
e_oplist_push_uconst(arena, &oplist, alias_reg_rng.byte_off + alias_slice.byte_off); e_oplist_push_uconst(arena, &oplist, alias_reg_rng.byte_off + alias_slice.byte_off);
atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str); atom = e_push_expr(arena, E_ExprKind_LeafBytecode, token_string.str);
@@ -1674,7 +1674,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
case RDI_LocationKind_ValReg: case RDI_LocationKind_ValReg:
{ {
REGS_RegCode regs_reg_code = regs_reg_code_from_arch_rdi_code(arch, loc_reg.reg_code); REGS_RegCode regs_reg_code = regs_reg_code_from_arch_rdi_code(arch, loc_reg.reg_code);
REGS_Rng reg_rng = regs_reg_code_rng_table_from_architecture(arch)[regs_reg_code]; REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(arch)[regs_reg_code];
E_OpList oplist = {0}; E_OpList oplist = {0};
U64 byte_size = (U64)reg_rng.byte_size; U64 byte_size = (U64)reg_rng.byte_size;
U64 byte_pos = 0; U64 byte_pos = 0;
+7 -7
View File
@@ -256,7 +256,7 @@ e_type_key_ext(E_TypeKind kind, U32 type_idx, U32 rdi_idx)
} }
internal E_TypeKey internal E_TypeKey
e_type_key_reg(Architecture arch, REGS_RegCode code) e_type_key_reg(Arch arch, REGS_RegCode code)
{ {
E_TypeKey key = {E_TypeKeyKind_Reg}; E_TypeKey key = {E_TypeKeyKind_Reg};
key.u32[0] = (U32)arch; key.u32[0] = (U32)arch;
@@ -265,7 +265,7 @@ e_type_key_reg(Architecture arch, REGS_RegCode code)
} }
internal E_TypeKey internal E_TypeKey
e_type_key_reg_alias(Architecture arch, REGS_AliasCode code) e_type_key_reg_alias(Arch arch, REGS_AliasCode code)
{ {
E_TypeKey key = {E_TypeKeyKind_RegAlias}; E_TypeKey key = {E_TypeKeyKind_RegAlias};
key.u32[0] = (U32)arch; key.u32[0] = (U32)arch;
@@ -398,7 +398,7 @@ e_type_key_cons_array(E_TypeKey element_type_key, U64 count)
} }
internal E_TypeKey internal E_TypeKey
e_type_key_cons_ptr(Architecture arch, E_TypeKey element_type_key) e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key)
{ {
E_TypeKey key = e_type_key_cons(.arch = arch, .kind = E_TypeKind_Ptr, .direct_key = element_type_key); E_TypeKey key = e_type_key_cons(.arch = arch, .kind = E_TypeKind_Ptr, .direct_key = element_type_key);
return key; return key;
@@ -818,16 +818,16 @@ e_type_from_key(Arena *arena, E_TypeKey key)
//- rjf: reg type keys //- rjf: reg type keys
case E_TypeKeyKind_Reg: case E_TypeKeyKind_Reg:
{ {
Architecture arch = (Architecture)key.u32[0]; Arch arch = (Arch)key.u32[0];
REGS_RegCode code = (REGS_RegCode)key.u32[1]; REGS_RegCode code = (REGS_RegCode)key.u32[1];
REGS_Rng rng = regs_reg_code_rng_table_from_architecture(arch)[code]; REGS_Rng rng = regs_reg_code_rng_table_from_arch(arch)[code];
reg_byte_count = (U64)rng.byte_size; reg_byte_count = (U64)rng.byte_size;
}goto build_reg_type; }goto build_reg_type;
case E_TypeKeyKind_RegAlias: case E_TypeKeyKind_RegAlias:
{ {
Architecture arch = (Architecture)key.u32[0]; Arch arch = (Arch)key.u32[0];
REGS_AliasCode code = (REGS_AliasCode)key.u32[1]; REGS_AliasCode code = (REGS_AliasCode)key.u32[1];
REGS_Slice slice = regs_alias_code_slice_table_from_architecture(arch)[code]; REGS_Slice slice = regs_alias_code_slice_table_from_arch(arch)[code];
reg_byte_count = (U64)slice.byte_size; reg_byte_count = (U64)slice.byte_size;
}goto build_reg_type; }goto build_reg_type;
build_reg_type: build_reg_type:
+5 -5
View File
@@ -23,7 +23,7 @@ struct E_TypeKey
{ {
E_TypeKeyKind kind; E_TypeKeyKind kind;
U32 u32[3]; U32 u32[3];
// [0] -> E_TypeKind (Basic, Cons, Ext); Architecture (Reg, RegAlias) // [0] -> E_TypeKind (Basic, Cons, Ext); Arch (Reg, RegAlias)
// [1] -> Type Index In RDI (Ext); Code (Reg, RegAlias); Type Index In Constructed (Cons) // [1] -> Type Index In RDI (Ext); Code (Reg, RegAlias); Type Index In Constructed (Cons)
// [2] -> RDI Index (Ext) // [2] -> RDI Index (Ext)
}; };
@@ -138,7 +138,7 @@ struct E_Type
typedef struct E_ConsTypeParams E_ConsTypeParams; typedef struct E_ConsTypeParams E_ConsTypeParams;
struct E_ConsTypeParams struct E_ConsTypeParams
{ {
Architecture arch; Arch arch;
E_TypeKind kind; E_TypeKind kind;
String8 name; String8 name;
E_TypeKey direct_key; E_TypeKey direct_key;
@@ -230,8 +230,8 @@ internal void e_select_type_ctx(E_TypeCtx *ctx);
internal E_TypeKey e_type_key_zero(void); internal E_TypeKey e_type_key_zero(void);
internal E_TypeKey e_type_key_basic(E_TypeKind kind); internal E_TypeKey e_type_key_basic(E_TypeKind kind);
internal E_TypeKey e_type_key_ext(E_TypeKind kind, U32 type_idx, U32 rdi_idx); internal E_TypeKey e_type_key_ext(E_TypeKind kind, U32 type_idx, U32 rdi_idx);
internal E_TypeKey e_type_key_reg(Architecture arch, REGS_RegCode code); internal E_TypeKey e_type_key_reg(Arch arch, REGS_RegCode code);
internal E_TypeKey e_type_key_reg_alias(Architecture arch, REGS_AliasCode code); internal E_TypeKey e_type_key_reg_alias(Arch arch, REGS_AliasCode code);
//- rjf: constructed type construction //- rjf: constructed type construction
internal U64 e_hash_from_cons_type_params(E_ConsTypeParams *params); internal U64 e_hash_from_cons_type_params(E_ConsTypeParams *params);
@@ -241,7 +241,7 @@ internal E_TypeKey e_type_key_cons_(E_ConsTypeParams *params);
//- rjf: constructed type construction helpers //- rjf: constructed type construction helpers
internal E_TypeKey e_type_key_cons_array(E_TypeKey element_type_key, U64 count); internal E_TypeKey e_type_key_cons_array(E_TypeKey element_type_key, U64 count);
internal E_TypeKey e_type_key_cons_ptr(Architecture arch, E_TypeKey element_type_key); internal E_TypeKey e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key);
//- rjf: basic type key functions //- rjf: basic type key functions
internal B32 e_type_key_match(E_TypeKey l, E_TypeKey r); internal B32 e_type_key_match(E_TypeKey l, E_TypeKey r);
+1 -1
View File
@@ -1389,7 +1389,7 @@ win32_exception_filter(EXCEPTION_POINTERS* exception_ptrs)
frame.AddrStack.Offset = context->Sp; frame.AddrStack.Offset = context->Sp;
frame.AddrStack.Mode = AddrModeFlat; frame.AddrStack.Mode = AddrModeFlat;
#else #else
# error Architecture not supported! # error Arch not supported!
#endif #endif
for(U32 idx=0; ;idx++) for(U32 idx=0; ;idx++)
+6 -6
View File
@@ -267,10 +267,10 @@ pe_bin_info_from_data(Arena *arena, String8 data)
switch(coff_header.machine) switch(coff_header.machine)
{ {
default:{}break; default:{}break;
case COFF_MachineType_X86: {info.arch = Architecture_x86;}break; case COFF_MachineType_X86: {info.arch = Arch_x86;}break;
case COFF_MachineType_X64: {info.arch = Architecture_x64;}break; case COFF_MachineType_X64: {info.arch = Arch_x64;}break;
case COFF_MachineType_ARM: {info.arch = Architecture_arm32;}break; case COFF_MachineType_ARM: {info.arch = Arch_arm32;}break;
case COFF_MachineType_ARM64: {info.arch = Architecture_arm64;}break; case COFF_MachineType_ARM64: {info.arch = Arch_arm64;}break;
} }
MemoryCopyStruct(&info.tls_header, &tls_header); MemoryCopyStruct(&info.tls_header, &tls_header);
} }
@@ -284,7 +284,7 @@ internal U64
pe_intel_pdata_off_from_voff__binary_search(String8 data, PE_BinInfo *bin, U64 voff) pe_intel_pdata_off_from_voff__binary_search(String8 data, PE_BinInfo *bin, U64 voff)
{ {
U64 result = 0; U64 result = 0;
if(bin->arch != Architecture_Null && PE_DataDirectoryIndex_EXCEPTIONS < bin->data_dir_count) if(bin->arch != Arch_Null && PE_DataDirectoryIndex_EXCEPTIONS < bin->data_dir_count)
{ {
Rng1U64 range = bin->data_dir_franges[PE_DataDirectoryIndex_EXCEPTIONS]; Rng1U64 range = bin->data_dir_franges[PE_DataDirectoryIndex_EXCEPTIONS];
U64 pdata_off = range.min; U64 pdata_off = range.min;
@@ -467,7 +467,7 @@ pe_tls_rng_from_bin_base_vaddr(String8 data, PE_BinInfo *bin, U64 base_vaddr)
{ {
U64 result_addr = (bin->tls_header.index_address - bin->image_base); U64 result_addr = (bin->tls_header.index_address - bin->image_base);
U64 result_size = sizeof(U32); U64 result_size = sizeof(U32);
if(bin->arch != Architecture_Null) if(bin->arch != Arch_Null)
{ {
U64 addr_size = bit_size_from_arch(bin->arch)/8; U64 addr_size = bit_size_from_arch(bin->arch)/8;
Temp scratch = scratch_begin(0, 0); Temp scratch = scratch_begin(0, 0);
+1 -1
View File
@@ -728,7 +728,7 @@ struct PE_BinInfo
OS_Guid dbg_guid; OS_Guid dbg_guid;
U32 dbg_age; U32 dbg_age;
U32 dbg_time; U32 dbg_time;
Architecture arch; Arch arch;
Rng1U64 *data_dir_franges; Rng1U64 *data_dir_franges;
U32 data_dir_count; U32 data_dir_count;
PE_TLSHeader64 tls_header; PE_TLSHeader64 tls_header;
+1 -1
View File
@@ -255,7 +255,7 @@ RDI_VMapEntryMemberTable:
} }
//////////////////////////////// ////////////////////////////////
//~ rjf: Architecture Info Tables //~ rjf: Arch Info Tables
@table(name value addr_size) @table(name value addr_size)
RDI_ArchTable: RDI_ArchTable:
+3 -3
View File
@@ -81,7 +81,7 @@ elf_parsed_from_data(Arena *arena, String8 elf_data){
//- validate & translate header values //- validate & translate header values
B32 header_is_good = 0; B32 header_is_good = 0;
Architecture arch = Architecture_Null; Arch arch = Arch_Null;
if (decoded_header){ if (decoded_header){
header_is_good = 1; header_is_good = 1;
@@ -96,8 +96,8 @@ elf_parsed_from_data(Arena *arena, String8 elf_data){
if (header_is_good){ if (header_is_good){
switch (e_machine){ switch (e_machine){
default: header_is_good = 0; default: header_is_good = 0;
case ELF_Machine_386: arch = Architecture_x86; break; case ELF_Machine_386: arch = Arch_x86; break;
case ELF_Machine_X86_64: arch = Architecture_x64; break; case ELF_Machine_X86_64: arch = Arch_x64; break;
} }
} }
+1 -1
View File
@@ -462,7 +462,7 @@ typedef struct ELF_SegmentArray{
typedef struct ELF_Parsed{ typedef struct ELF_Parsed{
String8 data; String8 data;
ELF_Class elf_class; ELF_Class elf_class;
Architecture arch; Arch arch;
ELF_Shdr64 *sections; ELF_Shdr64 *sections;
String8 *section_names; String8 *section_names;
+27 -27
View File
@@ -3,102 +3,102 @@
//- GENERATED CODE //- GENERATED CODE
internal U64 regs_block_size_from_architecture(Architecture arch) internal U64 regs_block_size_from_arch(Arch arch)
{ {
U64 result = 8; U64 result = 8;
switch(arch) switch(arch)
{ {
default:{}break; default:{}break;
case Architecture_x64:{result = sizeof(REGS_RegBlockX64);}break; case Arch_x64:{result = sizeof(REGS_RegBlockX64);}break;
case Architecture_x86:{result = sizeof(REGS_RegBlockX86);}break; case Arch_x86:{result = sizeof(REGS_RegBlockX86);}break;
} }
return result; return result;
} }
internal U64 regs_reg_code_count_from_architecture(Architecture arch) internal U64 regs_reg_code_count_from_arch(Arch arch)
{ {
U64 result = 0; U64 result = 0;
switch(arch) switch(arch)
{ {
default:{}break; default:{}break;
case Architecture_x64:{result = REGS_RegCodeX64_COUNT;}break; case Arch_x64:{result = REGS_RegCodeX64_COUNT;}break;
case Architecture_x86:{result = REGS_RegCodeX86_COUNT;}break; case Arch_x86:{result = REGS_RegCodeX86_COUNT;}break;
} }
return result; return result;
} }
internal U64 regs_alias_code_count_from_architecture(Architecture arch) internal U64 regs_alias_code_count_from_arch(Arch arch)
{ {
U64 result = 0; U64 result = 0;
switch(arch) switch(arch)
{ {
default:{}break; default:{}break;
case Architecture_x64:{result = REGS_AliasCodeX64_COUNT;}break; case Arch_x64:{result = REGS_AliasCodeX64_COUNT;}break;
case Architecture_x86:{result = REGS_AliasCodeX86_COUNT;}break; case Arch_x86:{result = REGS_AliasCodeX86_COUNT;}break;
} }
return result; return result;
} }
internal String8 *regs_reg_code_string_table_from_architecture(Architecture arch) internal String8 *regs_reg_code_string_table_from_arch(Arch arch)
{ {
String8 *result = 0; String8 *result = 0;
switch(arch) switch(arch)
{ {
default:{}break; default:{}break;
case Architecture_x64:{result = regs_g_reg_code_x64_string_table;}break; case Arch_x64:{result = regs_g_reg_code_x64_string_table;}break;
case Architecture_x86:{result = regs_g_reg_code_x86_string_table;}break; case Arch_x86:{result = regs_g_reg_code_x86_string_table;}break;
} }
return result; return result;
} }
internal String8 *regs_alias_code_string_table_from_architecture(Architecture arch) internal String8 *regs_alias_code_string_table_from_arch(Arch arch)
{ {
String8 *result = 0; String8 *result = 0;
switch(arch) switch(arch)
{ {
default:{}break; default:{}break;
case Architecture_x64:{result = regs_g_alias_code_x64_string_table;}break; case Arch_x64:{result = regs_g_alias_code_x64_string_table;}break;
case Architecture_x86:{result = regs_g_alias_code_x86_string_table;}break; case Arch_x86:{result = regs_g_alias_code_x86_string_table;}break;
} }
return result; return result;
} }
internal REGS_Rng *regs_reg_code_rng_table_from_architecture(Architecture arch) internal REGS_Rng *regs_reg_code_rng_table_from_arch(Arch arch)
{ {
REGS_Rng *result = 0; REGS_Rng *result = 0;
switch(arch) switch(arch)
{ {
default:{}break; default:{}break;
case Architecture_x64:{result = regs_g_reg_code_x64_rng_table;}break; case Arch_x64:{result = regs_g_reg_code_x64_rng_table;}break;
case Architecture_x86:{result = regs_g_reg_code_x86_rng_table;}break; case Arch_x86:{result = regs_g_reg_code_x86_rng_table;}break;
} }
return result; return result;
} }
internal REGS_Slice *regs_alias_code_slice_table_from_architecture(Architecture arch) internal REGS_Slice *regs_alias_code_slice_table_from_arch(Arch arch)
{ {
REGS_Slice *result = 0; REGS_Slice *result = 0;
switch(arch) switch(arch)
{ {
default:{}break; default:{}break;
case Architecture_x64:{result = regs_g_alias_code_x64_slice_table;}break; case Arch_x64:{result = regs_g_alias_code_x64_slice_table;}break;
case Architecture_x86:{result = regs_g_alias_code_x86_slice_table;}break; case Arch_x86:{result = regs_g_alias_code_x86_slice_table;}break;
} }
return result; return result;
} }
internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_architecture(Architecture arch) internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_arch(Arch arch)
{ {
REGS_UsageKind *result = 0; REGS_UsageKind *result = 0;
switch(arch) switch(arch)
{ {
default:{}break; default:{}break;
case Architecture_x64:{result = regs_g_reg_code_x64_usage_kind_table;}break; case Arch_x64:{result = regs_g_reg_code_x64_usage_kind_table;}break;
case Architecture_x86:{result = regs_g_reg_code_x86_usage_kind_table;}break; case Arch_x86:{result = regs_g_reg_code_x86_usage_kind_table;}break;
} }
return result; return result;
} }
internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_architecture(Architecture arch) internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_arch(Arch arch)
{ {
REGS_UsageKind *result = 0; REGS_UsageKind *result = 0;
switch(arch) switch(arch)
{ {
default:{}break; default:{}break;
case Architecture_x64:{result = regs_g_alias_code_x64_usage_kind_table;}break; case Arch_x64:{result = regs_g_alias_code_x64_usage_kind_table;}break;
case Architecture_x86:{result = regs_g_alias_code_x86_usage_kind_table;}break; case Arch_x86:{result = regs_g_alias_code_x86_usage_kind_table;}break;
} }
return result; return result;
} }
+6 -6
View File
@@ -3,13 +3,13 @@
//- GENERATED CODE //- GENERATED CODE
internal RDI_RegCode regs_rdi_code_from_arch_reg_code(Architecture arch, REGS_RegCode code) internal RDI_RegCode regs_rdi_code_from_arch_reg_code(Arch arch, REGS_RegCode code)
{ {
RDI_RegCode result = 0; RDI_RegCode result = 0;
switch(arch) switch(arch)
{ {
default:{}break; default:{}break;
case Architecture_x64: case Arch_x64:
{ {
switch(code) switch(code)
{ {
@@ -116,7 +116,7 @@ case REGS_RegCodeX64_k6:{result = RDI_RegCodeX64_k6;}break;
case REGS_RegCodeX64_k7:{result = RDI_RegCodeX64_k7;}break; case REGS_RegCodeX64_k7:{result = RDI_RegCodeX64_k7;}break;
} }
}break; }break;
case Architecture_x86: case Arch_x86:
{ {
switch(code) switch(code)
{ {
@@ -186,13 +186,13 @@ case REGS_RegCodeX86_ymm7:{result = RDI_RegCodeX86_ymm7;}break;
} }
return result; return result;
} }
internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Architecture arch, RDI_RegCode code) internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Arch arch, RDI_RegCode code)
{ {
REGS_RegCode result = 0; REGS_RegCode result = 0;
switch(arch) switch(arch)
{ {
default:{}break; default:{}break;
case Architecture_x64: case Arch_x64:
{ {
switch(code) switch(code)
{ {
@@ -299,7 +299,7 @@ case RDI_RegCodeX64_k6:{result = REGS_RegCodeX64_k6;}break;
case RDI_RegCodeX64_k7:{result = REGS_RegCodeX64_k7;}break; case RDI_RegCodeX64_k7:{result = REGS_RegCodeX64_k7;}break;
} }
}break; }break;
case Architecture_x86: case Arch_x86:
{ {
switch(code) switch(code)
{ {
+2 -2
View File
@@ -4,7 +4,7 @@
#ifndef REGS_RDI_H #ifndef REGS_RDI_H
#define REGS_RDI_H #define REGS_RDI_H
internal RDI_RegCode regs_rdi_code_from_arch_reg_code(Architecture arch, REGS_RegCode code); internal RDI_RegCode regs_rdi_code_from_arch_reg_code(Arch arch, REGS_RegCode code);
internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Architecture arch, RDI_RegCode reg); internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Arch arch, RDI_RegCode reg);
#endif //REGS_RDI_H #endif //REGS_RDI_H
+6 -6
View File
@@ -6,13 +6,13 @@
@gen @c_file @gen @c_file
{ {
`internal RDI_RegCode regs_rdi_code_from_arch_reg_code(Architecture arch, REGS_RegCode code)`; `internal RDI_RegCode regs_rdi_code_from_arch_reg_code(Arch arch, REGS_RegCode code)`;
`{`; `{`;
`RDI_RegCode result = 0;`; `RDI_RegCode result = 0;`;
`switch(arch)`; `switch(arch)`;
`{`; `{`;
`default:{}break;`; `default:{}break;`;
`case Architecture_x64:`; `case Arch_x64:`;
`{`; `{`;
`switch(code)` `switch(code)`
`{`; `{`;
@@ -20,7 +20,7 @@
@expand(REGS_RegTableX64 a) `case REGS_RegCodeX64_$(a.name):{result = RDI_RegCodeX64_$(a.name);}break;`; @expand(REGS_RegTableX64 a) `case REGS_RegCodeX64_$(a.name):{result = RDI_RegCodeX64_$(a.name);}break;`;
`}`; `}`;
`}break;`; `}break;`;
`case Architecture_x86:`; `case Arch_x86:`;
`{`; `{`;
`switch(code)` `switch(code)`
`{`; `{`;
@@ -35,13 +35,13 @@
@gen @c_file @gen @c_file
{ {
`internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Architecture arch, RDI_RegCode code)`; `internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Arch arch, RDI_RegCode code)`;
`{`; `{`;
`REGS_RegCode result = 0;`; `REGS_RegCode result = 0;`;
`switch(arch)`; `switch(arch)`;
`{`; `{`;
`default:{}break;`; `default:{}break;`;
`case Architecture_x64:`; `case Arch_x64:`;
`{`; `{`;
`switch(code)` `switch(code)`
`{`; `{`;
@@ -49,7 +49,7 @@
@expand(REGS_RegTableX64 a) `case RDI_RegCodeX64_$(a.name):{result = REGS_RegCodeX64_$(a.name);}break;`; @expand(REGS_RegTableX64 a) `case RDI_RegCodeX64_$(a.name):{result = REGS_RegCodeX64_$(a.name);}break;`;
`}`; `}`;
`}break;`; `}break;`;
`case Architecture_x86:`; `case Arch_x86:`;
`{`; `{`;
`switch(code)` `switch(code)`
`{`; `{`;
+12 -12
View File
@@ -10,49 +10,49 @@
//~ rjf: Helpers //~ rjf: Helpers
internal U64 internal U64
regs_rip_from_arch_block(Architecture arch, void *block) regs_rip_from_arch_block(Arch arch, void *block)
{ {
U64 result = 0; U64 result = 0;
if(block != 0) switch(arch) if(block != 0) switch(arch)
{ {
default:{}break; default:{}break;
case Architecture_x64:{result = ((REGS_RegBlockX64 *)block)->rip.u64;}break; case Arch_x64:{result = ((REGS_RegBlockX64 *)block)->rip.u64;}break;
case Architecture_x86:{result = (U64)((REGS_RegBlockX86 *)block)->eip.u32;}break; case Arch_x86:{result = (U64)((REGS_RegBlockX86 *)block)->eip.u32;}break;
} }
return result; return result;
} }
internal U64 internal U64
regs_rsp_from_arch_block(Architecture arch, void *block) regs_rsp_from_arch_block(Arch arch, void *block)
{ {
U64 result = 0; U64 result = 0;
if(block != 0) switch(arch) if(block != 0) switch(arch)
{ {
default:{}break; default:{}break;
case Architecture_x64:{result = ((REGS_RegBlockX64 *)block)->rsp.u64;}break; case Arch_x64:{result = ((REGS_RegBlockX64 *)block)->rsp.u64;}break;
case Architecture_x86:{result = (U64)((REGS_RegBlockX86 *)block)->esp.u32;}break; case Arch_x86:{result = (U64)((REGS_RegBlockX86 *)block)->esp.u32;}break;
} }
return result; return result;
} }
internal void internal void
regs_arch_block_write_rip(Architecture arch, void *block, U64 rip) regs_arch_block_write_rip(Arch arch, void *block, U64 rip)
{ {
if(block != 0) switch(arch) if(block != 0) switch(arch)
{ {
default:{}break; default:{}break;
case Architecture_x64:{((REGS_RegBlockX64 *)block)->rip.u64 = rip;}break; case Arch_x64:{((REGS_RegBlockX64 *)block)->rip.u64 = rip;}break;
case Architecture_x86:{((REGS_RegBlockX86 *)block)->eip.u32 = (U32)rip;}break; case Arch_x86:{((REGS_RegBlockX86 *)block)->eip.u32 = (U32)rip;}break;
} }
} }
internal void internal void
regs_arch_block_write_rsp(Architecture arch, void *block, U64 rsp) regs_arch_block_write_rsp(Arch arch, void *block, U64 rsp)
{ {
if(block != 0) switch(arch) if(block != 0) switch(arch)
{ {
default:{}break; default:{}break;
case Architecture_x64:{((REGS_RegBlockX64 *)block)->rsp.u64 = rsp;}break; case Arch_x64:{((REGS_RegBlockX64 *)block)->rsp.u64 = rsp;}break;
case Architecture_x86:{((REGS_RegBlockX86 *)block)->esp.u32 = (U32)rsp;}break; case Arch_x86:{((REGS_RegBlockX86 *)block)->esp.u32 = (U32)rsp;}break;
} }
} }
+13 -13
View File
@@ -108,18 +108,18 @@ struct REGS_Slice
//////////////////////////////// ////////////////////////////////
//~ rjf: Helpers //~ rjf: Helpers
internal U64 regs_block_size_from_architecture(Architecture arch); internal U64 regs_block_size_from_arch(Arch arch);
internal U64 regs_reg_code_count_from_architecture(Architecture arch); internal U64 regs_reg_code_count_from_arch(Arch arch);
internal U64 regs_alias_code_count_from_architecture(Architecture arch); internal U64 regs_alias_code_count_from_arch(Arch arch);
internal String8 *regs_reg_code_string_table_from_architecture(Architecture arch); internal String8 *regs_reg_code_string_table_from_arch(Arch arch);
internal String8 *regs_alias_code_string_table_from_architecture(Architecture arch); internal String8 *regs_alias_code_string_table_from_arch(Arch arch);
internal REGS_Rng *regs_reg_code_rng_table_from_architecture(Architecture arch); internal REGS_Rng *regs_reg_code_rng_table_from_arch(Arch arch);
internal REGS_Slice *regs_alias_code_slice_table_from_architecture(Architecture arch); internal REGS_Slice *regs_alias_code_slice_table_from_arch(Arch arch);
internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_architecture(Architecture arch); internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_arch(Arch arch);
internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_architecture(Architecture arch); internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_arch(Arch arch);
internal U64 regs_rip_from_arch_block(Architecture arch, void *block); internal U64 regs_rip_from_arch_block(Arch arch, void *block);
internal U64 regs_rsp_from_arch_block(Architecture arch, void *block); internal U64 regs_rsp_from_arch_block(Arch arch, void *block);
internal void regs_arch_block_write_rip(Architecture arch, void *block, U64 rip); internal void regs_arch_block_write_rip(Arch arch, void *block, U64 rip);
internal void regs_arch_block_write_rsp(Architecture arch, void *block, U64 rsp); internal void regs_arch_block_write_rsp(Arch arch, void *block, U64 rsp);
#endif // REGS_H #endif // REGS_H
+18 -18
View File
@@ -459,13 +459,13 @@ regs_g_reg_code_x86_usage_kind_table:
@c_file @gen @c_file @gen
{ {
`internal U64 regs_block_size_from_architecture(Architecture arch)`; `internal U64 regs_block_size_from_arch(Arch arch)`;
`{`; `{`;
`U64 result = 8;`; `U64 result = 8;`;
`switch(arch)`; `switch(arch)`;
`{`; `{`;
`default:{}break;`; `default:{}break;`;
@expand(REGS_ArchTable a) `case Architecture_$(a.name_lower):{result = sizeof(REGS_RegBlock$(a.name));}break;`; @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = sizeof(REGS_RegBlock$(a.name));}break;`;
`}`; `}`;
`return result;`; `return result;`;
`}`; `}`;
@@ -473,13 +473,13 @@ regs_g_reg_code_x86_usage_kind_table:
@c_file @gen @c_file @gen
{ {
`internal U64 regs_reg_code_count_from_architecture(Architecture arch)`; `internal U64 regs_reg_code_count_from_arch(Arch arch)`;
`{`; `{`;
`U64 result = 0;`; `U64 result = 0;`;
`switch(arch)`; `switch(arch)`;
`{`; `{`;
`default:{}break;`; `default:{}break;`;
@expand(REGS_ArchTable a) `case Architecture_$(a.name_lower):{result = REGS_RegCode$(a.name)_COUNT;}break;`; @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = REGS_RegCode$(a.name)_COUNT;}break;`;
`}`; `}`;
`return result;`; `return result;`;
`}`; `}`;
@@ -487,13 +487,13 @@ regs_g_reg_code_x86_usage_kind_table:
@c_file @gen @c_file @gen
{ {
`internal U64 regs_alias_code_count_from_architecture(Architecture arch)`; `internal U64 regs_alias_code_count_from_arch(Arch arch)`;
`{`; `{`;
`U64 result = 0;`; `U64 result = 0;`;
`switch(arch)`; `switch(arch)`;
`{`; `{`;
`default:{}break;`; `default:{}break;`;
@expand(REGS_ArchTable a) `case Architecture_$(a.name_lower):{result = REGS_AliasCode$(a.name)_COUNT;}break;`; @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = REGS_AliasCode$(a.name)_COUNT;}break;`;
`}`; `}`;
`return result;`; `return result;`;
`}`; `}`;
@@ -501,13 +501,13 @@ regs_g_reg_code_x86_usage_kind_table:
@c_file @gen @c_file @gen
{ {
`internal String8 *regs_reg_code_string_table_from_architecture(Architecture arch)`; `internal String8 *regs_reg_code_string_table_from_arch(Arch arch)`;
`{`; `{`;
`String8 *result = 0;`; `String8 *result = 0;`;
`switch(arch)`; `switch(arch)`;
`{`; `{`;
`default:{}break;`; `default:{}break;`;
@expand(REGS_ArchTable a) `case Architecture_$(a.name_lower):{result = regs_g_reg_code_$(a.name_lower)_string_table;}break;`; @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_reg_code_$(a.name_lower)_string_table;}break;`;
`}`; `}`;
`return result;`; `return result;`;
`}`; `}`;
@@ -515,13 +515,13 @@ regs_g_reg_code_x86_usage_kind_table:
@c_file @gen @c_file @gen
{ {
`internal String8 *regs_alias_code_string_table_from_architecture(Architecture arch)`; `internal String8 *regs_alias_code_string_table_from_arch(Arch arch)`;
`{`; `{`;
`String8 *result = 0;`; `String8 *result = 0;`;
`switch(arch)`; `switch(arch)`;
`{`; `{`;
`default:{}break;`; `default:{}break;`;
@expand(REGS_ArchTable a) `case Architecture_$(a.name_lower):{result = regs_g_alias_code_$(a.name_lower)_string_table;}break;`; @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_alias_code_$(a.name_lower)_string_table;}break;`;
`}`; `}`;
`return result;`; `return result;`;
`}`; `}`;
@@ -529,13 +529,13 @@ regs_g_reg_code_x86_usage_kind_table:
@c_file @gen @c_file @gen
{ {
`internal REGS_Rng *regs_reg_code_rng_table_from_architecture(Architecture arch)`; `internal REGS_Rng *regs_reg_code_rng_table_from_arch(Arch arch)`;
`{`; `{`;
`REGS_Rng *result = 0;`; `REGS_Rng *result = 0;`;
`switch(arch)`; `switch(arch)`;
`{`; `{`;
`default:{}break;`; `default:{}break;`;
@expand(REGS_ArchTable a) `case Architecture_$(a.name_lower):{result = regs_g_reg_code_$(a.name_lower)_rng_table;}break;`; @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_reg_code_$(a.name_lower)_rng_table;}break;`;
`}`; `}`;
`return result;`; `return result;`;
`}`; `}`;
@@ -543,13 +543,13 @@ regs_g_reg_code_x86_usage_kind_table:
@c_file @gen @c_file @gen
{ {
`internal REGS_Slice *regs_alias_code_slice_table_from_architecture(Architecture arch)`; `internal REGS_Slice *regs_alias_code_slice_table_from_arch(Arch arch)`;
`{`; `{`;
`REGS_Slice *result = 0;`; `REGS_Slice *result = 0;`;
`switch(arch)`; `switch(arch)`;
`{`; `{`;
`default:{}break;`; `default:{}break;`;
@expand(REGS_ArchTable a) `case Architecture_$(a.name_lower):{result = regs_g_alias_code_$(a.name_lower)_slice_table;}break;`; @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_alias_code_$(a.name_lower)_slice_table;}break;`;
`}`; `}`;
`return result;`; `return result;`;
`}`; `}`;
@@ -557,13 +557,13 @@ regs_g_reg_code_x86_usage_kind_table:
@c_file @gen @c_file @gen
{ {
`internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_architecture(Architecture arch)`; `internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_arch(Arch arch)`;
`{`; `{`;
`REGS_UsageKind *result = 0;`; `REGS_UsageKind *result = 0;`;
`switch(arch)`; `switch(arch)`;
`{`; `{`;
`default:{}break;`; `default:{}break;`;
@expand(REGS_ArchTable a) `case Architecture_$(a.name_lower):{result = regs_g_reg_code_$(a.name_lower)_usage_kind_table;}break;`; @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_reg_code_$(a.name_lower)_usage_kind_table;}break;`;
`}`; `}`;
`return result;`; `return result;`;
`}`; `}`;
@@ -571,13 +571,13 @@ regs_g_reg_code_x86_usage_kind_table:
@c_file @gen @c_file @gen
{ {
`internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_architecture(Architecture arch)`; `internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_arch(Arch arch)`;
`{`; `{`;
`REGS_UsageKind *result = 0;`; `REGS_UsageKind *result = 0;`;
`switch(arch)`; `switch(arch)`;
`{`; `{`;
`default:{}break;`; `default:{}break;`;
@expand(REGS_ArchTable a) `case Architecture_$(a.name_lower):{result = regs_g_alias_code_$(a.name_lower)_usage_kind_table;}break;`; @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_alias_code_$(a.name_lower)_usage_kind_table;}break;`;
`}`; `}`;
`return result;`; `return result;`;
`}`; `}`;
+2 -2
View File
@@ -67,13 +67,13 @@ txt_extension_from_lang_kind(TXT_LangKind kind)
} }
internal TXT_LangKind internal TXT_LangKind
txt_lang_kind_from_architecture(Architecture arch) txt_lang_kind_from_arch(Arch arch)
{ {
TXT_LangKind kind = TXT_LangKind_Null; TXT_LangKind kind = TXT_LangKind_Null;
switch(arch) switch(arch)
{ {
default:{}break; default:{}break;
case Architecture_x64:{kind = TXT_LangKind_DisasmX64Intel;}break; case Arch_x64:{kind = TXT_LangKind_DisasmX64Intel;}break;
} }
return kind; return kind;
} }
+1 -1
View File
@@ -237,7 +237,7 @@ global TXT_Shared *txt_shared = 0;
internal TXT_LangKind txt_lang_kind_from_extension(String8 extension); internal TXT_LangKind txt_lang_kind_from_extension(String8 extension);
internal String8 txt_extension_from_lang_kind(TXT_LangKind kind); internal String8 txt_extension_from_lang_kind(TXT_LangKind kind);
internal TXT_LangKind txt_lang_kind_from_architecture(Architecture arch); internal TXT_LangKind txt_lang_kind_from_arch(Arch arch);
internal TXT_LangLexFunctionType *txt_lex_function_from_lang_kind(TXT_LangKind kind); internal TXT_LangLexFunctionType *txt_lex_function_from_lang_kind(TXT_LangKind kind);
//////////////////////////////// ////////////////////////////////