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
internal U64
bit_size_from_arch(Architecture arch)
bit_size_from_arch(Arch arch)
{
// TODO(rjf): metacode
U64 arch_bitsize = 0;
switch(arch)
{
case Architecture_x64: arch_bitsize = 64; break;
case Architecture_x86: arch_bitsize = 32; break;
case Architecture_arm64: arch_bitsize = 64; break;
case Architecture_arm32: arch_bitsize = 32; break;
case Arch_x64: arch_bitsize = 64; break;
case Arch_x86: arch_bitsize = 32; break;
case Arch_arm64: arch_bitsize = 64; break;
case Arch_arm32: arch_bitsize = 32; break;
default: break;
}
return arch_bitsize;
}
internal U64
max_instruction_size_from_arch(Architecture arch)
max_instruction_size_from_arch(Arch arch)
{
// TODO(rjf): make this real
return 64;
@@ -434,17 +434,17 @@ operating_system_from_context(void){
return os;
}
internal Architecture
architecture_from_context(void){
Architecture arch = Architecture_Null;
internal Arch
arch_from_context(void){
Arch arch = Arch_Null;
#if ARCH_X64
arch = Architecture_x64;
arch = Arch_x64;
#elif ARCH_X86
arch = Architecture_x86;
arch = Arch_x86;
#elif ARCH_ARM64
arch = Architecture_arm64;
arch = Arch_arm64;
#elif ARCH_ARM32
arch = Architecture_arm32;
arch = Arch_arm32;
#endif
return arch;
}
+11 -11
View File
@@ -439,16 +439,16 @@ typedef enum OperatingSystem
}
OperatingSystem;
typedef enum Architecture
typedef enum Arch
{
Architecture_Null,
Architecture_x64,
Architecture_x86,
Architecture_arm64,
Architecture_arm32,
Architecture_COUNT,
Arch_Null,
Arch_x64,
Arch_x86,
Arch_arm64,
Arch_arm32,
Arch_COUNT,
}
Architecture;
Arch;
typedef enum Compiler
{
@@ -779,11 +779,11 @@ internal B32 txt_rng_contains(TxtRng r, TxtPt pt);
////////////////////////////////
//~ rjf: Toolchain/Environment Enum Functions
internal U64 bit_size_from_arch(Architecture arch);
internal U64 max_instruction_size_from_arch(Architecture arch);
internal U64 bit_size_from_arch(Arch arch);
internal U64 max_instruction_size_from_arch(Arch arch);
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);
////////////////////////////////
+2 -2
View File
@@ -1459,7 +1459,7 @@ string_from_operating_system(OperatingSystem os){
}
internal String8
string_from_architecture(Architecture arch){
string_from_arch(Arch arch){
local_persist String8 strings[] = {
str8_lit_comp("Null"),
str8_lit_comp("x64"),
@@ -1468,7 +1468,7 @@ string_from_architecture(Architecture arch){
str8_lit_comp("arm32"),
};
String8 result = str8_lit("error");
if (arch < Architecture_COUNT){
if (arch < Arch_COUNT){
result = strings[arch];
}
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_side(Side side);
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
+30 -30
View File
@@ -520,8 +520,8 @@ ctrl_entity_store_alloc(void)
store->arena = arena;
store->hash_slots_count = 1024;
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 *local_machine = ctrl_entity_alloc(store, root, CTRL_EntityKind_Machine, architecture_from_context(), CTRL_MachineID_Local, 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, arch_from_context(), CTRL_MachineID_Local, dmn_handle_zero(), 0);
(void)local_machine;
return store;
}
@@ -628,7 +628,7 @@ ctrl_entity_string_release(CTRL_EntityStore *store, String8 string)
//- 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)
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;
{
@@ -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);
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);
debug_info_path->timestamp = event->timestamp;
@@ -901,12 +901,12 @@ ctrl_init(void)
Arena *arena = arena_alloc();
ctrl_state = push_array(arena, CTRL_State, 1);
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);
U64 reg_count = regs_reg_code_count_from_architecture(arch);
String8 *alias_names = regs_alias_code_string_table_from_architecture(arch);
U64 alias_count = regs_alias_code_count_from_architecture(arch);
String8 *reg_names = regs_reg_code_string_table_from_arch(arch);
U64 reg_count = regs_reg_code_count_from_arch(arch);
String8 *alias_names = regs_alias_code_string_table_from_arch(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_string2alias_tables[arch] = e_string2num_map_make(ctrl_state->arena, 256);
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_Entity *thread_entity = ctrl_entity_from_machine_id_handle(store, machine_id, thread);
Architecture arch = thread_entity->arch;
U64 reg_block_size = regs_block_size_from_architecture(arch);
Arch arch = thread_entity->arch;
U64 reg_block_size = regs_block_size_from_arch(arch);
U64 hash = ctrl_hash_from_machine_id_handle(machine_id, thread);
U64 slot_idx = hash%cache->slots_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);
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);
U64 result = regs_rip_from_arch_block(arch, block);
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);
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);
U64 result = regs_rsp_from_arch_block(arch, block);
scratch_end(scratch);
@@ -1718,7 +1718,7 @@ ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_MachineID machine_id
//- rjf: unwind deep copier
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};
{
@@ -1726,7 +1726,7 @@ ctrl_unwind_deep_copy(Arena *arena, Architecture arch, CTRL_Unwind *src)
dst.frames.count = src->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);
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)
{
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
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};
switch(arch)
{
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);
}break;
@@ -2612,12 +2612,12 @@ ctrl_unwind_from_thread(Arena *arena, CTRL_EntityStore *store, CTRL_MachineID ma
//- rjf: unpack args
CTRL_Entity *thread_entity = ctrl_entity_from_machine_id_handle(store, machine_id, thread);
CTRL_Entity *process_entity = thread_entity->parent;
Architecture arch = thread_entity->arch;
U64 arch_reg_block_size = regs_block_size_from_architecture(arch);
Arch arch = thread_entity->arch;
U64 arch_reg_block_size = regs_block_size_from_arch(arch);
//- rjf: grab initial register block
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
CTRL_UnwindFrameNode *first_frame_node = 0;
@@ -2721,13 +2721,13 @@ ctrl_reg_gen(void)
//- rjf: name -> register/alias hash tables, for eval
internal E_String2NumMap *
ctrl_string2reg_from_arch(Architecture arch)
ctrl_string2reg_from_arch(Arch arch)
{
return &ctrl_state->arch_string2reg_tables[arch];
}
internal E_String2NumMap *
ctrl_string2alias_from_arch(Architecture arch)
ctrl_string2alias_from_arch(Arch 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("thread: [%I64u]\n", ev->thread.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("string: \"%S\"\n", ev->string);
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]);
U64 global_var_voff = global_var->voff;
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;
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);
@@ -3557,7 +3557,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg,
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);
Architecture arch = spoof_process->arch;
Arch arch = spoof_process->arch;
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);
}
@@ -3623,8 +3623,8 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg,
if(spoof != 0)
{
CTRL_Entity *thread = ctrl_entity_from_machine_id_handle(ctrl_state->ctrl_thread_entity_store, CTRL_MachineID_Local, spoof->thread);
Architecture arch = thread->arch;
void *regs_block = push_array(scratch.arena, U8, regs_block_size_from_architecture(arch));
Arch arch = thread->arch;
void *regs_block = push_array(scratch.arena, U8, regs_block_size_from_arch(arch));
dmn_thread_read_reg_block(spoof->thread, regs_block);
U64 spoof_thread_rip = regs_rip_from_arch_block(arch, regs_block);
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:
{
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);
Rng1U64 legal_range = r1u64(0, regs_size);
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)
{
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);
}
}
@@ -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 *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);
CTRL_Entity *module = &ctrl_entity_nil;
{
+9 -9
View File
@@ -63,7 +63,7 @@ struct CTRL_Entity
CTRL_Entity *prev;
CTRL_Entity *parent;
CTRL_EntityKind kind;
Architecture arch;
Arch arch;
CTRL_MachineID machine_id;
DMN_Handle handle;
U64 id;
@@ -371,7 +371,7 @@ struct CTRL_Event
CTRL_MachineID machine_id;
DMN_Handle entity;
DMN_Handle parent;
Architecture arch;
Arch arch;
U64 u64_code;
U32 entity_id;
Rng1U64 vaddr_rng;
@@ -562,8 +562,8 @@ struct CTRL_State
CTRL_WakeupFunctionType *wakeup_hook;
// rjf: name -> register/alias hash tables for eval
E_String2NumMap arch_string2reg_tables[Architecture_COUNT];
E_String2NumMap arch_string2alias_tables[Architecture_COUNT];
E_String2NumMap arch_string2reg_tables[Arch_COUNT];
E_String2NumMap arch_string2alias_tables[Arch_COUNT];
// rjf: caches
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);
//- 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);
//- rjf: entity equipment
@@ -763,14 +763,14 @@ internal String8 ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_Mac
//~ rjf: Unwinding Functions
//- 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]
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);
//- 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
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);
//- rjf: name -> register/alias hash tables, for eval
internal E_String2NumMap *ctrl_string2reg_from_arch(Architecture arch);
internal E_String2NumMap *ctrl_string2alias_from_arch(Architecture arch);
internal E_String2NumMap *ctrl_string2reg_from_arch(Arch arch);
internal E_String2NumMap *ctrl_string2alias_from_arch(Arch arch);
////////////////////////////////
//~ rjf: Control-Thread Functions
+9 -9
View File
@@ -10,7 +10,7 @@
#endif
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};
switch(arch)
@@ -18,8 +18,8 @@ dasm_inst_from_code(Arena *arena, Architecture arch, U64 vaddr, String8 code, DA
default:{}break;
//- rjf: x86/x64 disassembly
case Architecture_x86:
case Architecture_x64:
case Arch_x86:
case Arch_x64:
{
// rjf: determine zydis formatter style
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
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);
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("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("syntax: %i\n", params->syntax);
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 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;
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(;;)
{
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, &params_out->vaddr);
@@ -576,8 +576,8 @@ dasm_parse_thread__entry_point(void *p)
default:{}break;
//- rjf: x86/x64 decoding
case Architecture_x64:
case Architecture_x86:
case Arch_x64:
case Arch_x86:
{
// rjf: disassemble
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
{
U64 vaddr;
Architecture arch;
Arch arch;
DASM_StyleFlags style_flags;
DASM_Syntax syntax;
U64 base_vaddr;
@@ -280,12 +280,12 @@ global DASM_Shared *dasm_shared = 0;
////////////////////////////////
//~ 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
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
+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" }
{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" }
//- 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" }
{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" }
{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" }
+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->gen += 1;
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
if(user_defined_lifetime)
@@ -1352,6 +1353,10 @@ d_entity_release(D_Entity *entity)
{
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;
}
@@ -1478,7 +1483,7 @@ d_entity_equip_ctrl_handle(D_Entity *entity, DMN_Handle handle)
}
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_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);
}
//- 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
internal D_Entity *
@@ -2208,7 +2251,7 @@ d_trap_net_from_thread__step_over_inst(Arena *arena, D_Entity *thread)
// rjf: thread => unpacked info
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);
// 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 *module = d_module_from_thread(thread);
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);
log_infof("ip_vaddr: 0x%I64x\n", ip_vaddr);
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 *module = d_module_from_thread(thread);
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);
// 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;
}
internal Architecture
d_architecture_from_entity(D_Entity *entity)
internal Arch
d_arch_from_entity(D_Entity *entity)
{
return entity->arch;
}
@@ -3173,7 +3216,7 @@ d_module_from_thread_candidates(D_Entity *thread, D_EntityList *candidates)
internal D_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};
result.frames.concrete_frame_count = base_unwind->frames.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)
{
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 read_range = intersect_1u64(legal_range, 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)
{
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 write_range = intersect_1u64(legal_range, 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;
}
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)
{
Architecture arch = Architecture_Null;
Arch arch = Arch_Null;
MD_Node *arch_node = md_child_from_string(params, str8_lit("arch"), 0);
String8 arch_kind_string = arch_node->first->string;
if(str8_match(arch_kind_string, str8_lit("x64"), StringMatchFlag_CaseInsensitive))
{
arch = Architecture_x64;
arch = Arch_x64;
}
return arch;
}
@@ -8310,7 +8353,7 @@ d_begin_frame(Arena *arena, D_CmdList *cmds, F32 dt)
//- rjf: unpack eval-dependent info
D_Entity *process = d_entity_from_handle(d_regs()->process);
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 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count);
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;
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].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));
@@ -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("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("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("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("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(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(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_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,
.name = str8_lit("Entity"),
.members = entity_members_array.v,
+12 -4
View File
@@ -289,7 +289,7 @@ struct D_Entity
// rjf: ctrl equipment
CTRL_MachineID ctrl_machine_id;
DMN_Handle ctrl_handle;
Architecture arch;
Arch arch;
U32 ctrl_id;
U64 stack_base;
Rng1U64 vaddr_rng;
@@ -297,6 +297,10 @@ struct D_Entity
// rjf: string equipment
String8 string;
// rjf: parameter tree
Arena *params_arena;
MD_Node *params_root;
};
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
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_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_stack_base(D_Entity *entity, U64 stack_base);
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_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
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_thread(D_Entity *thread);
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_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);
@@ -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 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 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 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
if(ws->autocomp_lister_params.flags & DF_AutoCompListerFlag_Registers)
{
Architecture arch = d_architecture_from_entity(thread);
U64 reg_names_count = regs_reg_code_count_from_architecture(arch);
U64 alias_names_count = regs_alias_code_count_from_architecture(arch);
String8 *reg_names = regs_reg_code_string_table_from_architecture(arch);
String8 *alias_names = regs_alias_code_string_table_from_architecture(arch);
Arch arch = d_arch_from_entity(thread);
U64 reg_names_count = regs_reg_code_count_from_arch(arch);
U64 alias_names_count = regs_alias_code_count_from_arch(arch);
String8 *reg_names = regs_reg_code_string_table_from_arch(arch);
String8 *alias_names = regs_alias_code_string_table_from_arch(arch);
for(U64 idx = 0; idx < reg_names_count; idx += 1)
{
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
if(ws->autocomp_lister_params.flags & DF_AutoCompListerFlag_Architectures)
{
for(EachNonZeroEnumVal(Architecture, arch))
for(EachNonZeroEnumVal(Arch, arch))
{
DF_AutoCompListerItem item = {0};
{
item.string = string_from_architecture(arch);
item.kind_string = str8_lit("Architecture");
item.string = string_from_arch(arch);
item.kind_string = str8_lit("Arch");
item.matches = fuzzy_match_find(scratch.arena, query, item.string);
}
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);
U64 rip_vaddr = d_query_cached_rip_from_thread(entity);
Architecture arch = d_architecture_from_entity(entity);
String8 arch_str = string_from_architecture(arch);
Arch arch = d_arch_from_entity(entity);
String8 arch_str = string_from_arch(arch);
U32 pid_or_tid = entity->ctrl_id;
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_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_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);
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);
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);
@@ -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("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("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("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("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(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(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_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);
bp_expr->type_key = bp_type;
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_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);
wp_expr->type_key = wp_type;
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:
{
D_Entity *thread = d_entity_from_handle(d_regs()->thread);
Architecture arch = d_architecture_from_entity(thread);
U64 reg_count = regs_reg_code_count_from_architecture(arch);
String8 *reg_strings = regs_reg_code_string_table_from_architecture(arch);
U64 alias_count = regs_alias_code_count_from_architecture(arch);
String8 *alias_strings = regs_alias_code_string_table_from_architecture(arch);
Arch arch = d_arch_from_entity(thread);
U64 reg_count = regs_reg_code_count_from_arch(arch);
String8 *reg_strings = regs_reg_code_string_table_from_arch(arch);
U64 alias_count = regs_alias_code_count_from_arch(arch);
String8 *alias_strings = regs_alias_code_string_table_from_arch(arch);
U64 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));
}
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 *dasm_module = &d_nil_entity;
DI_Key dbgi_key = {0};
@@ -6661,7 +6661,7 @@ DF_VIEW_CMD_FUNCTION_DEF(disasm)
default:{}break;
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);
dbgi_key = d_dbgi_key_from_module(dasm_module);
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);
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};
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);
@@ -6783,7 +6783,7 @@ DF_VIEW_UI_FUNCTION_DEF(disasm)
space = d_eval_space_from_entity(d_entity_from_handle(d_regs()->process));
}
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 *dasm_module = &d_nil_entity;
DI_Key dbgi_key = {0};
@@ -6793,7 +6793,7 @@ DF_VIEW_UI_FUNCTION_DEF(disasm)
default:{}break;
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);
dbgi_key = d_dbgi_key_from_module(dasm_module);
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);
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};
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);
+4 -4
View File
@@ -131,8 +131,8 @@ dmn_rip_from_thread(DMN_Handle thread)
U64 result = 0;
Temp scratch = scratch_begin(0, 0);
{
Architecture arch = dmn_arch_from_thread(thread);
U64 reg_block_size = regs_block_size_from_architecture(arch);
Arch arch = dmn_arch_from_thread(thread);
U64 reg_block_size = regs_block_size_from_arch(arch);
void *reg_block = push_array(scratch.arena, U8, reg_block_size);
dmn_thread_read_reg_block(thread, 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;
Temp scratch = scratch_begin(0, 0);
{
Architecture arch = dmn_arch_from_thread(thread);
U64 reg_block_size = regs_block_size_from_architecture(arch);
Arch arch = dmn_arch_from_thread(thread);
U64 reg_block_size = regs_block_size_from_arch(arch);
void *reg_block = push_array(scratch.arena, U8, reg_block_size);
dmn_thread_read_reg_block(thread, 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 thread;
DMN_Handle module;
Architecture arch;
Arch arch;
U64 address;
U64 size;
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)
//- 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_tls_root_vaddr_from_thread(DMN_Handle handle);
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
internal Architecture
internal Arch
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);
}
internal Architecture
internal Arch
demon_lnx_arch_from_pid(pid_t pid){
Temp scratch = scratch_begin(0, 0);
Architecture result = Architecture_Null;
Arch result = Arch_Null;
// exe path
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){
case SYMS_ElfMachineKind_386:
{
result = Architecture_x86;
result = Arch_x86;
}break;
case SYMS_ElfMachineKind_ARM:
{
result = Architecture_arm32;
result = Arch_arm32;
}break;
case SYMS_ElfMachineKind_X86_64:
{
result = Architecture_x64;
result = Arch_x64;
}break;
case SYMS_ElfMachineKind_AARCH64:
{
result = Architecture_arm64;
result = Arch_arm64;
}break;
}
@@ -192,9 +192,9 @@ demon_lnx_arch_from_pid(pid_t pid){
}
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};
B32 addr_32bit = (arch == Architecture_x86 || arch == Architecture_arm32);
B32 addr_32bit = (arch == Arch_x86 || arch == Arch_arm32);
// open aux data
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*
demon_lnx_module_list_from_process(Arena *arena, DEMON_Entity *process){
Architecture arch = (Architecture)process->arch;
B32 is_32bit = (arch == Architecture_x86 || arch == Architecture_arm32);
Arch arch = (Arch)process->arch;
B32 is_32bit = (arch == Arch_x86 || arch == Arch_arm32);
int memory_fd = (int)process->ext_u64;
// aux from pid
@@ -839,11 +839,11 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){
U8 *trap_swap_bytes = 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
if (single_step_thread != 0){
switch (single_step_thread->arch){
case Architecture_x86:
case Arch_x86:
{
// TODO(allen): possibly buggy
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);
}break;
case Architecture_x64:
case Arch_x64:
{
// TODO(allen): possibly buggy
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);
{
@@ -980,13 +980,13 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){
union{ SYMS_RegX86 x86; SYMS_RegX64 x64; } regs = {0};
switch (thread->arch){
case Architecture_x86:
case Arch_x86:
{
demon_os_read_regs_x86(thread, &regs.x86);
instruction_pointer = regs.x86.eip.u32;
}break;
case Architecture_x64:
case Arch_x64:
{
demon_os_read_regs_x64(thread, &regs.x64);
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.
}
else{
Architecture arch = demon_lnx_arch_from_pid(new_pid);
Arch arch = demon_lnx_arch_from_pid(new_pid);
// process entity
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){
// TODO(allen): possibly buggy
switch (thread->arch){
case Architecture_x86:
case Arch_x86:
{
instruction_pointer -= 1;
regs.x86.eip.u32 = instruction_pointer;
demon_os_write_regs_x86(thread, &regs.x86);
}break;
case Architecture_x64:
case Arch_x64:
{
instruction_pointer -= 1;
regs.x64.rip.u64 = instruction_pointer;
@@ -1336,7 +1336,7 @@ demon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){
// cleanup
if (did_run){
// TODO(allen): per-Architecture
// TODO(allen): per-Arch
// unset 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
// the single step bit is automatically unset whenever we single step
// 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){
// TODO(allen): possibly buggy
switch (single_step_thread->arch){
case Architecture_x86:
case Arch_x86:
{
SYMS_RegX86 regs = {0};
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);
}break;
case Architecture_x64:
case Arch_x64:
{
SYMS_RegX64 regs = {0};
demon_os_read_regs_x64(single_step_thread, &regs);
@@ -1555,7 +1555,7 @@ demon_os_launch_process(OS_LaunchOptions *options){
else{
result = pid;
Architecture arch = demon_lnx_arch_from_pid(pid);
Arch arch = demon_lnx_arch_from_pid(pid);
// process entity
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
if (result){
Architecture arch = demon_lnx_arch_from_pid(the_process->pid);
Arch arch = demon_lnx_arch_from_pid(the_process->pid);
// process entity
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){
U64 result = 0;
switch (thread->arch){
case Architecture_x64:
case Architecture_x86:
case Arch_x64:
case Arch_x86:
{
U32 fsbase = 0;
pid_t tid = (pid_t)thread->id;
if (ptrace(PT_GETFSBASE, tid, (void*)&fsbase, 0) != -1){
result = (U64)fsbase;
}
if (thread->arch == Architecture_x64){
if (thread->arch == Arch_x64){
result += 8;
}
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 int demon_lnx_open_memory_fd_for_pid(pid_t pid);
internal Architecture demon_lnx_arch_from_pid(pid_t pid);
internal DEMON_LNX_ProcessAux demon_lnx_aux_from_pid(pid_t pid, Architecture arch);
internal Arch demon_lnx_arch_from_pid(pid_t pid);
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,
U64 phvaddr, U64 phstride, U64 phcount);
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)
{
U64 optional_size_off = 0;
Architecture arch = Architecture_Null;
Arch arch = Arch_Null;
switch(coff_header.machine)
{
case COFF_MachineType_X86:
{
arch = Architecture_x86;
arch = Arch_x86;
optional_size_off = OffsetOf(PE_OptionalHeader32, sizeof_image);
}break;
case COFF_MachineType_X64:
{
arch = Architecture_x64;
arch = Arch_x64;
optional_size_off = OffsetOf(PE_OptionalHeader32Plus, sizeof_image);
}break;
default:
{}break;
}
if(arch != Architecture_Null)
if(arch != Arch_Null)
{
U64 optional_off = coff_header_off + sizeof(coff_header);
U32 size = 0;
@@ -577,7 +577,7 @@ 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)
dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block)
{
B32 result = 0;
ProfBeginFunction();
@@ -586,17 +586,17 @@ dmn_w32_thread_read_reg_block(Architecture arch, HANDLE thread, void *reg_block)
////////////////////////////
//- rjf: unimplemented win32/arch combos
//
case Architecture_Null:
case Architecture_COUNT:
case Arch_Null:
case Arch_COUNT:
{}break;
case Architecture_arm64:
case Architecture_arm32:
case Arch_arm64:
case Arch_arm32:
{NotImplemented;}break;
////////////////////////////
//- rjf: x86
//
case Architecture_x86:
case Arch_x86:
{
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
//
case Architecture_x64:
case Arch_x64:
{
Temp scratch = scratch_begin(0, 0);
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
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;
ProfBeginFunction();
@@ -880,17 +880,17 @@ dmn_w32_thread_write_reg_block(Architecture arch, HANDLE thread, void *reg_block
////////////////////////////
//- rjf: unimplemented win32/arch combos
//
case Architecture_Null:
case Architecture_COUNT:
case Arch_Null:
case Arch_COUNT:
{}break;
case Architecture_arm64:
case Architecture_arm32:
case Arch_arm64:
case Arch_arm32:
{NotImplemented;}break;
////////////////////////////
//- rjf: x86
//
case Architecture_x86:
case Arch_x86:
{
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
//
case Architecture_x64:
case Arch_x64:
{
Temp scratch = scratch_begin(0, 0);
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()))
{
DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread);
Architecture arch = thread->arch;
Arch arch = thread->arch;
switch(arch)
{
default:{}break;
case Architecture_x64:
case Arch_x64:
{
U32 ctx_flags = DMN_W32_CTX_X64|DMN_W32_CTX_INTEL_CONTROL;
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")
{
DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread);
Architecture arch = thread->arch;
Arch arch = thread->arch;
switch(arch)
{
//- rjf: unimplemented win32/arch combos
case Architecture_Null:
case Architecture_COUNT:
case Arch_Null:
case Arch_COUNT:
{}break;
case Architecture_arm64:
case Architecture_arm32:
case Arch_arm64:
case Arch_arm32:
{NotImplemented;}break;
//- rjf: x86
case Architecture_x86:
case Arch_x86:
{
REGS_RegBlockX86 regs = {0};
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;
//- rjf: x64
case Architecture_x64:
case Arch_x64:
{
if(!GetThreadContext(thread->handle, single_step_thread_ctx))
{
@@ -2095,7 +2095,7 @@ dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls)
default:
{
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);
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;
//- rjf: x64 (fastpath)
case Architecture_x64:
case Arch_x64:
{
CONTEXT *ctx = 0;
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")
{
DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread);
Architecture arch = thread->arch;
Arch arch = thread->arch;
switch(arch)
{
//- rjf: unimplemented win32/arch combos
case Architecture_Null:
case Architecture_COUNT:
case Arch_Null:
case Arch_COUNT:
{}break;
case Architecture_arm64:
case Architecture_arm32:
case Arch_arm64:
case Arch_arm32:
{NotImplemented;}break;
//- rjf: x86/64
case Architecture_x86:
case Arch_x86:
{
REGS_RegBlockX86 regs = {0};
dmn_thread_read_reg_block(ctrls->single_step_thread, &regs);
regs.eflags.u32 &= ~0x100;
dmn_thread_write_reg_block(ctrls->single_step_thread, &regs);
}break;
case Architecture_x64:
case Arch_x64:
{
if(!GetThreadContext(thread->handle, single_step_thread_ctx))
{
@@ -2737,10 +2737,10 @@ dmn_process_write(DMN_Handle process, Rng1U64 range, void *src)
//- rjf: threads
internal Architecture
internal Arch
dmn_arch_from_thread(DMN_Handle handle)
{
Architecture arch = Architecture_Null;
Arch arch = Arch_Null;
DMN_AccessScope
{
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;
switch(thread->arch)
{
case Architecture_Null:
case Architecture_COUNT:
case Arch_Null:
case Arch_COUNT:
{}break;
case Architecture_arm64:
case Architecture_arm32:
case Arch_arm64:
case Arch_arm32:
{NotImplemented;}break;
case Architecture_x64:
case Arch_x64:
{
U64 stack_base_addr = tlb + 0x8;
dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+8), &result);
}break;
case Architecture_x86:
case Arch_x86:
{
U64 stack_base_addr = tlb + 0x4;
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;
switch(entity->arch)
{
case Architecture_Null:
case Architecture_COUNT:
case Arch_Null:
case Arch_COUNT:
{}break;
case Architecture_arm64:
case Architecture_arm32:
case Arch_arm64:
case Arch_arm32:
{NotImplemented;}break;
case Architecture_x64:
case Arch_x64:
{
result += 88;
}break;
case Architecture_x86:
case Arch_x86:
{
result += 44;
}break;
+4 -4
View File
@@ -106,7 +106,7 @@ struct DMN_W32_Entity
U32 gen;
U64 id;
HANDLE handle;
Architecture arch;
Arch arch;
union
{
struct
@@ -174,7 +174,7 @@ struct DMN_W32_InjectedBreak
typedef struct DMN_W32_ImageInfo DMN_W32_ImageInfo;
struct DMN_W32_ImageInfo
{
Architecture arch;
Arch arch;
U32 size;
};
@@ -277,8 +277,8 @@ internal DMN_W32_ImageInfo dmn_w32_image_info_from_process_base_vaddr(HANDLE pro
//- rjf: threads
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 B32 dmn_w32_thread_read_reg_block(Architecture 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_read_reg_block(Arch 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
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)) &&
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;
RDI_Parsed *rdi = 0;
U64 module_base = 0;
+1 -1
View File
@@ -110,7 +110,7 @@ struct E_Module
{
RDI_Parsed *rdi;
Rng1U64 vaddr_range;
Architecture arch;
Arch arch;
E_Space space;
};
+1 -1
View File
@@ -163,7 +163,7 @@ e_interpret(String8 bytecode)
U8 byte_size = (imm.u64&0x00FF00)>>8;
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_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 size = (U64)byte_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_write;
E_Space primary_space;
Architecture reg_arch;
Arch reg_arch;
E_Space reg_space;
U64 reg_unwind_count;
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;
String8 local_lookup_string = token_string;
E_Space space = {0};
Architecture arch = Architecture_Null;
Arch arch = Arch_Null;
//- rjf: identifiers surrounded by ``s should have those `s stripped
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)
{
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_push_uconst(arena, &oplist, reg_rng.byte_off);
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)
{
REGS_Slice alias_slice = regs_alias_code_slice_table_from_architecture(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_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_arch(e_parse_ctx->primary_module->arch)[alias_slice.code];
E_OpList oplist = {0};
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);
@@ -1674,7 +1674,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
case RDI_LocationKind_ValReg:
{
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};
U64 byte_size = (U64)reg_rng.byte_size;
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
e_type_key_reg(Architecture arch, REGS_RegCode code)
e_type_key_reg(Arch arch, REGS_RegCode code)
{
E_TypeKey key = {E_TypeKeyKind_Reg};
key.u32[0] = (U32)arch;
@@ -265,7 +265,7 @@ e_type_key_reg(Architecture arch, REGS_RegCode code)
}
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};
key.u32[0] = (U32)arch;
@@ -398,7 +398,7 @@ 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)
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);
return key;
@@ -818,16 +818,16 @@ e_type_from_key(Arena *arena, E_TypeKey key)
//- rjf: reg type keys
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_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;
}goto build_reg_type;
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_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;
}goto build_reg_type;
build_reg_type:
+5 -5
View File
@@ -23,7 +23,7 @@ struct E_TypeKey
{
E_TypeKeyKind kind;
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)
// [2] -> RDI Index (Ext)
};
@@ -138,7 +138,7 @@ struct E_Type
typedef struct E_ConsTypeParams E_ConsTypeParams;
struct E_ConsTypeParams
{
Architecture arch;
Arch arch;
E_TypeKind kind;
String8 name;
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_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_reg(Architecture arch, REGS_RegCode code);
internal E_TypeKey e_type_key_reg_alias(Architecture arch, REGS_AliasCode code);
internal E_TypeKey e_type_key_reg(Arch arch, REGS_RegCode code);
internal E_TypeKey e_type_key_reg_alias(Arch arch, REGS_AliasCode code);
//- rjf: constructed type construction
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
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
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.Mode = AddrModeFlat;
#else
# error Architecture not supported!
# error Arch not supported!
#endif
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)
{
default:{}break;
case COFF_MachineType_X86: {info.arch = Architecture_x86;}break;
case COFF_MachineType_X64: {info.arch = Architecture_x64;}break;
case COFF_MachineType_ARM: {info.arch = Architecture_arm32;}break;
case COFF_MachineType_ARM64: {info.arch = Architecture_arm64;}break;
case COFF_MachineType_X86: {info.arch = Arch_x86;}break;
case COFF_MachineType_X64: {info.arch = Arch_x64;}break;
case COFF_MachineType_ARM: {info.arch = Arch_arm32;}break;
case COFF_MachineType_ARM64: {info.arch = Arch_arm64;}break;
}
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)
{
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];
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_size = sizeof(U32);
if(bin->arch != Architecture_Null)
if(bin->arch != Arch_Null)
{
U64 addr_size = bit_size_from_arch(bin->arch)/8;
Temp scratch = scratch_begin(0, 0);
+1 -1
View File
@@ -728,7 +728,7 @@ struct PE_BinInfo
OS_Guid dbg_guid;
U32 dbg_age;
U32 dbg_time;
Architecture arch;
Arch arch;
Rng1U64 *data_dir_franges;
U32 data_dir_count;
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)
RDI_ArchTable:
+3 -3
View File
@@ -81,7 +81,7 @@ elf_parsed_from_data(Arena *arena, String8 elf_data){
//- validate & translate header values
B32 header_is_good = 0;
Architecture arch = Architecture_Null;
Arch arch = Arch_Null;
if (decoded_header){
header_is_good = 1;
@@ -96,8 +96,8 @@ elf_parsed_from_data(Arena *arena, String8 elf_data){
if (header_is_good){
switch (e_machine){
default: header_is_good = 0;
case ELF_Machine_386: arch = Architecture_x86; break;
case ELF_Machine_X86_64: arch = Architecture_x64; break;
case ELF_Machine_386: arch = Arch_x86; 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{
String8 data;
ELF_Class elf_class;
Architecture arch;
Arch arch;
ELF_Shdr64 *sections;
String8 *section_names;
+27 -27
View File
@@ -3,102 +3,102 @@
//- GENERATED CODE
internal U64 regs_block_size_from_architecture(Architecture arch)
internal U64 regs_block_size_from_arch(Arch arch)
{
U64 result = 8;
switch(arch)
{
default:{}break;
case Architecture_x64:{result = sizeof(REGS_RegBlockX64);}break;
case Architecture_x86:{result = sizeof(REGS_RegBlockX86);}break;
case Arch_x64:{result = sizeof(REGS_RegBlockX64);}break;
case Arch_x86:{result = sizeof(REGS_RegBlockX86);}break;
}
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;
switch(arch)
{
default:{}break;
case Architecture_x64:{result = REGS_RegCodeX64_COUNT;}break;
case Architecture_x86:{result = REGS_RegCodeX86_COUNT;}break;
case Arch_x64:{result = REGS_RegCodeX64_COUNT;}break;
case Arch_x86:{result = REGS_RegCodeX86_COUNT;}break;
}
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;
switch(arch)
{
default:{}break;
case Architecture_x64:{result = REGS_AliasCodeX64_COUNT;}break;
case Architecture_x86:{result = REGS_AliasCodeX86_COUNT;}break;
case Arch_x64:{result = REGS_AliasCodeX64_COUNT;}break;
case Arch_x86:{result = REGS_AliasCodeX86_COUNT;}break;
}
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;
switch(arch)
{
default:{}break;
case Architecture_x64:{result = regs_g_reg_code_x64_string_table;}break;
case Architecture_x86:{result = regs_g_reg_code_x86_string_table;}break;
case Arch_x64:{result = regs_g_reg_code_x64_string_table;}break;
case Arch_x86:{result = regs_g_reg_code_x86_string_table;}break;
}
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;
switch(arch)
{
default:{}break;
case Architecture_x64:{result = regs_g_alias_code_x64_string_table;}break;
case Architecture_x86:{result = regs_g_alias_code_x86_string_table;}break;
case Arch_x64:{result = regs_g_alias_code_x64_string_table;}break;
case Arch_x86:{result = regs_g_alias_code_x86_string_table;}break;
}
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;
switch(arch)
{
default:{}break;
case Architecture_x64:{result = regs_g_reg_code_x64_rng_table;}break;
case Architecture_x86:{result = regs_g_reg_code_x86_rng_table;}break;
case Arch_x64:{result = regs_g_reg_code_x64_rng_table;}break;
case Arch_x86:{result = regs_g_reg_code_x86_rng_table;}break;
}
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;
switch(arch)
{
default:{}break;
case Architecture_x64:{result = regs_g_alias_code_x64_slice_table;}break;
case Architecture_x86:{result = regs_g_alias_code_x86_slice_table;}break;
case Arch_x64:{result = regs_g_alias_code_x64_slice_table;}break;
case Arch_x86:{result = regs_g_alias_code_x86_slice_table;}break;
}
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;
switch(arch)
{
default:{}break;
case Architecture_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_x64:{result = regs_g_reg_code_x64_usage_kind_table;}break;
case Arch_x86:{result = regs_g_reg_code_x86_usage_kind_table;}break;
}
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;
switch(arch)
{
default:{}break;
case Architecture_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_x64:{result = regs_g_alias_code_x64_usage_kind_table;}break;
case Arch_x86:{result = regs_g_alias_code_x86_usage_kind_table;}break;
}
return result;
}
+6 -6
View File
@@ -3,13 +3,13 @@
//- 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;
switch(arch)
{
default:{}break;
case Architecture_x64:
case Arch_x64:
{
switch(code)
{
@@ -116,7 +116,7 @@ case REGS_RegCodeX64_k6:{result = RDI_RegCodeX64_k6;}break;
case REGS_RegCodeX64_k7:{result = RDI_RegCodeX64_k7;}break;
}
}break;
case Architecture_x86:
case Arch_x86:
{
switch(code)
{
@@ -186,13 +186,13 @@ case REGS_RegCodeX86_ymm7:{result = RDI_RegCodeX86_ymm7;}break;
}
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;
switch(arch)
{
default:{}break;
case Architecture_x64:
case Arch_x64:
{
switch(code)
{
@@ -299,7 +299,7 @@ case RDI_RegCodeX64_k6:{result = REGS_RegCodeX64_k6;}break;
case RDI_RegCodeX64_k7:{result = REGS_RegCodeX64_k7;}break;
}
}break;
case Architecture_x86:
case Arch_x86:
{
switch(code)
{
+2 -2
View File
@@ -4,7 +4,7 @@
#ifndef REGS_RDI_H
#define REGS_RDI_H
internal RDI_RegCode regs_rdi_code_from_arch_reg_code(Architecture arch, REGS_RegCode code);
internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Architecture arch, RDI_RegCode reg);
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(Arch arch, RDI_RegCode reg);
#endif //REGS_RDI_H
+6 -6
View File
@@ -6,13 +6,13 @@
@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;`;
`switch(arch)`;
`{`;
`default:{}break;`;
`case Architecture_x64:`;
`case Arch_x64:`;
`{`;
`switch(code)`
`{`;
@@ -20,7 +20,7 @@
@expand(REGS_RegTableX64 a) `case REGS_RegCodeX64_$(a.name):{result = RDI_RegCodeX64_$(a.name);}break;`;
`}`;
`}break;`;
`case Architecture_x86:`;
`case Arch_x86:`;
`{`;
`switch(code)`
`{`;
@@ -35,13 +35,13 @@
@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;`;
`switch(arch)`;
`{`;
`default:{}break;`;
`case Architecture_x64:`;
`case Arch_x64:`;
`{`;
`switch(code)`
`{`;
@@ -49,7 +49,7 @@
@expand(REGS_RegTableX64 a) `case RDI_RegCodeX64_$(a.name):{result = REGS_RegCodeX64_$(a.name);}break;`;
`}`;
`}break;`;
`case Architecture_x86:`;
`case Arch_x86:`;
`{`;
`switch(code)`
`{`;
+12 -12
View File
@@ -10,49 +10,49 @@
//~ rjf: Helpers
internal U64
regs_rip_from_arch_block(Architecture arch, void *block)
regs_rip_from_arch_block(Arch arch, void *block)
{
U64 result = 0;
if(block != 0) switch(arch)
{
default:{}break;
case Architecture_x64:{result = ((REGS_RegBlockX64 *)block)->rip.u64;}break;
case Architecture_x86:{result = (U64)((REGS_RegBlockX86 *)block)->eip.u32;}break;
case Arch_x64:{result = ((REGS_RegBlockX64 *)block)->rip.u64;}break;
case Arch_x86:{result = (U64)((REGS_RegBlockX86 *)block)->eip.u32;}break;
}
return result;
}
internal U64
regs_rsp_from_arch_block(Architecture arch, void *block)
regs_rsp_from_arch_block(Arch arch, void *block)
{
U64 result = 0;
if(block != 0) switch(arch)
{
default:{}break;
case Architecture_x64:{result = ((REGS_RegBlockX64 *)block)->rsp.u64;}break;
case Architecture_x86:{result = (U64)((REGS_RegBlockX86 *)block)->esp.u32;}break;
case Arch_x64:{result = ((REGS_RegBlockX64 *)block)->rsp.u64;}break;
case Arch_x86:{result = (U64)((REGS_RegBlockX86 *)block)->esp.u32;}break;
}
return result;
}
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)
{
default:{}break;
case Architecture_x64:{((REGS_RegBlockX64 *)block)->rip.u64 = rip;}break;
case Architecture_x86:{((REGS_RegBlockX86 *)block)->eip.u32 = (U32)rip;}break;
case Arch_x64:{((REGS_RegBlockX64 *)block)->rip.u64 = rip;}break;
case Arch_x86:{((REGS_RegBlockX86 *)block)->eip.u32 = (U32)rip;}break;
}
}
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)
{
default:{}break;
case Architecture_x64:{((REGS_RegBlockX64 *)block)->rsp.u64 = rsp;}break;
case Architecture_x86:{((REGS_RegBlockX86 *)block)->esp.u32 = (U32)rsp;}break;
case Arch_x64:{((REGS_RegBlockX64 *)block)->rsp.u64 = 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
internal U64 regs_block_size_from_architecture(Architecture arch);
internal U64 regs_reg_code_count_from_architecture(Architecture arch);
internal U64 regs_alias_code_count_from_architecture(Architecture arch);
internal String8 *regs_reg_code_string_table_from_architecture(Architecture arch);
internal String8 *regs_alias_code_string_table_from_architecture(Architecture arch);
internal REGS_Rng *regs_reg_code_rng_table_from_architecture(Architecture arch);
internal REGS_Slice *regs_alias_code_slice_table_from_architecture(Architecture arch);
internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_architecture(Architecture arch);
internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_architecture(Architecture arch);
internal U64 regs_rip_from_arch_block(Architecture arch, void *block);
internal U64 regs_rsp_from_arch_block(Architecture arch, void *block);
internal void regs_arch_block_write_rip(Architecture arch, void *block, U64 rip);
internal void regs_arch_block_write_rsp(Architecture arch, void *block, U64 rsp);
internal U64 regs_block_size_from_arch(Arch arch);
internal U64 regs_reg_code_count_from_arch(Arch arch);
internal U64 regs_alias_code_count_from_arch(Arch arch);
internal String8 *regs_reg_code_string_table_from_arch(Arch arch);
internal String8 *regs_alias_code_string_table_from_arch(Arch arch);
internal REGS_Rng *regs_reg_code_rng_table_from_arch(Arch arch);
internal REGS_Slice *regs_alias_code_slice_table_from_arch(Arch arch);
internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_arch(Arch arch);
internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_arch(Arch arch);
internal U64 regs_rip_from_arch_block(Arch arch, void *block);
internal U64 regs_rsp_from_arch_block(Arch arch, void *block);
internal void regs_arch_block_write_rip(Arch arch, void *block, U64 rip);
internal void regs_arch_block_write_rsp(Arch arch, void *block, U64 rsp);
#endif // REGS_H
+18 -18
View File
@@ -459,13 +459,13 @@ regs_g_reg_code_x86_usage_kind_table:
@c_file @gen
{
`internal U64 regs_block_size_from_architecture(Architecture arch)`;
`internal U64 regs_block_size_from_arch(Arch arch)`;
`{`;
`U64 result = 8;`;
`switch(arch)`;
`{`;
`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;`;
`}`;
@@ -473,13 +473,13 @@ regs_g_reg_code_x86_usage_kind_table:
@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;`;
`switch(arch)`;
`{`;
`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;`;
`}`;
@@ -487,13 +487,13 @@ regs_g_reg_code_x86_usage_kind_table:
@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;`;
`switch(arch)`;
`{`;
`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;`;
`}`;
@@ -501,13 +501,13 @@ regs_g_reg_code_x86_usage_kind_table:
@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;`;
`switch(arch)`;
`{`;
`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;`;
`}`;
@@ -515,13 +515,13 @@ regs_g_reg_code_x86_usage_kind_table:
@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;`;
`switch(arch)`;
`{`;
`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;`;
`}`;
@@ -529,13 +529,13 @@ regs_g_reg_code_x86_usage_kind_table:
@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;`;
`switch(arch)`;
`{`;
`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;`;
`}`;
@@ -543,13 +543,13 @@ regs_g_reg_code_x86_usage_kind_table:
@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;`;
`switch(arch)`;
`{`;
`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;`;
`}`;
@@ -557,13 +557,13 @@ regs_g_reg_code_x86_usage_kind_table:
@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;`;
`switch(arch)`;
`{`;
`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;`;
`}`;
@@ -571,13 +571,13 @@ regs_g_reg_code_x86_usage_kind_table:
@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;`;
`switch(arch)`;
`{`;
`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;`;
`}`;
+2 -2
View File
@@ -67,13 +67,13 @@ txt_extension_from_lang_kind(TXT_LangKind kind)
}
internal TXT_LangKind
txt_lang_kind_from_architecture(Architecture arch)
txt_lang_kind_from_arch(Arch arch)
{
TXT_LangKind kind = TXT_LangKind_Null;
switch(arch)
{
default:{}break;
case Architecture_x64:{kind = TXT_LangKind_DisasmX64Intel;}break;
case Arch_x64:{kind = TXT_LangKind_DisasmX64Intel;}break;
}
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 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);
////////////////////////////////