Esempio n. 1
0
R_API int r_debug_reg_list(RDebug *dbg, int type, int size, int rad, const char *use_color) {
	int i, delta, from, to, cols, n = 0;
	const char *fmt, *fmt2, *kwhites;
	RListIter *iter;
	RRegItem *item;
	RList *head;
	ut64 diff;

	if (!dbg || !dbg->reg)
		return R_FALSE;
	if (!(dbg->reg->bits & size)) {
		// TODO: verify if 32bit exists, otherwise use 64 or 8?
		size = 32;
	}
	//if (dbg->h && dbg->h->bits & R_SYS_BITS_64) {
	if (dbg->bits & R_SYS_BITS_64) {
		fmt = "%s = 0x%08"PFMT64x"%s";
		fmt2 = "%4s 0x%08"PFMT64x"%s";
		cols = 3;
		kwhites = "         ";
	} else {
		fmt = " %s = 0x%08"PFMT64x"%s";
		fmt2 = " %3s 0x%08"PFMT64x"%s";
		cols = 4;
		kwhites = "    ";
	}
	if (rad=='j')
		dbg->printf ("{");
	if (type == -1) {
		from = 0;
		to = R_REG_TYPE_LAST;
	} else {
		from = type;
		to = from +1;
	}
	for (i=from; i<to; i++) {
		head = r_reg_get_list (dbg->reg, i);
		if (!head) continue;
		r_list_foreach (head, iter, item) {
			ut64 value;
			if (type != -1) {
				if (type != item->type)
					continue;
				if (size != 0 && size != item->size)
					continue;
			}
			value = r_reg_get_value (dbg->reg, item);
			r_reg_arena_swap (dbg->reg, R_FALSE);
			diff = r_reg_get_value (dbg->reg, item);
			r_reg_arena_swap (dbg->reg, R_FALSE);
			delta = value-diff;

			switch (rad) {
			case 'j':
				dbg->printf ("%s\"%s\":%"PFMT64d,
					n?",":"", item->name, value);
				break;
			case 1:
			case '*':
				dbg->printf ("f %s 1 0x%"PFMT64x"\n",
					item->name, value);
				break;
			case 'd':
			case 2:
				 {
					char *str, whites[16], content[128];
					int len;
					strcpy (whites, kwhites);
					if (delta && use_color)
						dbg->printf (use_color);
					if (item->flags) {
						str = r_reg_get_bvalue (dbg->reg, item);
						len = strlen (str);
						strcpy (whites, "        ");
						len = (len>9)?9:(9-len);
						whites[len] = 0;
						dbg->printf (" %s = %s%s", item->name,
							str, ((n+1)%cols)? whites: "\n");
						free (str);
					} else {
						snprintf (content, sizeof(content), fmt2, item->name, value, "");
						len = strlen (content);
						len -= 4;
						if (len>10) {
							len -= 10;
							len = (len>9)?9:(9-len);
							whites[len] = 0;
						}
						dbg->printf (fmt2, item->name, value,
							((n+1)%cols)? whites: "\n");

					}
					if (delta && use_color)
						dbg->printf (Color_RESET);
				 }
				break;
			case 3:
				if (delta) {
					char woot[64];
					snprintf (woot, sizeof (woot),
						" was 0x%08"PFMT64x" delta %d\n", diff, delta);
					dbg->printf (fmt, item->name, value, woot);
				}
				break;
			default:
				if (delta && use_color)
					dbg->printf (use_color);
				dbg->printf (fmt, item->name, value, "\n");
				if (delta && use_color)
					dbg->printf (Color_RESET);
				break;
			}
			n++;
		}
	}
Esempio n. 2
0
R_API int r_debug_reg_list(RDebug *dbg, int type, int size, int rad, const char *use_color) {
	int i, delta, from, to, cols, n = 0;
	const char *fmt, *fmt2, *kwhites;
	int colwidth = 20;
	RListIter *iter;
	RRegItem *item;
	RList *head;
	RPrint *pr = NULL;
	ut64 diff;

	if (!dbg || !dbg->reg) {
		return false;
	}

	if (dbg->corebind.core) {
		pr = ((RCore*)dbg->corebind.core)->print;
	}

	if (!(dbg->reg->bits & size)) {
		// TODO: verify if 32bit exists, otherwise use 64 or 8?
		size = 32;
	}
	if (dbg->bits & R_SYS_BITS_64) {
		fmt = "%s = 0x%08"PFMT64x"%s";
		fmt2 = "%s%4s%s 0x%08"PFMT64x"%s";
		kwhites = "         ";
		colwidth = dbg->regcols? 20: 25;
		cols = 3;
	} else {
		fmt = "%s = 0x%08"PFMT64x"%s";
		fmt2 = "%s%4s%s 0x%08"PFMT64x"%s";
		kwhites = "    ";
		colwidth = 20;
		cols = 4;
	}
	if (dbg->regcols) {
		cols = dbg->regcols;
	}
	if (rad == 'j')
		dbg->cb_printf ("{");
	if (type == -1) {
		from = 0;
		to = R_REG_TYPE_LAST;
	} else {
		from = type;
		to = from +1;
	}

	int itmidx = -1;
	dbg->creg = NULL;
	for (i = from; i < to; i++) {
		head = r_reg_get_list (dbg->reg, i);
		if (!head) continue;
		r_list_foreach (head, iter, item) {
			ut64 value;
#if 0
			bool is_arm = dbg->arch && strstr (dbg->arch, "arm");

			/* the thumb flag in the cpsr register shouldnt forbid us to switch between arm or thumb */
			/* this code must run only after a step maybe ... need some discussion, disabling for now */
			if (is_arm && (rad == 1 || rad == '*') && item->size == 1) {
				if (!strcmp (item->name, "tf")) {
					bool is_thumb = r_reg_get_value (dbg->reg, item);
					int new_bits = is_thumb? 16: 32;
					if (dbg->anal->bits != new_bits)
						dbg->cb_printf ("e asm.bits=%d\n", new_bits);
				}
				continue;
			}
#endif

			if (type != -1) {
				if (type != item->type) continue;
				if (size != 0 && size != item->size) continue;
			}
			value = r_reg_get_value (dbg->reg, item);
			r_reg_arena_swap (dbg->reg, false);
			diff = r_reg_get_value (dbg->reg, item);
			r_reg_arena_swap (dbg->reg, false);
			delta = value-diff;
			itmidx++;

			switch (rad) {
			case 'j':
				dbg->cb_printf ("%s\"%s\":%"PFMT64d,
					n?",":"", item->name, value);
				break;
			case '-':
				dbg->cb_printf ("f-%s\n", item->name);
				break;
			case 1:
			case '*':
				dbg->cb_printf ("f %s 1 0x%"PFMT64x"\n",
					item->name, value);
				break;
			case 'd':
			case 2:
				{
					int len, highlight = use_color && pr && pr->cur_enabled && itmidx == pr->cur;
					char *str, whites[32], content[128];
					const char *a = "", *b = "";
					if (highlight) {
						a = Color_INVERT;
						b = Color_INVERT_RESET;
						dbg->creg = item->name;
					}
					strcpy (whites, kwhites);
					if (delta && use_color) {
						dbg->cb_printf (use_color);
					}
					if (item->flags) {
						str = r_reg_get_bvalue (dbg->reg, item);
						len = 12 - strlen (str);
						memset (whites, ' ', sizeof (whites));
						whites[len] = 0;
						dbg->cb_printf (" %s%s%s %s%s", a, item->name, b,
							str, ((n+1)%cols)? whites: "\n");
						free (str);
					} else {
						snprintf (content, sizeof (content),
							fmt2, "", item->name, "", value, "");
						len = colwidth - strlen (content);
						if (len < 0) len = 0;
						memset (whites, ' ', sizeof (whites));
						whites[len] = 0;
						dbg->cb_printf (fmt2, a, item->name, b, value,
							((n+1)%cols)? whites: "\n");
					}
					if (highlight) {
						dbg->cb_printf (Color_INVERT_RESET);
					}
					if (delta && use_color) {
						dbg->cb_printf (Color_RESET);
					}
				}
				break;
			case 3:
				if (delta) {
					char woot[64];
					snprintf (woot, sizeof (woot),
						" was 0x%08"PFMT64x" delta %d\n", diff, delta);
					dbg->cb_printf (fmt, item->name, value, woot);
				}
				break;
			default:
				if (delta && use_color) {
					dbg->cb_printf (use_color);
					dbg->cb_printf (fmt, item->name, value, Color_RESET"\n");
				} else {
					dbg->cb_printf (fmt, item->name, value, "\n");
				}
				break;
			}
			n++;
		}
	}