1*98be64d2SCho, Yu-Chen /* 2*98be64d2SCho, Yu-Chen * S/390 CPU dump to FILE 3*98be64d2SCho, Yu-Chen * 4*98be64d2SCho, Yu-Chen * Copyright (c) 2009 Ulrich Hecht 5*98be64d2SCho, Yu-Chen * Copyright (c) 2011 Alexander Graf 6*98be64d2SCho, Yu-Chen * 7*98be64d2SCho, Yu-Chen * This library is free software; you can redistribute it and/or 8*98be64d2SCho, Yu-Chen * modify it under the terms of the GNU Lesser General Public 9*98be64d2SCho, Yu-Chen * License as published by the Free Software Foundation; either 10*98be64d2SCho, Yu-Chen * version 2.1 of the License, or (at your option) any later version. 11*98be64d2SCho, Yu-Chen * 12*98be64d2SCho, Yu-Chen * This library is distributed in the hope that it will be useful, 13*98be64d2SCho, Yu-Chen * but WITHOUT ANY WARRANTY; without even the implied warranty of 14*98be64d2SCho, Yu-Chen * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15*98be64d2SCho, Yu-Chen * Lesser General Public License for more details. 16*98be64d2SCho, Yu-Chen * 17*98be64d2SCho, Yu-Chen * You should have received a copy of the GNU Lesser General Public 18*98be64d2SCho, Yu-Chen * License along with this library; if not, see <http://www.gnu.org/licenses/>. 19*98be64d2SCho, Yu-Chen * 20*98be64d2SCho, Yu-Chen */ 21*98be64d2SCho, Yu-Chen 22*98be64d2SCho, Yu-Chen #include "qemu/osdep.h" 23*98be64d2SCho, Yu-Chen #include "cpu.h" 24*98be64d2SCho, Yu-Chen #include "s390x-internal.h" 25*98be64d2SCho, Yu-Chen #include "qemu/qemu-print.h" 26*98be64d2SCho, Yu-Chen #include "sysemu/tcg.h" 27*98be64d2SCho, Yu-Chen 28*98be64d2SCho, Yu-Chen void s390_cpu_dump_state(CPUState *cs, FILE *f, int flags) 29*98be64d2SCho, Yu-Chen { 30*98be64d2SCho, Yu-Chen S390CPU *cpu = S390_CPU(cs); 31*98be64d2SCho, Yu-Chen CPUS390XState *env = &cpu->env; 32*98be64d2SCho, Yu-Chen int i; 33*98be64d2SCho, Yu-Chen 34*98be64d2SCho, Yu-Chen qemu_fprintf(f, "PSW=mask %016" PRIx64 " addr %016" PRIx64, 35*98be64d2SCho, Yu-Chen s390_cpu_get_psw_mask(env), env->psw.addr); 36*98be64d2SCho, Yu-Chen if (!tcg_enabled()) { 37*98be64d2SCho, Yu-Chen qemu_fprintf(f, "\n"); 38*98be64d2SCho, Yu-Chen } else if (env->cc_op > 3) { 39*98be64d2SCho, Yu-Chen qemu_fprintf(f, " cc %15s\n", cc_name(env->cc_op)); 40*98be64d2SCho, Yu-Chen } else { 41*98be64d2SCho, Yu-Chen qemu_fprintf(f, " cc %02x\n", env->cc_op); 42*98be64d2SCho, Yu-Chen } 43*98be64d2SCho, Yu-Chen 44*98be64d2SCho, Yu-Chen for (i = 0; i < 16; i++) { 45*98be64d2SCho, Yu-Chen qemu_fprintf(f, "R%02d=%016" PRIx64, i, env->regs[i]); 46*98be64d2SCho, Yu-Chen if ((i % 4) == 3) { 47*98be64d2SCho, Yu-Chen qemu_fprintf(f, "\n"); 48*98be64d2SCho, Yu-Chen } else { 49*98be64d2SCho, Yu-Chen qemu_fprintf(f, " "); 50*98be64d2SCho, Yu-Chen } 51*98be64d2SCho, Yu-Chen } 52*98be64d2SCho, Yu-Chen 53*98be64d2SCho, Yu-Chen if (flags & CPU_DUMP_FPU) { 54*98be64d2SCho, Yu-Chen if (s390_has_feat(S390_FEAT_VECTOR)) { 55*98be64d2SCho, Yu-Chen for (i = 0; i < 32; i++) { 56*98be64d2SCho, Yu-Chen qemu_fprintf(f, "V%02d=%016" PRIx64 "%016" PRIx64 "%c", 57*98be64d2SCho, Yu-Chen i, env->vregs[i][0], env->vregs[i][1], 58*98be64d2SCho, Yu-Chen i % 2 ? '\n' : ' '); 59*98be64d2SCho, Yu-Chen } 60*98be64d2SCho, Yu-Chen } else { 61*98be64d2SCho, Yu-Chen for (i = 0; i < 16; i++) { 62*98be64d2SCho, Yu-Chen qemu_fprintf(f, "F%02d=%016" PRIx64 "%c", 63*98be64d2SCho, Yu-Chen i, *get_freg(env, i), 64*98be64d2SCho, Yu-Chen (i % 4) == 3 ? '\n' : ' '); 65*98be64d2SCho, Yu-Chen } 66*98be64d2SCho, Yu-Chen } 67*98be64d2SCho, Yu-Chen } 68*98be64d2SCho, Yu-Chen 69*98be64d2SCho, Yu-Chen #ifndef CONFIG_USER_ONLY 70*98be64d2SCho, Yu-Chen for (i = 0; i < 16; i++) { 71*98be64d2SCho, Yu-Chen qemu_fprintf(f, "C%02d=%016" PRIx64, i, env->cregs[i]); 72*98be64d2SCho, Yu-Chen if ((i % 4) == 3) { 73*98be64d2SCho, Yu-Chen qemu_fprintf(f, "\n"); 74*98be64d2SCho, Yu-Chen } else { 75*98be64d2SCho, Yu-Chen qemu_fprintf(f, " "); 76*98be64d2SCho, Yu-Chen } 77*98be64d2SCho, Yu-Chen } 78*98be64d2SCho, Yu-Chen #endif 79*98be64d2SCho, Yu-Chen 80*98be64d2SCho, Yu-Chen #ifdef DEBUG_INLINE_BRANCHES 81*98be64d2SCho, Yu-Chen for (i = 0; i < CC_OP_MAX; i++) { 82*98be64d2SCho, Yu-Chen qemu_fprintf(f, " %15s = %10ld\t%10ld\n", cc_name(i), 83*98be64d2SCho, Yu-Chen inline_branch_miss[i], inline_branch_hit[i]); 84*98be64d2SCho, Yu-Chen } 85*98be64d2SCho, Yu-Chen #endif 86*98be64d2SCho, Yu-Chen 87*98be64d2SCho, Yu-Chen qemu_fprintf(f, "\n"); 88*98be64d2SCho, Yu-Chen } 89*98be64d2SCho, Yu-Chen 90*98be64d2SCho, Yu-Chen const char *cc_name(enum cc_op cc_op) 91*98be64d2SCho, Yu-Chen { 92*98be64d2SCho, Yu-Chen static const char * const cc_names[] = { 93*98be64d2SCho, Yu-Chen [CC_OP_CONST0] = "CC_OP_CONST0", 94*98be64d2SCho, Yu-Chen [CC_OP_CONST1] = "CC_OP_CONST1", 95*98be64d2SCho, Yu-Chen [CC_OP_CONST2] = "CC_OP_CONST2", 96*98be64d2SCho, Yu-Chen [CC_OP_CONST3] = "CC_OP_CONST3", 97*98be64d2SCho, Yu-Chen [CC_OP_DYNAMIC] = "CC_OP_DYNAMIC", 98*98be64d2SCho, Yu-Chen [CC_OP_STATIC] = "CC_OP_STATIC", 99*98be64d2SCho, Yu-Chen [CC_OP_NZ] = "CC_OP_NZ", 100*98be64d2SCho, Yu-Chen [CC_OP_ADDU] = "CC_OP_ADDU", 101*98be64d2SCho, Yu-Chen [CC_OP_SUBU] = "CC_OP_SUBU", 102*98be64d2SCho, Yu-Chen [CC_OP_LTGT_32] = "CC_OP_LTGT_32", 103*98be64d2SCho, Yu-Chen [CC_OP_LTGT_64] = "CC_OP_LTGT_64", 104*98be64d2SCho, Yu-Chen [CC_OP_LTUGTU_32] = "CC_OP_LTUGTU_32", 105*98be64d2SCho, Yu-Chen [CC_OP_LTUGTU_64] = "CC_OP_LTUGTU_64", 106*98be64d2SCho, Yu-Chen [CC_OP_LTGT0_32] = "CC_OP_LTGT0_32", 107*98be64d2SCho, Yu-Chen [CC_OP_LTGT0_64] = "CC_OP_LTGT0_64", 108*98be64d2SCho, Yu-Chen [CC_OP_ADD_64] = "CC_OP_ADD_64", 109*98be64d2SCho, Yu-Chen [CC_OP_SUB_64] = "CC_OP_SUB_64", 110*98be64d2SCho, Yu-Chen [CC_OP_ABS_64] = "CC_OP_ABS_64", 111*98be64d2SCho, Yu-Chen [CC_OP_NABS_64] = "CC_OP_NABS_64", 112*98be64d2SCho, Yu-Chen [CC_OP_ADD_32] = "CC_OP_ADD_32", 113*98be64d2SCho, Yu-Chen [CC_OP_SUB_32] = "CC_OP_SUB_32", 114*98be64d2SCho, Yu-Chen [CC_OP_ABS_32] = "CC_OP_ABS_32", 115*98be64d2SCho, Yu-Chen [CC_OP_NABS_32] = "CC_OP_NABS_32", 116*98be64d2SCho, Yu-Chen [CC_OP_COMP_32] = "CC_OP_COMP_32", 117*98be64d2SCho, Yu-Chen [CC_OP_COMP_64] = "CC_OP_COMP_64", 118*98be64d2SCho, Yu-Chen [CC_OP_TM_32] = "CC_OP_TM_32", 119*98be64d2SCho, Yu-Chen [CC_OP_TM_64] = "CC_OP_TM_64", 120*98be64d2SCho, Yu-Chen [CC_OP_NZ_F32] = "CC_OP_NZ_F32", 121*98be64d2SCho, Yu-Chen [CC_OP_NZ_F64] = "CC_OP_NZ_F64", 122*98be64d2SCho, Yu-Chen [CC_OP_NZ_F128] = "CC_OP_NZ_F128", 123*98be64d2SCho, Yu-Chen [CC_OP_ICM] = "CC_OP_ICM", 124*98be64d2SCho, Yu-Chen [CC_OP_SLA_32] = "CC_OP_SLA_32", 125*98be64d2SCho, Yu-Chen [CC_OP_SLA_64] = "CC_OP_SLA_64", 126*98be64d2SCho, Yu-Chen [CC_OP_FLOGR] = "CC_OP_FLOGR", 127*98be64d2SCho, Yu-Chen [CC_OP_LCBB] = "CC_OP_LCBB", 128*98be64d2SCho, Yu-Chen [CC_OP_VC] = "CC_OP_VC", 129*98be64d2SCho, Yu-Chen [CC_OP_MULS_32] = "CC_OP_MULS_32", 130*98be64d2SCho, Yu-Chen [CC_OP_MULS_64] = "CC_OP_MULS_64", 131*98be64d2SCho, Yu-Chen }; 132*98be64d2SCho, Yu-Chen 133*98be64d2SCho, Yu-Chen return cc_names[cc_op]; 134*98be64d2SCho, Yu-Chen } 135