* Add initial 'fs' command to handle flag spaces
- Added the necessary stuff in r_flags - Flag size is now 64 bit size * Some random and useless fixups for r_var
This commit is contained in:
parent
731472d2b9
commit
0503639432
9 changed files with 80 additions and 32 deletions
|
|
@ -17,8 +17,6 @@
|
|||
- Add lua disassembler
|
||||
- Add java, dalvik, xtensa achiecture (mm cpu)
|
||||
- http://git.linux-xtensa.org/cgi-bin/git.cgi?p=buildroot/buildroot-xtensa;a=blob;f=toolchain/binutils/binutils-xtensa_dc232b.tgz;h=214164399158c540a3033e52b3bb9f65c55289af;hb=HEAD
|
||||
- Vala API should not use State
|
||||
- Fix cpp issues
|
||||
- Fix endianess issues
|
||||
|
||||
|| anal || **MISSING**
|
||||
|
|
|
|||
|
|
@ -319,7 +319,9 @@ static int cmd_flag(void *data, const char *input)
|
|||
r_flag_unset(&core->flags, input+1);
|
||||
break;
|
||||
case 's':
|
||||
/* spaces */
|
||||
if (input[1]==' ')
|
||||
r_flag_space_set(&core->flags, input+2);
|
||||
else r_flag_space_list(&core->flags, 0);
|
||||
break;
|
||||
case '*':
|
||||
r_flag_list(&core->flags, 1);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
NAME=r_flags
|
||||
|
||||
OBJ=flags.o name.o
|
||||
OBJ=flags.o name.o spaces.o
|
||||
|
||||
include ../rules.mk
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* radare - LGPL - Copyright 2009 pancake<nopcode.org> */
|
||||
/* radare - LGPL - Copyright 2007-2009 pancake<nopcode.org> */
|
||||
|
||||
#include <r_flags.h>
|
||||
#include <r_cons.h> // TODO: drop dependency
|
||||
|
|
@ -13,7 +13,7 @@ int r_flag_init(struct r_flag_t *f)
|
|||
f->space_idx = -1;
|
||||
f->space_idx2 = -1;
|
||||
f->base = 0LL;
|
||||
for(i=0;i<R_FLAG_SPACES;i++)
|
||||
for(i=0;i<R_FLAG_SPACES_MAX;i++)
|
||||
f->space[i] = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -24,23 +24,14 @@ int r_flag_set_base(struct r_flag_t *f, u64 new_base)
|
|||
return 0;
|
||||
}
|
||||
|
||||
const const char *r_flag_space_get(struct r_flag_t *f, int idx)
|
||||
{
|
||||
if (idx==-1)
|
||||
return "";
|
||||
if (idx>255||f->space[idx]=='\0')
|
||||
return "";
|
||||
return f->space[idx];
|
||||
}
|
||||
|
||||
struct r_flag_item_t *r_flag_list(struct r_flag_t *f, int rad)
|
||||
{
|
||||
struct list_head *pos;
|
||||
list_for_each_prev(pos, &f->flags) {
|
||||
struct r_flag_item_t *flag = list_entry(pos, struct r_flag_item_t, list);
|
||||
if (rad) printf("f %s %d @ 0x%08llx\n", flag->name,
|
||||
if (rad) printf("f %s %lld @ 0x%08llx\n", flag->name,
|
||||
flag->size, flag->offset);
|
||||
else printf("0x%08llx %d %s\n",
|
||||
else printf("0x%08llx %lld %s\n",
|
||||
flag->offset, flag->size, flag->name);
|
||||
}
|
||||
return NULL;
|
||||
|
|
|
|||
56
libr/flags/spaces.c
Normal file
56
libr/flags/spaces.c
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
/* radare - LGPL - Copyright 2008-2009 pancake<nopcode.org> */
|
||||
|
||||
#include <r_flags.h>
|
||||
|
||||
const const char *r_flag_space_get(struct r_flag_t *f, int idx)
|
||||
{
|
||||
if (idx==-1)
|
||||
return "";
|
||||
if (idx>255||f->space[idx]=='\0')
|
||||
return "";
|
||||
return f->space[idx];
|
||||
}
|
||||
|
||||
#if 0
|
||||
void flag_space_init(struct r_flag_t *f)
|
||||
{
|
||||
static int init = 0;
|
||||
int i;
|
||||
if (init)
|
||||
return;
|
||||
init = 1;
|
||||
for(i=0;i<R_FLAG_SPACES_MAX;i++)
|
||||
f->space[i] = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
void r_flag_space_set(struct r_flag_t *f, const char *name)
|
||||
{
|
||||
int i;
|
||||
for(i=0;i<R_FLAG_SPACES_MAX;i++) {
|
||||
if (f->space[i] != NULL)
|
||||
if (!strcmp(name, f->space[i])) {
|
||||
f->space_idx = i; //flag_space_idx = i;
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* not found */
|
||||
for(i=0;i<R_FLAG_SPACES_MAX;i++) {
|
||||
if (f->space[i] == NULL) {
|
||||
f->space[i] = strdup(name);
|
||||
f->space_idx = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void r_flag_space_list(struct r_flag_t *f)
|
||||
{
|
||||
int i,j = 0;
|
||||
for(i=0;i<R_FLAG_SPACES_MAX;i++) {
|
||||
if (f->space[i])
|
||||
printf("%02d %c %s\n", j++,
|
||||
(i==f->space_idx)?'*':' ', f->space[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -6,12 +6,12 @@
|
|||
|
||||
#define R_FLAG_NAME_SIZE 128
|
||||
#define R_FLAG_BUF_SIZE 128
|
||||
#define R_FLAG_SPACES 128
|
||||
#define R_FLAG_SPACES_MAX 128
|
||||
|
||||
struct r_flag_item_t {
|
||||
char name[R_FLAG_NAME_SIZE];
|
||||
u64 offset;
|
||||
u32 size;
|
||||
u64 size;
|
||||
int format; // ???
|
||||
int space;
|
||||
const char *cmd;
|
||||
|
|
@ -23,13 +23,12 @@ struct r_flag_t {
|
|||
int space_idx;
|
||||
int space_idx2;
|
||||
u64 base;
|
||||
const char *space[R_FLAG_SPACES];
|
||||
const char *space[R_FLAG_SPACES_MAX];
|
||||
struct list_head flags;
|
||||
};
|
||||
|
||||
int r_flag_init(struct r_flag_t *f);
|
||||
int r_flag_set_base(struct r_flag_t *f, u64 new_base);
|
||||
const const char *r_flag_space_get(struct r_flag_t *f, int idx);
|
||||
struct r_flag_item_t *r_flag_list(struct r_flag_t *f, int rad);
|
||||
struct r_flag_item_t *r_flag_get(struct r_flag_t *f, const char *name);
|
||||
int r_flag_unset(struct r_flag_t *f, const char *name);
|
||||
|
|
@ -37,4 +36,9 @@ int r_flag_set(struct r_flag_t *fo, const char *name, u64 addr, u32 size, int du
|
|||
int r_flag_name_check(const char *name);
|
||||
int r_flag_name_filter(char *name);
|
||||
|
||||
/* spaces */
|
||||
const const char *r_flag_space_get(struct r_flag_t *f, int idx);
|
||||
void r_flag_space_set(struct r_flag_t *f, const char *name);
|
||||
void flag_space_list(struct r_flag_t *f);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ int r_var_init(struct r_var_t *var);
|
|||
int r_var_type_add(struct r_var_t *var, const char *typename, int size, const char *fmt);
|
||||
int r_var_type_del(struct r_var_t *var, const char *typename);
|
||||
int r_var_type_list(struct r_var_t *var);
|
||||
const char *r_var_type_get(struct r_var_t *var, const char *datatype);
|
||||
struct r_var_type_t *r_var_type_get(struct r_var_t *var, const char *datatype);
|
||||
const char *r_var_type_to_string(int type);
|
||||
|
||||
/* food */
|
||||
|
|
|
|||
|
|
@ -4,8 +4,6 @@
|
|||
#include "r_util.h"
|
||||
#include <stdio.h>
|
||||
|
||||
//u64 io->seek = 0; // XXX should be store per io_handle
|
||||
|
||||
int r_io_init(struct r_io_t *io)
|
||||
{
|
||||
io->write_mask_fd = -1;
|
||||
|
|
|
|||
|
|
@ -70,12 +70,12 @@ int r_var_type_list(struct r_var_t *var)
|
|||
list_for_each(pos, &var->vartypes) {
|
||||
struct r_var_type_t *d = (struct r_var_type_t *)
|
||||
list_entry(pos, struct r_var_type_t, list);
|
||||
cons_printf("%s %d %s\n", d->name, d->size, d->fmt);
|
||||
printf("%s %d %s\n", d->name, d->size, d->fmt);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct r_var_type_d *r_var_type_get(struct r_var_t *var, const char *datatype)
|
||||
struct r_var_type_t *r_var_type_get(struct r_var_t *var, const char *datatype)
|
||||
{
|
||||
struct list_head *pos;
|
||||
|
||||
|
|
@ -136,7 +136,7 @@ int r_var_add_access(struct r_var_t *var, u64 addr, int delta, int type, int set
|
|||
/* automatic init */
|
||||
/* detect function in CF list */
|
||||
from = to = 0LL;
|
||||
// XXX THIS IS FOR R_META?
|
||||
// XXX USE RMETA HERE!!
|
||||
if ( data_get_fun_for(addr, &from, &to) ) {
|
||||
char varname[32];
|
||||
if (delta < 0) {
|
||||
|
|
@ -186,7 +186,7 @@ int r_var_item_print(struct r_var_t *var, struct r_var_item_t * v)
|
|||
{
|
||||
struct r_var_type_t *t = r_var_type_get(var, v->vartype);
|
||||
if (t == NULL) {
|
||||
u32 value = var_dbg_read(v->delta);
|
||||
u32 value = 0; //XXX var_dbg_read(v->delta);
|
||||
// TODO: use var type to
|
||||
r_cons_printf("%x", value);
|
||||
} else {
|
||||
|
|
@ -206,14 +206,13 @@ int r_var_item_print(struct r_var_t *var, struct r_var_item_t * v)
|
|||
/* CFV */
|
||||
int r_var_list_show(struct r_var_t *var, u64 addr)
|
||||
{
|
||||
char buf[256];
|
||||
struct list_head *pos;
|
||||
struct r_var_item_t *v;
|
||||
|
||||
list_for_each(pos, &var->vars) {
|
||||
v = (struct r_var_item_t*)list_entry(pos, struct r_var_item_t, list);
|
||||
if (addr == 0 || (addr >= v->addr && addr <= v->eaddr)) {
|
||||
u32 value = var_dbg_read(v->delta);
|
||||
//u32 value = var_dbg_read(v->delta);
|
||||
if (v->arraysize>1) {
|
||||
r_cons_printf("%s %s %s[%d] = ",
|
||||
r_var_type_to_string(v->type),
|
||||
|
|
@ -246,12 +245,12 @@ int r_var_list(struct r_var_t *var, u64 addr, int delta)
|
|||
list_for_each(pos, &var->vars) {
|
||||
v = (struct r_var_item_t*)list_entry(pos, struct r_var_item_t, list);
|
||||
if (addr == 0 || (addr >= v->addr && addr <= v->eaddr)) {
|
||||
cons_printf("0x%08llx - 0x%08llx type=%s type=%s name=%s delta=%d array=%d\n",
|
||||
printf("0x%08llx - 0x%08llx type=%s type=%s name=%s delta=%d array=%d\n",
|
||||
v->addr, v->eaddr, r_var_type_to_string(v->type),
|
||||
v->vartype, v->name, v->delta, v->arraysize);
|
||||
list_for_each_prev(pos2, &v->access) {
|
||||
x = (struct r_var_access_t *)list_entry(pos2, struct r_var_access_t, list);
|
||||
r_cons_printf(" 0x%08llx %s\n", x->addr, x->set?"set":"get");
|
||||
printf(" 0x%08llx %s\n", x->addr, x->set?"set":"get");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue