mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 17:53:56 -06:00
target/arm: Move CPU state dumping routines to cpu.c
Suggested-by: Samuel Ortiz <sameo@linux.intel.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-id: 20190701132516.26392-11-philmd@redhat.com Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
6cdca173ef
commit
864806156a
5 changed files with 226 additions and 223 deletions
|
@ -27,7 +27,6 @@
|
|||
#include "translate.h"
|
||||
#include "internals.h"
|
||||
#include "qemu/host-utils.h"
|
||||
#include "qemu/qemu-print.h"
|
||||
|
||||
#include "hw/semihosting/semihost.h"
|
||||
#include "exec/gen-icount.h"
|
||||
|
@ -152,133 +151,6 @@ static void set_btype(DisasContext *s, int val)
|
|||
s->btype = -1;
|
||||
}
|
||||
|
||||
void aarch64_cpu_dump_state(CPUState *cs, FILE *f, int flags)
|
||||
{
|
||||
ARMCPU *cpu = ARM_CPU(cs);
|
||||
CPUARMState *env = &cpu->env;
|
||||
uint32_t psr = pstate_read(env);
|
||||
int i;
|
||||
int el = arm_current_el(env);
|
||||
const char *ns_status;
|
||||
|
||||
qemu_fprintf(f, " PC=%016" PRIx64 " ", env->pc);
|
||||
for (i = 0; i < 32; i++) {
|
||||
if (i == 31) {
|
||||
qemu_fprintf(f, " SP=%016" PRIx64 "\n", env->xregs[i]);
|
||||
} else {
|
||||
qemu_fprintf(f, "X%02d=%016" PRIx64 "%s", i, env->xregs[i],
|
||||
(i + 2) % 3 ? " " : "\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (arm_feature(env, ARM_FEATURE_EL3) && el != 3) {
|
||||
ns_status = env->cp15.scr_el3 & SCR_NS ? "NS " : "S ";
|
||||
} else {
|
||||
ns_status = "";
|
||||
}
|
||||
qemu_fprintf(f, "PSTATE=%08x %c%c%c%c %sEL%d%c",
|
||||
psr,
|
||||
psr & PSTATE_N ? 'N' : '-',
|
||||
psr & PSTATE_Z ? 'Z' : '-',
|
||||
psr & PSTATE_C ? 'C' : '-',
|
||||
psr & PSTATE_V ? 'V' : '-',
|
||||
ns_status,
|
||||
el,
|
||||
psr & PSTATE_SP ? 'h' : 't');
|
||||
|
||||
if (cpu_isar_feature(aa64_bti, cpu)) {
|
||||
qemu_fprintf(f, " BTYPE=%d", (psr & PSTATE_BTYPE) >> 10);
|
||||
}
|
||||
if (!(flags & CPU_DUMP_FPU)) {
|
||||
qemu_fprintf(f, "\n");
|
||||
return;
|
||||
}
|
||||
if (fp_exception_el(env, el) != 0) {
|
||||
qemu_fprintf(f, " FPU disabled\n");
|
||||
return;
|
||||
}
|
||||
qemu_fprintf(f, " FPCR=%08x FPSR=%08x\n",
|
||||
vfp_get_fpcr(env), vfp_get_fpsr(env));
|
||||
|
||||
if (cpu_isar_feature(aa64_sve, cpu) && sve_exception_el(env, el) == 0) {
|
||||
int j, zcr_len = sve_zcr_len_for_el(env, el);
|
||||
|
||||
for (i = 0; i <= FFR_PRED_NUM; i++) {
|
||||
bool eol;
|
||||
if (i == FFR_PRED_NUM) {
|
||||
qemu_fprintf(f, "FFR=");
|
||||
/* It's last, so end the line. */
|
||||
eol = true;
|
||||
} else {
|
||||
qemu_fprintf(f, "P%02d=", i);
|
||||
switch (zcr_len) {
|
||||
case 0:
|
||||
eol = i % 8 == 7;
|
||||
break;
|
||||
case 1:
|
||||
eol = i % 6 == 5;
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
eol = i % 3 == 2;
|
||||
break;
|
||||
default:
|
||||
/* More than one quadword per predicate. */
|
||||
eol = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (j = zcr_len / 4; j >= 0; j--) {
|
||||
int digits;
|
||||
if (j * 4 + 4 <= zcr_len + 1) {
|
||||
digits = 16;
|
||||
} else {
|
||||
digits = (zcr_len % 4 + 1) * 4;
|
||||
}
|
||||
qemu_fprintf(f, "%0*" PRIx64 "%s", digits,
|
||||
env->vfp.pregs[i].p[j],
|
||||
j ? ":" : eol ? "\n" : " ");
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < 32; i++) {
|
||||
if (zcr_len == 0) {
|
||||
qemu_fprintf(f, "Z%02d=%016" PRIx64 ":%016" PRIx64 "%s",
|
||||
i, env->vfp.zregs[i].d[1],
|
||||
env->vfp.zregs[i].d[0], i & 1 ? "\n" : " ");
|
||||
} else if (zcr_len == 1) {
|
||||
qemu_fprintf(f, "Z%02d=%016" PRIx64 ":%016" PRIx64
|
||||
":%016" PRIx64 ":%016" PRIx64 "\n",
|
||||
i, env->vfp.zregs[i].d[3], env->vfp.zregs[i].d[2],
|
||||
env->vfp.zregs[i].d[1], env->vfp.zregs[i].d[0]);
|
||||
} else {
|
||||
for (j = zcr_len; j >= 0; j--) {
|
||||
bool odd = (zcr_len - j) % 2 != 0;
|
||||
if (j == zcr_len) {
|
||||
qemu_fprintf(f, "Z%02d[%x-%x]=", i, j, j - 1);
|
||||
} else if (!odd) {
|
||||
if (j > 0) {
|
||||
qemu_fprintf(f, " [%x-%x]=", j, j - 1);
|
||||
} else {
|
||||
qemu_fprintf(f, " [%x]=", j);
|
||||
}
|
||||
}
|
||||
qemu_fprintf(f, "%016" PRIx64 ":%016" PRIx64 "%s",
|
||||
env->vfp.zregs[i].d[j * 2 + 1],
|
||||
env->vfp.zregs[i].d[j * 2],
|
||||
odd || j == 0 ? "\n" : ":");
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < 32; i++) {
|
||||
uint64_t *q = aa64_vfp_qreg(env, i);
|
||||
qemu_fprintf(f, "Q%02d=%016" PRIx64 ":%016" PRIx64 "%s",
|
||||
i, q[1], q[0], (i & 1 ? "\n" : " "));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void gen_a64_set_pc_im(uint64_t val)
|
||||
{
|
||||
tcg_gen_movi_i64(cpu_pc, val);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue