fixes for operations: dw_op_addr, dw_op_deref, dw_op_breg_x. Dereference
memory location if it's last on the dwarf stack
This commit is contained in:
@@ -96,7 +96,7 @@ bool dw_op_notimpl(dwarf_stack* stack, const dwarf_op_map* map, Dwarf_Word op1,
|
|||||||
// address and whose size is the size of an address on the target machine.
|
// address and whose size is the size of an address on the target machine.
|
||||||
bool dw_op_addr(dwarf_stack* stack, const dwarf_op_map* map, Dwarf_Word op1, Dwarf_Word op2)
|
bool dw_op_addr(dwarf_stack* stack, const dwarf_op_map* map, Dwarf_Word op1, Dwarf_Word op2)
|
||||||
{
|
{
|
||||||
stack->push(&op1, sizeof(op1), DWARF_TYPE_MEMORY_LOC | DWARF_TYPE_GENERIC);
|
stack->push(&op1, sizeof(op1), DWARF_TYPE_GENERIC);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,10 +107,12 @@ bool dw_op_deref(dwarf_stack* stack, const dwarf_op_map* map, Dwarf_Word op1, Dw
|
|||||||
{
|
{
|
||||||
dwarf_value* value = stack->pop();
|
dwarf_value* value = stack->pop();
|
||||||
if(value) {
|
if(value) {
|
||||||
uint64_t v = *((uint64_t*)value->value);
|
uint64_t addr;
|
||||||
stack->push(&v, sizeof(v), DWARF_TYPE_GENERIC);
|
if(value->get_uint(addr)) {
|
||||||
|
uint64_t v = *((uint64_t*)addr);
|
||||||
return true;
|
stack->push(&v, sizeof(v), DWARF_TYPE_GENERIC);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -790,7 +792,7 @@ bool dw_op_breg_x(dwarf_stack* stack, const dwarf_op_map* map, Dwarf_Word op1, D
|
|||||||
}
|
}
|
||||||
|
|
||||||
val += off;
|
val += off;
|
||||||
stack->push(&val, sizeof(val), DWARF_TYPE_MEMORY_LOC | DWARF_TYPE_GENERIC);
|
stack->push(&val, sizeof(val), DWARF_TYPE_REGISTER_LOC | DWARF_TYPE_GENERIC);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1071,6 +1073,13 @@ bool __dwarf_stack::get_value(uint64_t& value)
|
|||||||
ctx->log(SEVERITY_ERROR, "Failed to get value of register 0x%lX", regno);
|
ctx->log(SEVERITY_ERROR, "Failed to get value of register 0x%lX", regno);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
} else if(v->type & DWARF_TYPE_MEMORY_LOC) {
|
||||||
|
// dereference memory location
|
||||||
|
uint64_t addr;
|
||||||
|
if(!v->get_uint(addr)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
value = *((uint64_t*)addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Reference in New Issue
Block a user