* 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:
pancake 2009-02-17 10:59:26 +01:00
parent 731472d2b9
commit 0503639432
9 changed files with 80 additions and 32 deletions

View file

@ -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**

View file

@ -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);

View file

@ -1,5 +1,5 @@
NAME=r_flags
OBJ=flags.o name.o
OBJ=flags.o name.o spaces.o
include ../rules.mk

View file

@ -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
View 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]);
}
}

View file

@ -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

View file

@ -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 */

View file

@ -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;

View file

@ -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");
}
}
}