xref: /openbmc/qemu/target/s390x/cpu-dump.c (revision 9e34f127f419b3941b36dfdfac79640dc81e97e2)
198be64d2SCho, Yu-Chen /*
298be64d2SCho, Yu-Chen  * S/390 CPU dump to FILE
398be64d2SCho, Yu-Chen  *
498be64d2SCho, Yu-Chen  *  Copyright (c) 2009 Ulrich Hecht
598be64d2SCho, Yu-Chen  *  Copyright (c) 2011 Alexander Graf
698be64d2SCho, Yu-Chen  *
798be64d2SCho, Yu-Chen  * This library is free software; you can redistribute it and/or
898be64d2SCho, Yu-Chen  * modify it under the terms of the GNU Lesser General Public
998be64d2SCho, Yu-Chen  * License as published by the Free Software Foundation; either
1098be64d2SCho, Yu-Chen  * version 2.1 of the License, or (at your option) any later version.
1198be64d2SCho, Yu-Chen  *
1298be64d2SCho, Yu-Chen  * This library is distributed in the hope that it will be useful,
1398be64d2SCho, Yu-Chen  * but WITHOUT ANY WARRANTY; without even the implied warranty of
1498be64d2SCho, Yu-Chen  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1598be64d2SCho, Yu-Chen  * Lesser General Public License for more details.
1698be64d2SCho, Yu-Chen  *
1798be64d2SCho, Yu-Chen  * You should have received a copy of the GNU Lesser General Public
1898be64d2SCho, Yu-Chen  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
1998be64d2SCho, Yu-Chen  *
2098be64d2SCho, Yu-Chen  */
2198be64d2SCho, Yu-Chen 
2298be64d2SCho, Yu-Chen #include "qemu/osdep.h"
2398be64d2SCho, Yu-Chen #include "cpu.h"
2498be64d2SCho, Yu-Chen #include "s390x-internal.h"
2598be64d2SCho, Yu-Chen #include "qemu/qemu-print.h"
2698be64d2SCho, Yu-Chen #include "sysemu/tcg.h"
2798be64d2SCho, Yu-Chen 
s390_cpu_dump_state(CPUState * cs,FILE * f,int flags)2898be64d2SCho, Yu-Chen void s390_cpu_dump_state(CPUState *cs, FILE *f, int flags)
2998be64d2SCho, Yu-Chen {
30*d0143fa9SPhilippe Mathieu-Daudé     CPUS390XState *env = cpu_env(cs);
3198be64d2SCho, Yu-Chen     int i;
3298be64d2SCho, Yu-Chen 
3398be64d2SCho, Yu-Chen     qemu_fprintf(f, "PSW=mask %016" PRIx64 " addr %016" PRIx64,
3498be64d2SCho, Yu-Chen                  s390_cpu_get_psw_mask(env), env->psw.addr);
3598be64d2SCho, Yu-Chen     if (!tcg_enabled()) {
3698be64d2SCho, Yu-Chen         qemu_fprintf(f, "\n");
3798be64d2SCho, Yu-Chen     } else if (env->cc_op > 3) {
3898be64d2SCho, Yu-Chen         qemu_fprintf(f, " cc %15s\n", cc_name(env->cc_op));
3998be64d2SCho, Yu-Chen     } else {
4098be64d2SCho, Yu-Chen         qemu_fprintf(f, " cc %02x\n", env->cc_op);
4198be64d2SCho, Yu-Chen     }
4298be64d2SCho, Yu-Chen 
4398be64d2SCho, Yu-Chen     for (i = 0; i < 16; i++) {
4498be64d2SCho, Yu-Chen         qemu_fprintf(f, "R%02d=%016" PRIx64, i, env->regs[i]);
4598be64d2SCho, Yu-Chen         if ((i % 4) == 3) {
4698be64d2SCho, Yu-Chen             qemu_fprintf(f, "\n");
4798be64d2SCho, Yu-Chen         } else {
4898be64d2SCho, Yu-Chen             qemu_fprintf(f, " ");
4998be64d2SCho, Yu-Chen         }
5098be64d2SCho, Yu-Chen     }
5198be64d2SCho, Yu-Chen 
5298be64d2SCho, Yu-Chen     if (flags & CPU_DUMP_FPU) {
5398be64d2SCho, Yu-Chen         if (s390_has_feat(S390_FEAT_VECTOR)) {
5498be64d2SCho, Yu-Chen             for (i = 0; i < 32; i++) {
5598be64d2SCho, Yu-Chen                 qemu_fprintf(f, "V%02d=%016" PRIx64 "%016" PRIx64 "%c",
5698be64d2SCho, Yu-Chen                              i, env->vregs[i][0], env->vregs[i][1],
5798be64d2SCho, Yu-Chen                              i % 2 ? '\n' : ' ');
5898be64d2SCho, Yu-Chen             }
5998be64d2SCho, Yu-Chen         } else {
6098be64d2SCho, Yu-Chen             for (i = 0; i < 16; i++) {
6198be64d2SCho, Yu-Chen                 qemu_fprintf(f, "F%02d=%016" PRIx64 "%c",
6298be64d2SCho, Yu-Chen                              i, *get_freg(env, i),
6398be64d2SCho, Yu-Chen                              (i % 4) == 3 ? '\n' : ' ');
6498be64d2SCho, Yu-Chen             }
6598be64d2SCho, Yu-Chen         }
6698be64d2SCho, Yu-Chen     }
6798be64d2SCho, Yu-Chen 
6898be64d2SCho, Yu-Chen #ifndef CONFIG_USER_ONLY
6998be64d2SCho, Yu-Chen     for (i = 0; i < 16; i++) {
7098be64d2SCho, Yu-Chen         qemu_fprintf(f, "C%02d=%016" PRIx64, i, env->cregs[i]);
7198be64d2SCho, Yu-Chen         if ((i % 4) == 3) {
7298be64d2SCho, Yu-Chen             qemu_fprintf(f, "\n");
7398be64d2SCho, Yu-Chen         } else {
7498be64d2SCho, Yu-Chen             qemu_fprintf(f, " ");
7598be64d2SCho, Yu-Chen         }
7698be64d2SCho, Yu-Chen     }
7798be64d2SCho, Yu-Chen #endif
7898be64d2SCho, Yu-Chen 
7998be64d2SCho, Yu-Chen #ifdef DEBUG_INLINE_BRANCHES
8098be64d2SCho, Yu-Chen     for (i = 0; i < CC_OP_MAX; i++) {
8198be64d2SCho, Yu-Chen         qemu_fprintf(f, "  %15s = %10ld\t%10ld\n", cc_name(i),
8298be64d2SCho, Yu-Chen                      inline_branch_miss[i], inline_branch_hit[i]);
8398be64d2SCho, Yu-Chen     }
8498be64d2SCho, Yu-Chen #endif
8598be64d2SCho, Yu-Chen 
8698be64d2SCho, Yu-Chen     qemu_fprintf(f, "\n");
8798be64d2SCho, Yu-Chen }
8898be64d2SCho, Yu-Chen 
cc_name(enum cc_op cc_op)8998be64d2SCho, Yu-Chen const char *cc_name(enum cc_op cc_op)
9098be64d2SCho, Yu-Chen {
9198be64d2SCho, Yu-Chen     static const char * const cc_names[] = {
9298be64d2SCho, Yu-Chen         [CC_OP_CONST0]    = "CC_OP_CONST0",
9398be64d2SCho, Yu-Chen         [CC_OP_CONST1]    = "CC_OP_CONST1",
9498be64d2SCho, Yu-Chen         [CC_OP_CONST2]    = "CC_OP_CONST2",
9598be64d2SCho, Yu-Chen         [CC_OP_CONST3]    = "CC_OP_CONST3",
9698be64d2SCho, Yu-Chen         [CC_OP_DYNAMIC]   = "CC_OP_DYNAMIC",
9798be64d2SCho, Yu-Chen         [CC_OP_STATIC]    = "CC_OP_STATIC",
9898be64d2SCho, Yu-Chen         [CC_OP_NZ]        = "CC_OP_NZ",
9998be64d2SCho, Yu-Chen         [CC_OP_ADDU]      = "CC_OP_ADDU",
10098be64d2SCho, Yu-Chen         [CC_OP_SUBU]      = "CC_OP_SUBU",
10198be64d2SCho, Yu-Chen         [CC_OP_LTGT_32]   = "CC_OP_LTGT_32",
10298be64d2SCho, Yu-Chen         [CC_OP_LTGT_64]   = "CC_OP_LTGT_64",
10398be64d2SCho, Yu-Chen         [CC_OP_LTUGTU_32] = "CC_OP_LTUGTU_32",
10498be64d2SCho, Yu-Chen         [CC_OP_LTUGTU_64] = "CC_OP_LTUGTU_64",
10598be64d2SCho, Yu-Chen         [CC_OP_LTGT0_32]  = "CC_OP_LTGT0_32",
10698be64d2SCho, Yu-Chen         [CC_OP_LTGT0_64]  = "CC_OP_LTGT0_64",
10798be64d2SCho, Yu-Chen         [CC_OP_ADD_64]    = "CC_OP_ADD_64",
10898be64d2SCho, Yu-Chen         [CC_OP_SUB_64]    = "CC_OP_SUB_64",
10998be64d2SCho, Yu-Chen         [CC_OP_ABS_64]    = "CC_OP_ABS_64",
11098be64d2SCho, Yu-Chen         [CC_OP_NABS_64]   = "CC_OP_NABS_64",
11198be64d2SCho, Yu-Chen         [CC_OP_ADD_32]    = "CC_OP_ADD_32",
11298be64d2SCho, Yu-Chen         [CC_OP_SUB_32]    = "CC_OP_SUB_32",
11398be64d2SCho, Yu-Chen         [CC_OP_ABS_32]    = "CC_OP_ABS_32",
11498be64d2SCho, Yu-Chen         [CC_OP_NABS_32]   = "CC_OP_NABS_32",
11598be64d2SCho, Yu-Chen         [CC_OP_COMP_32]   = "CC_OP_COMP_32",
11698be64d2SCho, Yu-Chen         [CC_OP_COMP_64]   = "CC_OP_COMP_64",
11798be64d2SCho, Yu-Chen         [CC_OP_TM_32]     = "CC_OP_TM_32",
11898be64d2SCho, Yu-Chen         [CC_OP_TM_64]     = "CC_OP_TM_64",
11998be64d2SCho, Yu-Chen         [CC_OP_NZ_F32]    = "CC_OP_NZ_F32",
12098be64d2SCho, Yu-Chen         [CC_OP_NZ_F64]    = "CC_OP_NZ_F64",
12198be64d2SCho, Yu-Chen         [CC_OP_NZ_F128]   = "CC_OP_NZ_F128",
12298be64d2SCho, Yu-Chen         [CC_OP_ICM]       = "CC_OP_ICM",
1236da170beSIlya Leoshkevich         [CC_OP_SLA]       = "CC_OP_SLA",
12498be64d2SCho, Yu-Chen         [CC_OP_FLOGR]     = "CC_OP_FLOGR",
12598be64d2SCho, Yu-Chen         [CC_OP_LCBB]      = "CC_OP_LCBB",
12698be64d2SCho, Yu-Chen         [CC_OP_VC]        = "CC_OP_VC",
12798be64d2SCho, Yu-Chen         [CC_OP_MULS_32]   = "CC_OP_MULS_32",
12898be64d2SCho, Yu-Chen         [CC_OP_MULS_64]   = "CC_OP_MULS_64",
12998be64d2SCho, Yu-Chen     };
13098be64d2SCho, Yu-Chen 
13198be64d2SCho, Yu-Chen     return cc_names[cc_op];
13298be64d2SCho, Yu-Chen }
133