mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-11 17:16:03 +00:00
![pancake](/assets/img/avatar_default.png)
- Uses the mercurial's C algorithm for delta diffing - Remove r_diff_lines .. do we need a line-level diffing tool? - Remove -l flag from radiff2 * Rename RIo to RIO * Added r_reg_arena_new () to simplify arena creation - Some sanity fixes in r_reg arena.c * Add -C in rasm2 to output in C string format * Initial working implementation of r_debug_execute to inject code in child process and restore memory and registers - Returns %a0 register value in ut64 * Added 'c' command to r_core - to compare -- just dummy - Will use r_diff - if rdiff callback returns NULL, we must stop scanning - old r_diff_buffers_delta is now named buffers_radiff - Added test files in diff/t/{file1,file2} * Added doc/plugins documentation file * Fix ${EXT_SO} in bin/p and asm/p (dejavu?) * Added dummy asm_gas r_asm plugin * Various random syntax fixes * Rename 'dbg.ptrace' to 'dbg.native' * Added r_debug_io_bind () to sync dbg and bp io_bind * r_debug_map_list is now in a nicer format * Append ${EXT_EXE} in diff/t * Add missing util/log.c and vapi/r_line.vapi --HG-- rename : libr/debug/p/debug_ptrace.c => libr/debug/p/debug_native.c rename : libr/debug/p/ptrace.mk => libr/debug/p/native.mk
136 lines
3.1 KiB
C
136 lines
3.1 KiB
C
/* radare - LGPL - Copyright 2009-2010 pancake<nopcode.org> */
|
|
|
|
#include <r_reg.h>
|
|
/* TODO: add push/pop.. */
|
|
|
|
/* non-endian safe - used for raw mapping with system registers */
|
|
R_API ut8* r_reg_get_bytes(struct r_reg_t *reg, int type, int *size)
|
|
{
|
|
RRegisterArena *arena;
|
|
int i, sz, osize;
|
|
ut8 *buf;
|
|
if (type == -1) {
|
|
/* serialize ALL register types in a single buffer */
|
|
// owned buffer is returned
|
|
osize = sz = 0;
|
|
buf = malloc (8);
|
|
for (i=0; i<R_REG_TYPE_LAST; i++) {
|
|
arena = reg->regset[i].arena;
|
|
sz += arena->size;
|
|
buf = realloc (buf, sz);
|
|
memcpy (buf+osize, arena->bytes, arena->size);
|
|
osize += sz;
|
|
}
|
|
if (size)
|
|
*size = sz;
|
|
return buf;
|
|
}
|
|
|
|
if (type<0 || type>R_REG_TYPE_LAST)
|
|
return NULL;
|
|
sz = reg->regset[type].arena->size;
|
|
if (size)
|
|
*size = sz;
|
|
buf = malloc (sz);
|
|
if (buf == NULL)
|
|
return NULL;
|
|
memcpy (buf, reg->regset[type].arena->bytes, sz);
|
|
return buf;
|
|
}
|
|
|
|
/* reduce number of return statements */
|
|
R_API int r_reg_set_bytes(struct r_reg_t *reg, int type, const ut8* buf, int len)
|
|
{
|
|
int i, ret = R_FALSE;
|
|
struct r_reg_set_t *regset;
|
|
struct r_reg_arena_t *arena;
|
|
int off = 0;
|
|
|
|
if (type == -1) {
|
|
ret = R_TRUE;
|
|
/* deserialize ALL register types in a single buffer */
|
|
for(i=0; i<R_REG_TYPE_LAST; i++) {
|
|
arena = reg->regset[i].arena;
|
|
if (arena == NULL) {
|
|
arena = reg->regset[i].arena = R_NEW (RRegisterArena);
|
|
arena->size = len;
|
|
arena->bytes = malloc(len);
|
|
}
|
|
if (arena->bytes == NULL)
|
|
return R_FALSE;
|
|
memcpy (arena->bytes, buf+off, arena->size);
|
|
off += arena->size;
|
|
if (off>len) {
|
|
ret = R_FALSE;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
if (type>=0 && type<=R_REG_TYPE_LAST) {
|
|
regset = ®->regset[type];
|
|
if (len<=regset->arena->size) {
|
|
memcpy (regset->arena->bytes, buf, len);
|
|
ret = R_TRUE;
|
|
}
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
R_API int r_reg_export_to(struct r_reg_t *reg, struct r_reg_t *dst)
|
|
{
|
|
//struct r_reg_arena_t *arena;
|
|
struct r_reg_item_t *r;
|
|
struct list_head *pos;
|
|
int i, ret = R_FALSE;
|
|
if (dst) {
|
|
// foreach reg of every time in reg, define it in dst
|
|
for(i=0;i<R_REG_TYPE_LAST;i++) {
|
|
list_for_each(pos, ®->regset[i].regs) {
|
|
r = list_entry(pos, struct r_reg_item_t, list);
|
|
// TODO: export to not implemented
|
|
//r_reg_set(dst, r_reg_get(dst, r->name), );
|
|
//r_mem_copybits_delta(
|
|
}
|
|
}
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
R_API int r_reg_fit_arena(struct r_reg_t *reg)
|
|
{
|
|
struct list_head *pos;
|
|
struct r_reg_item_t *r;
|
|
struct r_reg_arena_t *arena;
|
|
int size, i;
|
|
|
|
/* propagate arenas */
|
|
for(i=0;i<R_REG_TYPE_LAST;i++) {
|
|
arena = reg->regset[i].arena;
|
|
arena->size = 0;
|
|
list_for_each(pos, ®->regset[i].regs) {
|
|
r = list_entry(pos, struct r_reg_item_t, list);
|
|
size = BITS2BYTES(r->offset+r->size);
|
|
if (size>arena->size) {
|
|
arena->size = size;
|
|
arena->bytes = realloc (arena->bytes, size);
|
|
if (arena->bytes == NULL)
|
|
return R_FALSE;
|
|
}
|
|
}
|
|
memset(arena->bytes, 0, arena->size);
|
|
}
|
|
return R_TRUE;
|
|
}
|
|
|
|
R_API RRegisterArena *r_reg_arena_new (int size) {
|
|
RRegisterArena *arena = R_NEW (RRegisterArena);
|
|
if (arena) {
|
|
if ((arena->bytes = malloc (size+8)) == NULL) {
|
|
free (arena);
|
|
arena = NULL;
|
|
} else arena->size = size;
|
|
}
|
|
return arena;
|
|
}
|