static void put_cpsr(QEMUFile *f, void *opaque, size_t size) { ARMCPU *cpu = opaque; CPUARMState *env = &cpu->env; qemu_put_be32(f, cpsr_read(env)); }
int arm_reg_read(struct uc_struct *uc, unsigned int regid, void *value) { CPUState *mycpu; mycpu = first_cpu; if (regid >= UC_ARM_REG_R0 && regid <= UC_ARM_REG_R12) *(int32_t *)value = ARM_CPU(uc, mycpu)->env.regs[regid - UC_ARM_REG_R0]; else { switch(regid) { case UC_ARM_REG_CPSR: *(int32_t *)value = cpsr_read(&ARM_CPU(uc, mycpu)->env); break; //case UC_ARM_REG_SP: case UC_ARM_REG_R13: *(int32_t *)value = ARM_CPU(uc, mycpu)->env.regs[13]; break; //case UC_ARM_REG_LR: case UC_ARM_REG_R14: *(int32_t *)value = ARM_CPU(uc, mycpu)->env.regs[14]; break; //case UC_ARM_REG_PC: case UC_ARM_REG_R15: *(int32_t *)value = ARM_CPU(uc, mycpu)->env.regs[15]; break; } } return 0; }
int arm_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int count) { CPUState *mycpu; int i; mycpu = first_cpu; for (i = 0; i < count; i++) { unsigned int regid = regs[i]; void *value = vals[i]; if (regid >= UC_ARM_REG_R0 && regid <= UC_ARM_REG_R12) *(int32_t *)value = ARM_CPU(uc, mycpu)->env.regs[regid - UC_ARM_REG_R0]; else { switch(regid) { case UC_ARM_REG_CPSR: *(int32_t *)value = cpsr_read(&ARM_CPU(uc, mycpu)->env); break; //case UC_ARM_REG_SP: case UC_ARM_REG_R13: *(int32_t *)value = ARM_CPU(uc, mycpu)->env.regs[13]; break; //case UC_ARM_REG_LR: case UC_ARM_REG_R14: *(int32_t *)value = ARM_CPU(uc, mycpu)->env.regs[14]; break; //case UC_ARM_REG_PC: case UC_ARM_REG_R15: *(int32_t *)value = ARM_CPU(uc, mycpu)->env.regs[15]; break; } } } return 0; }
int arm_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n) { ARMCPU *cpu = ARM_CPU(cs); CPUARMState *env = &cpu->env; if (n < 16) { /* Core integer register. */ return gdb_get_reg32(mem_buf, env->regs[n]); } if (n < 24) { /* FPA registers. */ if (gdb_has_xml) { return 0; } memset(mem_buf, 0, 12); return 12; } switch (n) { case 24: /* FPA status register. */ if (gdb_has_xml) { return 0; } return gdb_get_reg32(mem_buf, 0); case 25: /* CPSR */ return gdb_get_reg32(mem_buf, cpsr_read(env)); } /* Unknown register. */ return 0; }
static void put_cpsr(QEMUFile *f, void *opaque, size_t size) { ARMCPU *cpu = opaque; CPUARMState *env = &cpu->env; uint32_t val; if (is_a64(env)) { val = pstate_read(env); } else { val = cpsr_read(env); } qemu_put_be32(f, val); }
void cpu_save(QEMUFile *f, void *opaque) { int i; CPUARMState *env = (CPUARMState *)opaque; for (i = 0; i < 16; i++) { qemu_put_be32(f, env->regs[i]); } qemu_put_be32(f, cpsr_read(env)); qemu_put_be32(f, env->spsr); for (i = 0; i < 6; i++) { qemu_put_be32(f, env->banked_spsr[i]); qemu_put_be32(f, env->banked_r13[i]); qemu_put_be32(f, env->banked_r14[i]); } for (i = 0; i < 5; i++) { qemu_put_be32(f, env->usr_regs[i]); qemu_put_be32(f, env->fiq_regs[i]); } qemu_put_be32(f, env->cp15.c0_cpuid); qemu_put_be32(f, env->cp15.c0_cachetype); qemu_put_be32(f, env->cp15.c0_cssel); qemu_put_be32(f, env->cp15.c1_sys); qemu_put_be32(f, env->cp15.c1_coproc); qemu_put_be32(f, env->cp15.c1_xscaleauxcr); qemu_put_be32(f, env->cp15.c1_scr); qemu_put_be32(f, env->cp15.c2_base0); qemu_put_be32(f, env->cp15.c2_base1); qemu_put_be32(f, env->cp15.c2_control); qemu_put_be32(f, env->cp15.c2_mask); qemu_put_be32(f, env->cp15.c2_base_mask); qemu_put_be32(f, env->cp15.c2_data); qemu_put_be32(f, env->cp15.c2_insn); qemu_put_be32(f, env->cp15.c3); qemu_put_be32(f, env->cp15.c5_insn); qemu_put_be32(f, env->cp15.c5_data); for (i = 0; i < 8; i++) { qemu_put_be32(f, env->cp15.c6_region[i]); } qemu_put_be32(f, env->cp15.c6_insn); qemu_put_be32(f, env->cp15.c6_data); qemu_put_be32(f, env->cp15.c7_par); qemu_put_be32(f, env->cp15.c9_insn); qemu_put_be32(f, env->cp15.c9_data); qemu_put_be32(f, env->cp15.c9_pmcr); qemu_put_be32(f, env->cp15.c9_pmcnten); qemu_put_be32(f, env->cp15.c9_pmovsr); qemu_put_be32(f, env->cp15.c9_pmxevtyper); qemu_put_be32(f, env->cp15.c9_pmuserenr); qemu_put_be32(f, env->cp15.c9_pminten); qemu_put_be32(f, env->cp15.c13_fcse); qemu_put_be32(f, env->cp15.c13_context); qemu_put_be32(f, env->cp15.c13_tls1); qemu_put_be32(f, env->cp15.c13_tls2); qemu_put_be32(f, env->cp15.c13_tls3); qemu_put_be32(f, env->cp15.c15_cpar); qemu_put_be32(f, env->cp15.c15_power_control); qemu_put_be32(f, env->cp15.c15_diagnostic); qemu_put_be32(f, env->cp15.c15_power_diagnostic); qemu_put_be32(f, env->features); if (arm_feature(env, ARM_FEATURE_VFP)) { for (i = 0; i < 16; i++) { CPU_DoubleU u; u.d = env->vfp.regs[i]; qemu_put_be32(f, u.l.upper); qemu_put_be32(f, u.l.lower); } for (i = 0; i < 16; i++) { qemu_put_be32(f, env->vfp.xregs[i]); } /* TODO: Should use proper FPSCR access functions. */ qemu_put_be32(f, env->vfp.vec_len); qemu_put_be32(f, env->vfp.vec_stride); if (arm_feature(env, ARM_FEATURE_VFP3)) { for (i = 16; i < 32; i++) { CPU_DoubleU u; u.d = env->vfp.regs[i]; qemu_put_be32(f, u.l.upper); qemu_put_be32(f, u.l.lower); } } } if (arm_feature(env, ARM_FEATURE_IWMMXT)) { for (i = 0; i < 16; i++) { qemu_put_be64(f, env->iwmmxt.regs[i]); } for (i = 0; i < 16; i++) { qemu_put_be32(f, env->iwmmxt.cregs[i]); } } if (arm_feature(env, ARM_FEATURE_M)) { qemu_put_be32(f, env->v7m.other_sp); qemu_put_be32(f, env->v7m.vecbase); qemu_put_be32(f, env->v7m.basepri); qemu_put_be32(f, env->v7m.control); qemu_put_be32(f, env->v7m.current_sp); qemu_put_be32(f, env->v7m.exception); } if (arm_feature(env, ARM_FEATURE_THUMB2EE)) { qemu_put_be32(f, env->teecr); qemu_put_be32(f, env->teehbr); } }