Ejemplo n.º 1
0
static int or1k_save_context(struct target *target)
{
	struct or1k_common *or1k = target_to_or1k(target);
	struct or1k_du *du_core = or1k_to_du(or1k);
	int regs_read = 0;
	int retval;

	LOG_DEBUG("-");

	for (int i = 0; i < OR1KNUMCOREREGS; i++) {
		if (!or1k->core_cache->reg_list[i].valid) {
			if (i == OR1K_REG_PPC || i == OR1K_REG_NPC || i == OR1K_REG_SR) {
				retval = du_core->or1k_jtag_read_cpu(&or1k->jtag,
						or1k->arch_info[i].spr_num, 1,
						&or1k->core_regs[i]);
				if (retval != ERROR_OK)
					return retval;
			} else if (!regs_read) {
				/* read gpr registers at once (but only one time in this loop) */
				retval = or1k_jtag_read_regs(or1k, or1k->core_regs);
				if (retval != ERROR_OK)
					return retval;
				/* prevent next reads in this loop */
				regs_read = 1;
			}
			/* We've just updated the core_reg[i], now update
			   the core cache */
			or1k_read_core_reg(target, i);
		}
	}

	return ERROR_OK;
}
Ejemplo n.º 2
0
int or1k_save_context(struct target *target)
{

	LOG_DEBUG(" - ");
	int retval, i, regs_read = 0;
	struct or1k_common *or1k = target_to_or1k(target);
	
	for (i = 0; i < OR1KNUMCOREREGS; i++)
	{
		if (!regs_read && !or1k->core_cache->reg_list[i].valid)
		{
			/* read all registers at once (but only one time in this loop) */
			retval = or1k_jtag_read_regs(&or1k->jtag, or1k->core_regs);
			if (retval != ERROR_OK)
				return retval;
			
			/* prevent next reads in this loop */
			regs_read = 1;
		}
		if (!or1k->core_cache->reg_list[i].valid) {
			/* We've just updated the core_reg[i], now update
			   the core cache */
			or1k_read_core_reg(target, i);
		}
	}

	return ERROR_OK;
}