14c9649a9Sj_mayer /* 24c9649a9Sj_mayer * Alpha emulation cpu helpers for qemu. 34c9649a9Sj_mayer * 44c9649a9Sj_mayer * Copyright (c) 2007 Jocelyn Mayer 54c9649a9Sj_mayer * 64c9649a9Sj_mayer * This library is free software; you can redistribute it and/or 74c9649a9Sj_mayer * modify it under the terms of the GNU Lesser General Public 84c9649a9Sj_mayer * License as published by the Free Software Foundation; either 94c9649a9Sj_mayer * version 2 of the License, or (at your option) any later version. 104c9649a9Sj_mayer * 114c9649a9Sj_mayer * This library is distributed in the hope that it will be useful, 124c9649a9Sj_mayer * but WITHOUT ANY WARRANTY; without even the implied warranty of 134c9649a9Sj_mayer * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 144c9649a9Sj_mayer * Lesser General Public License for more details. 154c9649a9Sj_mayer * 164c9649a9Sj_mayer * You should have received a copy of the GNU Lesser General Public 174c9649a9Sj_mayer * License along with this library; if not, write to the Free Software 184c9649a9Sj_mayer * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 194c9649a9Sj_mayer */ 204c9649a9Sj_mayer 214c9649a9Sj_mayer #include <stdint.h> 224c9649a9Sj_mayer #include <stdlib.h> 234c9649a9Sj_mayer #include <stdio.h> 244c9649a9Sj_mayer 254c9649a9Sj_mayer #include "cpu.h" 264c9649a9Sj_mayer #include "exec-all.h" 274c9649a9Sj_mayer 284c9649a9Sj_mayer #if defined(CONFIG_USER_ONLY) 294c9649a9Sj_mayer 304c9649a9Sj_mayer int cpu_alpha_handle_mmu_fault (CPUState *env, target_ulong address, int rw, 316ebbf390Sj_mayer int mmu_idx, int is_softmmu) 324c9649a9Sj_mayer { 334c9649a9Sj_mayer if (rw == 2) 344c9649a9Sj_mayer env->exception_index = EXCP_ITB_MISS; 354c9649a9Sj_mayer else 364c9649a9Sj_mayer env->exception_index = EXCP_DFAULT; 374c9649a9Sj_mayer env->ipr[IPR_EXC_ADDR] = address; 384c9649a9Sj_mayer 394c9649a9Sj_mayer return 1; 404c9649a9Sj_mayer } 414c9649a9Sj_mayer 429b3c35e0Sj_mayer target_phys_addr_t cpu_get_phys_page_debug (CPUState *env, target_ulong addr) 434c9649a9Sj_mayer { 444c9649a9Sj_mayer return addr; 454c9649a9Sj_mayer } 464c9649a9Sj_mayer 474c9649a9Sj_mayer void do_interrupt (CPUState *env) 484c9649a9Sj_mayer { 494c9649a9Sj_mayer env->exception_index = -1; 504c9649a9Sj_mayer } 514c9649a9Sj_mayer 524c9649a9Sj_mayer #else 534c9649a9Sj_mayer 549b3c35e0Sj_mayer target_phys_addr_t cpu_get_phys_page_debug (CPUState *env, target_ulong addr) 554c9649a9Sj_mayer { 564c9649a9Sj_mayer return -1; 574c9649a9Sj_mayer } 584c9649a9Sj_mayer 594c9649a9Sj_mayer int cpu_alpha_handle_mmu_fault (CPUState *env, target_ulong address, int rw, 606ebbf390Sj_mayer int mmu_idx, int is_softmmu) 614c9649a9Sj_mayer { 624c9649a9Sj_mayer uint32_t opc; 634c9649a9Sj_mayer 644c9649a9Sj_mayer if (rw == 2) { 654c9649a9Sj_mayer /* Instruction translation buffer miss */ 664c9649a9Sj_mayer env->exception_index = EXCP_ITB_MISS; 674c9649a9Sj_mayer } else { 684c9649a9Sj_mayer if (env->ipr[IPR_EXC_ADDR] & 1) 694c9649a9Sj_mayer env->exception_index = EXCP_DTB_MISS_PAL; 704c9649a9Sj_mayer else 714c9649a9Sj_mayer env->exception_index = EXCP_DTB_MISS_NATIVE; 724c9649a9Sj_mayer opc = (ldl_code(env->pc) >> 21) << 4; 734c9649a9Sj_mayer if (rw) { 744c9649a9Sj_mayer opc |= 0x9; 754c9649a9Sj_mayer } else { 764c9649a9Sj_mayer opc |= 0x4; 774c9649a9Sj_mayer } 784c9649a9Sj_mayer env->ipr[IPR_MM_STAT] = opc; 794c9649a9Sj_mayer } 804c9649a9Sj_mayer 814c9649a9Sj_mayer return 1; 824c9649a9Sj_mayer } 834c9649a9Sj_mayer 844c9649a9Sj_mayer int cpu_alpha_mfpr (CPUState *env, int iprn, uint64_t *valp) 854c9649a9Sj_mayer { 864c9649a9Sj_mayer uint64_t hwpcb; 874c9649a9Sj_mayer int ret = 0; 884c9649a9Sj_mayer 894c9649a9Sj_mayer hwpcb = env->ipr[IPR_PCBB]; 904c9649a9Sj_mayer switch (iprn) { 914c9649a9Sj_mayer case IPR_ASN: 924c9649a9Sj_mayer if (env->features & FEATURE_ASN) 934c9649a9Sj_mayer *valp = env->ipr[IPR_ASN]; 944c9649a9Sj_mayer else 954c9649a9Sj_mayer *valp = 0; 964c9649a9Sj_mayer break; 974c9649a9Sj_mayer case IPR_ASTEN: 984c9649a9Sj_mayer *valp = ((int64_t)(env->ipr[IPR_ASTEN] << 60)) >> 60; 994c9649a9Sj_mayer break; 1004c9649a9Sj_mayer case IPR_ASTSR: 1014c9649a9Sj_mayer *valp = ((int64_t)(env->ipr[IPR_ASTSR] << 60)) >> 60; 1024c9649a9Sj_mayer break; 1034c9649a9Sj_mayer case IPR_DATFX: 1044c9649a9Sj_mayer /* Write only */ 1054c9649a9Sj_mayer ret = -1; 1064c9649a9Sj_mayer break; 1074c9649a9Sj_mayer case IPR_ESP: 1084c9649a9Sj_mayer if (env->features & FEATURE_SPS) 1094c9649a9Sj_mayer *valp = env->ipr[IPR_ESP]; 1104c9649a9Sj_mayer else 1114c9649a9Sj_mayer *valp = ldq_raw(hwpcb + 8); 1124c9649a9Sj_mayer break; 1134c9649a9Sj_mayer case IPR_FEN: 1144c9649a9Sj_mayer *valp = ((int64_t)(env->ipr[IPR_FEN] << 63)) >> 63; 1154c9649a9Sj_mayer break; 1164c9649a9Sj_mayer case IPR_IPIR: 1174c9649a9Sj_mayer /* Write-only */ 1184c9649a9Sj_mayer ret = -1; 1194c9649a9Sj_mayer break; 1204c9649a9Sj_mayer case IPR_IPL: 1214c9649a9Sj_mayer *valp = ((int64_t)(env->ipr[IPR_IPL] << 59)) >> 59; 1224c9649a9Sj_mayer break; 1234c9649a9Sj_mayer case IPR_KSP: 1244c9649a9Sj_mayer if (!(env->ipr[IPR_EXC_ADDR] & 1)) { 1254c9649a9Sj_mayer ret = -1; 1264c9649a9Sj_mayer } else { 1274c9649a9Sj_mayer if (env->features & FEATURE_SPS) 1284c9649a9Sj_mayer *valp = env->ipr[IPR_KSP]; 1294c9649a9Sj_mayer else 1304c9649a9Sj_mayer *valp = ldq_raw(hwpcb + 0); 1314c9649a9Sj_mayer } 1324c9649a9Sj_mayer break; 1334c9649a9Sj_mayer case IPR_MCES: 1344c9649a9Sj_mayer *valp = ((int64_t)(env->ipr[IPR_MCES] << 59)) >> 59; 1354c9649a9Sj_mayer break; 1364c9649a9Sj_mayer case IPR_PERFMON: 1374c9649a9Sj_mayer /* Implementation specific */ 1384c9649a9Sj_mayer *valp = 0; 1394c9649a9Sj_mayer break; 1404c9649a9Sj_mayer case IPR_PCBB: 1414c9649a9Sj_mayer *valp = ((int64_t)env->ipr[IPR_PCBB] << 16) >> 16; 1424c9649a9Sj_mayer break; 1434c9649a9Sj_mayer case IPR_PRBR: 1444c9649a9Sj_mayer *valp = env->ipr[IPR_PRBR]; 1454c9649a9Sj_mayer break; 1464c9649a9Sj_mayer case IPR_PTBR: 1474c9649a9Sj_mayer *valp = env->ipr[IPR_PTBR]; 1484c9649a9Sj_mayer break; 1494c9649a9Sj_mayer case IPR_SCBB: 1504c9649a9Sj_mayer *valp = (int64_t)((int32_t)env->ipr[IPR_SCBB]); 1514c9649a9Sj_mayer break; 1524c9649a9Sj_mayer case IPR_SIRR: 1534c9649a9Sj_mayer /* Write-only */ 1544c9649a9Sj_mayer ret = -1; 1554c9649a9Sj_mayer break; 1564c9649a9Sj_mayer case IPR_SISR: 1574c9649a9Sj_mayer *valp = (int64_t)((int16_t)env->ipr[IPR_SISR]); 1584c9649a9Sj_mayer case IPR_SSP: 1594c9649a9Sj_mayer if (env->features & FEATURE_SPS) 1604c9649a9Sj_mayer *valp = env->ipr[IPR_SSP]; 1614c9649a9Sj_mayer else 1624c9649a9Sj_mayer *valp = ldq_raw(hwpcb + 16); 1634c9649a9Sj_mayer break; 1644c9649a9Sj_mayer case IPR_SYSPTBR: 1654c9649a9Sj_mayer if (env->features & FEATURE_VIRBND) 1664c9649a9Sj_mayer *valp = env->ipr[IPR_SYSPTBR]; 1674c9649a9Sj_mayer else 1684c9649a9Sj_mayer ret = -1; 1694c9649a9Sj_mayer break; 1704c9649a9Sj_mayer case IPR_TBCHK: 1714c9649a9Sj_mayer if ((env->features & FEATURE_TBCHK)) { 1724c9649a9Sj_mayer /* XXX: TODO */ 1734c9649a9Sj_mayer *valp = 0; 1744c9649a9Sj_mayer ret = -1; 1754c9649a9Sj_mayer } else { 1764c9649a9Sj_mayer ret = -1; 1774c9649a9Sj_mayer } 1784c9649a9Sj_mayer break; 1794c9649a9Sj_mayer case IPR_TBIA: 1804c9649a9Sj_mayer /* Write-only */ 1814c9649a9Sj_mayer ret = -1; 1824c9649a9Sj_mayer break; 1834c9649a9Sj_mayer case IPR_TBIAP: 1844c9649a9Sj_mayer /* Write-only */ 1854c9649a9Sj_mayer ret = -1; 1864c9649a9Sj_mayer break; 1874c9649a9Sj_mayer case IPR_TBIS: 1884c9649a9Sj_mayer /* Write-only */ 1894c9649a9Sj_mayer ret = -1; 1904c9649a9Sj_mayer break; 1914c9649a9Sj_mayer case IPR_TBISD: 1924c9649a9Sj_mayer /* Write-only */ 1934c9649a9Sj_mayer ret = -1; 1944c9649a9Sj_mayer break; 1954c9649a9Sj_mayer case IPR_TBISI: 1964c9649a9Sj_mayer /* Write-only */ 1974c9649a9Sj_mayer ret = -1; 1984c9649a9Sj_mayer break; 1994c9649a9Sj_mayer case IPR_USP: 2004c9649a9Sj_mayer if (env->features & FEATURE_SPS) 2014c9649a9Sj_mayer *valp = env->ipr[IPR_USP]; 2024c9649a9Sj_mayer else 2034c9649a9Sj_mayer *valp = ldq_raw(hwpcb + 24); 2044c9649a9Sj_mayer break; 2054c9649a9Sj_mayer case IPR_VIRBND: 2064c9649a9Sj_mayer if (env->features & FEATURE_VIRBND) 2074c9649a9Sj_mayer *valp = env->ipr[IPR_VIRBND]; 2084c9649a9Sj_mayer else 2094c9649a9Sj_mayer ret = -1; 2104c9649a9Sj_mayer break; 2114c9649a9Sj_mayer case IPR_VPTB: 2124c9649a9Sj_mayer *valp = env->ipr[IPR_VPTB]; 2134c9649a9Sj_mayer break; 2144c9649a9Sj_mayer case IPR_WHAMI: 2154c9649a9Sj_mayer *valp = env->ipr[IPR_WHAMI]; 2164c9649a9Sj_mayer break; 2174c9649a9Sj_mayer default: 2184c9649a9Sj_mayer /* Invalid */ 2194c9649a9Sj_mayer ret = -1; 2204c9649a9Sj_mayer break; 2214c9649a9Sj_mayer } 2224c9649a9Sj_mayer 2234c9649a9Sj_mayer return ret; 2244c9649a9Sj_mayer } 2254c9649a9Sj_mayer 2264c9649a9Sj_mayer int cpu_alpha_mtpr (CPUState *env, int iprn, uint64_t val, uint64_t *oldvalp) 2274c9649a9Sj_mayer { 2284c9649a9Sj_mayer uint64_t hwpcb, tmp64; 2294c9649a9Sj_mayer uint8_t tmp8; 2304c9649a9Sj_mayer int ret = 0; 2314c9649a9Sj_mayer 2324c9649a9Sj_mayer hwpcb = env->ipr[IPR_PCBB]; 2334c9649a9Sj_mayer switch (iprn) { 2344c9649a9Sj_mayer case IPR_ASN: 2354c9649a9Sj_mayer /* Read-only */ 2364c9649a9Sj_mayer ret = -1; 2374c9649a9Sj_mayer break; 2384c9649a9Sj_mayer case IPR_ASTEN: 2394c9649a9Sj_mayer tmp8 = ((int8_t)(env->ipr[IPR_ASTEN] << 4)) >> 4; 2404c9649a9Sj_mayer *oldvalp = tmp8; 2414c9649a9Sj_mayer tmp8 &= val & 0xF; 2424c9649a9Sj_mayer tmp8 |= (val >> 4) & 0xF; 2434c9649a9Sj_mayer env->ipr[IPR_ASTEN] &= ~0xF; 2444c9649a9Sj_mayer env->ipr[IPR_ASTEN] |= tmp8; 2454c9649a9Sj_mayer ret = 1; 2464c9649a9Sj_mayer break; 2474c9649a9Sj_mayer case IPR_ASTSR: 2484c9649a9Sj_mayer tmp8 = ((int8_t)(env->ipr[IPR_ASTSR] << 4)) >> 4; 2494c9649a9Sj_mayer *oldvalp = tmp8; 2504c9649a9Sj_mayer tmp8 &= val & 0xF; 2514c9649a9Sj_mayer tmp8 |= (val >> 4) & 0xF; 2524c9649a9Sj_mayer env->ipr[IPR_ASTSR] &= ~0xF; 2534c9649a9Sj_mayer env->ipr[IPR_ASTSR] |= tmp8; 2544c9649a9Sj_mayer ret = 1; 2554c9649a9Sj_mayer case IPR_DATFX: 2564c9649a9Sj_mayer env->ipr[IPR_DATFX] &= ~0x1; 2574c9649a9Sj_mayer env->ipr[IPR_DATFX] |= val & 1; 2584c9649a9Sj_mayer tmp64 = ldq_raw(hwpcb + 56); 2594c9649a9Sj_mayer tmp64 &= ~0x8000000000000000ULL; 2604c9649a9Sj_mayer tmp64 |= (val & 1) << 63; 2614c9649a9Sj_mayer stq_raw(hwpcb + 56, tmp64); 2624c9649a9Sj_mayer break; 2634c9649a9Sj_mayer case IPR_ESP: 2644c9649a9Sj_mayer if (env->features & FEATURE_SPS) 2654c9649a9Sj_mayer env->ipr[IPR_ESP] = val; 2664c9649a9Sj_mayer else 2674c9649a9Sj_mayer stq_raw(hwpcb + 8, val); 2684c9649a9Sj_mayer break; 2694c9649a9Sj_mayer case IPR_FEN: 2704c9649a9Sj_mayer env->ipr[IPR_FEN] = val & 1; 2714c9649a9Sj_mayer tmp64 = ldq_raw(hwpcb + 56); 2724c9649a9Sj_mayer tmp64 &= ~1; 2734c9649a9Sj_mayer tmp64 |= val & 1; 2744c9649a9Sj_mayer stq_raw(hwpcb + 56, tmp64); 2754c9649a9Sj_mayer break; 2764c9649a9Sj_mayer case IPR_IPIR: 2774c9649a9Sj_mayer /* XXX: TODO: Send IRQ to CPU #ir[16] */ 2784c9649a9Sj_mayer break; 2794c9649a9Sj_mayer case IPR_IPL: 2804c9649a9Sj_mayer *oldvalp = ((int64_t)(env->ipr[IPR_IPL] << 59)) >> 59; 2814c9649a9Sj_mayer env->ipr[IPR_IPL] &= ~0x1F; 2824c9649a9Sj_mayer env->ipr[IPR_IPL] |= val & 0x1F; 2834c9649a9Sj_mayer /* XXX: may issue an interrupt or ASR _now_ */ 2844c9649a9Sj_mayer ret = 1; 2854c9649a9Sj_mayer break; 2864c9649a9Sj_mayer case IPR_KSP: 2874c9649a9Sj_mayer if (!(env->ipr[IPR_EXC_ADDR] & 1)) { 2884c9649a9Sj_mayer ret = -1; 2894c9649a9Sj_mayer } else { 2904c9649a9Sj_mayer if (env->features & FEATURE_SPS) 2914c9649a9Sj_mayer env->ipr[IPR_KSP] = val; 2924c9649a9Sj_mayer else 2934c9649a9Sj_mayer stq_raw(hwpcb + 0, val); 2944c9649a9Sj_mayer } 2954c9649a9Sj_mayer break; 2964c9649a9Sj_mayer case IPR_MCES: 2974c9649a9Sj_mayer env->ipr[IPR_MCES] &= ~((val & 0x7) | 0x18); 2984c9649a9Sj_mayer env->ipr[IPR_MCES] |= val & 0x18; 2994c9649a9Sj_mayer break; 3004c9649a9Sj_mayer case IPR_PERFMON: 3014c9649a9Sj_mayer /* Implementation specific */ 3024c9649a9Sj_mayer *oldvalp = 0; 3034c9649a9Sj_mayer ret = 1; 3044c9649a9Sj_mayer break; 3054c9649a9Sj_mayer case IPR_PCBB: 3064c9649a9Sj_mayer /* Read-only */ 3074c9649a9Sj_mayer ret = -1; 3084c9649a9Sj_mayer break; 3094c9649a9Sj_mayer case IPR_PRBR: 3104c9649a9Sj_mayer env->ipr[IPR_PRBR] = val; 3114c9649a9Sj_mayer break; 3124c9649a9Sj_mayer case IPR_PTBR: 3134c9649a9Sj_mayer /* Read-only */ 3144c9649a9Sj_mayer ret = -1; 3154c9649a9Sj_mayer break; 3164c9649a9Sj_mayer case IPR_SCBB: 3174c9649a9Sj_mayer env->ipr[IPR_SCBB] = (uint32_t)val; 3184c9649a9Sj_mayer break; 3194c9649a9Sj_mayer case IPR_SIRR: 3204c9649a9Sj_mayer if (val & 0xF) { 3214c9649a9Sj_mayer env->ipr[IPR_SISR] |= 1 << (val & 0xF); 3224c9649a9Sj_mayer /* XXX: request a software interrupt _now_ */ 3234c9649a9Sj_mayer } 3244c9649a9Sj_mayer break; 3254c9649a9Sj_mayer case IPR_SISR: 3264c9649a9Sj_mayer /* Read-only */ 3274c9649a9Sj_mayer ret = -1; 3284c9649a9Sj_mayer break; 3294c9649a9Sj_mayer case IPR_SSP: 3304c9649a9Sj_mayer if (env->features & FEATURE_SPS) 3314c9649a9Sj_mayer env->ipr[IPR_SSP] = val; 3324c9649a9Sj_mayer else 3334c9649a9Sj_mayer stq_raw(hwpcb + 16, val); 3344c9649a9Sj_mayer break; 3354c9649a9Sj_mayer case IPR_SYSPTBR: 3364c9649a9Sj_mayer if (env->features & FEATURE_VIRBND) 3374c9649a9Sj_mayer env->ipr[IPR_SYSPTBR] = val; 3384c9649a9Sj_mayer else 3394c9649a9Sj_mayer ret = -1; 3404c9649a9Sj_mayer case IPR_TBCHK: 3414c9649a9Sj_mayer /* Read-only */ 3424c9649a9Sj_mayer ret = -1; 3434c9649a9Sj_mayer break; 3444c9649a9Sj_mayer case IPR_TBIA: 3454c9649a9Sj_mayer tlb_flush(env, 1); 3464c9649a9Sj_mayer break; 3474c9649a9Sj_mayer case IPR_TBIAP: 3484c9649a9Sj_mayer tlb_flush(env, 1); 3494c9649a9Sj_mayer break; 3504c9649a9Sj_mayer case IPR_TBIS: 3514c9649a9Sj_mayer tlb_flush_page(env, val); 3524c9649a9Sj_mayer break; 3534c9649a9Sj_mayer case IPR_TBISD: 3544c9649a9Sj_mayer tlb_flush_page(env, val); 3554c9649a9Sj_mayer break; 3564c9649a9Sj_mayer case IPR_TBISI: 3574c9649a9Sj_mayer tlb_flush_page(env, val); 3584c9649a9Sj_mayer break; 3594c9649a9Sj_mayer case IPR_USP: 3604c9649a9Sj_mayer if (env->features & FEATURE_SPS) 3614c9649a9Sj_mayer env->ipr[IPR_USP] = val; 3624c9649a9Sj_mayer else 3634c9649a9Sj_mayer stq_raw(hwpcb + 24, val); 3644c9649a9Sj_mayer break; 3654c9649a9Sj_mayer case IPR_VIRBND: 3664c9649a9Sj_mayer if (env->features & FEATURE_VIRBND) 3674c9649a9Sj_mayer env->ipr[IPR_VIRBND] = val; 3684c9649a9Sj_mayer else 3694c9649a9Sj_mayer ret = -1; 3704c9649a9Sj_mayer break; 3714c9649a9Sj_mayer case IPR_VPTB: 3724c9649a9Sj_mayer env->ipr[IPR_VPTB] = val; 3734c9649a9Sj_mayer break; 3744c9649a9Sj_mayer case IPR_WHAMI: 3754c9649a9Sj_mayer /* Read-only */ 3764c9649a9Sj_mayer ret = -1; 3774c9649a9Sj_mayer break; 3784c9649a9Sj_mayer default: 3794c9649a9Sj_mayer /* Invalid */ 3804c9649a9Sj_mayer ret = -1; 3814c9649a9Sj_mayer break; 3824c9649a9Sj_mayer } 3834c9649a9Sj_mayer 3844c9649a9Sj_mayer return ret; 3854c9649a9Sj_mayer } 3864c9649a9Sj_mayer 3874c9649a9Sj_mayer void do_interrupt (CPUState *env) 3884c9649a9Sj_mayer { 3894c9649a9Sj_mayer int excp; 3904c9649a9Sj_mayer 3914c9649a9Sj_mayer env->ipr[IPR_EXC_ADDR] = env->pc | 1; 3924c9649a9Sj_mayer excp = env->exception_index; 3934c9649a9Sj_mayer env->exception_index = 0; 3944c9649a9Sj_mayer env->error_code = 0; 3954c9649a9Sj_mayer /* XXX: disable interrupts and memory mapping */ 3964c9649a9Sj_mayer if (env->ipr[IPR_PAL_BASE] != -1ULL) { 3974c9649a9Sj_mayer /* We use native PALcode */ 3984c9649a9Sj_mayer env->pc = env->ipr[IPR_PAL_BASE] + excp; 3994c9649a9Sj_mayer } else { 4004c9649a9Sj_mayer /* We use emulated PALcode */ 4014c9649a9Sj_mayer call_pal(env); 4024c9649a9Sj_mayer /* Emulate REI */ 4034c9649a9Sj_mayer env->pc = env->ipr[IPR_EXC_ADDR] & ~7; 4044c9649a9Sj_mayer env->ipr[IPR_EXC_ADDR] = env->ipr[IPR_EXC_ADDR] & 1; 4054c9649a9Sj_mayer /* XXX: re-enable interrupts and memory mapping */ 4064c9649a9Sj_mayer } 4074c9649a9Sj_mayer } 4084c9649a9Sj_mayer #endif 4094c9649a9Sj_mayer 4104c9649a9Sj_mayer void cpu_dump_state (CPUState *env, FILE *f, 4114c9649a9Sj_mayer int (*cpu_fprintf)(FILE *f, const char *fmt, ...), 4124c9649a9Sj_mayer int flags) 4134c9649a9Sj_mayer { 414b55266b5Sblueswir1 static const char *linux_reg_names[] = { 4154c9649a9Sj_mayer "v0 ", "t0 ", "t1 ", "t2 ", "t3 ", "t4 ", "t5 ", "t6 ", 4164c9649a9Sj_mayer "t7 ", "s0 ", "s1 ", "s2 ", "s3 ", "s4 ", "s5 ", "fp ", 4174c9649a9Sj_mayer "a0 ", "a1 ", "a2 ", "a3 ", "a4 ", "a5 ", "t8 ", "t9 ", 4184c9649a9Sj_mayer "t10", "t11", "ra ", "t12", "at ", "gp ", "sp ", "zero", 4194c9649a9Sj_mayer }; 4204c9649a9Sj_mayer int i; 4214c9649a9Sj_mayer 4224c9649a9Sj_mayer cpu_fprintf(f, " PC " TARGET_FMT_lx " PS " TARGET_FMT_lx "\n", 4234c9649a9Sj_mayer env->pc, env->ps); 4244c9649a9Sj_mayer for (i = 0; i < 31; i++) { 4254c9649a9Sj_mayer cpu_fprintf(f, "IR%02d %s " TARGET_FMT_lx " ", i, 4264c9649a9Sj_mayer linux_reg_names[i], env->ir[i]); 4274c9649a9Sj_mayer if ((i % 3) == 2) 4284c9649a9Sj_mayer cpu_fprintf(f, "\n"); 4294c9649a9Sj_mayer } 4304c9649a9Sj_mayer cpu_fprintf(f, "\n"); 4314c9649a9Sj_mayer for (i = 0; i < 31; i++) { 4324c9649a9Sj_mayer cpu_fprintf(f, "FIR%02d " TARGET_FMT_lx " ", i, 4334c9649a9Sj_mayer *((uint64_t *)(&env->fir[i]))); 4344c9649a9Sj_mayer if ((i % 3) == 2) 4354c9649a9Sj_mayer cpu_fprintf(f, "\n"); 4364c9649a9Sj_mayer } 43757a92c8eSaurel32 cpu_fprintf(f, "\nlock " TARGET_FMT_lx "\n", env->lock); 4384c9649a9Sj_mayer } 4394c9649a9Sj_mayer 440