1 /* 2 * PowerPC CPU initialization for qemu. 3 * 4 * Copyright (c) 2003-2007 Jocelyn Mayer 5 * Copyright 2011 Freescale Semiconductor, Inc. 6 * 7 * This library is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * This library is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with this library; if not, see <http://www.gnu.org/licenses/>. 19 */ 20 21 #include "qemu/osdep.h" 22 #include "disas/dis-asm.h" 23 #include "exec/gdbstub.h" 24 #include "kvm_ppc.h" 25 #include "sysemu/cpus.h" 26 #include "sysemu/hw_accel.h" 27 #include "sysemu/tcg.h" 28 #include "cpu-models.h" 29 #include "mmu-hash32.h" 30 #include "mmu-hash64.h" 31 #include "qemu/error-report.h" 32 #include "qemu/module.h" 33 #include "qemu/qemu-print.h" 34 #include "qapi/error.h" 35 #include "qapi/qmp/qnull.h" 36 #include "qapi/visitor.h" 37 #include "hw/qdev-properties.h" 38 #include "hw/ppc/ppc.h" 39 #include "mmu-book3s-v3.h" 40 #include "qemu/cutils.h" 41 #include "disas/capstone.h" 42 #include "fpu/softfloat.h" 43 #include "qapi/qapi-commands-machine-target.h" 44 45 #include "helper_regs.h" 46 #include "internal.h" 47 #include "spr_tcg.h" 48 #include "power8-pmu.h" 49 50 /* #define PPC_DEBUG_SPR */ 51 /* #define USE_APPLE_GDB */ 52 53 static inline void vscr_init(CPUPPCState *env, uint32_t val) 54 { 55 /* Altivec always uses round-to-nearest */ 56 set_float_rounding_mode(float_round_nearest_even, &env->vec_status); 57 ppc_store_vscr(env, val); 58 } 59 60 /** 61 * _spr_register 62 * 63 * Register an SPR with all the callbacks required for tcg, 64 * and the ID number for KVM. 65 * 66 * The reason for the conditional compilation is that the tcg functions 67 * may be compiled out, and the system kvm header may not be available 68 * for supplying the ID numbers. This is ugly, but the best we can do. 69 */ 70 71 #ifdef CONFIG_TCG 72 # define USR_ARG(X) X, 73 # ifdef CONFIG_USER_ONLY 74 # define SYS_ARG(X) 75 # else 76 # define SYS_ARG(X) X, 77 # endif 78 #else 79 # define USR_ARG(X) 80 # define SYS_ARG(X) 81 #endif 82 #ifdef CONFIG_KVM 83 # define KVM_ARG(X) X, 84 #else 85 # define KVM_ARG(X) 86 #endif 87 88 typedef void spr_callback(DisasContext *, int, int); 89 90 static void _spr_register(CPUPPCState *env, int num, const char *name, 91 USR_ARG(spr_callback *uea_read) 92 USR_ARG(spr_callback *uea_write) 93 SYS_ARG(spr_callback *oea_read) 94 SYS_ARG(spr_callback *oea_write) 95 SYS_ARG(spr_callback *hea_read) 96 SYS_ARG(spr_callback *hea_write) 97 KVM_ARG(uint64_t one_reg_id) 98 target_ulong initial_value) 99 { 100 ppc_spr_t *spr = &env->spr_cb[num]; 101 102 /* No SPR should be registered twice. */ 103 assert(spr->name == NULL); 104 assert(name != NULL); 105 106 spr->name = name; 107 spr->default_value = initial_value; 108 env->spr[num] = initial_value; 109 110 #ifdef CONFIG_TCG 111 spr->uea_read = uea_read; 112 spr->uea_write = uea_write; 113 # ifndef CONFIG_USER_ONLY 114 spr->oea_read = oea_read; 115 spr->oea_write = oea_write; 116 spr->hea_read = hea_read; 117 spr->hea_write = hea_write; 118 # endif 119 #endif 120 #ifdef CONFIG_KVM 121 spr->one_reg_id = one_reg_id; 122 #endif 123 } 124 125 /* spr_register_kvm_hv passes all required arguments. */ 126 #define spr_register_kvm_hv(env, num, name, uea_read, uea_write, \ 127 oea_read, oea_write, hea_read, hea_write, \ 128 one_reg_id, initial_value) \ 129 _spr_register(env, num, name, \ 130 USR_ARG(uea_read) USR_ARG(uea_write) \ 131 SYS_ARG(oea_read) SYS_ARG(oea_write) \ 132 SYS_ARG(hea_read) SYS_ARG(hea_write) \ 133 KVM_ARG(one_reg_id) initial_value) 134 135 /* spr_register_kvm duplicates the oea callbacks to the hea callbacks. */ 136 #define spr_register_kvm(env, num, name, uea_read, uea_write, \ 137 oea_read, oea_write, one_reg_id, ival) \ 138 spr_register_kvm_hv(env, num, name, uea_read, uea_write, oea_read, \ 139 oea_write, oea_read, oea_write, one_reg_id, ival) 140 141 /* spr_register_hv and spr_register are similar, except there is no kvm id. */ 142 #define spr_register_hv(env, num, name, uea_read, uea_write, \ 143 oea_read, oea_write, hea_read, hea_write, ival) \ 144 spr_register_kvm_hv(env, num, name, uea_read, uea_write, oea_read, \ 145 oea_write, hea_read, hea_write, 0, ival) 146 147 #define spr_register(env, num, name, uea_read, uea_write, \ 148 oea_read, oea_write, ival) \ 149 spr_register_kvm(env, num, name, uea_read, uea_write, \ 150 oea_read, oea_write, 0, ival) 151 152 /* Generic PowerPC SPRs */ 153 static void register_generic_sprs(PowerPCCPU *cpu) 154 { 155 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); 156 CPUPPCState *env = &cpu->env; 157 158 /* Integer processing */ 159 spr_register(env, SPR_XER, "XER", 160 &spr_read_xer, &spr_write_xer, 161 &spr_read_xer, &spr_write_xer, 162 0x00000000); 163 /* Branch control */ 164 spr_register(env, SPR_LR, "LR", 165 &spr_read_lr, &spr_write_lr, 166 &spr_read_lr, &spr_write_lr, 167 0x00000000); 168 spr_register(env, SPR_CTR, "CTR", 169 &spr_read_ctr, &spr_write_ctr, 170 &spr_read_ctr, &spr_write_ctr, 171 0x00000000); 172 /* Interrupt processing */ 173 spr_register(env, SPR_SRR0, "SRR0", 174 SPR_NOACCESS, SPR_NOACCESS, 175 &spr_read_generic, &spr_write_generic, 176 0x00000000); 177 spr_register(env, SPR_SRR1, "SRR1", 178 SPR_NOACCESS, SPR_NOACCESS, 179 &spr_read_generic, &spr_write_generic, 180 0x00000000); 181 /* Processor control */ 182 spr_register(env, SPR_SPRG0, "SPRG0", 183 SPR_NOACCESS, SPR_NOACCESS, 184 &spr_read_generic, &spr_write_generic, 185 0x00000000); 186 spr_register(env, SPR_SPRG1, "SPRG1", 187 SPR_NOACCESS, SPR_NOACCESS, 188 &spr_read_generic, &spr_write_generic, 189 0x00000000); 190 spr_register(env, SPR_SPRG2, "SPRG2", 191 SPR_NOACCESS, SPR_NOACCESS, 192 &spr_read_generic, &spr_write_generic, 193 0x00000000); 194 spr_register(env, SPR_SPRG3, "SPRG3", 195 SPR_NOACCESS, SPR_NOACCESS, 196 &spr_read_generic, &spr_write_generic, 197 0x00000000); 198 199 spr_register(env, SPR_PVR, "PVR", 200 /* Linux permits userspace to read PVR */ 201 #if defined(CONFIG_LINUX_USER) 202 &spr_read_generic, 203 #else 204 SPR_NOACCESS, 205 #endif 206 SPR_NOACCESS, 207 &spr_read_generic, SPR_NOACCESS, 208 pcc->pvr); 209 210 /* Register SVR if it's defined to anything else than POWERPC_SVR_NONE */ 211 if (pcc->svr != POWERPC_SVR_NONE) { 212 if (pcc->svr & POWERPC_SVR_E500) { 213 spr_register(env, SPR_E500_SVR, "SVR", 214 SPR_NOACCESS, SPR_NOACCESS, 215 &spr_read_generic, SPR_NOACCESS, 216 pcc->svr & ~POWERPC_SVR_E500); 217 } else { 218 spr_register(env, SPR_SVR, "SVR", 219 SPR_NOACCESS, SPR_NOACCESS, 220 &spr_read_generic, SPR_NOACCESS, 221 pcc->svr); 222 } 223 } 224 225 /* Time base */ 226 spr_register(env, SPR_VTBL, "TBL", 227 &spr_read_tbl, SPR_NOACCESS, 228 &spr_read_tbl, SPR_NOACCESS, 229 0x00000000); 230 spr_register(env, SPR_TBL, "TBL", 231 &spr_read_tbl, SPR_NOACCESS, 232 &spr_read_tbl, &spr_write_tbl, 233 0x00000000); 234 spr_register(env, SPR_VTBU, "TBU", 235 &spr_read_tbu, SPR_NOACCESS, 236 &spr_read_tbu, SPR_NOACCESS, 237 0x00000000); 238 spr_register(env, SPR_TBU, "TBU", 239 &spr_read_tbu, SPR_NOACCESS, 240 &spr_read_tbu, &spr_write_tbu, 241 0x00000000); 242 } 243 244 /* SPR common to all non-embedded PowerPC, including 601 */ 245 static void register_ne_601_sprs(CPUPPCState *env) 246 { 247 /* Exception processing */ 248 spr_register_kvm(env, SPR_DSISR, "DSISR", 249 SPR_NOACCESS, SPR_NOACCESS, 250 &spr_read_generic, &spr_write_generic, 251 KVM_REG_PPC_DSISR, 0x00000000); 252 spr_register_kvm(env, SPR_DAR, "DAR", 253 SPR_NOACCESS, SPR_NOACCESS, 254 &spr_read_generic, &spr_write_generic, 255 KVM_REG_PPC_DAR, 0x00000000); 256 /* Timer */ 257 spr_register(env, SPR_DECR, "DECR", 258 SPR_NOACCESS, SPR_NOACCESS, 259 &spr_read_decr, &spr_write_decr, 260 0x00000000); 261 } 262 263 /* Storage Description Register 1 */ 264 static void register_sdr1_sprs(CPUPPCState *env) 265 { 266 #ifndef CONFIG_USER_ONLY 267 if (env->has_hv_mode) { 268 /* 269 * SDR1 is a hypervisor resource on CPUs which have a 270 * hypervisor mode 271 */ 272 spr_register_hv(env, SPR_SDR1, "SDR1", 273 SPR_NOACCESS, SPR_NOACCESS, 274 SPR_NOACCESS, SPR_NOACCESS, 275 &spr_read_generic, &spr_write_sdr1, 276 0x00000000); 277 } else { 278 spr_register(env, SPR_SDR1, "SDR1", 279 SPR_NOACCESS, SPR_NOACCESS, 280 &spr_read_generic, &spr_write_sdr1, 281 0x00000000); 282 } 283 #endif 284 } 285 286 /* BATs 0-3 */ 287 static void register_low_BATs(CPUPPCState *env) 288 { 289 #if !defined(CONFIG_USER_ONLY) 290 spr_register(env, SPR_IBAT0U, "IBAT0U", 291 SPR_NOACCESS, SPR_NOACCESS, 292 &spr_read_ibat, &spr_write_ibatu, 293 0x00000000); 294 spr_register(env, SPR_IBAT0L, "IBAT0L", 295 SPR_NOACCESS, SPR_NOACCESS, 296 &spr_read_ibat, &spr_write_ibatl, 297 0x00000000); 298 spr_register(env, SPR_IBAT1U, "IBAT1U", 299 SPR_NOACCESS, SPR_NOACCESS, 300 &spr_read_ibat, &spr_write_ibatu, 301 0x00000000); 302 spr_register(env, SPR_IBAT1L, "IBAT1L", 303 SPR_NOACCESS, SPR_NOACCESS, 304 &spr_read_ibat, &spr_write_ibatl, 305 0x00000000); 306 spr_register(env, SPR_IBAT2U, "IBAT2U", 307 SPR_NOACCESS, SPR_NOACCESS, 308 &spr_read_ibat, &spr_write_ibatu, 309 0x00000000); 310 spr_register(env, SPR_IBAT2L, "IBAT2L", 311 SPR_NOACCESS, SPR_NOACCESS, 312 &spr_read_ibat, &spr_write_ibatl, 313 0x00000000); 314 spr_register(env, SPR_IBAT3U, "IBAT3U", 315 SPR_NOACCESS, SPR_NOACCESS, 316 &spr_read_ibat, &spr_write_ibatu, 317 0x00000000); 318 spr_register(env, SPR_IBAT3L, "IBAT3L", 319 SPR_NOACCESS, SPR_NOACCESS, 320 &spr_read_ibat, &spr_write_ibatl, 321 0x00000000); 322 spr_register(env, SPR_DBAT0U, "DBAT0U", 323 SPR_NOACCESS, SPR_NOACCESS, 324 &spr_read_dbat, &spr_write_dbatu, 325 0x00000000); 326 spr_register(env, SPR_DBAT0L, "DBAT0L", 327 SPR_NOACCESS, SPR_NOACCESS, 328 &spr_read_dbat, &spr_write_dbatl, 329 0x00000000); 330 spr_register(env, SPR_DBAT1U, "DBAT1U", 331 SPR_NOACCESS, SPR_NOACCESS, 332 &spr_read_dbat, &spr_write_dbatu, 333 0x00000000); 334 spr_register(env, SPR_DBAT1L, "DBAT1L", 335 SPR_NOACCESS, SPR_NOACCESS, 336 &spr_read_dbat, &spr_write_dbatl, 337 0x00000000); 338 spr_register(env, SPR_DBAT2U, "DBAT2U", 339 SPR_NOACCESS, SPR_NOACCESS, 340 &spr_read_dbat, &spr_write_dbatu, 341 0x00000000); 342 spr_register(env, SPR_DBAT2L, "DBAT2L", 343 SPR_NOACCESS, SPR_NOACCESS, 344 &spr_read_dbat, &spr_write_dbatl, 345 0x00000000); 346 spr_register(env, SPR_DBAT3U, "DBAT3U", 347 SPR_NOACCESS, SPR_NOACCESS, 348 &spr_read_dbat, &spr_write_dbatu, 349 0x00000000); 350 spr_register(env, SPR_DBAT3L, "DBAT3L", 351 SPR_NOACCESS, SPR_NOACCESS, 352 &spr_read_dbat, &spr_write_dbatl, 353 0x00000000); 354 env->nb_BATs += 4; 355 #endif 356 } 357 358 /* BATs 4-7 */ 359 static void register_high_BATs(CPUPPCState *env) 360 { 361 #if !defined(CONFIG_USER_ONLY) 362 spr_register(env, SPR_IBAT4U, "IBAT4U", 363 SPR_NOACCESS, SPR_NOACCESS, 364 &spr_read_ibat_h, &spr_write_ibatu_h, 365 0x00000000); 366 spr_register(env, SPR_IBAT4L, "IBAT4L", 367 SPR_NOACCESS, SPR_NOACCESS, 368 &spr_read_ibat_h, &spr_write_ibatl_h, 369 0x00000000); 370 spr_register(env, SPR_IBAT5U, "IBAT5U", 371 SPR_NOACCESS, SPR_NOACCESS, 372 &spr_read_ibat_h, &spr_write_ibatu_h, 373 0x00000000); 374 spr_register(env, SPR_IBAT5L, "IBAT5L", 375 SPR_NOACCESS, SPR_NOACCESS, 376 &spr_read_ibat_h, &spr_write_ibatl_h, 377 0x00000000); 378 spr_register(env, SPR_IBAT6U, "IBAT6U", 379 SPR_NOACCESS, SPR_NOACCESS, 380 &spr_read_ibat_h, &spr_write_ibatu_h, 381 0x00000000); 382 spr_register(env, SPR_IBAT6L, "IBAT6L", 383 SPR_NOACCESS, SPR_NOACCESS, 384 &spr_read_ibat_h, &spr_write_ibatl_h, 385 0x00000000); 386 spr_register(env, SPR_IBAT7U, "IBAT7U", 387 SPR_NOACCESS, SPR_NOACCESS, 388 &spr_read_ibat_h, &spr_write_ibatu_h, 389 0x00000000); 390 spr_register(env, SPR_IBAT7L, "IBAT7L", 391 SPR_NOACCESS, SPR_NOACCESS, 392 &spr_read_ibat_h, &spr_write_ibatl_h, 393 0x00000000); 394 spr_register(env, SPR_DBAT4U, "DBAT4U", 395 SPR_NOACCESS, SPR_NOACCESS, 396 &spr_read_dbat_h, &spr_write_dbatu_h, 397 0x00000000); 398 spr_register(env, SPR_DBAT4L, "DBAT4L", 399 SPR_NOACCESS, SPR_NOACCESS, 400 &spr_read_dbat_h, &spr_write_dbatl_h, 401 0x00000000); 402 spr_register(env, SPR_DBAT5U, "DBAT5U", 403 SPR_NOACCESS, SPR_NOACCESS, 404 &spr_read_dbat_h, &spr_write_dbatu_h, 405 0x00000000); 406 spr_register(env, SPR_DBAT5L, "DBAT5L", 407 SPR_NOACCESS, SPR_NOACCESS, 408 &spr_read_dbat_h, &spr_write_dbatl_h, 409 0x00000000); 410 spr_register(env, SPR_DBAT6U, "DBAT6U", 411 SPR_NOACCESS, SPR_NOACCESS, 412 &spr_read_dbat_h, &spr_write_dbatu_h, 413 0x00000000); 414 spr_register(env, SPR_DBAT6L, "DBAT6L", 415 SPR_NOACCESS, SPR_NOACCESS, 416 &spr_read_dbat_h, &spr_write_dbatl_h, 417 0x00000000); 418 spr_register(env, SPR_DBAT7U, "DBAT7U", 419 SPR_NOACCESS, SPR_NOACCESS, 420 &spr_read_dbat_h, &spr_write_dbatu_h, 421 0x00000000); 422 spr_register(env, SPR_DBAT7L, "DBAT7L", 423 SPR_NOACCESS, SPR_NOACCESS, 424 &spr_read_dbat_h, &spr_write_dbatl_h, 425 0x00000000); 426 env->nb_BATs += 4; 427 #endif 428 } 429 430 /* Softare table search registers */ 431 static void register_6xx_7xx_soft_tlb(CPUPPCState *env, int nb_tlbs, int nb_ways) 432 { 433 #if !defined(CONFIG_USER_ONLY) 434 env->nb_tlb = nb_tlbs; 435 env->nb_ways = nb_ways; 436 env->id_tlbs = 1; 437 env->tlb_type = TLB_6XX; 438 spr_register(env, SPR_DMISS, "DMISS", 439 SPR_NOACCESS, SPR_NOACCESS, 440 &spr_read_generic, SPR_NOACCESS, 441 0x00000000); 442 spr_register(env, SPR_DCMP, "DCMP", 443 SPR_NOACCESS, SPR_NOACCESS, 444 &spr_read_generic, SPR_NOACCESS, 445 0x00000000); 446 spr_register(env, SPR_HASH1, "HASH1", 447 SPR_NOACCESS, SPR_NOACCESS, 448 &spr_read_generic, SPR_NOACCESS, 449 0x00000000); 450 spr_register(env, SPR_HASH2, "HASH2", 451 SPR_NOACCESS, SPR_NOACCESS, 452 &spr_read_generic, SPR_NOACCESS, 453 0x00000000); 454 spr_register(env, SPR_IMISS, "IMISS", 455 SPR_NOACCESS, SPR_NOACCESS, 456 &spr_read_generic, SPR_NOACCESS, 457 0x00000000); 458 spr_register(env, SPR_ICMP, "ICMP", 459 SPR_NOACCESS, SPR_NOACCESS, 460 &spr_read_generic, SPR_NOACCESS, 461 0x00000000); 462 spr_register(env, SPR_RPA, "RPA", 463 SPR_NOACCESS, SPR_NOACCESS, 464 &spr_read_generic, &spr_write_generic, 465 0x00000000); 466 #endif 467 } 468 469 static void register_745_sprs(CPUPPCState *env) 470 { 471 /* SGPRs */ 472 spr_register(env, SPR_SPRG4, "SPRG4", 473 SPR_NOACCESS, SPR_NOACCESS, 474 &spr_read_generic, &spr_write_generic, 475 0x00000000); 476 spr_register(env, SPR_SPRG5, "SPRG5", 477 SPR_NOACCESS, SPR_NOACCESS, 478 &spr_read_generic, &spr_write_generic, 479 0x00000000); 480 spr_register(env, SPR_SPRG6, "SPRG6", 481 SPR_NOACCESS, SPR_NOACCESS, 482 &spr_read_generic, &spr_write_generic, 483 0x00000000); 484 spr_register(env, SPR_SPRG7, "SPRG7", 485 SPR_NOACCESS, SPR_NOACCESS, 486 &spr_read_generic, &spr_write_generic, 487 0x00000000); 488 489 /* Hardware implementation registers */ 490 spr_register(env, SPR_HID0, "HID0", 491 SPR_NOACCESS, SPR_NOACCESS, 492 &spr_read_generic, &spr_write_generic, 493 0x00000000); 494 495 spr_register(env, SPR_HID1, "HID1", 496 SPR_NOACCESS, SPR_NOACCESS, 497 &spr_read_generic, &spr_write_generic, 498 0x00000000); 499 500 spr_register(env, SPR_HID2, "HID2", 501 SPR_NOACCESS, SPR_NOACCESS, 502 &spr_read_generic, &spr_write_generic, 503 0x00000000); 504 } 505 506 static void register_755_sprs(CPUPPCState *env) 507 { 508 /* L2 cache control */ 509 spr_register(env, SPR_L2CR, "L2CR", 510 SPR_NOACCESS, SPR_NOACCESS, 511 &spr_read_generic, spr_access_nop, 512 0x00000000); 513 514 spr_register(env, SPR_L2PMCR, "L2PMCR", 515 SPR_NOACCESS, SPR_NOACCESS, 516 &spr_read_generic, &spr_write_generic, 517 0x00000000); 518 } 519 520 /* SPR common to all 7xx PowerPC implementations */ 521 static void register_7xx_sprs(CPUPPCState *env) 522 { 523 /* Breakpoints */ 524 spr_register_kvm(env, SPR_DABR, "DABR", 525 SPR_NOACCESS, SPR_NOACCESS, 526 &spr_read_generic, &spr_write_generic, 527 KVM_REG_PPC_DABR, 0x00000000); 528 529 spr_register(env, SPR_IABR, "IABR", 530 SPR_NOACCESS, SPR_NOACCESS, 531 &spr_read_generic, &spr_write_generic, 532 0x00000000); 533 /* Cache management */ 534 spr_register(env, SPR_ICTC, "ICTC", 535 SPR_NOACCESS, SPR_NOACCESS, 536 &spr_read_generic, &spr_write_generic, 537 0x00000000); 538 /* Performance monitors */ 539 spr_register(env, SPR_7XX_MMCR0, "MMCR0", 540 SPR_NOACCESS, SPR_NOACCESS, 541 &spr_read_generic, &spr_write_generic, 542 0x00000000); 543 544 spr_register(env, SPR_7XX_MMCR1, "MMCR1", 545 SPR_NOACCESS, SPR_NOACCESS, 546 &spr_read_generic, &spr_write_generic, 547 0x00000000); 548 549 spr_register(env, SPR_7XX_PMC1, "PMC1", 550 SPR_NOACCESS, SPR_NOACCESS, 551 &spr_read_generic, &spr_write_generic, 552 0x00000000); 553 554 spr_register(env, SPR_7XX_PMC2, "PMC2", 555 SPR_NOACCESS, SPR_NOACCESS, 556 &spr_read_generic, &spr_write_generic, 557 0x00000000); 558 559 spr_register(env, SPR_7XX_PMC3, "PMC3", 560 SPR_NOACCESS, SPR_NOACCESS, 561 &spr_read_generic, &spr_write_generic, 562 0x00000000); 563 564 spr_register(env, SPR_7XX_PMC4, "PMC4", 565 SPR_NOACCESS, SPR_NOACCESS, 566 &spr_read_generic, &spr_write_generic, 567 0x00000000); 568 569 spr_register(env, SPR_7XX_SIAR, "SIAR", 570 SPR_NOACCESS, SPR_NOACCESS, 571 &spr_read_generic, SPR_NOACCESS, 572 0x00000000); 573 574 spr_register(env, SPR_7XX_UMMCR0, "UMMCR0", 575 &spr_read_ureg, SPR_NOACCESS, 576 &spr_read_ureg, SPR_NOACCESS, 577 0x00000000); 578 579 spr_register(env, SPR_7XX_UMMCR1, "UMMCR1", 580 &spr_read_ureg, SPR_NOACCESS, 581 &spr_read_ureg, SPR_NOACCESS, 582 0x00000000); 583 584 spr_register(env, SPR_7XX_UPMC1, "UPMC1", 585 &spr_read_ureg, SPR_NOACCESS, 586 &spr_read_ureg, SPR_NOACCESS, 587 0x00000000); 588 589 spr_register(env, SPR_7XX_UPMC2, "UPMC2", 590 &spr_read_ureg, SPR_NOACCESS, 591 &spr_read_ureg, SPR_NOACCESS, 592 0x00000000); 593 594 spr_register(env, SPR_7XX_UPMC3, "UPMC3", 595 &spr_read_ureg, SPR_NOACCESS, 596 &spr_read_ureg, SPR_NOACCESS, 597 0x00000000); 598 599 spr_register(env, SPR_7XX_UPMC4, "UPMC4", 600 &spr_read_ureg, SPR_NOACCESS, 601 &spr_read_ureg, SPR_NOACCESS, 602 0x00000000); 603 604 spr_register(env, SPR_7XX_USIAR, "USIAR", 605 &spr_read_ureg, SPR_NOACCESS, 606 &spr_read_ureg, SPR_NOACCESS, 607 0x00000000); 608 /* External access control */ 609 spr_register(env, SPR_EAR, "EAR", 610 SPR_NOACCESS, SPR_NOACCESS, 611 &spr_read_generic, &spr_write_generic, 612 0x00000000); 613 614 /* Hardware implementation registers */ 615 spr_register(env, SPR_HID0, "HID0", 616 SPR_NOACCESS, SPR_NOACCESS, 617 &spr_read_generic, &spr_write_generic, 618 0x00000000); 619 620 spr_register(env, SPR_HID1, "HID1", 621 SPR_NOACCESS, SPR_NOACCESS, 622 &spr_read_generic, &spr_write_generic, 623 0x00000000); 624 } 625 626 #ifdef TARGET_PPC64 627 static void register_amr_sprs(CPUPPCState *env) 628 { 629 #ifndef CONFIG_USER_ONLY 630 /* 631 * Virtual Page Class Key protection 632 * 633 * The AMR is accessible either via SPR 13 or SPR 29. 13 is 634 * userspace accessible, 29 is privileged. So we only need to set 635 * the kvm ONE_REG id on one of them, we use 29 636 */ 637 spr_register(env, SPR_UAMR, "UAMR", 638 &spr_read_generic, &spr_write_amr, 639 &spr_read_generic, &spr_write_amr, 640 0); 641 spr_register_kvm_hv(env, SPR_AMR, "AMR", 642 SPR_NOACCESS, SPR_NOACCESS, 643 &spr_read_generic, &spr_write_amr, 644 &spr_read_generic, &spr_write_generic, 645 KVM_REG_PPC_AMR, 0); 646 spr_register_kvm_hv(env, SPR_UAMOR, "UAMOR", 647 SPR_NOACCESS, SPR_NOACCESS, 648 &spr_read_generic, &spr_write_uamor, 649 &spr_read_generic, &spr_write_generic, 650 KVM_REG_PPC_UAMOR, 0); 651 spr_register_hv(env, SPR_AMOR, "AMOR", 652 SPR_NOACCESS, SPR_NOACCESS, 653 SPR_NOACCESS, SPR_NOACCESS, 654 &spr_read_generic, &spr_write_generic, 655 0); 656 #endif /* !CONFIG_USER_ONLY */ 657 } 658 659 static void register_iamr_sprs(CPUPPCState *env) 660 { 661 #ifndef CONFIG_USER_ONLY 662 spr_register_kvm_hv(env, SPR_IAMR, "IAMR", 663 SPR_NOACCESS, SPR_NOACCESS, 664 &spr_read_generic, &spr_write_iamr, 665 &spr_read_generic, &spr_write_generic, 666 KVM_REG_PPC_IAMR, 0); 667 #endif /* !CONFIG_USER_ONLY */ 668 } 669 #endif /* TARGET_PPC64 */ 670 671 static void register_thrm_sprs(CPUPPCState *env) 672 { 673 /* Thermal management */ 674 spr_register(env, SPR_THRM1, "THRM1", 675 SPR_NOACCESS, SPR_NOACCESS, 676 &spr_read_thrm, &spr_write_generic, 677 0x00000000); 678 679 spr_register(env, SPR_THRM2, "THRM2", 680 SPR_NOACCESS, SPR_NOACCESS, 681 &spr_read_thrm, &spr_write_generic, 682 0x00000000); 683 684 spr_register(env, SPR_THRM3, "THRM3", 685 SPR_NOACCESS, SPR_NOACCESS, 686 &spr_read_thrm, &spr_write_generic, 687 0x00000000); 688 } 689 690 /* SPR specific to PowerPC 604 implementation */ 691 static void register_604_sprs(CPUPPCState *env) 692 { 693 /* Processor identification */ 694 spr_register(env, SPR_PIR, "PIR", 695 SPR_NOACCESS, SPR_NOACCESS, 696 &spr_read_generic, &spr_write_pir, 697 0x00000000); 698 /* Breakpoints */ 699 spr_register(env, SPR_IABR, "IABR", 700 SPR_NOACCESS, SPR_NOACCESS, 701 &spr_read_generic, &spr_write_generic, 702 0x00000000); 703 704 spr_register_kvm(env, SPR_DABR, "DABR", 705 SPR_NOACCESS, SPR_NOACCESS, 706 &spr_read_generic, &spr_write_generic, 707 KVM_REG_PPC_DABR, 0x00000000); 708 /* Performance counters */ 709 spr_register(env, SPR_7XX_MMCR0, "MMCR0", 710 SPR_NOACCESS, SPR_NOACCESS, 711 &spr_read_generic, &spr_write_generic, 712 0x00000000); 713 714 spr_register(env, SPR_7XX_PMC1, "PMC1", 715 SPR_NOACCESS, SPR_NOACCESS, 716 &spr_read_generic, &spr_write_generic, 717 0x00000000); 718 719 spr_register(env, SPR_7XX_PMC2, "PMC2", 720 SPR_NOACCESS, SPR_NOACCESS, 721 &spr_read_generic, &spr_write_generic, 722 0x00000000); 723 724 spr_register(env, SPR_7XX_SIAR, "SIAR", 725 SPR_NOACCESS, SPR_NOACCESS, 726 &spr_read_generic, SPR_NOACCESS, 727 0x00000000); 728 729 spr_register(env, SPR_SDA, "SDA", 730 SPR_NOACCESS, SPR_NOACCESS, 731 &spr_read_generic, SPR_NOACCESS, 732 0x00000000); 733 /* External access control */ 734 spr_register(env, SPR_EAR, "EAR", 735 SPR_NOACCESS, SPR_NOACCESS, 736 &spr_read_generic, &spr_write_generic, 737 0x00000000); 738 739 /* Hardware implementation registers */ 740 spr_register(env, SPR_HID0, "HID0", 741 SPR_NOACCESS, SPR_NOACCESS, 742 &spr_read_generic, &spr_write_generic, 743 0x00000000); 744 } 745 746 /* SPR specific to PowerPC 603 implementation */ 747 static void register_603_sprs(CPUPPCState *env) 748 { 749 /* External access control */ 750 spr_register(env, SPR_EAR, "EAR", 751 SPR_NOACCESS, SPR_NOACCESS, 752 &spr_read_generic, &spr_write_generic, 753 0x00000000); 754 /* Breakpoints */ 755 spr_register(env, SPR_IABR, "IABR", 756 SPR_NOACCESS, SPR_NOACCESS, 757 &spr_read_generic, &spr_write_generic, 758 0x00000000); 759 760 spr_register(env, SPR_HID0, "HID0", 761 SPR_NOACCESS, SPR_NOACCESS, 762 &spr_read_generic, &spr_write_generic, 763 0x00000000); 764 765 spr_register(env, SPR_HID1, "HID1", 766 SPR_NOACCESS, SPR_NOACCESS, 767 &spr_read_generic, &spr_write_generic, 768 0x00000000); 769 } 770 771 static void register_e300_sprs(CPUPPCState *env) 772 { 773 /* hardware implementation registers */ 774 spr_register(env, SPR_HID2, "HID2", 775 SPR_NOACCESS, SPR_NOACCESS, 776 &spr_read_generic, &spr_write_generic, 777 0x00000000); 778 /* Breakpoints */ 779 spr_register(env, SPR_DABR, "DABR", 780 SPR_NOACCESS, SPR_NOACCESS, 781 &spr_read_generic, &spr_write_generic, 782 0x00000000); 783 784 spr_register(env, SPR_DABR2, "DABR2", 785 SPR_NOACCESS, SPR_NOACCESS, 786 &spr_read_generic, &spr_write_generic, 787 0x00000000); 788 789 spr_register(env, SPR_IABR2, "IABR2", 790 SPR_NOACCESS, SPR_NOACCESS, 791 &spr_read_generic, &spr_write_generic, 792 0x00000000); 793 794 spr_register(env, SPR_IBCR, "IBCR", 795 SPR_NOACCESS, SPR_NOACCESS, 796 &spr_read_generic, &spr_write_generic, 797 0x00000000); 798 799 spr_register(env, SPR_DBCR, "DBCR", 800 SPR_NOACCESS, SPR_NOACCESS, 801 &spr_read_generic, &spr_write_generic, 802 0x00000000); 803 } 804 805 /* SPR specific to PowerPC G2 implementation */ 806 static void register_G2_sprs(CPUPPCState *env) 807 { 808 /* Memory base address */ 809 /* MBAR */ 810 spr_register(env, SPR_MBAR, "MBAR", 811 SPR_NOACCESS, SPR_NOACCESS, 812 &spr_read_generic, &spr_write_generic, 813 0x00000000); 814 /* Exception processing */ 815 spr_register(env, SPR_BOOKE_CSRR0, "CSRR0", 816 SPR_NOACCESS, SPR_NOACCESS, 817 &spr_read_generic, &spr_write_generic, 818 0x00000000); 819 spr_register(env, SPR_BOOKE_CSRR1, "CSRR1", 820 SPR_NOACCESS, SPR_NOACCESS, 821 &spr_read_generic, &spr_write_generic, 822 0x00000000); 823 /* Breakpoints */ 824 spr_register(env, SPR_DABR, "DABR", 825 SPR_NOACCESS, SPR_NOACCESS, 826 &spr_read_generic, &spr_write_generic, 827 0x00000000); 828 829 spr_register(env, SPR_DABR2, "DABR2", 830 SPR_NOACCESS, SPR_NOACCESS, 831 &spr_read_generic, &spr_write_generic, 832 0x00000000); 833 834 spr_register(env, SPR_IABR, "IABR", 835 SPR_NOACCESS, SPR_NOACCESS, 836 &spr_read_generic, &spr_write_generic, 837 0x00000000); 838 839 spr_register(env, SPR_IABR2, "IABR2", 840 SPR_NOACCESS, SPR_NOACCESS, 841 &spr_read_generic, &spr_write_generic, 842 0x00000000); 843 844 spr_register(env, SPR_IBCR, "IBCR", 845 SPR_NOACCESS, SPR_NOACCESS, 846 &spr_read_generic, &spr_write_generic, 847 0x00000000); 848 849 spr_register(env, SPR_DBCR, "DBCR", 850 SPR_NOACCESS, SPR_NOACCESS, 851 &spr_read_generic, &spr_write_generic, 852 0x00000000); 853 854 /* External access control */ 855 spr_register(env, SPR_EAR, "EAR", 856 SPR_NOACCESS, SPR_NOACCESS, 857 &spr_read_generic, &spr_write_generic, 858 0x00000000); 859 /* Hardware implementation register */ 860 spr_register(env, SPR_HID0, "HID0", 861 SPR_NOACCESS, SPR_NOACCESS, 862 &spr_read_generic, &spr_write_generic, 863 0x00000000); 864 865 spr_register(env, SPR_HID1, "HID1", 866 SPR_NOACCESS, SPR_NOACCESS, 867 &spr_read_generic, &spr_write_generic, 868 0x00000000); 869 870 spr_register(env, SPR_HID2, "HID2", 871 SPR_NOACCESS, SPR_NOACCESS, 872 &spr_read_generic, &spr_write_generic, 873 0x00000000); 874 875 /* SGPRs */ 876 spr_register(env, SPR_SPRG4, "SPRG4", 877 SPR_NOACCESS, SPR_NOACCESS, 878 &spr_read_generic, &spr_write_generic, 879 0x00000000); 880 spr_register(env, SPR_SPRG5, "SPRG5", 881 SPR_NOACCESS, SPR_NOACCESS, 882 &spr_read_generic, &spr_write_generic, 883 0x00000000); 884 spr_register(env, SPR_SPRG6, "SPRG6", 885 SPR_NOACCESS, SPR_NOACCESS, 886 &spr_read_generic, &spr_write_generic, 887 0x00000000); 888 spr_register(env, SPR_SPRG7, "SPRG7", 889 SPR_NOACCESS, SPR_NOACCESS, 890 &spr_read_generic, &spr_write_generic, 891 0x00000000); 892 } 893 894 static void register_74xx_sprs(CPUPPCState *env) 895 { 896 /* Breakpoints */ 897 spr_register_kvm(env, SPR_DABR, "DABR", 898 SPR_NOACCESS, SPR_NOACCESS, 899 &spr_read_generic, &spr_write_generic, 900 KVM_REG_PPC_DABR, 0x00000000); 901 902 spr_register(env, SPR_IABR, "IABR", 903 SPR_NOACCESS, SPR_NOACCESS, 904 &spr_read_generic, &spr_write_generic, 905 0x00000000); 906 /* Cache management */ 907 spr_register(env, SPR_ICTC, "ICTC", 908 SPR_NOACCESS, SPR_NOACCESS, 909 &spr_read_generic, &spr_write_generic, 910 0x00000000); 911 /* Performance monitors */ 912 spr_register(env, SPR_7XX_MMCR0, "MMCR0", 913 SPR_NOACCESS, SPR_NOACCESS, 914 &spr_read_generic, &spr_write_generic, 915 0x00000000); 916 917 spr_register(env, SPR_7XX_MMCR1, "MMCR1", 918 SPR_NOACCESS, SPR_NOACCESS, 919 &spr_read_generic, &spr_write_generic, 920 0x00000000); 921 922 spr_register(env, SPR_7XX_PMC1, "PMC1", 923 SPR_NOACCESS, SPR_NOACCESS, 924 &spr_read_generic, &spr_write_generic, 925 0x00000000); 926 927 spr_register(env, SPR_7XX_PMC2, "PMC2", 928 SPR_NOACCESS, SPR_NOACCESS, 929 &spr_read_generic, &spr_write_generic, 930 0x00000000); 931 932 spr_register(env, SPR_7XX_PMC3, "PMC3", 933 SPR_NOACCESS, SPR_NOACCESS, 934 &spr_read_generic, &spr_write_generic, 935 0x00000000); 936 937 spr_register(env, SPR_7XX_PMC4, "PMC4", 938 SPR_NOACCESS, SPR_NOACCESS, 939 &spr_read_generic, &spr_write_generic, 940 0x00000000); 941 942 spr_register(env, SPR_7XX_SIAR, "SIAR", 943 SPR_NOACCESS, SPR_NOACCESS, 944 &spr_read_generic, SPR_NOACCESS, 945 0x00000000); 946 947 spr_register(env, SPR_7XX_UMMCR0, "UMMCR0", 948 &spr_read_ureg, SPR_NOACCESS, 949 &spr_read_ureg, SPR_NOACCESS, 950 0x00000000); 951 952 spr_register(env, SPR_7XX_UMMCR1, "UMMCR1", 953 &spr_read_ureg, SPR_NOACCESS, 954 &spr_read_ureg, SPR_NOACCESS, 955 0x00000000); 956 957 spr_register(env, SPR_7XX_UPMC1, "UPMC1", 958 &spr_read_ureg, SPR_NOACCESS, 959 &spr_read_ureg, SPR_NOACCESS, 960 0x00000000); 961 962 spr_register(env, SPR_7XX_UPMC2, "UPMC2", 963 &spr_read_ureg, SPR_NOACCESS, 964 &spr_read_ureg, SPR_NOACCESS, 965 0x00000000); 966 967 spr_register(env, SPR_7XX_UPMC3, "UPMC3", 968 &spr_read_ureg, SPR_NOACCESS, 969 &spr_read_ureg, SPR_NOACCESS, 970 0x00000000); 971 972 spr_register(env, SPR_7XX_UPMC4, "UPMC4", 973 &spr_read_ureg, SPR_NOACCESS, 974 &spr_read_ureg, SPR_NOACCESS, 975 0x00000000); 976 977 spr_register(env, SPR_7XX_USIAR, "USIAR", 978 &spr_read_ureg, SPR_NOACCESS, 979 &spr_read_ureg, SPR_NOACCESS, 980 0x00000000); 981 /* External access control */ 982 spr_register(env, SPR_EAR, "EAR", 983 SPR_NOACCESS, SPR_NOACCESS, 984 &spr_read_generic, &spr_write_generic, 985 0x00000000); 986 987 /* Processor identification */ 988 spr_register(env, SPR_PIR, "PIR", 989 SPR_NOACCESS, SPR_NOACCESS, 990 &spr_read_generic, &spr_write_pir, 991 0x00000000); 992 993 spr_register(env, SPR_74XX_MMCR2, "MMCR2", 994 SPR_NOACCESS, SPR_NOACCESS, 995 &spr_read_generic, &spr_write_generic, 996 0x00000000); 997 998 spr_register(env, SPR_74XX_UMMCR2, "UMMCR2", 999 &spr_read_ureg, SPR_NOACCESS, 1000 &spr_read_ureg, SPR_NOACCESS, 1001 0x00000000); 1002 1003 spr_register(env, SPR_BAMR, "BAMR", 1004 SPR_NOACCESS, SPR_NOACCESS, 1005 &spr_read_generic, &spr_write_generic, 1006 0x00000000); 1007 1008 spr_register(env, SPR_MSSCR0, "MSSCR0", 1009 SPR_NOACCESS, SPR_NOACCESS, 1010 &spr_read_generic, &spr_write_generic, 1011 0x00000000); 1012 /* Hardware implementation registers */ 1013 spr_register(env, SPR_HID0, "HID0", 1014 SPR_NOACCESS, SPR_NOACCESS, 1015 &spr_read_generic, &spr_write_generic, 1016 0x00000000); 1017 1018 spr_register(env, SPR_HID1, "HID1", 1019 SPR_NOACCESS, SPR_NOACCESS, 1020 &spr_read_generic, &spr_write_generic, 1021 0x00000000); 1022 /* Altivec */ 1023 spr_register(env, SPR_VRSAVE, "VRSAVE", 1024 &spr_read_generic, &spr_write_generic, 1025 &spr_read_generic, &spr_write_generic, 1026 0x00000000); 1027 1028 spr_register(env, SPR_L2CR, "L2CR", 1029 SPR_NOACCESS, SPR_NOACCESS, 1030 &spr_read_generic, spr_access_nop, 1031 0x00000000); 1032 } 1033 1034 static void register_l3_ctrl(CPUPPCState *env) 1035 { 1036 /* L3CR */ 1037 spr_register(env, SPR_L3CR, "L3CR", 1038 SPR_NOACCESS, SPR_NOACCESS, 1039 &spr_read_generic, &spr_write_generic, 1040 0x00000000); 1041 /* L3ITCR0 */ 1042 spr_register(env, SPR_L3ITCR0, "L3ITCR0", 1043 SPR_NOACCESS, SPR_NOACCESS, 1044 &spr_read_generic, &spr_write_generic, 1045 0x00000000); 1046 /* L3PM */ 1047 spr_register(env, SPR_L3PM, "L3PM", 1048 SPR_NOACCESS, SPR_NOACCESS, 1049 &spr_read_generic, &spr_write_generic, 1050 0x00000000); 1051 } 1052 1053 static void register_usprg3_sprs(CPUPPCState *env) 1054 { 1055 spr_register(env, SPR_USPRG3, "USPRG3", 1056 &spr_read_ureg, SPR_NOACCESS, 1057 &spr_read_ureg, SPR_NOACCESS, 1058 0x00000000); 1059 } 1060 1061 static void register_usprgh_sprs(CPUPPCState *env) 1062 { 1063 spr_register(env, SPR_USPRG4, "USPRG4", 1064 &spr_read_ureg, SPR_NOACCESS, 1065 &spr_read_ureg, SPR_NOACCESS, 1066 0x00000000); 1067 spr_register(env, SPR_USPRG5, "USPRG5", 1068 &spr_read_ureg, SPR_NOACCESS, 1069 &spr_read_ureg, SPR_NOACCESS, 1070 0x00000000); 1071 spr_register(env, SPR_USPRG6, "USPRG6", 1072 &spr_read_ureg, SPR_NOACCESS, 1073 &spr_read_ureg, SPR_NOACCESS, 1074 0x00000000); 1075 spr_register(env, SPR_USPRG7, "USPRG7", 1076 &spr_read_ureg, SPR_NOACCESS, 1077 &spr_read_ureg, SPR_NOACCESS, 1078 0x00000000); 1079 } 1080 1081 /* PowerPC BookE SPR */ 1082 static void register_BookE_sprs(CPUPPCState *env, uint64_t ivor_mask) 1083 { 1084 const char *ivor_names[64] = { 1085 "IVOR0", "IVOR1", "IVOR2", "IVOR3", 1086 "IVOR4", "IVOR5", "IVOR6", "IVOR7", 1087 "IVOR8", "IVOR9", "IVOR10", "IVOR11", 1088 "IVOR12", "IVOR13", "IVOR14", "IVOR15", 1089 "IVOR16", "IVOR17", "IVOR18", "IVOR19", 1090 "IVOR20", "IVOR21", "IVOR22", "IVOR23", 1091 "IVOR24", "IVOR25", "IVOR26", "IVOR27", 1092 "IVOR28", "IVOR29", "IVOR30", "IVOR31", 1093 "IVOR32", "IVOR33", "IVOR34", "IVOR35", 1094 "IVOR36", "IVOR37", "IVOR38", "IVOR39", 1095 "IVOR40", "IVOR41", "IVOR42", "IVOR43", 1096 "IVOR44", "IVOR45", "IVOR46", "IVOR47", 1097 "IVOR48", "IVOR49", "IVOR50", "IVOR51", 1098 "IVOR52", "IVOR53", "IVOR54", "IVOR55", 1099 "IVOR56", "IVOR57", "IVOR58", "IVOR59", 1100 "IVOR60", "IVOR61", "IVOR62", "IVOR63", 1101 }; 1102 #define SPR_BOOKE_IVORxx (-1) 1103 int ivor_sprn[64] = { 1104 SPR_BOOKE_IVOR0, SPR_BOOKE_IVOR1, SPR_BOOKE_IVOR2, SPR_BOOKE_IVOR3, 1105 SPR_BOOKE_IVOR4, SPR_BOOKE_IVOR5, SPR_BOOKE_IVOR6, SPR_BOOKE_IVOR7, 1106 SPR_BOOKE_IVOR8, SPR_BOOKE_IVOR9, SPR_BOOKE_IVOR10, SPR_BOOKE_IVOR11, 1107 SPR_BOOKE_IVOR12, SPR_BOOKE_IVOR13, SPR_BOOKE_IVOR14, SPR_BOOKE_IVOR15, 1108 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, 1109 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, 1110 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, 1111 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, 1112 SPR_BOOKE_IVOR32, SPR_BOOKE_IVOR33, SPR_BOOKE_IVOR34, SPR_BOOKE_IVOR35, 1113 SPR_BOOKE_IVOR36, SPR_BOOKE_IVOR37, SPR_BOOKE_IVOR38, SPR_BOOKE_IVOR39, 1114 SPR_BOOKE_IVOR40, SPR_BOOKE_IVOR41, SPR_BOOKE_IVOR42, SPR_BOOKE_IVORxx, 1115 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, 1116 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, 1117 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, 1118 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, 1119 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, 1120 }; 1121 int i; 1122 1123 /* Interrupt processing */ 1124 spr_register(env, SPR_BOOKE_CSRR0, "CSRR0", 1125 SPR_NOACCESS, SPR_NOACCESS, 1126 &spr_read_generic, &spr_write_generic, 1127 0x00000000); 1128 spr_register(env, SPR_BOOKE_CSRR1, "CSRR1", 1129 SPR_NOACCESS, SPR_NOACCESS, 1130 &spr_read_generic, &spr_write_generic, 1131 0x00000000); 1132 /* Debug */ 1133 spr_register(env, SPR_BOOKE_IAC1, "IAC1", 1134 SPR_NOACCESS, SPR_NOACCESS, 1135 &spr_read_generic, &spr_write_generic, 1136 0x00000000); 1137 1138 spr_register(env, SPR_BOOKE_IAC2, "IAC2", 1139 SPR_NOACCESS, SPR_NOACCESS, 1140 &spr_read_generic, &spr_write_generic, 1141 0x00000000); 1142 1143 spr_register(env, SPR_BOOKE_DAC1, "DAC1", 1144 SPR_NOACCESS, SPR_NOACCESS, 1145 &spr_read_generic, &spr_write_generic, 1146 0x00000000); 1147 1148 spr_register(env, SPR_BOOKE_DAC2, "DAC2", 1149 SPR_NOACCESS, SPR_NOACCESS, 1150 &spr_read_generic, &spr_write_generic, 1151 0x00000000); 1152 1153 spr_register(env, SPR_BOOKE_DBCR0, "DBCR0", 1154 SPR_NOACCESS, SPR_NOACCESS, 1155 &spr_read_generic, &spr_write_40x_dbcr0, 1156 0x00000000); 1157 1158 spr_register(env, SPR_BOOKE_DBCR1, "DBCR1", 1159 SPR_NOACCESS, SPR_NOACCESS, 1160 &spr_read_generic, &spr_write_generic, 1161 0x00000000); 1162 1163 spr_register(env, SPR_BOOKE_DBCR2, "DBCR2", 1164 SPR_NOACCESS, SPR_NOACCESS, 1165 &spr_read_generic, &spr_write_generic, 1166 0x00000000); 1167 spr_register(env, SPR_BOOKE_DSRR0, "DSRR0", 1168 SPR_NOACCESS, SPR_NOACCESS, 1169 &spr_read_generic, &spr_write_generic, 1170 0x00000000); 1171 spr_register(env, SPR_BOOKE_DSRR1, "DSRR1", 1172 SPR_NOACCESS, SPR_NOACCESS, 1173 &spr_read_generic, &spr_write_generic, 1174 0x00000000); 1175 1176 spr_register(env, SPR_BOOKE_DBSR, "DBSR", 1177 SPR_NOACCESS, SPR_NOACCESS, 1178 &spr_read_generic, &spr_write_clear, 1179 0x00000000); 1180 spr_register(env, SPR_BOOKE_DEAR, "DEAR", 1181 SPR_NOACCESS, SPR_NOACCESS, 1182 &spr_read_generic, &spr_write_generic, 1183 0x00000000); 1184 spr_register(env, SPR_BOOKE_ESR, "ESR", 1185 SPR_NOACCESS, SPR_NOACCESS, 1186 &spr_read_generic, &spr_write_generic, 1187 0x00000000); 1188 spr_register(env, SPR_BOOKE_IVPR, "IVPR", 1189 SPR_NOACCESS, SPR_NOACCESS, 1190 &spr_read_generic, &spr_write_excp_prefix, 1191 0x00000000); 1192 /* Exception vectors */ 1193 for (i = 0; i < 64; i++) { 1194 if (ivor_mask & (1ULL << i)) { 1195 if (ivor_sprn[i] == SPR_BOOKE_IVORxx) { 1196 fprintf(stderr, "ERROR: IVOR %d SPR is not defined\n", i); 1197 exit(1); 1198 } 1199 spr_register(env, ivor_sprn[i], ivor_names[i], 1200 SPR_NOACCESS, SPR_NOACCESS, 1201 &spr_read_generic, &spr_write_excp_vector, 1202 0x00000000); 1203 } 1204 } 1205 spr_register(env, SPR_BOOKE_PID, "PID", 1206 SPR_NOACCESS, SPR_NOACCESS, 1207 &spr_read_generic, &spr_write_booke_pid, 1208 0x00000000); 1209 spr_register(env, SPR_BOOKE_TCR, "TCR", 1210 SPR_NOACCESS, SPR_NOACCESS, 1211 &spr_read_generic, &spr_write_booke_tcr, 1212 0x00000000); 1213 spr_register(env, SPR_BOOKE_TSR, "TSR", 1214 SPR_NOACCESS, SPR_NOACCESS, 1215 &spr_read_generic, &spr_write_booke_tsr, 1216 0x00000000); 1217 /* Timer */ 1218 spr_register(env, SPR_DECR, "DECR", 1219 SPR_NOACCESS, SPR_NOACCESS, 1220 &spr_read_decr, &spr_write_decr, 1221 0x00000000); 1222 spr_register(env, SPR_BOOKE_DECAR, "DECAR", 1223 SPR_NOACCESS, SPR_NOACCESS, 1224 SPR_NOACCESS, &spr_write_generic, 1225 0x00000000); 1226 /* SPRGs */ 1227 spr_register(env, SPR_USPRG0, "USPRG0", 1228 &spr_read_generic, &spr_write_generic, 1229 &spr_read_generic, &spr_write_generic, 1230 0x00000000); 1231 spr_register(env, SPR_SPRG4, "SPRG4", 1232 SPR_NOACCESS, SPR_NOACCESS, 1233 &spr_read_generic, &spr_write_generic, 1234 0x00000000); 1235 spr_register(env, SPR_SPRG5, "SPRG5", 1236 SPR_NOACCESS, SPR_NOACCESS, 1237 &spr_read_generic, &spr_write_generic, 1238 0x00000000); 1239 spr_register(env, SPR_SPRG6, "SPRG6", 1240 SPR_NOACCESS, SPR_NOACCESS, 1241 &spr_read_generic, &spr_write_generic, 1242 0x00000000); 1243 spr_register(env, SPR_SPRG7, "SPRG7", 1244 SPR_NOACCESS, SPR_NOACCESS, 1245 &spr_read_generic, &spr_write_generic, 1246 0x00000000); 1247 spr_register(env, SPR_BOOKE_SPRG8, "SPRG8", 1248 SPR_NOACCESS, SPR_NOACCESS, 1249 &spr_read_generic, &spr_write_generic, 1250 0x00000000); 1251 spr_register(env, SPR_BOOKE_SPRG9, "SPRG9", 1252 SPR_NOACCESS, SPR_NOACCESS, 1253 &spr_read_generic, &spr_write_generic, 1254 0x00000000); 1255 } 1256 1257 #if !defined(CONFIG_USER_ONLY) 1258 static inline uint32_t register_tlbncfg(uint32_t assoc, uint32_t minsize, 1259 uint32_t maxsize, uint32_t flags, 1260 uint32_t nentries) 1261 { 1262 return (assoc << TLBnCFG_ASSOC_SHIFT) | 1263 (minsize << TLBnCFG_MINSIZE_SHIFT) | 1264 (maxsize << TLBnCFG_MAXSIZE_SHIFT) | 1265 flags | nentries; 1266 } 1267 #endif /* !CONFIG_USER_ONLY */ 1268 1269 /* BookE 2.06 storage control registers */ 1270 static void register_BookE206_sprs(CPUPPCState *env, uint32_t mas_mask, 1271 uint32_t *tlbncfg, uint32_t mmucfg) 1272 { 1273 #if !defined(CONFIG_USER_ONLY) 1274 const char *mas_names[8] = { 1275 "MAS0", "MAS1", "MAS2", "MAS3", "MAS4", "MAS5", "MAS6", "MAS7", 1276 }; 1277 int mas_sprn[8] = { 1278 SPR_BOOKE_MAS0, SPR_BOOKE_MAS1, SPR_BOOKE_MAS2, SPR_BOOKE_MAS3, 1279 SPR_BOOKE_MAS4, SPR_BOOKE_MAS5, SPR_BOOKE_MAS6, SPR_BOOKE_MAS7, 1280 }; 1281 int i; 1282 1283 /* TLB assist registers */ 1284 for (i = 0; i < 8; i++) { 1285 if (mas_mask & (1 << i)) { 1286 spr_register(env, mas_sprn[i], mas_names[i], 1287 SPR_NOACCESS, SPR_NOACCESS, 1288 &spr_read_generic, 1289 (i == 2 && (env->insns_flags & PPC_64B)) 1290 ? &spr_write_generic : &spr_write_generic32, 1291 0x00000000); 1292 } 1293 } 1294 if (env->nb_pids > 1) { 1295 spr_register(env, SPR_BOOKE_PID1, "PID1", 1296 SPR_NOACCESS, SPR_NOACCESS, 1297 &spr_read_generic, &spr_write_booke_pid, 1298 0x00000000); 1299 } 1300 if (env->nb_pids > 2) { 1301 spr_register(env, SPR_BOOKE_PID2, "PID2", 1302 SPR_NOACCESS, SPR_NOACCESS, 1303 &spr_read_generic, &spr_write_booke_pid, 1304 0x00000000); 1305 } 1306 1307 spr_register(env, SPR_BOOKE_EPLC, "EPLC", 1308 SPR_NOACCESS, SPR_NOACCESS, 1309 &spr_read_generic, &spr_write_eplc, 1310 0x00000000); 1311 spr_register(env, SPR_BOOKE_EPSC, "EPSC", 1312 SPR_NOACCESS, SPR_NOACCESS, 1313 &spr_read_generic, &spr_write_epsc, 1314 0x00000000); 1315 1316 spr_register(env, SPR_MMUCFG, "MMUCFG", 1317 SPR_NOACCESS, SPR_NOACCESS, 1318 &spr_read_generic, SPR_NOACCESS, 1319 mmucfg); 1320 switch (env->nb_ways) { 1321 case 4: 1322 spr_register(env, SPR_BOOKE_TLB3CFG, "TLB3CFG", 1323 SPR_NOACCESS, SPR_NOACCESS, 1324 &spr_read_generic, SPR_NOACCESS, 1325 tlbncfg[3]); 1326 /* Fallthru */ 1327 case 3: 1328 spr_register(env, SPR_BOOKE_TLB2CFG, "TLB2CFG", 1329 SPR_NOACCESS, SPR_NOACCESS, 1330 &spr_read_generic, SPR_NOACCESS, 1331 tlbncfg[2]); 1332 /* Fallthru */ 1333 case 2: 1334 spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG", 1335 SPR_NOACCESS, SPR_NOACCESS, 1336 &spr_read_generic, SPR_NOACCESS, 1337 tlbncfg[1]); 1338 /* Fallthru */ 1339 case 1: 1340 spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG", 1341 SPR_NOACCESS, SPR_NOACCESS, 1342 &spr_read_generic, SPR_NOACCESS, 1343 tlbncfg[0]); 1344 /* Fallthru */ 1345 case 0: 1346 default: 1347 break; 1348 } 1349 #endif 1350 } 1351 1352 /* SPR specific to PowerPC 440 implementation */ 1353 static void register_440_sprs(CPUPPCState *env) 1354 { 1355 /* Cache control */ 1356 spr_register(env, SPR_440_DNV0, "DNV0", 1357 SPR_NOACCESS, SPR_NOACCESS, 1358 &spr_read_generic, &spr_write_generic, 1359 0x00000000); 1360 1361 spr_register(env, SPR_440_DNV1, "DNV1", 1362 SPR_NOACCESS, SPR_NOACCESS, 1363 &spr_read_generic, &spr_write_generic, 1364 0x00000000); 1365 1366 spr_register(env, SPR_440_DNV2, "DNV2", 1367 SPR_NOACCESS, SPR_NOACCESS, 1368 &spr_read_generic, &spr_write_generic, 1369 0x00000000); 1370 1371 spr_register(env, SPR_440_DNV3, "DNV3", 1372 SPR_NOACCESS, SPR_NOACCESS, 1373 &spr_read_generic, &spr_write_generic, 1374 0x00000000); 1375 1376 spr_register(env, SPR_440_DTV0, "DTV0", 1377 SPR_NOACCESS, SPR_NOACCESS, 1378 &spr_read_generic, &spr_write_generic, 1379 0x00000000); 1380 1381 spr_register(env, SPR_440_DTV1, "DTV1", 1382 SPR_NOACCESS, SPR_NOACCESS, 1383 &spr_read_generic, &spr_write_generic, 1384 0x00000000); 1385 1386 spr_register(env, SPR_440_DTV2, "DTV2", 1387 SPR_NOACCESS, SPR_NOACCESS, 1388 &spr_read_generic, &spr_write_generic, 1389 0x00000000); 1390 1391 spr_register(env, SPR_440_DTV3, "DTV3", 1392 SPR_NOACCESS, SPR_NOACCESS, 1393 &spr_read_generic, &spr_write_generic, 1394 0x00000000); 1395 1396 spr_register(env, SPR_440_DVLIM, "DVLIM", 1397 SPR_NOACCESS, SPR_NOACCESS, 1398 &spr_read_generic, &spr_write_generic, 1399 0x00000000); 1400 1401 spr_register(env, SPR_440_INV0, "INV0", 1402 SPR_NOACCESS, SPR_NOACCESS, 1403 &spr_read_generic, &spr_write_generic, 1404 0x00000000); 1405 1406 spr_register(env, SPR_440_INV1, "INV1", 1407 SPR_NOACCESS, SPR_NOACCESS, 1408 &spr_read_generic, &spr_write_generic, 1409 0x00000000); 1410 1411 spr_register(env, SPR_440_INV2, "INV2", 1412 SPR_NOACCESS, SPR_NOACCESS, 1413 &spr_read_generic, &spr_write_generic, 1414 0x00000000); 1415 1416 spr_register(env, SPR_440_INV3, "INV3", 1417 SPR_NOACCESS, SPR_NOACCESS, 1418 &spr_read_generic, &spr_write_generic, 1419 0x00000000); 1420 1421 spr_register(env, SPR_440_ITV0, "ITV0", 1422 SPR_NOACCESS, SPR_NOACCESS, 1423 &spr_read_generic, &spr_write_generic, 1424 0x00000000); 1425 1426 spr_register(env, SPR_440_ITV1, "ITV1", 1427 SPR_NOACCESS, SPR_NOACCESS, 1428 &spr_read_generic, &spr_write_generic, 1429 0x00000000); 1430 1431 spr_register(env, SPR_440_ITV2, "ITV2", 1432 SPR_NOACCESS, SPR_NOACCESS, 1433 &spr_read_generic, &spr_write_generic, 1434 0x00000000); 1435 1436 spr_register(env, SPR_440_ITV3, "ITV3", 1437 SPR_NOACCESS, SPR_NOACCESS, 1438 &spr_read_generic, &spr_write_generic, 1439 0x00000000); 1440 1441 spr_register(env, SPR_440_IVLIM, "IVLIM", 1442 SPR_NOACCESS, SPR_NOACCESS, 1443 &spr_read_generic, &spr_write_generic, 1444 0x00000000); 1445 /* Cache debug */ 1446 spr_register(env, SPR_BOOKE_DCDBTRH, "DCDBTRH", 1447 SPR_NOACCESS, SPR_NOACCESS, 1448 &spr_read_generic, SPR_NOACCESS, 1449 0x00000000); 1450 1451 spr_register(env, SPR_BOOKE_DCDBTRL, "DCDBTRL", 1452 SPR_NOACCESS, SPR_NOACCESS, 1453 &spr_read_generic, SPR_NOACCESS, 1454 0x00000000); 1455 1456 spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR", 1457 SPR_NOACCESS, SPR_NOACCESS, 1458 &spr_read_generic, SPR_NOACCESS, 1459 0x00000000); 1460 1461 spr_register(env, SPR_BOOKE_ICDBTRH, "ICDBTRH", 1462 SPR_NOACCESS, SPR_NOACCESS, 1463 &spr_read_generic, SPR_NOACCESS, 1464 0x00000000); 1465 1466 spr_register(env, SPR_BOOKE_ICDBTRL, "ICDBTRL", 1467 SPR_NOACCESS, SPR_NOACCESS, 1468 &spr_read_generic, SPR_NOACCESS, 1469 0x00000000); 1470 1471 spr_register(env, SPR_440_DBDR, "DBDR", 1472 SPR_NOACCESS, SPR_NOACCESS, 1473 &spr_read_generic, &spr_write_generic, 1474 0x00000000); 1475 /* Processor control */ 1476 spr_register(env, SPR_4xx_CCR0, "CCR0", 1477 SPR_NOACCESS, SPR_NOACCESS, 1478 &spr_read_generic, &spr_write_generic, 1479 0x00000000); 1480 spr_register(env, SPR_440_RSTCFG, "RSTCFG", 1481 SPR_NOACCESS, SPR_NOACCESS, 1482 &spr_read_generic, SPR_NOACCESS, 1483 0x00000000); 1484 /* Storage control */ 1485 spr_register(env, SPR_440_MMUCR, "MMUCR", 1486 SPR_NOACCESS, SPR_NOACCESS, 1487 &spr_read_generic, &spr_write_generic, 1488 0x00000000); 1489 1490 /* Processor identification */ 1491 spr_register(env, SPR_BOOKE_PIR, "PIR", 1492 SPR_NOACCESS, SPR_NOACCESS, 1493 &spr_read_generic, &spr_write_pir, 1494 0x00000000); 1495 1496 spr_register(env, SPR_BOOKE_IAC3, "IAC3", 1497 SPR_NOACCESS, SPR_NOACCESS, 1498 &spr_read_generic, &spr_write_generic, 1499 0x00000000); 1500 1501 spr_register(env, SPR_BOOKE_IAC4, "IAC4", 1502 SPR_NOACCESS, SPR_NOACCESS, 1503 &spr_read_generic, &spr_write_generic, 1504 0x00000000); 1505 1506 spr_register(env, SPR_BOOKE_DVC1, "DVC1", 1507 SPR_NOACCESS, SPR_NOACCESS, 1508 &spr_read_generic, &spr_write_generic, 1509 0x00000000); 1510 1511 spr_register(env, SPR_BOOKE_DVC2, "DVC2", 1512 SPR_NOACCESS, SPR_NOACCESS, 1513 &spr_read_generic, &spr_write_generic, 1514 0x00000000); 1515 } 1516 1517 /* SPR shared between PowerPC 40x implementations */ 1518 static void register_40x_sprs(CPUPPCState *env) 1519 { 1520 /* Cache */ 1521 /* not emulated, as QEMU do not emulate caches */ 1522 spr_register(env, SPR_40x_DCCR, "DCCR", 1523 SPR_NOACCESS, SPR_NOACCESS, 1524 &spr_read_generic, &spr_write_generic, 1525 0x00000000); 1526 /* not emulated, as QEMU do not emulate caches */ 1527 spr_register(env, SPR_40x_ICCR, "ICCR", 1528 SPR_NOACCESS, SPR_NOACCESS, 1529 &spr_read_generic, &spr_write_generic, 1530 0x00000000); 1531 /* not emulated, as QEMU do not emulate caches */ 1532 spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR", 1533 SPR_NOACCESS, SPR_NOACCESS, 1534 &spr_read_generic, SPR_NOACCESS, 1535 0x00000000); 1536 /* Exception */ 1537 spr_register(env, SPR_40x_DEAR, "DEAR", 1538 SPR_NOACCESS, SPR_NOACCESS, 1539 &spr_read_generic, &spr_write_generic, 1540 0x00000000); 1541 spr_register(env, SPR_40x_ESR, "ESR", 1542 SPR_NOACCESS, SPR_NOACCESS, 1543 &spr_read_generic, &spr_write_generic, 1544 0x00000000); 1545 spr_register(env, SPR_40x_EVPR, "EVPR", 1546 SPR_NOACCESS, SPR_NOACCESS, 1547 &spr_read_generic, &spr_write_excp_prefix, 1548 0x00000000); 1549 spr_register(env, SPR_40x_SRR2, "SRR2", 1550 &spr_read_generic, &spr_write_generic, 1551 &spr_read_generic, &spr_write_generic, 1552 0x00000000); 1553 spr_register(env, SPR_40x_SRR3, "SRR3", 1554 &spr_read_generic, &spr_write_generic, 1555 &spr_read_generic, &spr_write_generic, 1556 0x00000000); 1557 /* Timers */ 1558 spr_register(env, SPR_40x_PIT, "PIT", 1559 SPR_NOACCESS, SPR_NOACCESS, 1560 &spr_read_40x_pit, &spr_write_40x_pit, 1561 0x00000000); 1562 spr_register(env, SPR_40x_TCR, "TCR", 1563 SPR_NOACCESS, SPR_NOACCESS, 1564 &spr_read_generic, &spr_write_40x_tcr, 1565 0x00000000); 1566 spr_register(env, SPR_40x_TSR, "TSR", 1567 SPR_NOACCESS, SPR_NOACCESS, 1568 &spr_read_generic, &spr_write_40x_tsr, 1569 0x00000000); 1570 } 1571 1572 /* SPR specific to PowerPC 405 implementation */ 1573 static void register_405_sprs(CPUPPCState *env) 1574 { 1575 /* MMU */ 1576 spr_register(env, SPR_40x_PID, "PID", 1577 SPR_NOACCESS, SPR_NOACCESS, 1578 &spr_read_generic, &spr_write_40x_pid, 1579 0x00000000); 1580 spr_register(env, SPR_4xx_CCR0, "CCR0", 1581 SPR_NOACCESS, SPR_NOACCESS, 1582 &spr_read_generic, &spr_write_generic, 1583 0x00700000); 1584 /* Debug interface */ 1585 spr_register(env, SPR_40x_DBCR0, "DBCR0", 1586 SPR_NOACCESS, SPR_NOACCESS, 1587 &spr_read_generic, &spr_write_40x_dbcr0, 1588 0x00000000); 1589 1590 spr_register(env, SPR_405_DBCR1, "DBCR1", 1591 SPR_NOACCESS, SPR_NOACCESS, 1592 &spr_read_generic, &spr_write_generic, 1593 0x00000000); 1594 1595 spr_register(env, SPR_40x_DBSR, "DBSR", 1596 SPR_NOACCESS, SPR_NOACCESS, 1597 &spr_read_generic, &spr_write_clear, 1598 /* Last reset was system reset */ 1599 0x00000300); 1600 1601 spr_register(env, SPR_40x_DAC1, "DAC1", 1602 SPR_NOACCESS, SPR_NOACCESS, 1603 &spr_read_generic, &spr_write_generic, 1604 0x00000000); 1605 spr_register(env, SPR_40x_DAC2, "DAC2", 1606 SPR_NOACCESS, SPR_NOACCESS, 1607 &spr_read_generic, &spr_write_generic, 1608 0x00000000); 1609 1610 spr_register(env, SPR_405_DVC1, "DVC1", 1611 SPR_NOACCESS, SPR_NOACCESS, 1612 &spr_read_generic, &spr_write_generic, 1613 0x00000000); 1614 1615 spr_register(env, SPR_405_DVC2, "DVC2", 1616 SPR_NOACCESS, SPR_NOACCESS, 1617 &spr_read_generic, &spr_write_generic, 1618 0x00000000); 1619 1620 spr_register(env, SPR_40x_IAC1, "IAC1", 1621 SPR_NOACCESS, SPR_NOACCESS, 1622 &spr_read_generic, &spr_write_generic, 1623 0x00000000); 1624 spr_register(env, SPR_40x_IAC2, "IAC2", 1625 SPR_NOACCESS, SPR_NOACCESS, 1626 &spr_read_generic, &spr_write_generic, 1627 0x00000000); 1628 1629 spr_register(env, SPR_405_IAC3, "IAC3", 1630 SPR_NOACCESS, SPR_NOACCESS, 1631 &spr_read_generic, &spr_write_generic, 1632 0x00000000); 1633 1634 spr_register(env, SPR_405_IAC4, "IAC4", 1635 SPR_NOACCESS, SPR_NOACCESS, 1636 &spr_read_generic, &spr_write_generic, 1637 0x00000000); 1638 /* Storage control */ 1639 spr_register(env, SPR_405_SLER, "SLER", 1640 SPR_NOACCESS, SPR_NOACCESS, 1641 &spr_read_generic, &spr_write_40x_sler, 1642 0x00000000); 1643 spr_register(env, SPR_40x_ZPR, "ZPR", 1644 SPR_NOACCESS, SPR_NOACCESS, 1645 &spr_read_generic, &spr_write_generic, 1646 0x00000000); 1647 1648 spr_register(env, SPR_405_SU0R, "SU0R", 1649 SPR_NOACCESS, SPR_NOACCESS, 1650 &spr_read_generic, &spr_write_generic, 1651 0x00000000); 1652 /* SPRG */ 1653 spr_register(env, SPR_USPRG0, "USPRG0", 1654 &spr_read_ureg, SPR_NOACCESS, 1655 &spr_read_ureg, SPR_NOACCESS, 1656 0x00000000); 1657 spr_register(env, SPR_SPRG4, "SPRG4", 1658 SPR_NOACCESS, SPR_NOACCESS, 1659 &spr_read_generic, &spr_write_generic, 1660 0x00000000); 1661 spr_register(env, SPR_SPRG5, "SPRG5", 1662 SPR_NOACCESS, SPR_NOACCESS, 1663 spr_read_generic, &spr_write_generic, 1664 0x00000000); 1665 spr_register(env, SPR_SPRG6, "SPRG6", 1666 SPR_NOACCESS, SPR_NOACCESS, 1667 spr_read_generic, &spr_write_generic, 1668 0x00000000); 1669 spr_register(env, SPR_SPRG7, "SPRG7", 1670 SPR_NOACCESS, SPR_NOACCESS, 1671 spr_read_generic, &spr_write_generic, 1672 0x00000000); 1673 1674 /* Bus access control */ 1675 /* not emulated, as QEMU never does speculative access */ 1676 spr_register(env, SPR_40x_SGR, "SGR", 1677 SPR_NOACCESS, SPR_NOACCESS, 1678 &spr_read_generic, &spr_write_generic, 1679 0xFFFFFFFF); 1680 /* not emulated, as QEMU do not emulate caches */ 1681 spr_register(env, SPR_40x_DCWR, "DCWR", 1682 SPR_NOACCESS, SPR_NOACCESS, 1683 &spr_read_generic, &spr_write_generic, 1684 0x00000000); 1685 } 1686 1687 1688 static void register_5xx_8xx_sprs(CPUPPCState *env) 1689 { 1690 /* Exception processing */ 1691 spr_register_kvm(env, SPR_DSISR, "DSISR", 1692 SPR_NOACCESS, SPR_NOACCESS, 1693 &spr_read_generic, &spr_write_generic, 1694 KVM_REG_PPC_DSISR, 0x00000000); 1695 spr_register_kvm(env, SPR_DAR, "DAR", 1696 SPR_NOACCESS, SPR_NOACCESS, 1697 &spr_read_generic, &spr_write_generic, 1698 KVM_REG_PPC_DAR, 0x00000000); 1699 /* Timer */ 1700 spr_register(env, SPR_DECR, "DECR", 1701 SPR_NOACCESS, SPR_NOACCESS, 1702 &spr_read_decr, &spr_write_decr, 1703 0x00000000); 1704 1705 spr_register(env, SPR_MPC_EIE, "EIE", 1706 SPR_NOACCESS, SPR_NOACCESS, 1707 &spr_read_generic, &spr_write_generic, 1708 0x00000000); 1709 1710 spr_register(env, SPR_MPC_EID, "EID", 1711 SPR_NOACCESS, SPR_NOACCESS, 1712 &spr_read_generic, &spr_write_generic, 1713 0x00000000); 1714 1715 spr_register(env, SPR_MPC_NRI, "NRI", 1716 SPR_NOACCESS, SPR_NOACCESS, 1717 &spr_read_generic, &spr_write_generic, 1718 0x00000000); 1719 1720 spr_register(env, SPR_MPC_CMPA, "CMPA", 1721 SPR_NOACCESS, SPR_NOACCESS, 1722 &spr_read_generic, &spr_write_generic, 1723 0x00000000); 1724 1725 spr_register(env, SPR_MPC_CMPB, "CMPB", 1726 SPR_NOACCESS, SPR_NOACCESS, 1727 &spr_read_generic, &spr_write_generic, 1728 0x00000000); 1729 1730 spr_register(env, SPR_MPC_CMPC, "CMPC", 1731 SPR_NOACCESS, SPR_NOACCESS, 1732 &spr_read_generic, &spr_write_generic, 1733 0x00000000); 1734 1735 spr_register(env, SPR_MPC_CMPD, "CMPD", 1736 SPR_NOACCESS, SPR_NOACCESS, 1737 &spr_read_generic, &spr_write_generic, 1738 0x00000000); 1739 1740 spr_register(env, SPR_MPC_ECR, "ECR", 1741 SPR_NOACCESS, SPR_NOACCESS, 1742 &spr_read_generic, &spr_write_generic, 1743 0x00000000); 1744 1745 spr_register(env, SPR_MPC_DER, "DER", 1746 SPR_NOACCESS, SPR_NOACCESS, 1747 &spr_read_generic, &spr_write_generic, 1748 0x00000000); 1749 1750 spr_register(env, SPR_MPC_COUNTA, "COUNTA", 1751 SPR_NOACCESS, SPR_NOACCESS, 1752 &spr_read_generic, &spr_write_generic, 1753 0x00000000); 1754 1755 spr_register(env, SPR_MPC_COUNTB, "COUNTB", 1756 SPR_NOACCESS, SPR_NOACCESS, 1757 &spr_read_generic, &spr_write_generic, 1758 0x00000000); 1759 1760 spr_register(env, SPR_MPC_CMPE, "CMPE", 1761 SPR_NOACCESS, SPR_NOACCESS, 1762 &spr_read_generic, &spr_write_generic, 1763 0x00000000); 1764 1765 spr_register(env, SPR_MPC_CMPF, "CMPF", 1766 SPR_NOACCESS, SPR_NOACCESS, 1767 &spr_read_generic, &spr_write_generic, 1768 0x00000000); 1769 1770 spr_register(env, SPR_MPC_CMPG, "CMPG", 1771 SPR_NOACCESS, SPR_NOACCESS, 1772 &spr_read_generic, &spr_write_generic, 1773 0x00000000); 1774 1775 spr_register(env, SPR_MPC_CMPH, "CMPH", 1776 SPR_NOACCESS, SPR_NOACCESS, 1777 &spr_read_generic, &spr_write_generic, 1778 0x00000000); 1779 1780 spr_register(env, SPR_MPC_LCTRL1, "LCTRL1", 1781 SPR_NOACCESS, SPR_NOACCESS, 1782 &spr_read_generic, &spr_write_generic, 1783 0x00000000); 1784 1785 spr_register(env, SPR_MPC_LCTRL2, "LCTRL2", 1786 SPR_NOACCESS, SPR_NOACCESS, 1787 &spr_read_generic, &spr_write_generic, 1788 0x00000000); 1789 1790 spr_register(env, SPR_MPC_BAR, "BAR", 1791 SPR_NOACCESS, SPR_NOACCESS, 1792 &spr_read_generic, &spr_write_generic, 1793 0x00000000); 1794 1795 spr_register(env, SPR_MPC_DPDR, "DPDR", 1796 SPR_NOACCESS, SPR_NOACCESS, 1797 &spr_read_generic, &spr_write_generic, 1798 0x00000000); 1799 1800 spr_register(env, SPR_MPC_IMMR, "IMMR", 1801 SPR_NOACCESS, SPR_NOACCESS, 1802 &spr_read_generic, &spr_write_generic, 1803 0x00000000); 1804 } 1805 1806 static void register_5xx_sprs(CPUPPCState *env) 1807 { 1808 spr_register(env, SPR_RCPU_MI_GRA, "MI_GRA", 1809 SPR_NOACCESS, SPR_NOACCESS, 1810 &spr_read_generic, &spr_write_generic, 1811 0x00000000); 1812 1813 spr_register(env, SPR_RCPU_L2U_GRA, "L2U_GRA", 1814 SPR_NOACCESS, SPR_NOACCESS, 1815 &spr_read_generic, &spr_write_generic, 1816 0x00000000); 1817 1818 spr_register(env, SPR_RPCU_BBCMCR, "L2U_BBCMCR", 1819 SPR_NOACCESS, SPR_NOACCESS, 1820 &spr_read_generic, &spr_write_generic, 1821 0x00000000); 1822 1823 spr_register(env, SPR_RCPU_L2U_MCR, "L2U_MCR", 1824 SPR_NOACCESS, SPR_NOACCESS, 1825 &spr_read_generic, &spr_write_generic, 1826 0x00000000); 1827 1828 spr_register(env, SPR_RCPU_MI_RBA0, "MI_RBA0", 1829 SPR_NOACCESS, SPR_NOACCESS, 1830 &spr_read_generic, &spr_write_generic, 1831 0x00000000); 1832 1833 spr_register(env, SPR_RCPU_MI_RBA1, "MI_RBA1", 1834 SPR_NOACCESS, SPR_NOACCESS, 1835 &spr_read_generic, &spr_write_generic, 1836 0x00000000); 1837 1838 spr_register(env, SPR_RCPU_MI_RBA2, "MI_RBA2", 1839 SPR_NOACCESS, SPR_NOACCESS, 1840 &spr_read_generic, &spr_write_generic, 1841 0x00000000); 1842 1843 spr_register(env, SPR_RCPU_MI_RBA3, "MI_RBA3", 1844 SPR_NOACCESS, SPR_NOACCESS, 1845 &spr_read_generic, &spr_write_generic, 1846 0x00000000); 1847 1848 spr_register(env, SPR_RCPU_L2U_RBA0, "L2U_RBA0", 1849 SPR_NOACCESS, SPR_NOACCESS, 1850 &spr_read_generic, &spr_write_generic, 1851 0x00000000); 1852 1853 spr_register(env, SPR_RCPU_L2U_RBA1, "L2U_RBA1", 1854 SPR_NOACCESS, SPR_NOACCESS, 1855 &spr_read_generic, &spr_write_generic, 1856 0x00000000); 1857 1858 spr_register(env, SPR_RCPU_L2U_RBA2, "L2U_RBA2", 1859 SPR_NOACCESS, SPR_NOACCESS, 1860 &spr_read_generic, &spr_write_generic, 1861 0x00000000); 1862 1863 spr_register(env, SPR_RCPU_L2U_RBA3, "L2U_RBA3", 1864 SPR_NOACCESS, SPR_NOACCESS, 1865 &spr_read_generic, &spr_write_generic, 1866 0x00000000); 1867 1868 spr_register(env, SPR_RCPU_MI_RA0, "MI_RA0", 1869 SPR_NOACCESS, SPR_NOACCESS, 1870 &spr_read_generic, &spr_write_generic, 1871 0x00000000); 1872 1873 spr_register(env, SPR_RCPU_MI_RA1, "MI_RA1", 1874 SPR_NOACCESS, SPR_NOACCESS, 1875 &spr_read_generic, &spr_write_generic, 1876 0x00000000); 1877 1878 spr_register(env, SPR_RCPU_MI_RA2, "MI_RA2", 1879 SPR_NOACCESS, SPR_NOACCESS, 1880 &spr_read_generic, &spr_write_generic, 1881 0x00000000); 1882 1883 spr_register(env, SPR_RCPU_MI_RA3, "MI_RA3", 1884 SPR_NOACCESS, SPR_NOACCESS, 1885 &spr_read_generic, &spr_write_generic, 1886 0x00000000); 1887 1888 spr_register(env, SPR_RCPU_L2U_RA0, "L2U_RA0", 1889 SPR_NOACCESS, SPR_NOACCESS, 1890 &spr_read_generic, &spr_write_generic, 1891 0x00000000); 1892 1893 spr_register(env, SPR_RCPU_L2U_RA1, "L2U_RA1", 1894 SPR_NOACCESS, SPR_NOACCESS, 1895 &spr_read_generic, &spr_write_generic, 1896 0x00000000); 1897 1898 spr_register(env, SPR_RCPU_L2U_RA2, "L2U_RA2", 1899 SPR_NOACCESS, SPR_NOACCESS, 1900 &spr_read_generic, &spr_write_generic, 1901 0x00000000); 1902 1903 spr_register(env, SPR_RCPU_L2U_RA3, "L2U_RA3", 1904 SPR_NOACCESS, SPR_NOACCESS, 1905 &spr_read_generic, &spr_write_generic, 1906 0x00000000); 1907 1908 spr_register(env, SPR_RCPU_FPECR, "FPECR", 1909 SPR_NOACCESS, SPR_NOACCESS, 1910 &spr_read_generic, &spr_write_generic, 1911 0x00000000); 1912 } 1913 1914 static void register_8xx_sprs(CPUPPCState *env) 1915 { 1916 1917 spr_register(env, SPR_MPC_IC_CST, "IC_CST", 1918 SPR_NOACCESS, SPR_NOACCESS, 1919 &spr_read_generic, &spr_write_generic, 1920 0x00000000); 1921 1922 spr_register(env, SPR_MPC_IC_ADR, "IC_ADR", 1923 SPR_NOACCESS, SPR_NOACCESS, 1924 &spr_read_generic, &spr_write_generic, 1925 0x00000000); 1926 1927 spr_register(env, SPR_MPC_IC_DAT, "IC_DAT", 1928 SPR_NOACCESS, SPR_NOACCESS, 1929 &spr_read_generic, &spr_write_generic, 1930 0x00000000); 1931 1932 spr_register(env, SPR_MPC_DC_CST, "DC_CST", 1933 SPR_NOACCESS, SPR_NOACCESS, 1934 &spr_read_generic, &spr_write_generic, 1935 0x00000000); 1936 1937 spr_register(env, SPR_MPC_DC_ADR, "DC_ADR", 1938 SPR_NOACCESS, SPR_NOACCESS, 1939 &spr_read_generic, &spr_write_generic, 1940 0x00000000); 1941 1942 spr_register(env, SPR_MPC_DC_DAT, "DC_DAT", 1943 SPR_NOACCESS, SPR_NOACCESS, 1944 &spr_read_generic, &spr_write_generic, 1945 0x00000000); 1946 1947 spr_register(env, SPR_MPC_MI_CTR, "MI_CTR", 1948 SPR_NOACCESS, SPR_NOACCESS, 1949 &spr_read_generic, &spr_write_generic, 1950 0x00000000); 1951 1952 spr_register(env, SPR_MPC_MI_AP, "MI_AP", 1953 SPR_NOACCESS, SPR_NOACCESS, 1954 &spr_read_generic, &spr_write_generic, 1955 0x00000000); 1956 1957 spr_register(env, SPR_MPC_MI_EPN, "MI_EPN", 1958 SPR_NOACCESS, SPR_NOACCESS, 1959 &spr_read_generic, &spr_write_generic, 1960 0x00000000); 1961 1962 spr_register(env, SPR_MPC_MI_TWC, "MI_TWC", 1963 SPR_NOACCESS, SPR_NOACCESS, 1964 &spr_read_generic, &spr_write_generic, 1965 0x00000000); 1966 1967 spr_register(env, SPR_MPC_MI_RPN, "MI_RPN", 1968 SPR_NOACCESS, SPR_NOACCESS, 1969 &spr_read_generic, &spr_write_generic, 1970 0x00000000); 1971 1972 spr_register(env, SPR_MPC_MI_DBCAM, "MI_DBCAM", 1973 SPR_NOACCESS, SPR_NOACCESS, 1974 &spr_read_generic, &spr_write_generic, 1975 0x00000000); 1976 1977 spr_register(env, SPR_MPC_MI_DBRAM0, "MI_DBRAM0", 1978 SPR_NOACCESS, SPR_NOACCESS, 1979 &spr_read_generic, &spr_write_generic, 1980 0x00000000); 1981 1982 spr_register(env, SPR_MPC_MI_DBRAM1, "MI_DBRAM1", 1983 SPR_NOACCESS, SPR_NOACCESS, 1984 &spr_read_generic, &spr_write_generic, 1985 0x00000000); 1986 1987 spr_register(env, SPR_MPC_MD_CTR, "MD_CTR", 1988 SPR_NOACCESS, SPR_NOACCESS, 1989 &spr_read_generic, &spr_write_generic, 1990 0x00000000); 1991 1992 spr_register(env, SPR_MPC_MD_CASID, "MD_CASID", 1993 SPR_NOACCESS, SPR_NOACCESS, 1994 &spr_read_generic, &spr_write_generic, 1995 0x00000000); 1996 1997 spr_register(env, SPR_MPC_MD_AP, "MD_AP", 1998 SPR_NOACCESS, SPR_NOACCESS, 1999 &spr_read_generic, &spr_write_generic, 2000 0x00000000); 2001 2002 spr_register(env, SPR_MPC_MD_EPN, "MD_EPN", 2003 SPR_NOACCESS, SPR_NOACCESS, 2004 &spr_read_generic, &spr_write_generic, 2005 0x00000000); 2006 2007 spr_register(env, SPR_MPC_MD_TWB, "MD_TWB", 2008 SPR_NOACCESS, SPR_NOACCESS, 2009 &spr_read_generic, &spr_write_generic, 2010 0x00000000); 2011 2012 spr_register(env, SPR_MPC_MD_TWC, "MD_TWC", 2013 SPR_NOACCESS, SPR_NOACCESS, 2014 &spr_read_generic, &spr_write_generic, 2015 0x00000000); 2016 2017 spr_register(env, SPR_MPC_MD_RPN, "MD_RPN", 2018 SPR_NOACCESS, SPR_NOACCESS, 2019 &spr_read_generic, &spr_write_generic, 2020 0x00000000); 2021 2022 spr_register(env, SPR_MPC_MD_TW, "MD_TW", 2023 SPR_NOACCESS, SPR_NOACCESS, 2024 &spr_read_generic, &spr_write_generic, 2025 0x00000000); 2026 2027 spr_register(env, SPR_MPC_MD_DBCAM, "MD_DBCAM", 2028 SPR_NOACCESS, SPR_NOACCESS, 2029 &spr_read_generic, &spr_write_generic, 2030 0x00000000); 2031 2032 spr_register(env, SPR_MPC_MD_DBRAM0, "MD_DBRAM0", 2033 SPR_NOACCESS, SPR_NOACCESS, 2034 &spr_read_generic, &spr_write_generic, 2035 0x00000000); 2036 2037 spr_register(env, SPR_MPC_MD_DBRAM1, "MD_DBRAM1", 2038 SPR_NOACCESS, SPR_NOACCESS, 2039 &spr_read_generic, &spr_write_generic, 2040 0x00000000); 2041 } 2042 2043 /* 2044 * AMR => SPR 29 (Power 2.04) 2045 * CTRL => SPR 136 (Power 2.04) 2046 * CTRL => SPR 152 (Power 2.04) 2047 * SCOMC => SPR 276 (64 bits ?) 2048 * SCOMD => SPR 277 (64 bits ?) 2049 * TBU40 => SPR 286 (Power 2.04 hypv) 2050 * HSPRG0 => SPR 304 (Power 2.04 hypv) 2051 * HSPRG1 => SPR 305 (Power 2.04 hypv) 2052 * HDSISR => SPR 306 (Power 2.04 hypv) 2053 * HDAR => SPR 307 (Power 2.04 hypv) 2054 * PURR => SPR 309 (Power 2.04 hypv) 2055 * HDEC => SPR 310 (Power 2.04 hypv) 2056 * HIOR => SPR 311 (hypv) 2057 * RMOR => SPR 312 (970) 2058 * HRMOR => SPR 313 (Power 2.04 hypv) 2059 * HSRR0 => SPR 314 (Power 2.04 hypv) 2060 * HSRR1 => SPR 315 (Power 2.04 hypv) 2061 * LPIDR => SPR 317 (970) 2062 * EPR => SPR 702 (Power 2.04 emb) 2063 * perf => 768-783 (Power 2.04) 2064 * perf => 784-799 (Power 2.04) 2065 * PPR => SPR 896 (Power 2.04) 2066 * DABRX => 1015 (Power 2.04 hypv) 2067 * FPECR => SPR 1022 (?) 2068 * ... and more (thermal management, performance counters, ...) 2069 */ 2070 2071 /*****************************************************************************/ 2072 /* Exception vectors models */ 2073 static void init_excp_4xx_softmmu(CPUPPCState *env) 2074 { 2075 #if !defined(CONFIG_USER_ONLY) 2076 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100; 2077 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200; 2078 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300; 2079 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400; 2080 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500; 2081 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600; 2082 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700; 2083 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00; 2084 env->excp_vectors[POWERPC_EXCP_PIT] = 0x00001000; 2085 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00001010; 2086 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00001020; 2087 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00001100; 2088 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00001200; 2089 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00002000; 2090 env->ivor_mask = 0x0000FFF0UL; 2091 env->ivpr_mask = 0xFFFF0000UL; 2092 /* Hardware reset vector */ 2093 env->hreset_vector = 0xFFFFFFFCUL; 2094 #endif 2095 } 2096 2097 static void init_excp_MPC5xx(CPUPPCState *env) 2098 { 2099 #if !defined(CONFIG_USER_ONLY) 2100 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100; 2101 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200; 2102 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500; 2103 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600; 2104 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700; 2105 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800; 2106 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900; 2107 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00; 2108 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00; 2109 env->excp_vectors[POWERPC_EXCP_FPA] = 0x00000E00; 2110 env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001000; 2111 env->excp_vectors[POWERPC_EXCP_DABR] = 0x00001C00; 2112 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001C00; 2113 env->excp_vectors[POWERPC_EXCP_MEXTBR] = 0x00001E00; 2114 env->excp_vectors[POWERPC_EXCP_NMEXTBR] = 0x00001F00; 2115 env->ivor_mask = 0x0000FFF0UL; 2116 env->ivpr_mask = 0xFFFF0000UL; 2117 /* Hardware reset vector */ 2118 env->hreset_vector = 0x00000100UL; 2119 #endif 2120 } 2121 2122 static void init_excp_MPC8xx(CPUPPCState *env) 2123 { 2124 #if !defined(CONFIG_USER_ONLY) 2125 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100; 2126 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200; 2127 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300; 2128 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400; 2129 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500; 2130 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600; 2131 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700; 2132 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800; 2133 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900; 2134 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00; 2135 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00; 2136 env->excp_vectors[POWERPC_EXCP_FPA] = 0x00000E00; 2137 env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001000; 2138 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00001100; 2139 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00001200; 2140 env->excp_vectors[POWERPC_EXCP_ITLBE] = 0x00001300; 2141 env->excp_vectors[POWERPC_EXCP_DTLBE] = 0x00001400; 2142 env->excp_vectors[POWERPC_EXCP_DABR] = 0x00001C00; 2143 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001C00; 2144 env->excp_vectors[POWERPC_EXCP_MEXTBR] = 0x00001E00; 2145 env->excp_vectors[POWERPC_EXCP_NMEXTBR] = 0x00001F00; 2146 env->ivor_mask = 0x0000FFF0UL; 2147 env->ivpr_mask = 0xFFFF0000UL; 2148 /* Hardware reset vector */ 2149 env->hreset_vector = 0x00000100UL; 2150 #endif 2151 } 2152 2153 static void init_excp_G2(CPUPPCState *env) 2154 { 2155 #if !defined(CONFIG_USER_ONLY) 2156 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100; 2157 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200; 2158 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300; 2159 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400; 2160 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500; 2161 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600; 2162 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700; 2163 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800; 2164 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900; 2165 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000A00; 2166 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00; 2167 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00; 2168 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000; 2169 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100; 2170 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200; 2171 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; 2172 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400; 2173 /* Hardware reset vector */ 2174 env->hreset_vector = 0x00000100UL; 2175 #endif 2176 } 2177 2178 static void init_excp_e200(CPUPPCState *env, target_ulong ivpr_mask) 2179 { 2180 #if !defined(CONFIG_USER_ONLY) 2181 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000FFC; 2182 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000; 2183 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000000; 2184 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000000; 2185 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000000; 2186 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000; 2187 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000000; 2188 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000000; 2189 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000000; 2190 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000000; 2191 env->excp_vectors[POWERPC_EXCP_APU] = 0x00000000; 2192 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000000; 2193 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00000000; 2194 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00000000; 2195 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00000000; 2196 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00000000; 2197 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00000000; 2198 /* 2199 * These two are the same IVOR as POWERPC_EXCP_VPU and 2200 * POWERPC_EXCP_VPUA. We deal with that when dispatching at 2201 * powerpc_excp(). 2202 */ 2203 env->excp_vectors[POWERPC_EXCP_SPEU] = 0x00000000; 2204 env->excp_vectors[POWERPC_EXCP_EFPDI] = 0x00000000; 2205 2206 env->excp_vectors[POWERPC_EXCP_EFPRI] = 0x00000000; 2207 env->ivor_mask = 0x0000FFF7UL; 2208 env->ivpr_mask = ivpr_mask; 2209 /* Hardware reset vector */ 2210 env->hreset_vector = 0xFFFFFFFCUL; 2211 #endif 2212 } 2213 2214 static void init_excp_BookE(CPUPPCState *env) 2215 { 2216 #if !defined(CONFIG_USER_ONLY) 2217 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000; 2218 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000000; 2219 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000000; 2220 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000000; 2221 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000; 2222 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000000; 2223 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000000; 2224 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000000; 2225 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000000; 2226 env->excp_vectors[POWERPC_EXCP_APU] = 0x00000000; 2227 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000000; 2228 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00000000; 2229 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00000000; 2230 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00000000; 2231 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00000000; 2232 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00000000; 2233 env->ivor_mask = 0x0000FFF0UL; 2234 env->ivpr_mask = 0xFFFF0000UL; 2235 /* Hardware reset vector */ 2236 env->hreset_vector = 0xFFFFFFFCUL; 2237 #endif 2238 } 2239 2240 static void init_excp_603(CPUPPCState *env) 2241 { 2242 #if !defined(CONFIG_USER_ONLY) 2243 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100; 2244 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200; 2245 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300; 2246 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400; 2247 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500; 2248 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600; 2249 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700; 2250 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800; 2251 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900; 2252 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00; 2253 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00; 2254 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000; 2255 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100; 2256 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200; 2257 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; 2258 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400; 2259 /* Hardware reset vector */ 2260 env->hreset_vector = 0x00000100UL; 2261 #endif 2262 } 2263 2264 static void init_excp_604(CPUPPCState *env) 2265 { 2266 #if !defined(CONFIG_USER_ONLY) 2267 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100; 2268 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200; 2269 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300; 2270 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400; 2271 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500; 2272 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600; 2273 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700; 2274 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800; 2275 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900; 2276 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00; 2277 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00; 2278 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00; 2279 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; 2280 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400; 2281 /* Hardware reset vector */ 2282 env->hreset_vector = 0x00000100UL; 2283 #endif 2284 } 2285 2286 static void init_excp_7x0(CPUPPCState *env) 2287 { 2288 #if !defined(CONFIG_USER_ONLY) 2289 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100; 2290 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200; 2291 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300; 2292 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400; 2293 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500; 2294 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600; 2295 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700; 2296 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800; 2297 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900; 2298 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00; 2299 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00; 2300 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00; 2301 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; 2302 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400; 2303 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700; 2304 /* Hardware reset vector */ 2305 env->hreset_vector = 0x00000100UL; 2306 #endif 2307 } 2308 2309 static void init_excp_750cl(CPUPPCState *env) 2310 { 2311 #if !defined(CONFIG_USER_ONLY) 2312 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100; 2313 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200; 2314 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300; 2315 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400; 2316 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500; 2317 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600; 2318 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700; 2319 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800; 2320 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900; 2321 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00; 2322 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00; 2323 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00; 2324 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; 2325 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400; 2326 /* Hardware reset vector */ 2327 env->hreset_vector = 0x00000100UL; 2328 #endif 2329 } 2330 2331 static void init_excp_750cx(CPUPPCState *env) 2332 { 2333 #if !defined(CONFIG_USER_ONLY) 2334 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100; 2335 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200; 2336 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300; 2337 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400; 2338 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500; 2339 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600; 2340 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700; 2341 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800; 2342 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900; 2343 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00; 2344 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00; 2345 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00; 2346 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; 2347 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700; 2348 /* Hardware reset vector */ 2349 env->hreset_vector = 0x00000100UL; 2350 #endif 2351 } 2352 2353 /* XXX: Check if this is correct */ 2354 static void init_excp_7x5(CPUPPCState *env) 2355 { 2356 #if !defined(CONFIG_USER_ONLY) 2357 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100; 2358 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200; 2359 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300; 2360 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400; 2361 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500; 2362 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600; 2363 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700; 2364 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800; 2365 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900; 2366 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00; 2367 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00; 2368 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00; 2369 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000; 2370 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100; 2371 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200; 2372 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; 2373 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400; 2374 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700; 2375 /* Hardware reset vector */ 2376 env->hreset_vector = 0x00000100UL; 2377 #endif 2378 } 2379 2380 static void init_excp_7400(CPUPPCState *env) 2381 { 2382 #if !defined(CONFIG_USER_ONLY) 2383 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100; 2384 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200; 2385 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300; 2386 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400; 2387 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500; 2388 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600; 2389 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700; 2390 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800; 2391 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900; 2392 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00; 2393 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00; 2394 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00; 2395 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20; 2396 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; 2397 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400; 2398 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001600; 2399 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700; 2400 /* Hardware reset vector */ 2401 env->hreset_vector = 0x00000100UL; 2402 #endif 2403 } 2404 2405 static void init_excp_7450(CPUPPCState *env) 2406 { 2407 #if !defined(CONFIG_USER_ONLY) 2408 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100; 2409 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200; 2410 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300; 2411 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400; 2412 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500; 2413 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600; 2414 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700; 2415 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800; 2416 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900; 2417 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00; 2418 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00; 2419 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00; 2420 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20; 2421 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; 2422 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400; 2423 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001600; 2424 /* Hardware reset vector */ 2425 env->hreset_vector = 0x00000100UL; 2426 #endif 2427 } 2428 2429 #if defined(TARGET_PPC64) 2430 static void init_excp_970(CPUPPCState *env) 2431 { 2432 #if !defined(CONFIG_USER_ONLY) 2433 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100; 2434 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200; 2435 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300; 2436 env->excp_vectors[POWERPC_EXCP_DSEG] = 0x00000380; 2437 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400; 2438 env->excp_vectors[POWERPC_EXCP_ISEG] = 0x00000480; 2439 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500; 2440 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600; 2441 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700; 2442 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800; 2443 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900; 2444 env->excp_vectors[POWERPC_EXCP_HDECR] = 0x00000980; 2445 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00; 2446 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00; 2447 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00; 2448 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20; 2449 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300; 2450 env->excp_vectors[POWERPC_EXCP_MAINT] = 0x00001600; 2451 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001700; 2452 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001800; 2453 /* Hardware reset vector */ 2454 env->hreset_vector = 0x0000000000000100ULL; 2455 #endif 2456 } 2457 2458 static void init_excp_POWER7(CPUPPCState *env) 2459 { 2460 #if !defined(CONFIG_USER_ONLY) 2461 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100; 2462 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200; 2463 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300; 2464 env->excp_vectors[POWERPC_EXCP_DSEG] = 0x00000380; 2465 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400; 2466 env->excp_vectors[POWERPC_EXCP_ISEG] = 0x00000480; 2467 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500; 2468 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600; 2469 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700; 2470 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800; 2471 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900; 2472 env->excp_vectors[POWERPC_EXCP_HDECR] = 0x00000980; 2473 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00; 2474 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00; 2475 env->excp_vectors[POWERPC_EXCP_HDSI] = 0x00000E00; 2476 env->excp_vectors[POWERPC_EXCP_HISI] = 0x00000E20; 2477 env->excp_vectors[POWERPC_EXCP_HV_EMU] = 0x00000E40; 2478 env->excp_vectors[POWERPC_EXCP_HV_MAINT] = 0x00000E60; 2479 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00; 2480 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20; 2481 env->excp_vectors[POWERPC_EXCP_VSXU] = 0x00000F40; 2482 /* Hardware reset vector */ 2483 env->hreset_vector = 0x0000000000000100ULL; 2484 #endif 2485 } 2486 2487 static void init_excp_POWER8(CPUPPCState *env) 2488 { 2489 init_excp_POWER7(env); 2490 2491 #if !defined(CONFIG_USER_ONLY) 2492 env->excp_vectors[POWERPC_EXCP_SDOOR] = 0x00000A00; 2493 env->excp_vectors[POWERPC_EXCP_FU] = 0x00000F60; 2494 env->excp_vectors[POWERPC_EXCP_HV_FU] = 0x00000F80; 2495 env->excp_vectors[POWERPC_EXCP_SDOOR_HV] = 0x00000E80; 2496 #endif 2497 } 2498 2499 static void init_excp_POWER9(CPUPPCState *env) 2500 { 2501 init_excp_POWER8(env); 2502 2503 #if !defined(CONFIG_USER_ONLY) 2504 env->excp_vectors[POWERPC_EXCP_HVIRT] = 0x00000EA0; 2505 env->excp_vectors[POWERPC_EXCP_SYSCALL_VECTORED] = 0x00017000; 2506 #endif 2507 } 2508 2509 static void init_excp_POWER10(CPUPPCState *env) 2510 { 2511 init_excp_POWER9(env); 2512 } 2513 2514 #endif 2515 2516 /*****************************************************************************/ 2517 /* Power management enable checks */ 2518 static int check_pow_none(CPUPPCState *env) 2519 { 2520 return 0; 2521 } 2522 2523 static int check_pow_nocheck(CPUPPCState *env) 2524 { 2525 return 1; 2526 } 2527 2528 static int check_pow_hid0(CPUPPCState *env) 2529 { 2530 if (env->spr[SPR_HID0] & 0x00E00000) { 2531 return 1; 2532 } 2533 2534 return 0; 2535 } 2536 2537 static int check_pow_hid0_74xx(CPUPPCState *env) 2538 { 2539 if (env->spr[SPR_HID0] & 0x00600000) { 2540 return 1; 2541 } 2542 2543 return 0; 2544 } 2545 2546 /*****************************************************************************/ 2547 /* PowerPC implementations definitions */ 2548 2549 #define POWERPC_FAMILY(_name) \ 2550 static void \ 2551 glue(glue(ppc_, _name), _cpu_family_class_init)(ObjectClass *, void *); \ 2552 \ 2553 static const TypeInfo \ 2554 glue(glue(ppc_, _name), _cpu_family_type_info) = { \ 2555 .name = stringify(_name) "-family-" TYPE_POWERPC_CPU, \ 2556 .parent = TYPE_POWERPC_CPU, \ 2557 .abstract = true, \ 2558 .class_init = glue(glue(ppc_, _name), _cpu_family_class_init), \ 2559 }; \ 2560 \ 2561 static void glue(glue(ppc_, _name), _cpu_family_register_types)(void) \ 2562 { \ 2563 type_register_static( \ 2564 &glue(glue(ppc_, _name), _cpu_family_type_info)); \ 2565 } \ 2566 \ 2567 type_init(glue(glue(ppc_, _name), _cpu_family_register_types)) \ 2568 \ 2569 static void glue(glue(ppc_, _name), _cpu_family_class_init) 2570 2571 static void init_proc_405(CPUPPCState *env) 2572 { 2573 register_40x_sprs(env); 2574 register_405_sprs(env); 2575 register_usprgh_sprs(env); 2576 2577 /* Memory management */ 2578 #if !defined(CONFIG_USER_ONLY) 2579 env->nb_tlb = 64; 2580 env->nb_ways = 1; 2581 env->id_tlbs = 0; 2582 env->tlb_type = TLB_EMB; 2583 #endif 2584 init_excp_4xx_softmmu(env); 2585 env->dcache_line_size = 32; 2586 env->icache_line_size = 32; 2587 /* Allocate hardware IRQ controller */ 2588 ppc40x_irq_init(env_archcpu(env)); 2589 2590 SET_FIT_PERIOD(8, 12, 16, 20); 2591 SET_WDT_PERIOD(16, 20, 24, 28); 2592 } 2593 2594 POWERPC_FAMILY(405)(ObjectClass *oc, void *data) 2595 { 2596 DeviceClass *dc = DEVICE_CLASS(oc); 2597 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 2598 2599 dc->desc = "PowerPC 405"; 2600 pcc->init_proc = init_proc_405; 2601 pcc->check_pow = check_pow_nocheck; 2602 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 2603 PPC_DCR | PPC_WRTEE | 2604 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT | 2605 PPC_CACHE_DCBZ | PPC_CACHE_DCBA | 2606 PPC_MEM_SYNC | PPC_MEM_EIEIO | 2607 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | 2608 PPC_4xx_COMMON | PPC_405_MAC | PPC_40x_EXCP; 2609 pcc->msr_mask = (1ull << MSR_WE) | 2610 (1ull << MSR_CE) | 2611 (1ull << MSR_EE) | 2612 (1ull << MSR_PR) | 2613 (1ull << MSR_FP) | 2614 (1ull << MSR_ME) | 2615 (1ull << MSR_DWE) | 2616 (1ull << MSR_DE) | 2617 (1ull << MSR_IR) | 2618 (1ull << MSR_DR); 2619 pcc->mmu_model = POWERPC_MMU_SOFT_4xx; 2620 pcc->excp_model = POWERPC_EXCP_40x; 2621 pcc->bus_model = PPC_FLAGS_INPUT_405; 2622 pcc->bfd_mach = bfd_mach_ppc_403; 2623 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE | 2624 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK; 2625 } 2626 2627 static void init_proc_440EP(CPUPPCState *env) 2628 { 2629 register_BookE_sprs(env, 0x000000000000FFFFULL); 2630 register_440_sprs(env); 2631 register_usprgh_sprs(env); 2632 2633 spr_register(env, SPR_BOOKE_MCSR, "MCSR", 2634 SPR_NOACCESS, SPR_NOACCESS, 2635 &spr_read_generic, &spr_write_generic, 2636 0x00000000); 2637 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0", 2638 SPR_NOACCESS, SPR_NOACCESS, 2639 &spr_read_generic, &spr_write_generic, 2640 0x00000000); 2641 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1", 2642 SPR_NOACCESS, SPR_NOACCESS, 2643 &spr_read_generic, &spr_write_generic, 2644 0x00000000); 2645 2646 spr_register(env, SPR_440_CCR1, "CCR1", 2647 SPR_NOACCESS, SPR_NOACCESS, 2648 &spr_read_generic, &spr_write_generic, 2649 0x00000000); 2650 /* Memory management */ 2651 #if !defined(CONFIG_USER_ONLY) 2652 env->nb_tlb = 64; 2653 env->nb_ways = 1; 2654 env->id_tlbs = 0; 2655 env->tlb_type = TLB_EMB; 2656 #endif 2657 init_excp_BookE(env); 2658 env->dcache_line_size = 32; 2659 env->icache_line_size = 32; 2660 ppc40x_irq_init(env_archcpu(env)); 2661 2662 SET_FIT_PERIOD(12, 16, 20, 24); 2663 SET_WDT_PERIOD(20, 24, 28, 32); 2664 } 2665 2666 POWERPC_FAMILY(440EP)(ObjectClass *oc, void *data) 2667 { 2668 DeviceClass *dc = DEVICE_CLASS(oc); 2669 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 2670 2671 dc->desc = "PowerPC 440 EP"; 2672 pcc->init_proc = init_proc_440EP; 2673 pcc->check_pow = check_pow_nocheck; 2674 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | 2675 PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL | 2676 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE | 2677 PPC_FLOAT_STFIWX | 2678 PPC_DCR | PPC_WRTEE | PPC_RFMCI | 2679 PPC_CACHE | PPC_CACHE_ICBI | 2680 PPC_CACHE_DCBZ | PPC_CACHE_DCBA | 2681 PPC_MEM_TLBSYNC | PPC_MFTB | 2682 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC | 2683 PPC_440_SPEC; 2684 pcc->msr_mask = (1ull << MSR_POW) | 2685 (1ull << MSR_CE) | 2686 (1ull << MSR_EE) | 2687 (1ull << MSR_PR) | 2688 (1ull << MSR_FP) | 2689 (1ull << MSR_ME) | 2690 (1ull << MSR_FE0) | 2691 (1ull << MSR_DWE) | 2692 (1ull << MSR_DE) | 2693 (1ull << MSR_FE1) | 2694 (1ull << MSR_IR) | 2695 (1ull << MSR_DR); 2696 pcc->mmu_model = POWERPC_MMU_BOOKE; 2697 pcc->excp_model = POWERPC_EXCP_BOOKE; 2698 pcc->bus_model = PPC_FLAGS_INPUT_BookE; 2699 pcc->bfd_mach = bfd_mach_ppc_403; 2700 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE | 2701 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK; 2702 } 2703 2704 POWERPC_FAMILY(460EX)(ObjectClass *oc, void *data) 2705 { 2706 DeviceClass *dc = DEVICE_CLASS(oc); 2707 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 2708 2709 dc->desc = "PowerPC 460 EX"; 2710 pcc->init_proc = init_proc_440EP; 2711 pcc->check_pow = check_pow_nocheck; 2712 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | 2713 PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL | 2714 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE | 2715 PPC_FLOAT_STFIWX | 2716 PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_RFMCI | 2717 PPC_CACHE | PPC_CACHE_ICBI | 2718 PPC_CACHE_DCBZ | PPC_CACHE_DCBA | 2719 PPC_MEM_TLBSYNC | PPC_MFTB | 2720 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC | 2721 PPC_440_SPEC; 2722 pcc->msr_mask = (1ull << MSR_POW) | 2723 (1ull << MSR_CE) | 2724 (1ull << MSR_EE) | 2725 (1ull << MSR_PR) | 2726 (1ull << MSR_FP) | 2727 (1ull << MSR_ME) | 2728 (1ull << MSR_FE0) | 2729 (1ull << MSR_DWE) | 2730 (1ull << MSR_DE) | 2731 (1ull << MSR_FE1) | 2732 (1ull << MSR_IR) | 2733 (1ull << MSR_DR); 2734 pcc->mmu_model = POWERPC_MMU_BOOKE; 2735 pcc->excp_model = POWERPC_EXCP_BOOKE; 2736 pcc->bus_model = PPC_FLAGS_INPUT_BookE; 2737 pcc->bfd_mach = bfd_mach_ppc_403; 2738 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE | 2739 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK; 2740 } 2741 2742 static void init_proc_440GP(CPUPPCState *env) 2743 { 2744 register_BookE_sprs(env, 0x000000000000FFFFULL); 2745 register_440_sprs(env); 2746 register_usprgh_sprs(env); 2747 2748 /* Memory management */ 2749 #if !defined(CONFIG_USER_ONLY) 2750 env->nb_tlb = 64; 2751 env->nb_ways = 1; 2752 env->id_tlbs = 0; 2753 env->tlb_type = TLB_EMB; 2754 #endif 2755 init_excp_BookE(env); 2756 env->dcache_line_size = 32; 2757 env->icache_line_size = 32; 2758 /* XXX: TODO: allocate internal IRQ controller */ 2759 2760 SET_FIT_PERIOD(12, 16, 20, 24); 2761 SET_WDT_PERIOD(20, 24, 28, 32); 2762 } 2763 2764 POWERPC_FAMILY(440GP)(ObjectClass *oc, void *data) 2765 { 2766 DeviceClass *dc = DEVICE_CLASS(oc); 2767 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 2768 2769 dc->desc = "PowerPC 440 GP"; 2770 pcc->init_proc = init_proc_440GP; 2771 pcc->check_pow = check_pow_nocheck; 2772 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | 2773 PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_MFAPIDI | 2774 PPC_CACHE | PPC_CACHE_ICBI | 2775 PPC_CACHE_DCBZ | PPC_CACHE_DCBA | 2776 PPC_MEM_TLBSYNC | PPC_TLBIVA | PPC_MFTB | 2777 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC | 2778 PPC_440_SPEC; 2779 pcc->msr_mask = (1ull << MSR_POW) | 2780 (1ull << MSR_CE) | 2781 (1ull << MSR_EE) | 2782 (1ull << MSR_PR) | 2783 (1ull << MSR_FP) | 2784 (1ull << MSR_ME) | 2785 (1ull << MSR_FE0) | 2786 (1ull << MSR_DWE) | 2787 (1ull << MSR_DE) | 2788 (1ull << MSR_FE1) | 2789 (1ull << MSR_IR) | 2790 (1ull << MSR_DR); 2791 pcc->mmu_model = POWERPC_MMU_BOOKE; 2792 pcc->excp_model = POWERPC_EXCP_BOOKE; 2793 pcc->bus_model = PPC_FLAGS_INPUT_BookE; 2794 pcc->bfd_mach = bfd_mach_ppc_403; 2795 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE | 2796 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK; 2797 } 2798 2799 static void init_proc_440x5(CPUPPCState *env) 2800 { 2801 register_BookE_sprs(env, 0x000000000000FFFFULL); 2802 register_440_sprs(env); 2803 register_usprgh_sprs(env); 2804 2805 spr_register(env, SPR_BOOKE_MCSR, "MCSR", 2806 SPR_NOACCESS, SPR_NOACCESS, 2807 &spr_read_generic, &spr_write_generic, 2808 0x00000000); 2809 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0", 2810 SPR_NOACCESS, SPR_NOACCESS, 2811 &spr_read_generic, &spr_write_generic, 2812 0x00000000); 2813 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1", 2814 SPR_NOACCESS, SPR_NOACCESS, 2815 &spr_read_generic, &spr_write_generic, 2816 0x00000000); 2817 2818 spr_register(env, SPR_440_CCR1, "CCR1", 2819 SPR_NOACCESS, SPR_NOACCESS, 2820 &spr_read_generic, &spr_write_generic, 2821 0x00000000); 2822 /* Memory management */ 2823 #if !defined(CONFIG_USER_ONLY) 2824 env->nb_tlb = 64; 2825 env->nb_ways = 1; 2826 env->id_tlbs = 0; 2827 env->tlb_type = TLB_EMB; 2828 #endif 2829 init_excp_BookE(env); 2830 env->dcache_line_size = 32; 2831 env->icache_line_size = 32; 2832 ppc40x_irq_init(env_archcpu(env)); 2833 2834 SET_FIT_PERIOD(12, 16, 20, 24); 2835 SET_WDT_PERIOD(20, 24, 28, 32); 2836 } 2837 2838 POWERPC_FAMILY(440x5)(ObjectClass *oc, void *data) 2839 { 2840 DeviceClass *dc = DEVICE_CLASS(oc); 2841 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 2842 2843 dc->desc = "PowerPC 440x5"; 2844 pcc->init_proc = init_proc_440x5; 2845 pcc->check_pow = check_pow_nocheck; 2846 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | 2847 PPC_DCR | PPC_WRTEE | PPC_RFMCI | 2848 PPC_CACHE | PPC_CACHE_ICBI | 2849 PPC_CACHE_DCBZ | PPC_CACHE_DCBA | 2850 PPC_MEM_TLBSYNC | PPC_MFTB | 2851 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC | 2852 PPC_440_SPEC; 2853 pcc->msr_mask = (1ull << MSR_POW) | 2854 (1ull << MSR_CE) | 2855 (1ull << MSR_EE) | 2856 (1ull << MSR_PR) | 2857 (1ull << MSR_FP) | 2858 (1ull << MSR_ME) | 2859 (1ull << MSR_FE0) | 2860 (1ull << MSR_DWE) | 2861 (1ull << MSR_DE) | 2862 (1ull << MSR_FE1) | 2863 (1ull << MSR_IR) | 2864 (1ull << MSR_DR); 2865 pcc->mmu_model = POWERPC_MMU_BOOKE; 2866 pcc->excp_model = POWERPC_EXCP_BOOKE; 2867 pcc->bus_model = PPC_FLAGS_INPUT_BookE; 2868 pcc->bfd_mach = bfd_mach_ppc_403; 2869 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE | 2870 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK; 2871 } 2872 2873 POWERPC_FAMILY(440x5wDFPU)(ObjectClass *oc, void *data) 2874 { 2875 DeviceClass *dc = DEVICE_CLASS(oc); 2876 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 2877 2878 dc->desc = "PowerPC 440x5 with double precision FPU"; 2879 pcc->init_proc = init_proc_440x5; 2880 pcc->check_pow = check_pow_nocheck; 2881 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | 2882 PPC_FLOAT | PPC_FLOAT_FSQRT | 2883 PPC_FLOAT_STFIWX | 2884 PPC_DCR | PPC_WRTEE | PPC_RFMCI | 2885 PPC_CACHE | PPC_CACHE_ICBI | 2886 PPC_CACHE_DCBZ | PPC_CACHE_DCBA | 2887 PPC_MEM_TLBSYNC | PPC_MFTB | 2888 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC | 2889 PPC_440_SPEC; 2890 pcc->insns_flags2 = PPC2_FP_CVT_S64; 2891 pcc->msr_mask = (1ull << MSR_POW) | 2892 (1ull << MSR_CE) | 2893 (1ull << MSR_EE) | 2894 (1ull << MSR_PR) | 2895 (1ull << MSR_FP) | 2896 (1ull << MSR_ME) | 2897 (1ull << MSR_FE0) | 2898 (1ull << MSR_DWE) | 2899 (1ull << MSR_DE) | 2900 (1ull << MSR_FE1) | 2901 (1ull << MSR_IR) | 2902 (1ull << MSR_DR); 2903 pcc->mmu_model = POWERPC_MMU_BOOKE; 2904 pcc->excp_model = POWERPC_EXCP_BOOKE; 2905 pcc->bus_model = PPC_FLAGS_INPUT_BookE; 2906 pcc->bfd_mach = bfd_mach_ppc_403; 2907 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE | 2908 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK; 2909 } 2910 2911 static void init_proc_MPC5xx(CPUPPCState *env) 2912 { 2913 register_5xx_8xx_sprs(env); 2914 register_5xx_sprs(env); 2915 init_excp_MPC5xx(env); 2916 env->dcache_line_size = 32; 2917 env->icache_line_size = 32; 2918 /* XXX: TODO: allocate internal IRQ controller */ 2919 } 2920 2921 POWERPC_FAMILY(MPC5xx)(ObjectClass *oc, void *data) 2922 { 2923 DeviceClass *dc = DEVICE_CLASS(oc); 2924 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 2925 2926 dc->desc = "Freescale 5xx cores (aka RCPU)"; 2927 pcc->init_proc = init_proc_MPC5xx; 2928 pcc->check_pow = check_pow_none; 2929 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | 2930 PPC_MEM_EIEIO | PPC_MEM_SYNC | 2931 PPC_CACHE_ICBI | PPC_FLOAT | PPC_FLOAT_STFIWX | 2932 PPC_MFTB; 2933 pcc->msr_mask = (1ull << MSR_ILE) | 2934 (1ull << MSR_EE) | 2935 (1ull << MSR_PR) | 2936 (1ull << MSR_FP) | 2937 (1ull << MSR_ME) | 2938 (1ull << MSR_FE0) | 2939 (1ull << MSR_SE) | 2940 (1ull << MSR_DE) | 2941 (1ull << MSR_FE1) | 2942 (1ull << MSR_EP) | 2943 (1ull << MSR_RI) | 2944 (1ull << MSR_LE); 2945 pcc->mmu_model = POWERPC_MMU_REAL; 2946 pcc->excp_model = POWERPC_EXCP_6xx; 2947 pcc->bus_model = PPC_FLAGS_INPUT_RCPU; 2948 pcc->bfd_mach = bfd_mach_ppc_505; 2949 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE | 2950 POWERPC_FLAG_BUS_CLK; 2951 } 2952 2953 static void init_proc_MPC8xx(CPUPPCState *env) 2954 { 2955 register_5xx_8xx_sprs(env); 2956 register_8xx_sprs(env); 2957 init_excp_MPC8xx(env); 2958 env->dcache_line_size = 32; 2959 env->icache_line_size = 32; 2960 /* XXX: TODO: allocate internal IRQ controller */ 2961 } 2962 2963 POWERPC_FAMILY(MPC8xx)(ObjectClass *oc, void *data) 2964 { 2965 DeviceClass *dc = DEVICE_CLASS(oc); 2966 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 2967 2968 dc->desc = "Freescale 8xx cores (aka PowerQUICC)"; 2969 pcc->init_proc = init_proc_MPC8xx; 2970 pcc->check_pow = check_pow_none; 2971 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | 2972 PPC_MEM_EIEIO | PPC_MEM_SYNC | 2973 PPC_CACHE_ICBI | PPC_MFTB; 2974 pcc->msr_mask = (1ull << MSR_ILE) | 2975 (1ull << MSR_EE) | 2976 (1ull << MSR_PR) | 2977 (1ull << MSR_FP) | 2978 (1ull << MSR_ME) | 2979 (1ull << MSR_SE) | 2980 (1ull << MSR_DE) | 2981 (1ull << MSR_EP) | 2982 (1ull << MSR_IR) | 2983 (1ull << MSR_DR) | 2984 (1ull << MSR_RI) | 2985 (1ull << MSR_LE); 2986 pcc->mmu_model = POWERPC_MMU_MPC8xx; 2987 pcc->excp_model = POWERPC_EXCP_6xx; 2988 pcc->bus_model = PPC_FLAGS_INPUT_RCPU; 2989 pcc->bfd_mach = bfd_mach_ppc_860; 2990 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE | 2991 POWERPC_FLAG_BUS_CLK; 2992 } 2993 2994 /* Freescale 82xx cores (aka PowerQUICC-II) */ 2995 2996 static void init_proc_G2(CPUPPCState *env) 2997 { 2998 register_ne_601_sprs(env); 2999 register_sdr1_sprs(env); 3000 register_G2_sprs(env); 3001 3002 /* Memory management */ 3003 register_low_BATs(env); 3004 register_high_BATs(env); 3005 register_6xx_7xx_soft_tlb(env, 64, 2); 3006 init_excp_G2(env); 3007 env->dcache_line_size = 32; 3008 env->icache_line_size = 32; 3009 /* Allocate hardware IRQ controller */ 3010 ppc6xx_irq_init(env_archcpu(env)); 3011 } 3012 3013 POWERPC_FAMILY(G2)(ObjectClass *oc, void *data) 3014 { 3015 DeviceClass *dc = DEVICE_CLASS(oc); 3016 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 3017 3018 dc->desc = "PowerPC G2"; 3019 pcc->init_proc = init_proc_G2; 3020 pcc->check_pow = check_pow_hid0; 3021 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 3022 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 3023 PPC_FLOAT_STFIWX | 3024 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 3025 PPC_MEM_SYNC | PPC_MEM_EIEIO | 3026 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | 3027 PPC_SEGMENT | PPC_EXTERN; 3028 pcc->msr_mask = (1ull << MSR_POW) | 3029 (1ull << MSR_TGPR) | 3030 (1ull << MSR_EE) | 3031 (1ull << MSR_PR) | 3032 (1ull << MSR_FP) | 3033 (1ull << MSR_ME) | 3034 (1ull << MSR_FE0) | 3035 (1ull << MSR_SE) | 3036 (1ull << MSR_DE) | 3037 (1ull << MSR_FE1) | 3038 (1ull << MSR_AL) | 3039 (1ull << MSR_EP) | 3040 (1ull << MSR_IR) | 3041 (1ull << MSR_DR) | 3042 (1ull << MSR_RI); 3043 pcc->mmu_model = POWERPC_MMU_SOFT_6xx; 3044 pcc->excp_model = POWERPC_EXCP_6xx; 3045 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 3046 pcc->bfd_mach = bfd_mach_ppc_ec603e; 3047 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE | 3048 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK; 3049 } 3050 3051 POWERPC_FAMILY(G2LE)(ObjectClass *oc, void *data) 3052 { 3053 DeviceClass *dc = DEVICE_CLASS(oc); 3054 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 3055 3056 dc->desc = "PowerPC G2LE"; 3057 pcc->init_proc = init_proc_G2; 3058 pcc->check_pow = check_pow_hid0; 3059 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 3060 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 3061 PPC_FLOAT_STFIWX | 3062 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 3063 PPC_MEM_SYNC | PPC_MEM_EIEIO | 3064 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | 3065 PPC_SEGMENT | PPC_EXTERN; 3066 pcc->msr_mask = (1ull << MSR_POW) | 3067 (1ull << MSR_TGPR) | 3068 (1ull << MSR_ILE) | 3069 (1ull << MSR_EE) | 3070 (1ull << MSR_PR) | 3071 (1ull << MSR_FP) | 3072 (1ull << MSR_ME) | 3073 (1ull << MSR_FE0) | 3074 (1ull << MSR_SE) | 3075 (1ull << MSR_DE) | 3076 (1ull << MSR_FE1) | 3077 (1ull << MSR_AL) | 3078 (1ull << MSR_EP) | 3079 (1ull << MSR_IR) | 3080 (1ull << MSR_DR) | 3081 (1ull << MSR_RI) | 3082 (1ull << MSR_LE); 3083 pcc->mmu_model = POWERPC_MMU_SOFT_6xx; 3084 pcc->excp_model = POWERPC_EXCP_6xx; 3085 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 3086 pcc->bfd_mach = bfd_mach_ppc_ec603e; 3087 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE | 3088 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK; 3089 } 3090 3091 static void init_proc_e200(CPUPPCState *env) 3092 { 3093 register_BookE_sprs(env, 0x000000070000FFFFULL); 3094 3095 spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR", 3096 &spr_read_spefscr, &spr_write_spefscr, 3097 &spr_read_spefscr, &spr_write_spefscr, 3098 0x00000000); 3099 /* Memory management */ 3100 register_BookE206_sprs(env, 0x0000005D, NULL, 0); 3101 register_usprgh_sprs(env); 3102 3103 spr_register(env, SPR_HID0, "HID0", 3104 SPR_NOACCESS, SPR_NOACCESS, 3105 &spr_read_generic, &spr_write_generic, 3106 0x00000000); 3107 3108 spr_register(env, SPR_HID1, "HID1", 3109 SPR_NOACCESS, SPR_NOACCESS, 3110 &spr_read_generic, &spr_write_generic, 3111 0x00000000); 3112 3113 spr_register(env, SPR_Exxx_ALTCTXCR, "ALTCTXCR", 3114 SPR_NOACCESS, SPR_NOACCESS, 3115 &spr_read_generic, &spr_write_generic, 3116 0x00000000); 3117 3118 spr_register(env, SPR_Exxx_BUCSR, "BUCSR", 3119 SPR_NOACCESS, SPR_NOACCESS, 3120 &spr_read_generic, &spr_write_generic, 3121 0x00000000); 3122 3123 spr_register(env, SPR_Exxx_CTXCR, "CTXCR", 3124 SPR_NOACCESS, SPR_NOACCESS, 3125 &spr_read_generic, &spr_write_generic, 3126 0x00000000); 3127 3128 spr_register(env, SPR_Exxx_DBCNT, "DBCNT", 3129 SPR_NOACCESS, SPR_NOACCESS, 3130 &spr_read_generic, &spr_write_generic, 3131 0x00000000); 3132 3133 spr_register(env, SPR_Exxx_DBCR3, "DBCR3", 3134 SPR_NOACCESS, SPR_NOACCESS, 3135 &spr_read_generic, &spr_write_generic, 3136 0x00000000); 3137 3138 spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0", 3139 &spr_read_generic, SPR_NOACCESS, 3140 &spr_read_generic, SPR_NOACCESS, 3141 0x00000000); 3142 3143 spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0", 3144 SPR_NOACCESS, SPR_NOACCESS, 3145 &spr_read_generic, &spr_write_generic, 3146 0x00000000); 3147 3148 spr_register(env, SPR_Exxx_L1FINV0, "L1FINV0", 3149 SPR_NOACCESS, SPR_NOACCESS, 3150 &spr_read_generic, &spr_write_generic, 3151 0x00000000); 3152 3153 spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG", 3154 SPR_NOACCESS, SPR_NOACCESS, 3155 &spr_read_generic, &spr_write_generic, 3156 0x00000000); 3157 3158 spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG", 3159 SPR_NOACCESS, SPR_NOACCESS, 3160 &spr_read_generic, &spr_write_generic, 3161 0x00000000); 3162 3163 spr_register(env, SPR_BOOKE_IAC3, "IAC3", 3164 SPR_NOACCESS, SPR_NOACCESS, 3165 &spr_read_generic, &spr_write_generic, 3166 0x00000000); 3167 3168 spr_register(env, SPR_BOOKE_IAC4, "IAC4", 3169 SPR_NOACCESS, SPR_NOACCESS, 3170 &spr_read_generic, &spr_write_generic, 3171 0x00000000); 3172 3173 spr_register(env, SPR_MMUCSR0, "MMUCSR0", 3174 SPR_NOACCESS, SPR_NOACCESS, 3175 &spr_read_generic, &spr_write_generic, 3176 0x00000000); /* TOFIX */ 3177 spr_register(env, SPR_BOOKE_DSRR0, "DSRR0", 3178 SPR_NOACCESS, SPR_NOACCESS, 3179 &spr_read_generic, &spr_write_generic, 3180 0x00000000); 3181 spr_register(env, SPR_BOOKE_DSRR1, "DSRR1", 3182 SPR_NOACCESS, SPR_NOACCESS, 3183 &spr_read_generic, &spr_write_generic, 3184 0x00000000); 3185 #if !defined(CONFIG_USER_ONLY) 3186 env->nb_tlb = 64; 3187 env->nb_ways = 1; 3188 env->id_tlbs = 0; 3189 env->tlb_type = TLB_EMB; 3190 #endif 3191 init_excp_e200(env, 0xFFFF0000UL); 3192 env->dcache_line_size = 32; 3193 env->icache_line_size = 32; 3194 /* XXX: TODO: allocate internal IRQ controller */ 3195 } 3196 3197 POWERPC_FAMILY(e200)(ObjectClass *oc, void *data) 3198 { 3199 DeviceClass *dc = DEVICE_CLASS(oc); 3200 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 3201 3202 dc->desc = "e200 core"; 3203 pcc->init_proc = init_proc_e200; 3204 pcc->check_pow = check_pow_hid0; 3205 /* 3206 * XXX: unimplemented instructions: 3207 * dcblc 3208 * dcbtlst 3209 * dcbtstls 3210 * icblc 3211 * icbtls 3212 * tlbivax 3213 * all SPE multiply-accumulate instructions 3214 */ 3215 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | 3216 PPC_SPE | PPC_SPE_SINGLE | 3217 PPC_WRTEE | PPC_RFDI | 3218 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI | 3219 PPC_CACHE_DCBZ | PPC_CACHE_DCBA | 3220 PPC_MEM_TLBSYNC | PPC_TLBIVAX | 3221 PPC_BOOKE; 3222 pcc->msr_mask = (1ull << MSR_UCLE) | 3223 (1ull << MSR_SPE) | 3224 (1ull << MSR_POW) | 3225 (1ull << MSR_CE) | 3226 (1ull << MSR_EE) | 3227 (1ull << MSR_PR) | 3228 (1ull << MSR_FP) | 3229 (1ull << MSR_ME) | 3230 (1ull << MSR_FE0) | 3231 (1ull << MSR_DWE) | 3232 (1ull << MSR_DE) | 3233 (1ull << MSR_FE1) | 3234 (1ull << MSR_IR) | 3235 (1ull << MSR_DR); 3236 pcc->mmu_model = POWERPC_MMU_BOOKE206; 3237 pcc->excp_model = POWERPC_EXCP_BOOKE; 3238 pcc->bus_model = PPC_FLAGS_INPUT_BookE; 3239 pcc->bfd_mach = bfd_mach_ppc_860; 3240 pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE | 3241 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE | 3242 POWERPC_FLAG_BUS_CLK; 3243 } 3244 3245 static void init_proc_e300(CPUPPCState *env) 3246 { 3247 register_ne_601_sprs(env); 3248 register_sdr1_sprs(env); 3249 register_603_sprs(env); 3250 register_e300_sprs(env); 3251 3252 /* Memory management */ 3253 register_low_BATs(env); 3254 register_high_BATs(env); 3255 register_6xx_7xx_soft_tlb(env, 64, 2); 3256 init_excp_603(env); 3257 env->dcache_line_size = 32; 3258 env->icache_line_size = 32; 3259 /* Allocate hardware IRQ controller */ 3260 ppc6xx_irq_init(env_archcpu(env)); 3261 } 3262 3263 POWERPC_FAMILY(e300)(ObjectClass *oc, void *data) 3264 { 3265 DeviceClass *dc = DEVICE_CLASS(oc); 3266 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 3267 3268 dc->desc = "e300 core"; 3269 pcc->init_proc = init_proc_e300; 3270 pcc->check_pow = check_pow_hid0; 3271 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 3272 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 3273 PPC_FLOAT_STFIWX | 3274 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 3275 PPC_MEM_SYNC | PPC_MEM_EIEIO | 3276 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | 3277 PPC_SEGMENT | PPC_EXTERN; 3278 pcc->msr_mask = (1ull << MSR_POW) | 3279 (1ull << MSR_TGPR) | 3280 (1ull << MSR_ILE) | 3281 (1ull << MSR_EE) | 3282 (1ull << MSR_PR) | 3283 (1ull << MSR_FP) | 3284 (1ull << MSR_ME) | 3285 (1ull << MSR_FE0) | 3286 (1ull << MSR_SE) | 3287 (1ull << MSR_DE) | 3288 (1ull << MSR_FE1) | 3289 (1ull << MSR_AL) | 3290 (1ull << MSR_EP) | 3291 (1ull << MSR_IR) | 3292 (1ull << MSR_DR) | 3293 (1ull << MSR_RI) | 3294 (1ull << MSR_LE); 3295 pcc->mmu_model = POWERPC_MMU_SOFT_6xx; 3296 pcc->excp_model = POWERPC_EXCP_6xx; 3297 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 3298 pcc->bfd_mach = bfd_mach_ppc_603; 3299 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE | 3300 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK; 3301 } 3302 3303 enum fsl_e500_version { 3304 fsl_e500v1, 3305 fsl_e500v2, 3306 fsl_e500mc, 3307 fsl_e5500, 3308 fsl_e6500, 3309 }; 3310 3311 static void init_proc_e500(CPUPPCState *env, int version) 3312 { 3313 uint32_t tlbncfg[2]; 3314 uint64_t ivor_mask; 3315 uint64_t ivpr_mask = 0xFFFF0000ULL; 3316 uint32_t l1cfg0 = 0x3800 /* 8 ways */ 3317 | 0x0020; /* 32 kb */ 3318 uint32_t l1cfg1 = 0x3800 /* 8 ways */ 3319 | 0x0020; /* 32 kb */ 3320 uint32_t mmucfg = 0; 3321 #if !defined(CONFIG_USER_ONLY) 3322 int i; 3323 #endif 3324 3325 /* 3326 * XXX The e500 doesn't implement IVOR7 and IVOR9, but doesn't 3327 * complain when accessing them. 3328 * register_BookE_sprs(env, 0x0000000F0000FD7FULL); 3329 */ 3330 switch (version) { 3331 case fsl_e500v1: 3332 case fsl_e500v2: 3333 default: 3334 ivor_mask = 0x0000000F0000FFFFULL; 3335 break; 3336 case fsl_e500mc: 3337 case fsl_e5500: 3338 ivor_mask = 0x000003FE0000FFFFULL; 3339 break; 3340 case fsl_e6500: 3341 ivor_mask = 0x000003FF0000FFFFULL; 3342 break; 3343 } 3344 register_BookE_sprs(env, ivor_mask); 3345 register_usprg3_sprs(env); 3346 /* Processor identification */ 3347 spr_register(env, SPR_BOOKE_PIR, "PIR", 3348 SPR_NOACCESS, SPR_NOACCESS, 3349 &spr_read_generic, &spr_write_pir, 3350 0x00000000); 3351 3352 spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR", 3353 &spr_read_spefscr, &spr_write_spefscr, 3354 &spr_read_spefscr, &spr_write_spefscr, 3355 0x00000000); 3356 #if !defined(CONFIG_USER_ONLY) 3357 /* Memory management */ 3358 env->nb_pids = 3; 3359 env->nb_ways = 2; 3360 env->id_tlbs = 0; 3361 switch (version) { 3362 case fsl_e500v1: 3363 tlbncfg[0] = register_tlbncfg(2, 1, 1, 0, 256); 3364 tlbncfg[1] = register_tlbncfg(16, 1, 9, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16); 3365 break; 3366 case fsl_e500v2: 3367 tlbncfg[0] = register_tlbncfg(4, 1, 1, 0, 512); 3368 tlbncfg[1] = register_tlbncfg(16, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16); 3369 break; 3370 case fsl_e500mc: 3371 case fsl_e5500: 3372 tlbncfg[0] = register_tlbncfg(4, 1, 1, 0, 512); 3373 tlbncfg[1] = register_tlbncfg(64, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 64); 3374 break; 3375 case fsl_e6500: 3376 mmucfg = 0x6510B45; 3377 env->nb_pids = 1; 3378 tlbncfg[0] = 0x08052400; 3379 tlbncfg[1] = 0x40028040; 3380 break; 3381 default: 3382 cpu_abort(env_cpu(env), "Unknown CPU: " TARGET_FMT_lx "\n", 3383 env->spr[SPR_PVR]); 3384 } 3385 #endif 3386 /* Cache sizes */ 3387 switch (version) { 3388 case fsl_e500v1: 3389 case fsl_e500v2: 3390 env->dcache_line_size = 32; 3391 env->icache_line_size = 32; 3392 break; 3393 case fsl_e500mc: 3394 case fsl_e5500: 3395 env->dcache_line_size = 64; 3396 env->icache_line_size = 64; 3397 l1cfg0 |= 0x1000000; /* 64 byte cache block size */ 3398 l1cfg1 |= 0x1000000; /* 64 byte cache block size */ 3399 break; 3400 case fsl_e6500: 3401 env->dcache_line_size = 32; 3402 env->icache_line_size = 32; 3403 l1cfg0 |= 0x0F83820; 3404 l1cfg1 |= 0x0B83820; 3405 break; 3406 default: 3407 cpu_abort(env_cpu(env), "Unknown CPU: " TARGET_FMT_lx "\n", 3408 env->spr[SPR_PVR]); 3409 } 3410 register_BookE206_sprs(env, 0x000000DF, tlbncfg, mmucfg); 3411 register_usprgh_sprs(env); 3412 3413 spr_register(env, SPR_HID0, "HID0", 3414 SPR_NOACCESS, SPR_NOACCESS, 3415 &spr_read_generic, &spr_write_generic, 3416 0x00000000); 3417 3418 spr_register(env, SPR_HID1, "HID1", 3419 SPR_NOACCESS, SPR_NOACCESS, 3420 &spr_read_generic, &spr_write_generic, 3421 0x00000000); 3422 3423 spr_register(env, SPR_Exxx_BBEAR, "BBEAR", 3424 SPR_NOACCESS, SPR_NOACCESS, 3425 &spr_read_generic, &spr_write_generic, 3426 0x00000000); 3427 3428 spr_register(env, SPR_Exxx_BBTAR, "BBTAR", 3429 SPR_NOACCESS, SPR_NOACCESS, 3430 &spr_read_generic, &spr_write_generic, 3431 0x00000000); 3432 3433 spr_register(env, SPR_Exxx_MCAR, "MCAR", 3434 SPR_NOACCESS, SPR_NOACCESS, 3435 &spr_read_generic, &spr_write_generic, 3436 0x00000000); 3437 3438 spr_register(env, SPR_BOOKE_MCSR, "MCSR", 3439 SPR_NOACCESS, SPR_NOACCESS, 3440 &spr_read_generic, &spr_write_generic, 3441 0x00000000); 3442 3443 spr_register(env, SPR_Exxx_NPIDR, "NPIDR", 3444 SPR_NOACCESS, SPR_NOACCESS, 3445 &spr_read_generic, &spr_write_generic, 3446 0x00000000); 3447 3448 spr_register(env, SPR_Exxx_BUCSR, "BUCSR", 3449 SPR_NOACCESS, SPR_NOACCESS, 3450 &spr_read_generic, &spr_write_generic, 3451 0x00000000); 3452 3453 spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0", 3454 &spr_read_generic, SPR_NOACCESS, 3455 &spr_read_generic, SPR_NOACCESS, 3456 l1cfg0); 3457 spr_register(env, SPR_Exxx_L1CFG1, "L1CFG1", 3458 &spr_read_generic, SPR_NOACCESS, 3459 &spr_read_generic, SPR_NOACCESS, 3460 l1cfg1); 3461 spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0", 3462 SPR_NOACCESS, SPR_NOACCESS, 3463 &spr_read_generic, &spr_write_e500_l1csr0, 3464 0x00000000); 3465 spr_register(env, SPR_Exxx_L1CSR1, "L1CSR1", 3466 SPR_NOACCESS, SPR_NOACCESS, 3467 &spr_read_generic, &spr_write_e500_l1csr1, 3468 0x00000000); 3469 if (version != fsl_e500v1 && version != fsl_e500v2) { 3470 spr_register(env, SPR_Exxx_L2CSR0, "L2CSR0", 3471 SPR_NOACCESS, SPR_NOACCESS, 3472 &spr_read_generic, &spr_write_e500_l2csr0, 3473 0x00000000); 3474 } 3475 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0", 3476 SPR_NOACCESS, SPR_NOACCESS, 3477 &spr_read_generic, &spr_write_generic, 3478 0x00000000); 3479 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1", 3480 SPR_NOACCESS, SPR_NOACCESS, 3481 &spr_read_generic, &spr_write_generic, 3482 0x00000000); 3483 spr_register(env, SPR_MMUCSR0, "MMUCSR0", 3484 SPR_NOACCESS, SPR_NOACCESS, 3485 &spr_read_generic, &spr_write_booke206_mmucsr0, 3486 0x00000000); 3487 spr_register(env, SPR_BOOKE_EPR, "EPR", 3488 SPR_NOACCESS, SPR_NOACCESS, 3489 &spr_read_generic, SPR_NOACCESS, 3490 0x00000000); 3491 /* XXX better abstract into Emb.xxx features */ 3492 if ((version == fsl_e5500) || (version == fsl_e6500)) { 3493 spr_register(env, SPR_BOOKE_EPCR, "EPCR", 3494 SPR_NOACCESS, SPR_NOACCESS, 3495 &spr_read_generic, &spr_write_generic, 3496 0x00000000); 3497 spr_register(env, SPR_BOOKE_MAS7_MAS3, "MAS7_MAS3", 3498 SPR_NOACCESS, SPR_NOACCESS, 3499 &spr_read_mas73, &spr_write_mas73, 3500 0x00000000); 3501 ivpr_mask = (target_ulong)~0xFFFFULL; 3502 } 3503 3504 if (version == fsl_e6500) { 3505 /* Thread identification */ 3506 spr_register(env, SPR_TIR, "TIR", 3507 SPR_NOACCESS, SPR_NOACCESS, 3508 &spr_read_generic, SPR_NOACCESS, 3509 0x00000000); 3510 spr_register(env, SPR_BOOKE_TLB0PS, "TLB0PS", 3511 SPR_NOACCESS, SPR_NOACCESS, 3512 &spr_read_generic, SPR_NOACCESS, 3513 0x00000004); 3514 spr_register(env, SPR_BOOKE_TLB1PS, "TLB1PS", 3515 SPR_NOACCESS, SPR_NOACCESS, 3516 &spr_read_generic, SPR_NOACCESS, 3517 0x7FFFFFFC); 3518 } 3519 3520 #if !defined(CONFIG_USER_ONLY) 3521 env->nb_tlb = 0; 3522 env->tlb_type = TLB_MAS; 3523 for (i = 0; i < BOOKE206_MAX_TLBN; i++) { 3524 env->nb_tlb += booke206_tlb_size(env, i); 3525 } 3526 #endif 3527 3528 init_excp_e200(env, ivpr_mask); 3529 /* Allocate hardware IRQ controller */ 3530 ppce500_irq_init(env_archcpu(env)); 3531 } 3532 3533 static void init_proc_e500v1(CPUPPCState *env) 3534 { 3535 init_proc_e500(env, fsl_e500v1); 3536 } 3537 3538 POWERPC_FAMILY(e500v1)(ObjectClass *oc, void *data) 3539 { 3540 DeviceClass *dc = DEVICE_CLASS(oc); 3541 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 3542 3543 dc->desc = "e500v1 core"; 3544 pcc->init_proc = init_proc_e500v1; 3545 pcc->check_pow = check_pow_hid0; 3546 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | 3547 PPC_SPE | PPC_SPE_SINGLE | 3548 PPC_WRTEE | PPC_RFDI | 3549 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI | 3550 PPC_CACHE_DCBZ | PPC_CACHE_DCBA | 3551 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC; 3552 pcc->insns_flags2 = PPC2_BOOKE206; 3553 pcc->msr_mask = (1ull << MSR_UCLE) | 3554 (1ull << MSR_SPE) | 3555 (1ull << MSR_POW) | 3556 (1ull << MSR_CE) | 3557 (1ull << MSR_EE) | 3558 (1ull << MSR_PR) | 3559 (1ull << MSR_FP) | 3560 (1ull << MSR_ME) | 3561 (1ull << MSR_FE0) | 3562 (1ull << MSR_DWE) | 3563 (1ull << MSR_DE) | 3564 (1ull << MSR_FE1) | 3565 (1ull << MSR_IR) | 3566 (1ull << MSR_DR); 3567 pcc->mmu_model = POWERPC_MMU_BOOKE206; 3568 pcc->excp_model = POWERPC_EXCP_BOOKE; 3569 pcc->bus_model = PPC_FLAGS_INPUT_BookE; 3570 pcc->bfd_mach = bfd_mach_ppc_860; 3571 pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE | 3572 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE | 3573 POWERPC_FLAG_BUS_CLK; 3574 } 3575 3576 static void init_proc_e500v2(CPUPPCState *env) 3577 { 3578 init_proc_e500(env, fsl_e500v2); 3579 } 3580 3581 POWERPC_FAMILY(e500v2)(ObjectClass *oc, void *data) 3582 { 3583 DeviceClass *dc = DEVICE_CLASS(oc); 3584 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 3585 3586 dc->desc = "e500v2 core"; 3587 pcc->init_proc = init_proc_e500v2; 3588 pcc->check_pow = check_pow_hid0; 3589 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | 3590 PPC_SPE | PPC_SPE_SINGLE | PPC_SPE_DOUBLE | 3591 PPC_WRTEE | PPC_RFDI | 3592 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI | 3593 PPC_CACHE_DCBZ | PPC_CACHE_DCBA | 3594 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC; 3595 pcc->insns_flags2 = PPC2_BOOKE206; 3596 pcc->msr_mask = (1ull << MSR_UCLE) | 3597 (1ull << MSR_SPE) | 3598 (1ull << MSR_POW) | 3599 (1ull << MSR_CE) | 3600 (1ull << MSR_EE) | 3601 (1ull << MSR_PR) | 3602 (1ull << MSR_FP) | 3603 (1ull << MSR_ME) | 3604 (1ull << MSR_FE0) | 3605 (1ull << MSR_DWE) | 3606 (1ull << MSR_DE) | 3607 (1ull << MSR_FE1) | 3608 (1ull << MSR_IR) | 3609 (1ull << MSR_DR); 3610 pcc->mmu_model = POWERPC_MMU_BOOKE206; 3611 pcc->excp_model = POWERPC_EXCP_BOOKE; 3612 pcc->bus_model = PPC_FLAGS_INPUT_BookE; 3613 pcc->bfd_mach = bfd_mach_ppc_860; 3614 pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE | 3615 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE | 3616 POWERPC_FLAG_BUS_CLK; 3617 } 3618 3619 static void init_proc_e500mc(CPUPPCState *env) 3620 { 3621 init_proc_e500(env, fsl_e500mc); 3622 } 3623 3624 POWERPC_FAMILY(e500mc)(ObjectClass *oc, void *data) 3625 { 3626 DeviceClass *dc = DEVICE_CLASS(oc); 3627 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 3628 3629 dc->desc = "e500mc core"; 3630 pcc->init_proc = init_proc_e500mc; 3631 pcc->check_pow = check_pow_none; 3632 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB | 3633 PPC_WRTEE | PPC_RFDI | PPC_RFMCI | 3634 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI | 3635 PPC_CACHE_DCBZ | PPC_CACHE_DCBA | 3636 PPC_FLOAT | PPC_FLOAT_FRES | 3637 PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL | 3638 PPC_FLOAT_STFIWX | PPC_WAIT | 3639 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC; 3640 pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL; 3641 pcc->msr_mask = (1ull << MSR_GS) | 3642 (1ull << MSR_UCLE) | 3643 (1ull << MSR_CE) | 3644 (1ull << MSR_EE) | 3645 (1ull << MSR_PR) | 3646 (1ull << MSR_FP) | 3647 (1ull << MSR_ME) | 3648 (1ull << MSR_FE0) | 3649 (1ull << MSR_DE) | 3650 (1ull << MSR_FE1) | 3651 (1ull << MSR_IR) | 3652 (1ull << MSR_DR) | 3653 (1ull << MSR_PX) | 3654 (1ull << MSR_RI); 3655 pcc->mmu_model = POWERPC_MMU_BOOKE206; 3656 pcc->excp_model = POWERPC_EXCP_BOOKE; 3657 pcc->bus_model = PPC_FLAGS_INPUT_BookE; 3658 /* FIXME: figure out the correct flag for e500mc */ 3659 pcc->bfd_mach = bfd_mach_ppc_e500; 3660 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE | 3661 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK; 3662 } 3663 3664 #ifdef TARGET_PPC64 3665 static void init_proc_e5500(CPUPPCState *env) 3666 { 3667 init_proc_e500(env, fsl_e5500); 3668 } 3669 3670 POWERPC_FAMILY(e5500)(ObjectClass *oc, void *data) 3671 { 3672 DeviceClass *dc = DEVICE_CLASS(oc); 3673 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 3674 3675 dc->desc = "e5500 core"; 3676 pcc->init_proc = init_proc_e5500; 3677 pcc->check_pow = check_pow_none; 3678 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB | 3679 PPC_WRTEE | PPC_RFDI | PPC_RFMCI | 3680 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI | 3681 PPC_CACHE_DCBZ | PPC_CACHE_DCBA | 3682 PPC_FLOAT | PPC_FLOAT_FRES | 3683 PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL | 3684 PPC_FLOAT_STFIWX | PPC_WAIT | 3685 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC | 3686 PPC_64B | PPC_POPCNTB | PPC_POPCNTWD; 3687 pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL | PPC2_PERM_ISA206 | 3688 PPC2_FP_CVT_S64; 3689 pcc->msr_mask = (1ull << MSR_CM) | 3690 (1ull << MSR_GS) | 3691 (1ull << MSR_UCLE) | 3692 (1ull << MSR_CE) | 3693 (1ull << MSR_EE) | 3694 (1ull << MSR_PR) | 3695 (1ull << MSR_FP) | 3696 (1ull << MSR_ME) | 3697 (1ull << MSR_FE0) | 3698 (1ull << MSR_DE) | 3699 (1ull << MSR_FE1) | 3700 (1ull << MSR_IR) | 3701 (1ull << MSR_DR) | 3702 (1ull << MSR_PX) | 3703 (1ull << MSR_RI); 3704 pcc->mmu_model = POWERPC_MMU_BOOKE206; 3705 pcc->excp_model = POWERPC_EXCP_BOOKE; 3706 pcc->bus_model = PPC_FLAGS_INPUT_BookE; 3707 /* FIXME: figure out the correct flag for e5500 */ 3708 pcc->bfd_mach = bfd_mach_ppc_e500; 3709 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE | 3710 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK; 3711 } 3712 3713 static void init_proc_e6500(CPUPPCState *env) 3714 { 3715 init_proc_e500(env, fsl_e6500); 3716 } 3717 3718 POWERPC_FAMILY(e6500)(ObjectClass *oc, void *data) 3719 { 3720 DeviceClass *dc = DEVICE_CLASS(oc); 3721 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 3722 3723 dc->desc = "e6500 core"; 3724 pcc->init_proc = init_proc_e6500; 3725 pcc->check_pow = check_pow_none; 3726 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB | 3727 PPC_WRTEE | PPC_RFDI | PPC_RFMCI | 3728 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI | 3729 PPC_CACHE_DCBZ | PPC_CACHE_DCBA | 3730 PPC_FLOAT | PPC_FLOAT_FRES | 3731 PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL | 3732 PPC_FLOAT_STFIWX | PPC_WAIT | 3733 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC | 3734 PPC_64B | PPC_POPCNTB | PPC_POPCNTWD | PPC_ALTIVEC; 3735 pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL | PPC2_PERM_ISA206 | 3736 PPC2_FP_CVT_S64 | PPC2_ATOMIC_ISA206; 3737 pcc->msr_mask = (1ull << MSR_CM) | 3738 (1ull << MSR_GS) | 3739 (1ull << MSR_UCLE) | 3740 (1ull << MSR_CE) | 3741 (1ull << MSR_EE) | 3742 (1ull << MSR_PR) | 3743 (1ull << MSR_FP) | 3744 (1ull << MSR_ME) | 3745 (1ull << MSR_FE0) | 3746 (1ull << MSR_DE) | 3747 (1ull << MSR_FE1) | 3748 (1ull << MSR_IS) | 3749 (1ull << MSR_DS) | 3750 (1ull << MSR_PX) | 3751 (1ull << MSR_RI) | 3752 (1ull << MSR_VR); 3753 pcc->mmu_model = POWERPC_MMU_BOOKE206; 3754 pcc->excp_model = POWERPC_EXCP_BOOKE; 3755 pcc->bus_model = PPC_FLAGS_INPUT_BookE; 3756 pcc->bfd_mach = bfd_mach_ppc_e500; 3757 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE | 3758 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_VRE; 3759 } 3760 3761 #endif 3762 3763 /* Non-embedded PowerPC */ 3764 static void init_proc_603(CPUPPCState *env) 3765 { 3766 register_ne_601_sprs(env); 3767 register_sdr1_sprs(env); 3768 register_603_sprs(env); 3769 3770 /* Memory management */ 3771 register_low_BATs(env); 3772 register_6xx_7xx_soft_tlb(env, 64, 2); 3773 init_excp_603(env); 3774 env->dcache_line_size = 32; 3775 env->icache_line_size = 32; 3776 /* Allocate hardware IRQ controller */ 3777 ppc6xx_irq_init(env_archcpu(env)); 3778 } 3779 3780 POWERPC_FAMILY(603)(ObjectClass *oc, void *data) 3781 { 3782 DeviceClass *dc = DEVICE_CLASS(oc); 3783 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 3784 3785 dc->desc = "PowerPC 603"; 3786 pcc->init_proc = init_proc_603; 3787 pcc->check_pow = check_pow_hid0; 3788 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 3789 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 3790 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX | 3791 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 3792 PPC_MEM_SYNC | PPC_MEM_EIEIO | 3793 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | 3794 PPC_SEGMENT | PPC_EXTERN; 3795 pcc->msr_mask = (1ull << MSR_POW) | 3796 (1ull << MSR_TGPR) | 3797 (1ull << MSR_ILE) | 3798 (1ull << MSR_EE) | 3799 (1ull << MSR_PR) | 3800 (1ull << MSR_FP) | 3801 (1ull << MSR_ME) | 3802 (1ull << MSR_FE0) | 3803 (1ull << MSR_SE) | 3804 (1ull << MSR_DE) | 3805 (1ull << MSR_FE1) | 3806 (1ull << MSR_EP) | 3807 (1ull << MSR_IR) | 3808 (1ull << MSR_DR) | 3809 (1ull << MSR_RI) | 3810 (1ull << MSR_LE); 3811 pcc->mmu_model = POWERPC_MMU_SOFT_6xx; 3812 pcc->excp_model = POWERPC_EXCP_6xx; 3813 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 3814 pcc->bfd_mach = bfd_mach_ppc_603; 3815 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE | 3816 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK; 3817 } 3818 3819 POWERPC_FAMILY(603E)(ObjectClass *oc, void *data) 3820 { 3821 DeviceClass *dc = DEVICE_CLASS(oc); 3822 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 3823 3824 dc->desc = "PowerPC 603e"; 3825 pcc->init_proc = init_proc_603; 3826 pcc->check_pow = check_pow_hid0; 3827 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 3828 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 3829 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX | 3830 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 3831 PPC_MEM_SYNC | PPC_MEM_EIEIO | 3832 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | 3833 PPC_SEGMENT | PPC_EXTERN; 3834 pcc->msr_mask = (1ull << MSR_POW) | 3835 (1ull << MSR_TGPR) | 3836 (1ull << MSR_ILE) | 3837 (1ull << MSR_EE) | 3838 (1ull << MSR_PR) | 3839 (1ull << MSR_FP) | 3840 (1ull << MSR_ME) | 3841 (1ull << MSR_FE0) | 3842 (1ull << MSR_SE) | 3843 (1ull << MSR_DE) | 3844 (1ull << MSR_FE1) | 3845 (1ull << MSR_EP) | 3846 (1ull << MSR_IR) | 3847 (1ull << MSR_DR) | 3848 (1ull << MSR_RI) | 3849 (1ull << MSR_LE); 3850 pcc->mmu_model = POWERPC_MMU_SOFT_6xx; 3851 pcc->excp_model = POWERPC_EXCP_6xx; 3852 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 3853 pcc->bfd_mach = bfd_mach_ppc_ec603e; 3854 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE | 3855 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK; 3856 } 3857 3858 static void init_proc_604(CPUPPCState *env) 3859 { 3860 register_ne_601_sprs(env); 3861 register_sdr1_sprs(env); 3862 register_604_sprs(env); 3863 3864 /* Memory management */ 3865 register_low_BATs(env); 3866 init_excp_604(env); 3867 env->dcache_line_size = 32; 3868 env->icache_line_size = 32; 3869 /* Allocate hardware IRQ controller */ 3870 ppc6xx_irq_init(env_archcpu(env)); 3871 } 3872 3873 POWERPC_FAMILY(604)(ObjectClass *oc, void *data) 3874 { 3875 DeviceClass *dc = DEVICE_CLASS(oc); 3876 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 3877 3878 dc->desc = "PowerPC 604"; 3879 pcc->init_proc = init_proc_604; 3880 pcc->check_pow = check_pow_nocheck; 3881 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 3882 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 3883 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX | 3884 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 3885 PPC_MEM_SYNC | PPC_MEM_EIEIO | 3886 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 3887 PPC_SEGMENT | PPC_EXTERN; 3888 pcc->msr_mask = (1ull << MSR_POW) | 3889 (1ull << MSR_ILE) | 3890 (1ull << MSR_EE) | 3891 (1ull << MSR_PR) | 3892 (1ull << MSR_FP) | 3893 (1ull << MSR_ME) | 3894 (1ull << MSR_FE0) | 3895 (1ull << MSR_SE) | 3896 (1ull << MSR_DE) | 3897 (1ull << MSR_FE1) | 3898 (1ull << MSR_EP) | 3899 (1ull << MSR_IR) | 3900 (1ull << MSR_DR) | 3901 (1ull << MSR_PMM) | 3902 (1ull << MSR_RI) | 3903 (1ull << MSR_LE); 3904 pcc->mmu_model = POWERPC_MMU_32B; 3905 pcc->excp_model = POWERPC_EXCP_6xx; 3906 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 3907 pcc->bfd_mach = bfd_mach_ppc_604; 3908 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE | 3909 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK; 3910 } 3911 3912 static void init_proc_604E(CPUPPCState *env) 3913 { 3914 register_ne_601_sprs(env); 3915 register_sdr1_sprs(env); 3916 register_604_sprs(env); 3917 3918 spr_register(env, SPR_7XX_MMCR1, "MMCR1", 3919 SPR_NOACCESS, SPR_NOACCESS, 3920 &spr_read_generic, &spr_write_generic, 3921 0x00000000); 3922 3923 spr_register(env, SPR_7XX_PMC3, "PMC3", 3924 SPR_NOACCESS, SPR_NOACCESS, 3925 &spr_read_generic, &spr_write_generic, 3926 0x00000000); 3927 3928 spr_register(env, SPR_7XX_PMC4, "PMC4", 3929 SPR_NOACCESS, SPR_NOACCESS, 3930 &spr_read_generic, &spr_write_generic, 3931 0x00000000); 3932 /* Hardware implementation registers */ 3933 spr_register(env, SPR_HID1, "HID1", 3934 SPR_NOACCESS, SPR_NOACCESS, 3935 &spr_read_generic, &spr_write_generic, 3936 0x00000000); 3937 /* Memory management */ 3938 register_low_BATs(env); 3939 init_excp_604(env); 3940 env->dcache_line_size = 32; 3941 env->icache_line_size = 32; 3942 /* Allocate hardware IRQ controller */ 3943 ppc6xx_irq_init(env_archcpu(env)); 3944 } 3945 3946 POWERPC_FAMILY(604E)(ObjectClass *oc, void *data) 3947 { 3948 DeviceClass *dc = DEVICE_CLASS(oc); 3949 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 3950 3951 dc->desc = "PowerPC 604E"; 3952 pcc->init_proc = init_proc_604E; 3953 pcc->check_pow = check_pow_nocheck; 3954 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 3955 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 3956 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX | 3957 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 3958 PPC_MEM_SYNC | PPC_MEM_EIEIO | 3959 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 3960 PPC_SEGMENT | PPC_EXTERN; 3961 pcc->msr_mask = (1ull << MSR_POW) | 3962 (1ull << MSR_ILE) | 3963 (1ull << MSR_EE) | 3964 (1ull << MSR_PR) | 3965 (1ull << MSR_FP) | 3966 (1ull << MSR_ME) | 3967 (1ull << MSR_FE0) | 3968 (1ull << MSR_SE) | 3969 (1ull << MSR_DE) | 3970 (1ull << MSR_FE1) | 3971 (1ull << MSR_EP) | 3972 (1ull << MSR_IR) | 3973 (1ull << MSR_DR) | 3974 (1ull << MSR_PMM) | 3975 (1ull << MSR_RI) | 3976 (1ull << MSR_LE); 3977 pcc->mmu_model = POWERPC_MMU_32B; 3978 pcc->excp_model = POWERPC_EXCP_6xx; 3979 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 3980 pcc->bfd_mach = bfd_mach_ppc_604; 3981 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE | 3982 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK; 3983 } 3984 3985 static void init_proc_740(CPUPPCState *env) 3986 { 3987 register_ne_601_sprs(env); 3988 register_sdr1_sprs(env); 3989 register_7xx_sprs(env); 3990 /* Thermal management */ 3991 register_thrm_sprs(env); 3992 3993 /* Memory management */ 3994 register_low_BATs(env); 3995 init_excp_7x0(env); 3996 env->dcache_line_size = 32; 3997 env->icache_line_size = 32; 3998 /* Allocate hardware IRQ controller */ 3999 ppc6xx_irq_init(env_archcpu(env)); 4000 } 4001 4002 POWERPC_FAMILY(740)(ObjectClass *oc, void *data) 4003 { 4004 DeviceClass *dc = DEVICE_CLASS(oc); 4005 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 4006 4007 dc->desc = "PowerPC 740"; 4008 pcc->init_proc = init_proc_740; 4009 pcc->check_pow = check_pow_hid0; 4010 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 4011 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 4012 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX | 4013 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 4014 PPC_MEM_SYNC | PPC_MEM_EIEIO | 4015 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 4016 PPC_SEGMENT | PPC_EXTERN; 4017 pcc->msr_mask = (1ull << MSR_POW) | 4018 (1ull << MSR_ILE) | 4019 (1ull << MSR_EE) | 4020 (1ull << MSR_PR) | 4021 (1ull << MSR_FP) | 4022 (1ull << MSR_ME) | 4023 (1ull << MSR_FE0) | 4024 (1ull << MSR_SE) | 4025 (1ull << MSR_DE) | 4026 (1ull << MSR_FE1) | 4027 (1ull << MSR_EP) | 4028 (1ull << MSR_IR) | 4029 (1ull << MSR_DR) | 4030 (1ull << MSR_PMM) | 4031 (1ull << MSR_RI) | 4032 (1ull << MSR_LE); 4033 pcc->mmu_model = POWERPC_MMU_32B; 4034 pcc->excp_model = POWERPC_EXCP_7xx; 4035 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 4036 pcc->bfd_mach = bfd_mach_ppc_750; 4037 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE | 4038 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK; 4039 } 4040 4041 static void init_proc_750(CPUPPCState *env) 4042 { 4043 register_ne_601_sprs(env); 4044 register_sdr1_sprs(env); 4045 register_7xx_sprs(env); 4046 4047 spr_register(env, SPR_L2CR, "L2CR", 4048 SPR_NOACCESS, SPR_NOACCESS, 4049 &spr_read_generic, spr_access_nop, 4050 0x00000000); 4051 /* Thermal management */ 4052 register_thrm_sprs(env); 4053 4054 /* Memory management */ 4055 register_low_BATs(env); 4056 /* 4057 * XXX: high BATs are also present but are known to be bugged on 4058 * die version 1.x 4059 */ 4060 init_excp_7x0(env); 4061 env->dcache_line_size = 32; 4062 env->icache_line_size = 32; 4063 /* Allocate hardware IRQ controller */ 4064 ppc6xx_irq_init(env_archcpu(env)); 4065 } 4066 4067 POWERPC_FAMILY(750)(ObjectClass *oc, void *data) 4068 { 4069 DeviceClass *dc = DEVICE_CLASS(oc); 4070 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 4071 4072 dc->desc = "PowerPC 750"; 4073 pcc->init_proc = init_proc_750; 4074 pcc->check_pow = check_pow_hid0; 4075 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 4076 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 4077 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX | 4078 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 4079 PPC_MEM_SYNC | PPC_MEM_EIEIO | 4080 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 4081 PPC_SEGMENT | PPC_EXTERN; 4082 pcc->msr_mask = (1ull << MSR_POW) | 4083 (1ull << MSR_ILE) | 4084 (1ull << MSR_EE) | 4085 (1ull << MSR_PR) | 4086 (1ull << MSR_FP) | 4087 (1ull << MSR_ME) | 4088 (1ull << MSR_FE0) | 4089 (1ull << MSR_SE) | 4090 (1ull << MSR_DE) | 4091 (1ull << MSR_FE1) | 4092 (1ull << MSR_EP) | 4093 (1ull << MSR_IR) | 4094 (1ull << MSR_DR) | 4095 (1ull << MSR_PMM) | 4096 (1ull << MSR_RI) | 4097 (1ull << MSR_LE); 4098 pcc->mmu_model = POWERPC_MMU_32B; 4099 pcc->excp_model = POWERPC_EXCP_7xx; 4100 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 4101 pcc->bfd_mach = bfd_mach_ppc_750; 4102 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE | 4103 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK; 4104 } 4105 4106 static void init_proc_750cl(CPUPPCState *env) 4107 { 4108 register_ne_601_sprs(env); 4109 register_sdr1_sprs(env); 4110 register_7xx_sprs(env); 4111 4112 spr_register(env, SPR_L2CR, "L2CR", 4113 SPR_NOACCESS, SPR_NOACCESS, 4114 &spr_read_generic, spr_access_nop, 4115 0x00000000); 4116 /* Thermal management */ 4117 /* Those registers are fake on 750CL */ 4118 spr_register(env, SPR_THRM1, "THRM1", 4119 SPR_NOACCESS, SPR_NOACCESS, 4120 &spr_read_generic, &spr_write_generic, 4121 0x00000000); 4122 spr_register(env, SPR_THRM2, "THRM2", 4123 SPR_NOACCESS, SPR_NOACCESS, 4124 &spr_read_generic, &spr_write_generic, 4125 0x00000000); 4126 spr_register(env, SPR_THRM3, "THRM3", 4127 SPR_NOACCESS, SPR_NOACCESS, 4128 &spr_read_generic, &spr_write_generic, 4129 0x00000000); 4130 4131 spr_register(env, SPR_750_TDCL, "TDCL", 4132 SPR_NOACCESS, SPR_NOACCESS, 4133 &spr_read_generic, &spr_write_generic, 4134 0x00000000); 4135 spr_register(env, SPR_750_TDCH, "TDCH", 4136 SPR_NOACCESS, SPR_NOACCESS, 4137 &spr_read_generic, &spr_write_generic, 4138 0x00000000); 4139 /* DMA */ 4140 spr_register(env, SPR_750_WPAR, "WPAR", 4141 SPR_NOACCESS, SPR_NOACCESS, 4142 &spr_read_generic, &spr_write_generic, 4143 0x00000000); 4144 spr_register(env, SPR_750_DMAL, "DMAL", 4145 SPR_NOACCESS, SPR_NOACCESS, 4146 &spr_read_generic, &spr_write_generic, 4147 0x00000000); 4148 spr_register(env, SPR_750_DMAU, "DMAU", 4149 SPR_NOACCESS, SPR_NOACCESS, 4150 &spr_read_generic, &spr_write_generic, 4151 0x00000000); 4152 /* Hardware implementation registers */ 4153 spr_register(env, SPR_750CL_HID2, "HID2", 4154 SPR_NOACCESS, SPR_NOACCESS, 4155 &spr_read_generic, &spr_write_generic, 4156 0x00000000); 4157 4158 spr_register(env, SPR_750CL_HID4, "HID4", 4159 SPR_NOACCESS, SPR_NOACCESS, 4160 &spr_read_generic, &spr_write_generic, 4161 0x00000000); 4162 /* Quantization registers */ 4163 spr_register(env, SPR_750_GQR0, "GQR0", 4164 SPR_NOACCESS, SPR_NOACCESS, 4165 &spr_read_generic, &spr_write_generic, 4166 0x00000000); 4167 4168 spr_register(env, SPR_750_GQR1, "GQR1", 4169 SPR_NOACCESS, SPR_NOACCESS, 4170 &spr_read_generic, &spr_write_generic, 4171 0x00000000); 4172 4173 spr_register(env, SPR_750_GQR2, "GQR2", 4174 SPR_NOACCESS, SPR_NOACCESS, 4175 &spr_read_generic, &spr_write_generic, 4176 0x00000000); 4177 4178 spr_register(env, SPR_750_GQR3, "GQR3", 4179 SPR_NOACCESS, SPR_NOACCESS, 4180 &spr_read_generic, &spr_write_generic, 4181 0x00000000); 4182 4183 spr_register(env, SPR_750_GQR4, "GQR4", 4184 SPR_NOACCESS, SPR_NOACCESS, 4185 &spr_read_generic, &spr_write_generic, 4186 0x00000000); 4187 4188 spr_register(env, SPR_750_GQR5, "GQR5", 4189 SPR_NOACCESS, SPR_NOACCESS, 4190 &spr_read_generic, &spr_write_generic, 4191 0x00000000); 4192 4193 spr_register(env, SPR_750_GQR6, "GQR6", 4194 SPR_NOACCESS, SPR_NOACCESS, 4195 &spr_read_generic, &spr_write_generic, 4196 0x00000000); 4197 4198 spr_register(env, SPR_750_GQR7, "GQR7", 4199 SPR_NOACCESS, SPR_NOACCESS, 4200 &spr_read_generic, &spr_write_generic, 4201 0x00000000); 4202 /* Memory management */ 4203 register_low_BATs(env); 4204 /* PowerPC 750cl has 8 DBATs and 8 IBATs */ 4205 register_high_BATs(env); 4206 init_excp_750cl(env); 4207 env->dcache_line_size = 32; 4208 env->icache_line_size = 32; 4209 /* Allocate hardware IRQ controller */ 4210 ppc6xx_irq_init(env_archcpu(env)); 4211 } 4212 4213 POWERPC_FAMILY(750cl)(ObjectClass *oc, void *data) 4214 { 4215 DeviceClass *dc = DEVICE_CLASS(oc); 4216 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 4217 4218 dc->desc = "PowerPC 750 CL"; 4219 pcc->init_proc = init_proc_750cl; 4220 pcc->check_pow = check_pow_hid0; 4221 /* 4222 * XXX: not implemented: 4223 * cache lock instructions: 4224 * dcbz_l 4225 * floating point paired instructions 4226 * psq_lux 4227 * psq_lx 4228 * psq_stux 4229 * psq_stx 4230 * ps_abs 4231 * ps_add 4232 * ps_cmpo0 4233 * ps_cmpo1 4234 * ps_cmpu0 4235 * ps_cmpu1 4236 * ps_div 4237 * ps_madd 4238 * ps_madds0 4239 * ps_madds1 4240 * ps_merge00 4241 * ps_merge01 4242 * ps_merge10 4243 * ps_merge11 4244 * ps_mr 4245 * ps_msub 4246 * ps_mul 4247 * ps_muls0 4248 * ps_muls1 4249 * ps_nabs 4250 * ps_neg 4251 * ps_nmadd 4252 * ps_nmsub 4253 * ps_res 4254 * ps_rsqrte 4255 * ps_sel 4256 * ps_sub 4257 * ps_sum0 4258 * ps_sum1 4259 */ 4260 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 4261 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 4262 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX | 4263 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 4264 PPC_MEM_SYNC | PPC_MEM_EIEIO | 4265 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 4266 PPC_SEGMENT | PPC_EXTERN; 4267 pcc->msr_mask = (1ull << MSR_POW) | 4268 (1ull << MSR_ILE) | 4269 (1ull << MSR_EE) | 4270 (1ull << MSR_PR) | 4271 (1ull << MSR_FP) | 4272 (1ull << MSR_ME) | 4273 (1ull << MSR_FE0) | 4274 (1ull << MSR_SE) | 4275 (1ull << MSR_DE) | 4276 (1ull << MSR_FE1) | 4277 (1ull << MSR_EP) | 4278 (1ull << MSR_IR) | 4279 (1ull << MSR_DR) | 4280 (1ull << MSR_PMM) | 4281 (1ull << MSR_RI) | 4282 (1ull << MSR_LE); 4283 pcc->mmu_model = POWERPC_MMU_32B; 4284 pcc->excp_model = POWERPC_EXCP_7xx; 4285 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 4286 pcc->bfd_mach = bfd_mach_ppc_750; 4287 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE | 4288 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK; 4289 } 4290 4291 static void init_proc_750cx(CPUPPCState *env) 4292 { 4293 register_ne_601_sprs(env); 4294 register_sdr1_sprs(env); 4295 register_7xx_sprs(env); 4296 4297 spr_register(env, SPR_L2CR, "L2CR", 4298 SPR_NOACCESS, SPR_NOACCESS, 4299 &spr_read_generic, spr_access_nop, 4300 0x00000000); 4301 /* Thermal management */ 4302 register_thrm_sprs(env); 4303 4304 spr_register(env, SPR_SDA, "SDA", 4305 SPR_NOACCESS, SPR_NOACCESS, 4306 &spr_read_generic, &spr_write_generic, 4307 0x00000000); 4308 4309 /* Memory management */ 4310 register_low_BATs(env); 4311 /* PowerPC 750cx has 8 DBATs and 8 IBATs */ 4312 register_high_BATs(env); 4313 init_excp_750cx(env); 4314 env->dcache_line_size = 32; 4315 env->icache_line_size = 32; 4316 /* Allocate hardware IRQ controller */ 4317 ppc6xx_irq_init(env_archcpu(env)); 4318 } 4319 4320 POWERPC_FAMILY(750cx)(ObjectClass *oc, void *data) 4321 { 4322 DeviceClass *dc = DEVICE_CLASS(oc); 4323 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 4324 4325 dc->desc = "PowerPC 750CX"; 4326 pcc->init_proc = init_proc_750cx; 4327 pcc->check_pow = check_pow_hid0; 4328 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 4329 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 4330 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX | 4331 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 4332 PPC_MEM_SYNC | PPC_MEM_EIEIO | 4333 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 4334 PPC_SEGMENT | PPC_EXTERN; 4335 pcc->msr_mask = (1ull << MSR_POW) | 4336 (1ull << MSR_ILE) | 4337 (1ull << MSR_EE) | 4338 (1ull << MSR_PR) | 4339 (1ull << MSR_FP) | 4340 (1ull << MSR_ME) | 4341 (1ull << MSR_FE0) | 4342 (1ull << MSR_SE) | 4343 (1ull << MSR_DE) | 4344 (1ull << MSR_FE1) | 4345 (1ull << MSR_EP) | 4346 (1ull << MSR_IR) | 4347 (1ull << MSR_DR) | 4348 (1ull << MSR_PMM) | 4349 (1ull << MSR_RI) | 4350 (1ull << MSR_LE); 4351 pcc->mmu_model = POWERPC_MMU_32B; 4352 pcc->excp_model = POWERPC_EXCP_7xx; 4353 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 4354 pcc->bfd_mach = bfd_mach_ppc_750; 4355 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE | 4356 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK; 4357 } 4358 4359 static void init_proc_750fx(CPUPPCState *env) 4360 { 4361 register_ne_601_sprs(env); 4362 register_sdr1_sprs(env); 4363 register_7xx_sprs(env); 4364 4365 spr_register(env, SPR_L2CR, "L2CR", 4366 SPR_NOACCESS, SPR_NOACCESS, 4367 &spr_read_generic, spr_access_nop, 4368 0x00000000); 4369 /* Thermal management */ 4370 register_thrm_sprs(env); 4371 4372 spr_register(env, SPR_750_THRM4, "THRM4", 4373 SPR_NOACCESS, SPR_NOACCESS, 4374 &spr_read_generic, &spr_write_generic, 4375 0x00000000); 4376 /* Hardware implementation registers */ 4377 spr_register(env, SPR_750FX_HID2, "HID2", 4378 SPR_NOACCESS, SPR_NOACCESS, 4379 &spr_read_generic, &spr_write_generic, 4380 0x00000000); 4381 /* Memory management */ 4382 register_low_BATs(env); 4383 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */ 4384 register_high_BATs(env); 4385 init_excp_7x0(env); 4386 env->dcache_line_size = 32; 4387 env->icache_line_size = 32; 4388 /* Allocate hardware IRQ controller */ 4389 ppc6xx_irq_init(env_archcpu(env)); 4390 } 4391 4392 POWERPC_FAMILY(750fx)(ObjectClass *oc, void *data) 4393 { 4394 DeviceClass *dc = DEVICE_CLASS(oc); 4395 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 4396 4397 dc->desc = "PowerPC 750FX"; 4398 pcc->init_proc = init_proc_750fx; 4399 pcc->check_pow = check_pow_hid0; 4400 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 4401 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 4402 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX | 4403 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 4404 PPC_MEM_SYNC | PPC_MEM_EIEIO | 4405 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 4406 PPC_SEGMENT | PPC_EXTERN; 4407 pcc->msr_mask = (1ull << MSR_POW) | 4408 (1ull << MSR_ILE) | 4409 (1ull << MSR_EE) | 4410 (1ull << MSR_PR) | 4411 (1ull << MSR_FP) | 4412 (1ull << MSR_ME) | 4413 (1ull << MSR_FE0) | 4414 (1ull << MSR_SE) | 4415 (1ull << MSR_DE) | 4416 (1ull << MSR_FE1) | 4417 (1ull << MSR_EP) | 4418 (1ull << MSR_IR) | 4419 (1ull << MSR_DR) | 4420 (1ull << MSR_PMM) | 4421 (1ull << MSR_RI) | 4422 (1ull << MSR_LE); 4423 pcc->mmu_model = POWERPC_MMU_32B; 4424 pcc->excp_model = POWERPC_EXCP_7xx; 4425 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 4426 pcc->bfd_mach = bfd_mach_ppc_750; 4427 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE | 4428 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK; 4429 } 4430 4431 static void init_proc_750gx(CPUPPCState *env) 4432 { 4433 register_ne_601_sprs(env); 4434 register_sdr1_sprs(env); 4435 register_7xx_sprs(env); 4436 4437 spr_register(env, SPR_L2CR, "L2CR", 4438 SPR_NOACCESS, SPR_NOACCESS, 4439 &spr_read_generic, spr_access_nop, 4440 0x00000000); 4441 /* Thermal management */ 4442 register_thrm_sprs(env); 4443 4444 spr_register(env, SPR_750_THRM4, "THRM4", 4445 SPR_NOACCESS, SPR_NOACCESS, 4446 &spr_read_generic, &spr_write_generic, 4447 0x00000000); 4448 /* Hardware implementation registers */ 4449 spr_register(env, SPR_750FX_HID2, "HID2", 4450 SPR_NOACCESS, SPR_NOACCESS, 4451 &spr_read_generic, &spr_write_generic, 4452 0x00000000); 4453 /* Memory management */ 4454 register_low_BATs(env); 4455 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */ 4456 register_high_BATs(env); 4457 init_excp_7x0(env); 4458 env->dcache_line_size = 32; 4459 env->icache_line_size = 32; 4460 /* Allocate hardware IRQ controller */ 4461 ppc6xx_irq_init(env_archcpu(env)); 4462 } 4463 4464 POWERPC_FAMILY(750gx)(ObjectClass *oc, void *data) 4465 { 4466 DeviceClass *dc = DEVICE_CLASS(oc); 4467 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 4468 4469 dc->desc = "PowerPC 750GX"; 4470 pcc->init_proc = init_proc_750gx; 4471 pcc->check_pow = check_pow_hid0; 4472 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 4473 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 4474 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX | 4475 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 4476 PPC_MEM_SYNC | PPC_MEM_EIEIO | 4477 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 4478 PPC_SEGMENT | PPC_EXTERN; 4479 pcc->msr_mask = (1ull << MSR_POW) | 4480 (1ull << MSR_ILE) | 4481 (1ull << MSR_EE) | 4482 (1ull << MSR_PR) | 4483 (1ull << MSR_FP) | 4484 (1ull << MSR_ME) | 4485 (1ull << MSR_FE0) | 4486 (1ull << MSR_SE) | 4487 (1ull << MSR_DE) | 4488 (1ull << MSR_FE1) | 4489 (1ull << MSR_EP) | 4490 (1ull << MSR_IR) | 4491 (1ull << MSR_DR) | 4492 (1ull << MSR_PMM) | 4493 (1ull << MSR_RI) | 4494 (1ull << MSR_LE); 4495 pcc->mmu_model = POWERPC_MMU_32B; 4496 pcc->excp_model = POWERPC_EXCP_7xx; 4497 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 4498 pcc->bfd_mach = bfd_mach_ppc_750; 4499 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE | 4500 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK; 4501 } 4502 4503 static void init_proc_745(CPUPPCState *env) 4504 { 4505 register_ne_601_sprs(env); 4506 register_sdr1_sprs(env); 4507 register_7xx_sprs(env); 4508 register_745_sprs(env); 4509 /* Thermal management */ 4510 register_thrm_sprs(env); 4511 4512 /* Memory management */ 4513 register_low_BATs(env); 4514 register_high_BATs(env); 4515 register_6xx_7xx_soft_tlb(env, 64, 2); 4516 init_excp_7x5(env); 4517 env->dcache_line_size = 32; 4518 env->icache_line_size = 32; 4519 /* Allocate hardware IRQ controller */ 4520 ppc6xx_irq_init(env_archcpu(env)); 4521 } 4522 4523 POWERPC_FAMILY(745)(ObjectClass *oc, void *data) 4524 { 4525 DeviceClass *dc = DEVICE_CLASS(oc); 4526 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 4527 4528 dc->desc = "PowerPC 745"; 4529 pcc->init_proc = init_proc_745; 4530 pcc->check_pow = check_pow_hid0; 4531 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 4532 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 4533 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX | 4534 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 4535 PPC_MEM_SYNC | PPC_MEM_EIEIO | 4536 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | 4537 PPC_SEGMENT | PPC_EXTERN; 4538 pcc->msr_mask = (1ull << MSR_POW) | 4539 (1ull << MSR_ILE) | 4540 (1ull << MSR_EE) | 4541 (1ull << MSR_PR) | 4542 (1ull << MSR_FP) | 4543 (1ull << MSR_ME) | 4544 (1ull << MSR_FE0) | 4545 (1ull << MSR_SE) | 4546 (1ull << MSR_DE) | 4547 (1ull << MSR_FE1) | 4548 (1ull << MSR_EP) | 4549 (1ull << MSR_IR) | 4550 (1ull << MSR_DR) | 4551 (1ull << MSR_PMM) | 4552 (1ull << MSR_RI) | 4553 (1ull << MSR_LE); 4554 pcc->mmu_model = POWERPC_MMU_SOFT_6xx; 4555 pcc->excp_model = POWERPC_EXCP_7xx; 4556 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 4557 pcc->bfd_mach = bfd_mach_ppc_750; 4558 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE | 4559 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK; 4560 } 4561 4562 static void init_proc_755(CPUPPCState *env) 4563 { 4564 register_ne_601_sprs(env); 4565 register_sdr1_sprs(env); 4566 register_7xx_sprs(env); 4567 register_745_sprs(env); 4568 register_755_sprs(env); 4569 4570 /* Thermal management */ 4571 register_thrm_sprs(env); 4572 4573 /* Memory management */ 4574 register_low_BATs(env); 4575 register_high_BATs(env); 4576 register_6xx_7xx_soft_tlb(env, 64, 2); 4577 init_excp_7x5(env); 4578 env->dcache_line_size = 32; 4579 env->icache_line_size = 32; 4580 /* Allocate hardware IRQ controller */ 4581 ppc6xx_irq_init(env_archcpu(env)); 4582 } 4583 4584 POWERPC_FAMILY(755)(ObjectClass *oc, void *data) 4585 { 4586 DeviceClass *dc = DEVICE_CLASS(oc); 4587 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 4588 4589 dc->desc = "PowerPC 755"; 4590 pcc->init_proc = init_proc_755; 4591 pcc->check_pow = check_pow_hid0; 4592 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 4593 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 4594 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX | 4595 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 4596 PPC_MEM_SYNC | PPC_MEM_EIEIO | 4597 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | 4598 PPC_SEGMENT | PPC_EXTERN; 4599 pcc->msr_mask = (1ull << MSR_POW) | 4600 (1ull << MSR_ILE) | 4601 (1ull << MSR_EE) | 4602 (1ull << MSR_PR) | 4603 (1ull << MSR_FP) | 4604 (1ull << MSR_ME) | 4605 (1ull << MSR_FE0) | 4606 (1ull << MSR_SE) | 4607 (1ull << MSR_DE) | 4608 (1ull << MSR_FE1) | 4609 (1ull << MSR_EP) | 4610 (1ull << MSR_IR) | 4611 (1ull << MSR_DR) | 4612 (1ull << MSR_PMM) | 4613 (1ull << MSR_RI) | 4614 (1ull << MSR_LE); 4615 pcc->mmu_model = POWERPC_MMU_SOFT_6xx; 4616 pcc->excp_model = POWERPC_EXCP_7xx; 4617 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 4618 pcc->bfd_mach = bfd_mach_ppc_750; 4619 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE | 4620 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK; 4621 } 4622 4623 static void init_proc_7400(CPUPPCState *env) 4624 { 4625 register_ne_601_sprs(env); 4626 register_sdr1_sprs(env); 4627 register_74xx_sprs(env); 4628 vscr_init(env, 0x00010000); 4629 4630 spr_register(env, SPR_UBAMR, "UBAMR", 4631 &spr_read_ureg, SPR_NOACCESS, 4632 &spr_read_ureg, SPR_NOACCESS, 4633 0x00000000); 4634 4635 spr_register(env, SPR_MSSCR1, "MSSCR1", 4636 SPR_NOACCESS, SPR_NOACCESS, 4637 &spr_read_generic, &spr_write_generic, 4638 0x00000000); 4639 /* Thermal management */ 4640 register_thrm_sprs(env); 4641 /* Memory management */ 4642 register_low_BATs(env); 4643 init_excp_7400(env); 4644 env->dcache_line_size = 32; 4645 env->icache_line_size = 32; 4646 /* Allocate hardware IRQ controller */ 4647 ppc6xx_irq_init(env_archcpu(env)); 4648 } 4649 4650 POWERPC_FAMILY(7400)(ObjectClass *oc, void *data) 4651 { 4652 DeviceClass *dc = DEVICE_CLASS(oc); 4653 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 4654 4655 dc->desc = "PowerPC 7400 (aka G4)"; 4656 pcc->init_proc = init_proc_7400; 4657 pcc->check_pow = check_pow_hid0; 4658 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 4659 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 4660 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE | 4661 PPC_FLOAT_STFIWX | 4662 PPC_CACHE | PPC_CACHE_ICBI | 4663 PPC_CACHE_DCBA | PPC_CACHE_DCBZ | 4664 PPC_MEM_SYNC | PPC_MEM_EIEIO | 4665 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 4666 PPC_MEM_TLBIA | 4667 PPC_SEGMENT | PPC_EXTERN | 4668 PPC_ALTIVEC; 4669 pcc->msr_mask = (1ull << MSR_VR) | 4670 (1ull << MSR_POW) | 4671 (1ull << MSR_ILE) | 4672 (1ull << MSR_EE) | 4673 (1ull << MSR_PR) | 4674 (1ull << MSR_FP) | 4675 (1ull << MSR_ME) | 4676 (1ull << MSR_FE0) | 4677 (1ull << MSR_SE) | 4678 (1ull << MSR_DE) | 4679 (1ull << MSR_FE1) | 4680 (1ull << MSR_EP) | 4681 (1ull << MSR_IR) | 4682 (1ull << MSR_DR) | 4683 (1ull << MSR_PMM) | 4684 (1ull << MSR_RI) | 4685 (1ull << MSR_LE); 4686 pcc->mmu_model = POWERPC_MMU_32B; 4687 pcc->excp_model = POWERPC_EXCP_74xx; 4688 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 4689 pcc->bfd_mach = bfd_mach_ppc_7400; 4690 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE | 4691 POWERPC_FLAG_BE | POWERPC_FLAG_PMM | 4692 POWERPC_FLAG_BUS_CLK; 4693 } 4694 4695 static void init_proc_7410(CPUPPCState *env) 4696 { 4697 register_ne_601_sprs(env); 4698 register_sdr1_sprs(env); 4699 register_74xx_sprs(env); 4700 vscr_init(env, 0x00010000); 4701 4702 spr_register(env, SPR_UBAMR, "UBAMR", 4703 &spr_read_ureg, SPR_NOACCESS, 4704 &spr_read_ureg, SPR_NOACCESS, 4705 0x00000000); 4706 /* Thermal management */ 4707 register_thrm_sprs(env); 4708 /* L2PMCR */ 4709 4710 spr_register(env, SPR_L2PMCR, "L2PMCR", 4711 SPR_NOACCESS, SPR_NOACCESS, 4712 &spr_read_generic, &spr_write_generic, 4713 0x00000000); 4714 /* LDSTDB */ 4715 4716 spr_register(env, SPR_LDSTDB, "LDSTDB", 4717 SPR_NOACCESS, SPR_NOACCESS, 4718 &spr_read_generic, &spr_write_generic, 4719 0x00000000); 4720 /* Memory management */ 4721 register_low_BATs(env); 4722 init_excp_7400(env); 4723 env->dcache_line_size = 32; 4724 env->icache_line_size = 32; 4725 /* Allocate hardware IRQ controller */ 4726 ppc6xx_irq_init(env_archcpu(env)); 4727 } 4728 4729 POWERPC_FAMILY(7410)(ObjectClass *oc, void *data) 4730 { 4731 DeviceClass *dc = DEVICE_CLASS(oc); 4732 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 4733 4734 dc->desc = "PowerPC 7410 (aka G4)"; 4735 pcc->init_proc = init_proc_7410; 4736 pcc->check_pow = check_pow_hid0; 4737 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 4738 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 4739 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE | 4740 PPC_FLOAT_STFIWX | 4741 PPC_CACHE | PPC_CACHE_ICBI | 4742 PPC_CACHE_DCBA | PPC_CACHE_DCBZ | 4743 PPC_MEM_SYNC | PPC_MEM_EIEIO | 4744 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 4745 PPC_MEM_TLBIA | 4746 PPC_SEGMENT | PPC_EXTERN | 4747 PPC_ALTIVEC; 4748 pcc->msr_mask = (1ull << MSR_VR) | 4749 (1ull << MSR_POW) | 4750 (1ull << MSR_ILE) | 4751 (1ull << MSR_EE) | 4752 (1ull << MSR_PR) | 4753 (1ull << MSR_FP) | 4754 (1ull << MSR_ME) | 4755 (1ull << MSR_FE0) | 4756 (1ull << MSR_SE) | 4757 (1ull << MSR_DE) | 4758 (1ull << MSR_FE1) | 4759 (1ull << MSR_EP) | 4760 (1ull << MSR_IR) | 4761 (1ull << MSR_DR) | 4762 (1ull << MSR_PMM) | 4763 (1ull << MSR_RI) | 4764 (1ull << MSR_LE); 4765 pcc->mmu_model = POWERPC_MMU_32B; 4766 pcc->excp_model = POWERPC_EXCP_74xx; 4767 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 4768 pcc->bfd_mach = bfd_mach_ppc_7400; 4769 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE | 4770 POWERPC_FLAG_BE | POWERPC_FLAG_PMM | 4771 POWERPC_FLAG_BUS_CLK; 4772 } 4773 4774 static void init_proc_7440(CPUPPCState *env) 4775 { 4776 register_ne_601_sprs(env); 4777 register_sdr1_sprs(env); 4778 register_74xx_sprs(env); 4779 vscr_init(env, 0x00010000); 4780 4781 spr_register(env, SPR_UBAMR, "UBAMR", 4782 &spr_read_ureg, SPR_NOACCESS, 4783 &spr_read_ureg, SPR_NOACCESS, 4784 0x00000000); 4785 /* LDSTCR */ 4786 spr_register(env, SPR_LDSTCR, "LDSTCR", 4787 SPR_NOACCESS, SPR_NOACCESS, 4788 &spr_read_generic, &spr_write_generic, 4789 0x00000000); 4790 /* ICTRL */ 4791 spr_register(env, SPR_ICTRL, "ICTRL", 4792 SPR_NOACCESS, SPR_NOACCESS, 4793 &spr_read_generic, &spr_write_generic, 4794 0x00000000); 4795 /* MSSSR0 */ 4796 spr_register(env, SPR_MSSSR0, "MSSSR0", 4797 SPR_NOACCESS, SPR_NOACCESS, 4798 &spr_read_generic, &spr_write_generic, 4799 0x00000000); 4800 /* PMC */ 4801 spr_register(env, SPR_7XX_PMC5, "PMC5", 4802 SPR_NOACCESS, SPR_NOACCESS, 4803 &spr_read_generic, &spr_write_generic, 4804 0x00000000); 4805 4806 spr_register(env, SPR_7XX_UPMC5, "UPMC5", 4807 &spr_read_ureg, SPR_NOACCESS, 4808 &spr_read_ureg, SPR_NOACCESS, 4809 0x00000000); 4810 4811 spr_register(env, SPR_7XX_PMC6, "PMC6", 4812 SPR_NOACCESS, SPR_NOACCESS, 4813 &spr_read_generic, &spr_write_generic, 4814 0x00000000); 4815 4816 spr_register(env, SPR_7XX_UPMC6, "UPMC6", 4817 &spr_read_ureg, SPR_NOACCESS, 4818 &spr_read_ureg, SPR_NOACCESS, 4819 0x00000000); 4820 /* Memory management */ 4821 register_low_BATs(env); 4822 init_excp_7450(env); 4823 env->dcache_line_size = 32; 4824 env->icache_line_size = 32; 4825 /* Allocate hardware IRQ controller */ 4826 ppc6xx_irq_init(env_archcpu(env)); 4827 } 4828 4829 POWERPC_FAMILY(7440)(ObjectClass *oc, void *data) 4830 { 4831 DeviceClass *dc = DEVICE_CLASS(oc); 4832 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 4833 4834 dc->desc = "PowerPC 7440 (aka G4)"; 4835 pcc->init_proc = init_proc_7440; 4836 pcc->check_pow = check_pow_hid0_74xx; 4837 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 4838 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 4839 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE | 4840 PPC_FLOAT_STFIWX | 4841 PPC_CACHE | PPC_CACHE_ICBI | 4842 PPC_CACHE_DCBA | PPC_CACHE_DCBZ | 4843 PPC_MEM_SYNC | PPC_MEM_EIEIO | 4844 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 4845 PPC_MEM_TLBIA | 4846 PPC_SEGMENT | PPC_EXTERN | 4847 PPC_ALTIVEC; 4848 pcc->msr_mask = (1ull << MSR_VR) | 4849 (1ull << MSR_POW) | 4850 (1ull << MSR_ILE) | 4851 (1ull << MSR_EE) | 4852 (1ull << MSR_PR) | 4853 (1ull << MSR_FP) | 4854 (1ull << MSR_ME) | 4855 (1ull << MSR_FE0) | 4856 (1ull << MSR_SE) | 4857 (1ull << MSR_DE) | 4858 (1ull << MSR_FE1) | 4859 (1ull << MSR_EP) | 4860 (1ull << MSR_IR) | 4861 (1ull << MSR_DR) | 4862 (1ull << MSR_PMM) | 4863 (1ull << MSR_RI) | 4864 (1ull << MSR_LE); 4865 pcc->mmu_model = POWERPC_MMU_32B; 4866 pcc->excp_model = POWERPC_EXCP_74xx; 4867 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 4868 pcc->bfd_mach = bfd_mach_ppc_7400; 4869 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE | 4870 POWERPC_FLAG_BE | POWERPC_FLAG_PMM | 4871 POWERPC_FLAG_BUS_CLK; 4872 } 4873 4874 static void init_proc_7450(CPUPPCState *env) 4875 { 4876 register_ne_601_sprs(env); 4877 register_sdr1_sprs(env); 4878 register_74xx_sprs(env); 4879 vscr_init(env, 0x00010000); 4880 /* Level 3 cache control */ 4881 register_l3_ctrl(env); 4882 /* L3ITCR1 */ 4883 spr_register(env, SPR_L3ITCR1, "L3ITCR1", 4884 SPR_NOACCESS, SPR_NOACCESS, 4885 &spr_read_generic, &spr_write_generic, 4886 0x00000000); 4887 /* L3ITCR2 */ 4888 spr_register(env, SPR_L3ITCR2, "L3ITCR2", 4889 SPR_NOACCESS, SPR_NOACCESS, 4890 &spr_read_generic, &spr_write_generic, 4891 0x00000000); 4892 /* L3ITCR3 */ 4893 spr_register(env, SPR_L3ITCR3, "L3ITCR3", 4894 SPR_NOACCESS, SPR_NOACCESS, 4895 &spr_read_generic, &spr_write_generic, 4896 0x00000000); 4897 /* L3OHCR */ 4898 spr_register(env, SPR_L3OHCR, "L3OHCR", 4899 SPR_NOACCESS, SPR_NOACCESS, 4900 &spr_read_generic, &spr_write_generic, 4901 0x00000000); 4902 4903 spr_register(env, SPR_UBAMR, "UBAMR", 4904 &spr_read_ureg, SPR_NOACCESS, 4905 &spr_read_ureg, SPR_NOACCESS, 4906 0x00000000); 4907 /* LDSTCR */ 4908 spr_register(env, SPR_LDSTCR, "LDSTCR", 4909 SPR_NOACCESS, SPR_NOACCESS, 4910 &spr_read_generic, &spr_write_generic, 4911 0x00000000); 4912 /* ICTRL */ 4913 spr_register(env, SPR_ICTRL, "ICTRL", 4914 SPR_NOACCESS, SPR_NOACCESS, 4915 &spr_read_generic, &spr_write_generic, 4916 0x00000000); 4917 /* MSSSR0 */ 4918 spr_register(env, SPR_MSSSR0, "MSSSR0", 4919 SPR_NOACCESS, SPR_NOACCESS, 4920 &spr_read_generic, &spr_write_generic, 4921 0x00000000); 4922 /* PMC */ 4923 spr_register(env, SPR_7XX_PMC5, "PMC5", 4924 SPR_NOACCESS, SPR_NOACCESS, 4925 &spr_read_generic, &spr_write_generic, 4926 0x00000000); 4927 4928 spr_register(env, SPR_7XX_UPMC5, "UPMC5", 4929 &spr_read_ureg, SPR_NOACCESS, 4930 &spr_read_ureg, SPR_NOACCESS, 4931 0x00000000); 4932 4933 spr_register(env, SPR_7XX_PMC6, "PMC6", 4934 SPR_NOACCESS, SPR_NOACCESS, 4935 &spr_read_generic, &spr_write_generic, 4936 0x00000000); 4937 4938 spr_register(env, SPR_7XX_UPMC6, "UPMC6", 4939 &spr_read_ureg, SPR_NOACCESS, 4940 &spr_read_ureg, SPR_NOACCESS, 4941 0x00000000); 4942 /* Memory management */ 4943 register_low_BATs(env); 4944 init_excp_7450(env); 4945 env->dcache_line_size = 32; 4946 env->icache_line_size = 32; 4947 /* Allocate hardware IRQ controller */ 4948 ppc6xx_irq_init(env_archcpu(env)); 4949 } 4950 4951 POWERPC_FAMILY(7450)(ObjectClass *oc, void *data) 4952 { 4953 DeviceClass *dc = DEVICE_CLASS(oc); 4954 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 4955 4956 dc->desc = "PowerPC 7450 (aka G4)"; 4957 pcc->init_proc = init_proc_7450; 4958 pcc->check_pow = check_pow_hid0_74xx; 4959 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 4960 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 4961 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE | 4962 PPC_FLOAT_STFIWX | 4963 PPC_CACHE | PPC_CACHE_ICBI | 4964 PPC_CACHE_DCBA | PPC_CACHE_DCBZ | 4965 PPC_MEM_SYNC | PPC_MEM_EIEIO | 4966 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 4967 PPC_MEM_TLBIA | 4968 PPC_SEGMENT | PPC_EXTERN | 4969 PPC_ALTIVEC; 4970 pcc->msr_mask = (1ull << MSR_VR) | 4971 (1ull << MSR_POW) | 4972 (1ull << MSR_ILE) | 4973 (1ull << MSR_EE) | 4974 (1ull << MSR_PR) | 4975 (1ull << MSR_FP) | 4976 (1ull << MSR_ME) | 4977 (1ull << MSR_FE0) | 4978 (1ull << MSR_SE) | 4979 (1ull << MSR_DE) | 4980 (1ull << MSR_FE1) | 4981 (1ull << MSR_EP) | 4982 (1ull << MSR_IR) | 4983 (1ull << MSR_DR) | 4984 (1ull << MSR_PMM) | 4985 (1ull << MSR_RI) | 4986 (1ull << MSR_LE); 4987 pcc->mmu_model = POWERPC_MMU_32B; 4988 pcc->excp_model = POWERPC_EXCP_74xx; 4989 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 4990 pcc->bfd_mach = bfd_mach_ppc_7400; 4991 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE | 4992 POWERPC_FLAG_BE | POWERPC_FLAG_PMM | 4993 POWERPC_FLAG_BUS_CLK; 4994 } 4995 4996 static void init_proc_7445(CPUPPCState *env) 4997 { 4998 register_ne_601_sprs(env); 4999 register_sdr1_sprs(env); 5000 register_74xx_sprs(env); 5001 vscr_init(env, 0x00010000); 5002 /* LDSTCR */ 5003 spr_register(env, SPR_LDSTCR, "LDSTCR", 5004 SPR_NOACCESS, SPR_NOACCESS, 5005 &spr_read_generic, &spr_write_generic, 5006 0x00000000); 5007 /* ICTRL */ 5008 spr_register(env, SPR_ICTRL, "ICTRL", 5009 SPR_NOACCESS, SPR_NOACCESS, 5010 &spr_read_generic, &spr_write_generic, 5011 0x00000000); 5012 /* MSSSR0 */ 5013 spr_register(env, SPR_MSSSR0, "MSSSR0", 5014 SPR_NOACCESS, SPR_NOACCESS, 5015 &spr_read_generic, &spr_write_generic, 5016 0x00000000); 5017 /* PMC */ 5018 spr_register(env, SPR_7XX_PMC5, "PMC5", 5019 SPR_NOACCESS, SPR_NOACCESS, 5020 &spr_read_generic, &spr_write_generic, 5021 0x00000000); 5022 5023 spr_register(env, SPR_7XX_UPMC5, "UPMC5", 5024 &spr_read_ureg, SPR_NOACCESS, 5025 &spr_read_ureg, SPR_NOACCESS, 5026 0x00000000); 5027 5028 spr_register(env, SPR_7XX_PMC6, "PMC6", 5029 SPR_NOACCESS, SPR_NOACCESS, 5030 &spr_read_generic, &spr_write_generic, 5031 0x00000000); 5032 5033 spr_register(env, SPR_7XX_UPMC6, "UPMC6", 5034 &spr_read_ureg, SPR_NOACCESS, 5035 &spr_read_ureg, SPR_NOACCESS, 5036 0x00000000); 5037 /* SPRGs */ 5038 spr_register(env, SPR_SPRG4, "SPRG4", 5039 SPR_NOACCESS, SPR_NOACCESS, 5040 &spr_read_generic, &spr_write_generic, 5041 0x00000000); 5042 spr_register(env, SPR_USPRG4, "USPRG4", 5043 &spr_read_ureg, SPR_NOACCESS, 5044 &spr_read_ureg, SPR_NOACCESS, 5045 0x00000000); 5046 spr_register(env, SPR_SPRG5, "SPRG5", 5047 SPR_NOACCESS, SPR_NOACCESS, 5048 &spr_read_generic, &spr_write_generic, 5049 0x00000000); 5050 spr_register(env, SPR_USPRG5, "USPRG5", 5051 &spr_read_ureg, SPR_NOACCESS, 5052 &spr_read_ureg, SPR_NOACCESS, 5053 0x00000000); 5054 spr_register(env, SPR_SPRG6, "SPRG6", 5055 SPR_NOACCESS, SPR_NOACCESS, 5056 &spr_read_generic, &spr_write_generic, 5057 0x00000000); 5058 spr_register(env, SPR_USPRG6, "USPRG6", 5059 &spr_read_ureg, SPR_NOACCESS, 5060 &spr_read_ureg, SPR_NOACCESS, 5061 0x00000000); 5062 spr_register(env, SPR_SPRG7, "SPRG7", 5063 SPR_NOACCESS, SPR_NOACCESS, 5064 &spr_read_generic, &spr_write_generic, 5065 0x00000000); 5066 spr_register(env, SPR_USPRG7, "USPRG7", 5067 &spr_read_ureg, SPR_NOACCESS, 5068 &spr_read_ureg, SPR_NOACCESS, 5069 0x00000000); 5070 /* Memory management */ 5071 register_low_BATs(env); 5072 register_high_BATs(env); 5073 init_excp_7450(env); 5074 env->dcache_line_size = 32; 5075 env->icache_line_size = 32; 5076 /* Allocate hardware IRQ controller */ 5077 ppc6xx_irq_init(env_archcpu(env)); 5078 } 5079 5080 POWERPC_FAMILY(7445)(ObjectClass *oc, void *data) 5081 { 5082 DeviceClass *dc = DEVICE_CLASS(oc); 5083 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 5084 5085 dc->desc = "PowerPC 7445 (aka G4)"; 5086 pcc->init_proc = init_proc_7445; 5087 pcc->check_pow = check_pow_hid0_74xx; 5088 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 5089 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 5090 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE | 5091 PPC_FLOAT_STFIWX | 5092 PPC_CACHE | PPC_CACHE_ICBI | 5093 PPC_CACHE_DCBA | PPC_CACHE_DCBZ | 5094 PPC_MEM_SYNC | PPC_MEM_EIEIO | 5095 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 5096 PPC_MEM_TLBIA | 5097 PPC_SEGMENT | PPC_EXTERN | 5098 PPC_ALTIVEC; 5099 pcc->msr_mask = (1ull << MSR_VR) | 5100 (1ull << MSR_POW) | 5101 (1ull << MSR_ILE) | 5102 (1ull << MSR_EE) | 5103 (1ull << MSR_PR) | 5104 (1ull << MSR_FP) | 5105 (1ull << MSR_ME) | 5106 (1ull << MSR_FE0) | 5107 (1ull << MSR_SE) | 5108 (1ull << MSR_DE) | 5109 (1ull << MSR_FE1) | 5110 (1ull << MSR_EP) | 5111 (1ull << MSR_IR) | 5112 (1ull << MSR_DR) | 5113 (1ull << MSR_PMM) | 5114 (1ull << MSR_RI) | 5115 (1ull << MSR_LE); 5116 pcc->mmu_model = POWERPC_MMU_32B; 5117 pcc->excp_model = POWERPC_EXCP_74xx; 5118 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 5119 pcc->bfd_mach = bfd_mach_ppc_7400; 5120 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE | 5121 POWERPC_FLAG_BE | POWERPC_FLAG_PMM | 5122 POWERPC_FLAG_BUS_CLK; 5123 } 5124 5125 static void init_proc_7455(CPUPPCState *env) 5126 { 5127 register_ne_601_sprs(env); 5128 register_sdr1_sprs(env); 5129 register_74xx_sprs(env); 5130 vscr_init(env, 0x00010000); 5131 /* Level 3 cache control */ 5132 register_l3_ctrl(env); 5133 /* LDSTCR */ 5134 spr_register(env, SPR_LDSTCR, "LDSTCR", 5135 SPR_NOACCESS, SPR_NOACCESS, 5136 &spr_read_generic, &spr_write_generic, 5137 0x00000000); 5138 /* ICTRL */ 5139 spr_register(env, SPR_ICTRL, "ICTRL", 5140 SPR_NOACCESS, SPR_NOACCESS, 5141 &spr_read_generic, &spr_write_generic, 5142 0x00000000); 5143 /* MSSSR0 */ 5144 spr_register(env, SPR_MSSSR0, "MSSSR0", 5145 SPR_NOACCESS, SPR_NOACCESS, 5146 &spr_read_generic, &spr_write_generic, 5147 0x00000000); 5148 /* PMC */ 5149 spr_register(env, SPR_7XX_PMC5, "PMC5", 5150 SPR_NOACCESS, SPR_NOACCESS, 5151 &spr_read_generic, &spr_write_generic, 5152 0x00000000); 5153 5154 spr_register(env, SPR_7XX_UPMC5, "UPMC5", 5155 &spr_read_ureg, SPR_NOACCESS, 5156 &spr_read_ureg, SPR_NOACCESS, 5157 0x00000000); 5158 5159 spr_register(env, SPR_7XX_PMC6, "PMC6", 5160 SPR_NOACCESS, SPR_NOACCESS, 5161 &spr_read_generic, &spr_write_generic, 5162 0x00000000); 5163 5164 spr_register(env, SPR_7XX_UPMC6, "UPMC6", 5165 &spr_read_ureg, SPR_NOACCESS, 5166 &spr_read_ureg, SPR_NOACCESS, 5167 0x00000000); 5168 /* SPRGs */ 5169 spr_register(env, SPR_SPRG4, "SPRG4", 5170 SPR_NOACCESS, SPR_NOACCESS, 5171 &spr_read_generic, &spr_write_generic, 5172 0x00000000); 5173 spr_register(env, SPR_USPRG4, "USPRG4", 5174 &spr_read_ureg, SPR_NOACCESS, 5175 &spr_read_ureg, SPR_NOACCESS, 5176 0x00000000); 5177 spr_register(env, SPR_SPRG5, "SPRG5", 5178 SPR_NOACCESS, SPR_NOACCESS, 5179 &spr_read_generic, &spr_write_generic, 5180 0x00000000); 5181 spr_register(env, SPR_USPRG5, "USPRG5", 5182 &spr_read_ureg, SPR_NOACCESS, 5183 &spr_read_ureg, SPR_NOACCESS, 5184 0x00000000); 5185 spr_register(env, SPR_SPRG6, "SPRG6", 5186 SPR_NOACCESS, SPR_NOACCESS, 5187 &spr_read_generic, &spr_write_generic, 5188 0x00000000); 5189 spr_register(env, SPR_USPRG6, "USPRG6", 5190 &spr_read_ureg, SPR_NOACCESS, 5191 &spr_read_ureg, SPR_NOACCESS, 5192 0x00000000); 5193 spr_register(env, SPR_SPRG7, "SPRG7", 5194 SPR_NOACCESS, SPR_NOACCESS, 5195 &spr_read_generic, &spr_write_generic, 5196 0x00000000); 5197 spr_register(env, SPR_USPRG7, "USPRG7", 5198 &spr_read_ureg, SPR_NOACCESS, 5199 &spr_read_ureg, SPR_NOACCESS, 5200 0x00000000); 5201 /* Memory management */ 5202 register_low_BATs(env); 5203 register_high_BATs(env); 5204 init_excp_7450(env); 5205 env->dcache_line_size = 32; 5206 env->icache_line_size = 32; 5207 /* Allocate hardware IRQ controller */ 5208 ppc6xx_irq_init(env_archcpu(env)); 5209 } 5210 5211 POWERPC_FAMILY(7455)(ObjectClass *oc, void *data) 5212 { 5213 DeviceClass *dc = DEVICE_CLASS(oc); 5214 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 5215 5216 dc->desc = "PowerPC 7455 (aka G4)"; 5217 pcc->init_proc = init_proc_7455; 5218 pcc->check_pow = check_pow_hid0_74xx; 5219 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 5220 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 5221 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE | 5222 PPC_FLOAT_STFIWX | 5223 PPC_CACHE | PPC_CACHE_ICBI | 5224 PPC_CACHE_DCBA | PPC_CACHE_DCBZ | 5225 PPC_MEM_SYNC | PPC_MEM_EIEIO | 5226 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 5227 PPC_MEM_TLBIA | 5228 PPC_SEGMENT | PPC_EXTERN | 5229 PPC_ALTIVEC; 5230 pcc->msr_mask = (1ull << MSR_VR) | 5231 (1ull << MSR_POW) | 5232 (1ull << MSR_ILE) | 5233 (1ull << MSR_EE) | 5234 (1ull << MSR_PR) | 5235 (1ull << MSR_FP) | 5236 (1ull << MSR_ME) | 5237 (1ull << MSR_FE0) | 5238 (1ull << MSR_SE) | 5239 (1ull << MSR_DE) | 5240 (1ull << MSR_FE1) | 5241 (1ull << MSR_EP) | 5242 (1ull << MSR_IR) | 5243 (1ull << MSR_DR) | 5244 (1ull << MSR_PMM) | 5245 (1ull << MSR_RI) | 5246 (1ull << MSR_LE); 5247 pcc->mmu_model = POWERPC_MMU_32B; 5248 pcc->excp_model = POWERPC_EXCP_74xx; 5249 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 5250 pcc->bfd_mach = bfd_mach_ppc_7400; 5251 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE | 5252 POWERPC_FLAG_BE | POWERPC_FLAG_PMM | 5253 POWERPC_FLAG_BUS_CLK; 5254 } 5255 5256 static void init_proc_7457(CPUPPCState *env) 5257 { 5258 register_ne_601_sprs(env); 5259 register_sdr1_sprs(env); 5260 register_74xx_sprs(env); 5261 vscr_init(env, 0x00010000); 5262 /* Level 3 cache control */ 5263 register_l3_ctrl(env); 5264 /* L3ITCR1 */ 5265 spr_register(env, SPR_L3ITCR1, "L3ITCR1", 5266 SPR_NOACCESS, SPR_NOACCESS, 5267 &spr_read_generic, &spr_write_generic, 5268 0x00000000); 5269 /* L3ITCR2 */ 5270 spr_register(env, SPR_L3ITCR2, "L3ITCR2", 5271 SPR_NOACCESS, SPR_NOACCESS, 5272 &spr_read_generic, &spr_write_generic, 5273 0x00000000); 5274 /* L3ITCR3 */ 5275 spr_register(env, SPR_L3ITCR3, "L3ITCR3", 5276 SPR_NOACCESS, SPR_NOACCESS, 5277 &spr_read_generic, &spr_write_generic, 5278 0x00000000); 5279 /* L3OHCR */ 5280 spr_register(env, SPR_L3OHCR, "L3OHCR", 5281 SPR_NOACCESS, SPR_NOACCESS, 5282 &spr_read_generic, &spr_write_generic, 5283 0x00000000); 5284 /* LDSTCR */ 5285 spr_register(env, SPR_LDSTCR, "LDSTCR", 5286 SPR_NOACCESS, SPR_NOACCESS, 5287 &spr_read_generic, &spr_write_generic, 5288 0x00000000); 5289 /* ICTRL */ 5290 spr_register(env, SPR_ICTRL, "ICTRL", 5291 SPR_NOACCESS, SPR_NOACCESS, 5292 &spr_read_generic, &spr_write_generic, 5293 0x00000000); 5294 /* MSSSR0 */ 5295 spr_register(env, SPR_MSSSR0, "MSSSR0", 5296 SPR_NOACCESS, SPR_NOACCESS, 5297 &spr_read_generic, &spr_write_generic, 5298 0x00000000); 5299 /* PMC */ 5300 spr_register(env, SPR_7XX_PMC5, "PMC5", 5301 SPR_NOACCESS, SPR_NOACCESS, 5302 &spr_read_generic, &spr_write_generic, 5303 0x00000000); 5304 5305 spr_register(env, SPR_7XX_UPMC5, "UPMC5", 5306 &spr_read_ureg, SPR_NOACCESS, 5307 &spr_read_ureg, SPR_NOACCESS, 5308 0x00000000); 5309 5310 spr_register(env, SPR_7XX_PMC6, "PMC6", 5311 SPR_NOACCESS, SPR_NOACCESS, 5312 &spr_read_generic, &spr_write_generic, 5313 0x00000000); 5314 5315 spr_register(env, SPR_7XX_UPMC6, "UPMC6", 5316 &spr_read_ureg, SPR_NOACCESS, 5317 &spr_read_ureg, SPR_NOACCESS, 5318 0x00000000); 5319 /* SPRGs */ 5320 spr_register(env, SPR_SPRG4, "SPRG4", 5321 SPR_NOACCESS, SPR_NOACCESS, 5322 &spr_read_generic, &spr_write_generic, 5323 0x00000000); 5324 spr_register(env, SPR_USPRG4, "USPRG4", 5325 &spr_read_ureg, SPR_NOACCESS, 5326 &spr_read_ureg, SPR_NOACCESS, 5327 0x00000000); 5328 spr_register(env, SPR_SPRG5, "SPRG5", 5329 SPR_NOACCESS, SPR_NOACCESS, 5330 &spr_read_generic, &spr_write_generic, 5331 0x00000000); 5332 spr_register(env, SPR_USPRG5, "USPRG5", 5333 &spr_read_ureg, SPR_NOACCESS, 5334 &spr_read_ureg, SPR_NOACCESS, 5335 0x00000000); 5336 spr_register(env, SPR_SPRG6, "SPRG6", 5337 SPR_NOACCESS, SPR_NOACCESS, 5338 &spr_read_generic, &spr_write_generic, 5339 0x00000000); 5340 spr_register(env, SPR_USPRG6, "USPRG6", 5341 &spr_read_ureg, SPR_NOACCESS, 5342 &spr_read_ureg, SPR_NOACCESS, 5343 0x00000000); 5344 spr_register(env, SPR_SPRG7, "SPRG7", 5345 SPR_NOACCESS, SPR_NOACCESS, 5346 &spr_read_generic, &spr_write_generic, 5347 0x00000000); 5348 spr_register(env, SPR_USPRG7, "USPRG7", 5349 &spr_read_ureg, SPR_NOACCESS, 5350 &spr_read_ureg, SPR_NOACCESS, 5351 0x00000000); 5352 /* Memory management */ 5353 register_low_BATs(env); 5354 register_high_BATs(env); 5355 init_excp_7450(env); 5356 env->dcache_line_size = 32; 5357 env->icache_line_size = 32; 5358 /* Allocate hardware IRQ controller */ 5359 ppc6xx_irq_init(env_archcpu(env)); 5360 } 5361 5362 POWERPC_FAMILY(7457)(ObjectClass *oc, void *data) 5363 { 5364 DeviceClass *dc = DEVICE_CLASS(oc); 5365 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 5366 5367 dc->desc = "PowerPC 7457 (aka G4)"; 5368 pcc->init_proc = init_proc_7457; 5369 pcc->check_pow = check_pow_hid0_74xx; 5370 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 5371 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 5372 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE | 5373 PPC_FLOAT_STFIWX | 5374 PPC_CACHE | PPC_CACHE_ICBI | 5375 PPC_CACHE_DCBA | PPC_CACHE_DCBZ | 5376 PPC_MEM_SYNC | PPC_MEM_EIEIO | 5377 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 5378 PPC_MEM_TLBIA | 5379 PPC_SEGMENT | PPC_EXTERN | 5380 PPC_ALTIVEC; 5381 pcc->msr_mask = (1ull << MSR_VR) | 5382 (1ull << MSR_POW) | 5383 (1ull << MSR_ILE) | 5384 (1ull << MSR_EE) | 5385 (1ull << MSR_PR) | 5386 (1ull << MSR_FP) | 5387 (1ull << MSR_ME) | 5388 (1ull << MSR_FE0) | 5389 (1ull << MSR_SE) | 5390 (1ull << MSR_DE) | 5391 (1ull << MSR_FE1) | 5392 (1ull << MSR_EP) | 5393 (1ull << MSR_IR) | 5394 (1ull << MSR_DR) | 5395 (1ull << MSR_PMM) | 5396 (1ull << MSR_RI) | 5397 (1ull << MSR_LE); 5398 pcc->mmu_model = POWERPC_MMU_32B; 5399 pcc->excp_model = POWERPC_EXCP_74xx; 5400 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 5401 pcc->bfd_mach = bfd_mach_ppc_7400; 5402 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE | 5403 POWERPC_FLAG_BE | POWERPC_FLAG_PMM | 5404 POWERPC_FLAG_BUS_CLK; 5405 } 5406 5407 static void init_proc_e600(CPUPPCState *env) 5408 { 5409 register_ne_601_sprs(env); 5410 register_sdr1_sprs(env); 5411 register_74xx_sprs(env); 5412 vscr_init(env, 0x00010000); 5413 5414 spr_register(env, SPR_UBAMR, "UBAMR", 5415 &spr_read_ureg, SPR_NOACCESS, 5416 &spr_read_ureg, SPR_NOACCESS, 5417 0x00000000); 5418 5419 spr_register(env, SPR_LDSTCR, "LDSTCR", 5420 SPR_NOACCESS, SPR_NOACCESS, 5421 &spr_read_generic, &spr_write_generic, 5422 0x00000000); 5423 5424 spr_register(env, SPR_ICTRL, "ICTRL", 5425 SPR_NOACCESS, SPR_NOACCESS, 5426 &spr_read_generic, &spr_write_generic, 5427 0x00000000); 5428 5429 spr_register(env, SPR_MSSSR0, "MSSSR0", 5430 SPR_NOACCESS, SPR_NOACCESS, 5431 &spr_read_generic, &spr_write_generic, 5432 0x00000000); 5433 5434 spr_register(env, SPR_7XX_PMC5, "PMC5", 5435 SPR_NOACCESS, SPR_NOACCESS, 5436 &spr_read_generic, &spr_write_generic, 5437 0x00000000); 5438 5439 spr_register(env, SPR_7XX_UPMC5, "UPMC5", 5440 &spr_read_ureg, SPR_NOACCESS, 5441 &spr_read_ureg, SPR_NOACCESS, 5442 0x00000000); 5443 5444 spr_register(env, SPR_7XX_PMC6, "PMC6", 5445 SPR_NOACCESS, SPR_NOACCESS, 5446 &spr_read_generic, &spr_write_generic, 5447 0x00000000); 5448 5449 spr_register(env, SPR_7XX_UPMC6, "UPMC6", 5450 &spr_read_ureg, SPR_NOACCESS, 5451 &spr_read_ureg, SPR_NOACCESS, 5452 0x00000000); 5453 /* SPRGs */ 5454 spr_register(env, SPR_SPRG4, "SPRG4", 5455 SPR_NOACCESS, SPR_NOACCESS, 5456 &spr_read_generic, &spr_write_generic, 5457 0x00000000); 5458 spr_register(env, SPR_USPRG4, "USPRG4", 5459 &spr_read_ureg, SPR_NOACCESS, 5460 &spr_read_ureg, SPR_NOACCESS, 5461 0x00000000); 5462 spr_register(env, SPR_SPRG5, "SPRG5", 5463 SPR_NOACCESS, SPR_NOACCESS, 5464 &spr_read_generic, &spr_write_generic, 5465 0x00000000); 5466 spr_register(env, SPR_USPRG5, "USPRG5", 5467 &spr_read_ureg, SPR_NOACCESS, 5468 &spr_read_ureg, SPR_NOACCESS, 5469 0x00000000); 5470 spr_register(env, SPR_SPRG6, "SPRG6", 5471 SPR_NOACCESS, SPR_NOACCESS, 5472 &spr_read_generic, &spr_write_generic, 5473 0x00000000); 5474 spr_register(env, SPR_USPRG6, "USPRG6", 5475 &spr_read_ureg, SPR_NOACCESS, 5476 &spr_read_ureg, SPR_NOACCESS, 5477 0x00000000); 5478 spr_register(env, SPR_SPRG7, "SPRG7", 5479 SPR_NOACCESS, SPR_NOACCESS, 5480 &spr_read_generic, &spr_write_generic, 5481 0x00000000); 5482 spr_register(env, SPR_USPRG7, "USPRG7", 5483 &spr_read_ureg, SPR_NOACCESS, 5484 &spr_read_ureg, SPR_NOACCESS, 5485 0x00000000); 5486 /* Memory management */ 5487 register_low_BATs(env); 5488 register_high_BATs(env); 5489 init_excp_7450(env); 5490 env->dcache_line_size = 32; 5491 env->icache_line_size = 32; 5492 /* Allocate hardware IRQ controller */ 5493 ppc6xx_irq_init(env_archcpu(env)); 5494 } 5495 5496 POWERPC_FAMILY(e600)(ObjectClass *oc, void *data) 5497 { 5498 DeviceClass *dc = DEVICE_CLASS(oc); 5499 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 5500 5501 dc->desc = "PowerPC e600"; 5502 pcc->init_proc = init_proc_e600; 5503 pcc->check_pow = check_pow_hid0_74xx; 5504 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 5505 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 5506 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE | 5507 PPC_FLOAT_STFIWX | 5508 PPC_CACHE | PPC_CACHE_ICBI | 5509 PPC_CACHE_DCBA | PPC_CACHE_DCBZ | 5510 PPC_MEM_SYNC | PPC_MEM_EIEIO | 5511 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 5512 PPC_MEM_TLBIA | 5513 PPC_SEGMENT | PPC_EXTERN | 5514 PPC_ALTIVEC; 5515 pcc->insns_flags2 = PPC_NONE; 5516 pcc->msr_mask = (1ull << MSR_VR) | 5517 (1ull << MSR_POW) | 5518 (1ull << MSR_ILE) | 5519 (1ull << MSR_EE) | 5520 (1ull << MSR_PR) | 5521 (1ull << MSR_FP) | 5522 (1ull << MSR_ME) | 5523 (1ull << MSR_FE0) | 5524 (1ull << MSR_SE) | 5525 (1ull << MSR_DE) | 5526 (1ull << MSR_FE1) | 5527 (1ull << MSR_EP) | 5528 (1ull << MSR_IR) | 5529 (1ull << MSR_DR) | 5530 (1ull << MSR_PMM) | 5531 (1ull << MSR_RI) | 5532 (1ull << MSR_LE); 5533 pcc->mmu_model = POWERPC_MMU_32B; 5534 pcc->excp_model = POWERPC_EXCP_74xx; 5535 pcc->bus_model = PPC_FLAGS_INPUT_6xx; 5536 pcc->bfd_mach = bfd_mach_ppc_7400; 5537 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE | 5538 POWERPC_FLAG_BE | POWERPC_FLAG_PMM | 5539 POWERPC_FLAG_BUS_CLK; 5540 } 5541 5542 #if defined(TARGET_PPC64) 5543 #if defined(CONFIG_USER_ONLY) 5544 #define POWERPC970_HID5_INIT 0x00000080 5545 #else 5546 #define POWERPC970_HID5_INIT 0x00000000 5547 #endif 5548 5549 static int check_pow_970(CPUPPCState *env) 5550 { 5551 if (env->spr[SPR_HID0] & (HID0_DEEPNAP | HID0_DOZE | HID0_NAP)) { 5552 return 1; 5553 } 5554 5555 return 0; 5556 } 5557 5558 static void register_970_hid_sprs(CPUPPCState *env) 5559 { 5560 /* Hardware implementation registers */ 5561 spr_register(env, SPR_HID0, "HID0", 5562 SPR_NOACCESS, SPR_NOACCESS, 5563 &spr_read_generic, &spr_write_clear, 5564 0x60000000); 5565 spr_register(env, SPR_HID1, "HID1", 5566 SPR_NOACCESS, SPR_NOACCESS, 5567 &spr_read_generic, &spr_write_generic, 5568 0x00000000); 5569 spr_register(env, SPR_970_HID5, "HID5", 5570 SPR_NOACCESS, SPR_NOACCESS, 5571 &spr_read_generic, &spr_write_generic, 5572 POWERPC970_HID5_INIT); 5573 } 5574 5575 static void register_970_hior_sprs(CPUPPCState *env) 5576 { 5577 spr_register(env, SPR_HIOR, "SPR_HIOR", 5578 SPR_NOACCESS, SPR_NOACCESS, 5579 &spr_read_hior, &spr_write_hior, 5580 0x00000000); 5581 } 5582 5583 static void register_book3s_ctrl_sprs(CPUPPCState *env) 5584 { 5585 spr_register(env, SPR_CTRL, "SPR_CTRL", 5586 SPR_NOACCESS, SPR_NOACCESS, 5587 SPR_NOACCESS, &spr_write_CTRL, 5588 0x00000000); 5589 spr_register(env, SPR_UCTRL, "SPR_UCTRL", 5590 &spr_read_ureg, SPR_NOACCESS, 5591 &spr_read_ureg, SPR_NOACCESS, 5592 0x00000000); 5593 } 5594 5595 static void register_book3s_altivec_sprs(CPUPPCState *env) 5596 { 5597 if (!(env->insns_flags & PPC_ALTIVEC)) { 5598 return; 5599 } 5600 5601 spr_register_kvm(env, SPR_VRSAVE, "VRSAVE", 5602 &spr_read_generic, &spr_write_generic, 5603 &spr_read_generic, &spr_write_generic, 5604 KVM_REG_PPC_VRSAVE, 0x00000000); 5605 5606 } 5607 5608 static void register_book3s_dbg_sprs(CPUPPCState *env) 5609 { 5610 /* 5611 * TODO: different specs define different scopes for these, 5612 * will have to address this: 5613 * 970: super/write and super/read 5614 * powerisa 2.03..2.04: hypv/write and super/read. 5615 * powerisa 2.05 and newer: hypv/write and hypv/read. 5616 */ 5617 spr_register_kvm(env, SPR_DABR, "DABR", 5618 SPR_NOACCESS, SPR_NOACCESS, 5619 &spr_read_generic, &spr_write_generic, 5620 KVM_REG_PPC_DABR, 0x00000000); 5621 spr_register_kvm(env, SPR_DABRX, "DABRX", 5622 SPR_NOACCESS, SPR_NOACCESS, 5623 &spr_read_generic, &spr_write_generic, 5624 KVM_REG_PPC_DABRX, 0x00000000); 5625 } 5626 5627 static void register_book3s_207_dbg_sprs(CPUPPCState *env) 5628 { 5629 spr_register_kvm_hv(env, SPR_DAWR0, "DAWR0", 5630 SPR_NOACCESS, SPR_NOACCESS, 5631 SPR_NOACCESS, SPR_NOACCESS, 5632 &spr_read_generic, &spr_write_generic, 5633 KVM_REG_PPC_DAWR, 0x00000000); 5634 spr_register_kvm_hv(env, SPR_DAWRX0, "DAWRX0", 5635 SPR_NOACCESS, SPR_NOACCESS, 5636 SPR_NOACCESS, SPR_NOACCESS, 5637 &spr_read_generic, &spr_write_generic, 5638 KVM_REG_PPC_DAWRX, 0x00000000); 5639 spr_register_kvm_hv(env, SPR_CIABR, "CIABR", 5640 SPR_NOACCESS, SPR_NOACCESS, 5641 SPR_NOACCESS, SPR_NOACCESS, 5642 &spr_read_generic, &spr_write_generic, 5643 KVM_REG_PPC_CIABR, 0x00000000); 5644 } 5645 5646 static void register_970_dbg_sprs(CPUPPCState *env) 5647 { 5648 /* Breakpoints */ 5649 spr_register(env, SPR_IABR, "IABR", 5650 SPR_NOACCESS, SPR_NOACCESS, 5651 &spr_read_generic, &spr_write_generic, 5652 0x00000000); 5653 } 5654 5655 static void register_book3s_pmu_sup_sprs(CPUPPCState *env) 5656 { 5657 spr_register_kvm(env, SPR_POWER_MMCR0, "MMCR0", 5658 SPR_NOACCESS, SPR_NOACCESS, 5659 &spr_read_generic, &spr_write_MMCR0, 5660 KVM_REG_PPC_MMCR0, 0x80000000); 5661 spr_register_kvm(env, SPR_POWER_MMCR1, "MMCR1", 5662 SPR_NOACCESS, SPR_NOACCESS, 5663 &spr_read_generic, &spr_write_MMCR1, 5664 KVM_REG_PPC_MMCR1, 0x00000000); 5665 spr_register_kvm(env, SPR_POWER_MMCRA, "MMCRA", 5666 SPR_NOACCESS, SPR_NOACCESS, 5667 &spr_read_generic, &spr_write_generic, 5668 KVM_REG_PPC_MMCRA, 0x00000000); 5669 spr_register_kvm(env, SPR_POWER_PMC1, "PMC1", 5670 SPR_NOACCESS, SPR_NOACCESS, 5671 &spr_read_PMC, &spr_write_PMC, 5672 KVM_REG_PPC_PMC1, 0x00000000); 5673 spr_register_kvm(env, SPR_POWER_PMC2, "PMC2", 5674 SPR_NOACCESS, SPR_NOACCESS, 5675 &spr_read_PMC, &spr_write_PMC, 5676 KVM_REG_PPC_PMC2, 0x00000000); 5677 spr_register_kvm(env, SPR_POWER_PMC3, "PMC3", 5678 SPR_NOACCESS, SPR_NOACCESS, 5679 &spr_read_PMC, &spr_write_PMC, 5680 KVM_REG_PPC_PMC3, 0x00000000); 5681 spr_register_kvm(env, SPR_POWER_PMC4, "PMC4", 5682 SPR_NOACCESS, SPR_NOACCESS, 5683 &spr_read_PMC, &spr_write_PMC, 5684 KVM_REG_PPC_PMC4, 0x00000000); 5685 spr_register_kvm(env, SPR_POWER_PMC5, "PMC5", 5686 SPR_NOACCESS, SPR_NOACCESS, 5687 &spr_read_PMC, &spr_write_PMC, 5688 KVM_REG_PPC_PMC5, 0x00000000); 5689 spr_register_kvm(env, SPR_POWER_PMC6, "PMC6", 5690 SPR_NOACCESS, SPR_NOACCESS, 5691 &spr_read_PMC, &spr_write_PMC, 5692 KVM_REG_PPC_PMC6, 0x00000000); 5693 spr_register_kvm(env, SPR_POWER_SIAR, "SIAR", 5694 SPR_NOACCESS, SPR_NOACCESS, 5695 &spr_read_generic, &spr_write_generic, 5696 KVM_REG_PPC_SIAR, 0x00000000); 5697 spr_register_kvm(env, SPR_POWER_SDAR, "SDAR", 5698 SPR_NOACCESS, SPR_NOACCESS, 5699 &spr_read_generic, &spr_write_generic, 5700 KVM_REG_PPC_SDAR, 0x00000000); 5701 } 5702 5703 static void register_book3s_pmu_user_sprs(CPUPPCState *env) 5704 { 5705 spr_register(env, SPR_POWER_UMMCR0, "UMMCR0", 5706 &spr_read_MMCR0_ureg, &spr_write_MMCR0_ureg, 5707 &spr_read_ureg, &spr_write_ureg, 5708 0x80000000); 5709 spr_register(env, SPR_POWER_UMMCR1, "UMMCR1", 5710 &spr_read_ureg, SPR_NOACCESS, 5711 &spr_read_ureg, &spr_write_ureg, 5712 0x00000000); 5713 spr_register(env, SPR_POWER_UMMCRA, "UMMCRA", 5714 &spr_read_ureg, SPR_NOACCESS, 5715 &spr_read_ureg, &spr_write_ureg, 5716 0x00000000); 5717 spr_register(env, SPR_POWER_UPMC1, "UPMC1", 5718 &spr_read_PMC14_ureg, &spr_write_PMC14_ureg, 5719 &spr_read_ureg, &spr_write_ureg, 5720 0x00000000); 5721 spr_register(env, SPR_POWER_UPMC2, "UPMC2", 5722 &spr_read_PMC14_ureg, &spr_write_PMC14_ureg, 5723 &spr_read_ureg, &spr_write_ureg, 5724 0x00000000); 5725 spr_register(env, SPR_POWER_UPMC3, "UPMC3", 5726 &spr_read_PMC14_ureg, &spr_write_PMC14_ureg, 5727 &spr_read_ureg, &spr_write_ureg, 5728 0x00000000); 5729 spr_register(env, SPR_POWER_UPMC4, "UPMC4", 5730 &spr_read_PMC14_ureg, &spr_write_PMC14_ureg, 5731 &spr_read_ureg, &spr_write_ureg, 5732 0x00000000); 5733 spr_register(env, SPR_POWER_UPMC5, "UPMC5", 5734 &spr_read_PMC56_ureg, &spr_write_PMC56_ureg, 5735 &spr_read_ureg, &spr_write_ureg, 5736 0x00000000); 5737 spr_register(env, SPR_POWER_UPMC6, "UPMC6", 5738 &spr_read_PMC56_ureg, &spr_write_PMC56_ureg, 5739 &spr_read_ureg, &spr_write_ureg, 5740 0x00000000); 5741 spr_register(env, SPR_POWER_USIAR, "USIAR", 5742 &spr_read_ureg, SPR_NOACCESS, 5743 &spr_read_ureg, &spr_write_ureg, 5744 0x00000000); 5745 spr_register(env, SPR_POWER_USDAR, "USDAR", 5746 &spr_read_ureg, SPR_NOACCESS, 5747 &spr_read_ureg, &spr_write_ureg, 5748 0x00000000); 5749 } 5750 5751 static void register_970_pmu_sup_sprs(CPUPPCState *env) 5752 { 5753 spr_register_kvm(env, SPR_970_PMC7, "PMC7", 5754 SPR_NOACCESS, SPR_NOACCESS, 5755 &spr_read_generic, &spr_write_generic, 5756 KVM_REG_PPC_PMC7, 0x00000000); 5757 spr_register_kvm(env, SPR_970_PMC8, "PMC8", 5758 SPR_NOACCESS, SPR_NOACCESS, 5759 &spr_read_generic, &spr_write_generic, 5760 KVM_REG_PPC_PMC8, 0x00000000); 5761 } 5762 5763 static void register_970_pmu_user_sprs(CPUPPCState *env) 5764 { 5765 spr_register(env, SPR_970_UPMC7, "UPMC7", 5766 &spr_read_ureg, SPR_NOACCESS, 5767 &spr_read_ureg, &spr_write_ureg, 5768 0x00000000); 5769 spr_register(env, SPR_970_UPMC8, "UPMC8", 5770 &spr_read_ureg, SPR_NOACCESS, 5771 &spr_read_ureg, &spr_write_ureg, 5772 0x00000000); 5773 } 5774 5775 static void register_power8_pmu_sup_sprs(CPUPPCState *env) 5776 { 5777 spr_register_kvm(env, SPR_POWER_MMCR2, "MMCR2", 5778 SPR_NOACCESS, SPR_NOACCESS, 5779 &spr_read_generic, &spr_write_generic, 5780 KVM_REG_PPC_MMCR2, 0x00000000); 5781 spr_register_kvm(env, SPR_POWER_MMCRS, "MMCRS", 5782 SPR_NOACCESS, SPR_NOACCESS, 5783 &spr_read_generic, &spr_write_generic, 5784 KVM_REG_PPC_MMCRS, 0x00000000); 5785 spr_register_kvm(env, SPR_POWER_SIER, "SIER", 5786 SPR_NOACCESS, SPR_NOACCESS, 5787 &spr_read_generic, &spr_write_generic, 5788 KVM_REG_PPC_SIER, 0x00000000); 5789 spr_register_kvm(env, SPR_POWER_SPMC1, "SPMC1", 5790 SPR_NOACCESS, SPR_NOACCESS, 5791 &spr_read_generic, &spr_write_generic, 5792 KVM_REG_PPC_SPMC1, 0x00000000); 5793 spr_register_kvm(env, SPR_POWER_SPMC2, "SPMC2", 5794 SPR_NOACCESS, SPR_NOACCESS, 5795 &spr_read_generic, &spr_write_generic, 5796 KVM_REG_PPC_SPMC2, 0x00000000); 5797 spr_register_kvm(env, SPR_TACR, "TACR", 5798 SPR_NOACCESS, SPR_NOACCESS, 5799 &spr_read_generic, &spr_write_generic, 5800 KVM_REG_PPC_TACR, 0x00000000); 5801 spr_register_kvm(env, SPR_TCSCR, "TCSCR", 5802 SPR_NOACCESS, SPR_NOACCESS, 5803 &spr_read_generic, &spr_write_generic, 5804 KVM_REG_PPC_TCSCR, 0x00000000); 5805 spr_register_kvm(env, SPR_CSIGR, "CSIGR", 5806 SPR_NOACCESS, SPR_NOACCESS, 5807 &spr_read_generic, &spr_write_generic, 5808 KVM_REG_PPC_CSIGR, 0x00000000); 5809 } 5810 5811 static void register_power8_pmu_user_sprs(CPUPPCState *env) 5812 { 5813 spr_register(env, SPR_POWER_UMMCR2, "UMMCR2", 5814 &spr_read_MMCR2_ureg, &spr_write_MMCR2_ureg, 5815 &spr_read_ureg, &spr_write_ureg, 5816 0x00000000); 5817 spr_register(env, SPR_POWER_USIER, "USIER", 5818 &spr_read_generic, SPR_NOACCESS, 5819 &spr_read_generic, &spr_write_generic, 5820 0x00000000); 5821 } 5822 5823 static void register_power5p_ear_sprs(CPUPPCState *env) 5824 { 5825 /* External access control */ 5826 spr_register(env, SPR_EAR, "EAR", 5827 SPR_NOACCESS, SPR_NOACCESS, 5828 &spr_read_generic, &spr_write_generic, 5829 0x00000000); 5830 } 5831 5832 static void register_power5p_tb_sprs(CPUPPCState *env) 5833 { 5834 /* TBU40 (High 40 bits of the Timebase register */ 5835 spr_register_hv(env, SPR_TBU40, "TBU40", 5836 SPR_NOACCESS, SPR_NOACCESS, 5837 SPR_NOACCESS, SPR_NOACCESS, 5838 SPR_NOACCESS, &spr_write_tbu40, 5839 0x00000000); 5840 } 5841 5842 static void register_970_lpar_sprs(CPUPPCState *env) 5843 { 5844 #if !defined(CONFIG_USER_ONLY) 5845 /* 5846 * PPC970: HID4 covers things later controlled by the LPCR and 5847 * RMOR in later CPUs, but with a different encoding. We only 5848 * support the 970 in "Apple mode" which has all hypervisor 5849 * facilities disabled by strapping, so we can basically just 5850 * ignore it 5851 */ 5852 spr_register(env, SPR_970_HID4, "HID4", 5853 SPR_NOACCESS, SPR_NOACCESS, 5854 &spr_read_generic, &spr_write_generic, 5855 0x00000000); 5856 #endif 5857 } 5858 5859 static void register_power5p_lpar_sprs(CPUPPCState *env) 5860 { 5861 #if !defined(CONFIG_USER_ONLY) 5862 /* Logical partitionning */ 5863 spr_register_kvm_hv(env, SPR_LPCR, "LPCR", 5864 SPR_NOACCESS, SPR_NOACCESS, 5865 SPR_NOACCESS, SPR_NOACCESS, 5866 &spr_read_generic, &spr_write_lpcr, 5867 KVM_REG_PPC_LPCR, LPCR_LPES0 | LPCR_LPES1); 5868 spr_register_hv(env, SPR_HDEC, "HDEC", 5869 SPR_NOACCESS, SPR_NOACCESS, 5870 SPR_NOACCESS, SPR_NOACCESS, 5871 &spr_read_hdecr, &spr_write_hdecr, 0); 5872 #endif 5873 } 5874 5875 static void register_book3s_ids_sprs(CPUPPCState *env) 5876 { 5877 /* FIXME: Will need to deal with thread vs core only SPRs */ 5878 5879 /* Processor identification */ 5880 spr_register_hv(env, SPR_PIR, "PIR", 5881 SPR_NOACCESS, SPR_NOACCESS, 5882 &spr_read_generic, SPR_NOACCESS, 5883 &spr_read_generic, NULL, 5884 0x00000000); 5885 spr_register_hv(env, SPR_HID0, "HID0", 5886 SPR_NOACCESS, SPR_NOACCESS, 5887 SPR_NOACCESS, SPR_NOACCESS, 5888 &spr_read_generic, &spr_write_generic, 5889 0x00000000); 5890 spr_register_hv(env, SPR_TSCR, "TSCR", 5891 SPR_NOACCESS, SPR_NOACCESS, 5892 SPR_NOACCESS, SPR_NOACCESS, 5893 &spr_read_generic, &spr_write_generic, 5894 0x00000000); 5895 spr_register_hv(env, SPR_HMER, "HMER", 5896 SPR_NOACCESS, SPR_NOACCESS, 5897 SPR_NOACCESS, SPR_NOACCESS, 5898 &spr_read_generic, &spr_write_hmer, 5899 0x00000000); 5900 spr_register_hv(env, SPR_HMEER, "HMEER", 5901 SPR_NOACCESS, SPR_NOACCESS, 5902 SPR_NOACCESS, SPR_NOACCESS, 5903 &spr_read_generic, &spr_write_generic, 5904 0x00000000); 5905 spr_register_hv(env, SPR_TFMR, "TFMR", 5906 SPR_NOACCESS, SPR_NOACCESS, 5907 SPR_NOACCESS, SPR_NOACCESS, 5908 &spr_read_generic, &spr_write_generic, 5909 0x00000000); 5910 spr_register_hv(env, SPR_LPIDR, "LPIDR", 5911 SPR_NOACCESS, SPR_NOACCESS, 5912 SPR_NOACCESS, SPR_NOACCESS, 5913 &spr_read_generic, &spr_write_lpidr, 5914 0x00000000); 5915 spr_register_hv(env, SPR_HFSCR, "HFSCR", 5916 SPR_NOACCESS, SPR_NOACCESS, 5917 SPR_NOACCESS, SPR_NOACCESS, 5918 &spr_read_generic, &spr_write_generic, 5919 0x00000000); 5920 spr_register_hv(env, SPR_MMCRC, "MMCRC", 5921 SPR_NOACCESS, SPR_NOACCESS, 5922 SPR_NOACCESS, SPR_NOACCESS, 5923 &spr_read_generic, &spr_write_generic, 5924 0x00000000); 5925 spr_register_hv(env, SPR_MMCRH, "MMCRH", 5926 SPR_NOACCESS, SPR_NOACCESS, 5927 SPR_NOACCESS, SPR_NOACCESS, 5928 &spr_read_generic, &spr_write_generic, 5929 0x00000000); 5930 spr_register_hv(env, SPR_HSPRG0, "HSPRG0", 5931 SPR_NOACCESS, SPR_NOACCESS, 5932 SPR_NOACCESS, SPR_NOACCESS, 5933 &spr_read_generic, &spr_write_generic, 5934 0x00000000); 5935 spr_register_hv(env, SPR_HSPRG1, "HSPRG1", 5936 SPR_NOACCESS, SPR_NOACCESS, 5937 SPR_NOACCESS, SPR_NOACCESS, 5938 &spr_read_generic, &spr_write_generic, 5939 0x00000000); 5940 spr_register_hv(env, SPR_HSRR0, "HSRR0", 5941 SPR_NOACCESS, SPR_NOACCESS, 5942 SPR_NOACCESS, SPR_NOACCESS, 5943 &spr_read_generic, &spr_write_generic, 5944 0x00000000); 5945 spr_register_hv(env, SPR_HSRR1, "HSRR1", 5946 SPR_NOACCESS, SPR_NOACCESS, 5947 SPR_NOACCESS, SPR_NOACCESS, 5948 &spr_read_generic, &spr_write_generic, 5949 0x00000000); 5950 spr_register_hv(env, SPR_HDAR, "HDAR", 5951 SPR_NOACCESS, SPR_NOACCESS, 5952 SPR_NOACCESS, SPR_NOACCESS, 5953 &spr_read_generic, &spr_write_generic, 5954 0x00000000); 5955 spr_register_hv(env, SPR_HDSISR, "HDSISR", 5956 SPR_NOACCESS, SPR_NOACCESS, 5957 SPR_NOACCESS, SPR_NOACCESS, 5958 &spr_read_generic, &spr_write_generic, 5959 0x00000000); 5960 spr_register_hv(env, SPR_HRMOR, "HRMOR", 5961 SPR_NOACCESS, SPR_NOACCESS, 5962 SPR_NOACCESS, SPR_NOACCESS, 5963 &spr_read_generic, &spr_write_generic, 5964 0x00000000); 5965 } 5966 5967 static void register_rmor_sprs(CPUPPCState *env) 5968 { 5969 spr_register_hv(env, SPR_RMOR, "RMOR", 5970 SPR_NOACCESS, SPR_NOACCESS, 5971 SPR_NOACCESS, SPR_NOACCESS, 5972 &spr_read_generic, &spr_write_generic, 5973 0x00000000); 5974 } 5975 5976 static void register_power8_ids_sprs(CPUPPCState *env) 5977 { 5978 /* Thread identification */ 5979 spr_register(env, SPR_TIR, "TIR", 5980 SPR_NOACCESS, SPR_NOACCESS, 5981 &spr_read_generic, SPR_NOACCESS, 5982 0x00000000); 5983 } 5984 5985 static void register_book3s_purr_sprs(CPUPPCState *env) 5986 { 5987 #if !defined(CONFIG_USER_ONLY) 5988 /* PURR & SPURR: Hack - treat these as aliases for the TB for now */ 5989 spr_register_kvm_hv(env, SPR_PURR, "PURR", 5990 &spr_read_purr, SPR_NOACCESS, 5991 &spr_read_purr, SPR_NOACCESS, 5992 &spr_read_purr, &spr_write_purr, 5993 KVM_REG_PPC_PURR, 0x00000000); 5994 spr_register_kvm_hv(env, SPR_SPURR, "SPURR", 5995 &spr_read_purr, SPR_NOACCESS, 5996 &spr_read_purr, SPR_NOACCESS, 5997 &spr_read_purr, &spr_write_purr, 5998 KVM_REG_PPC_SPURR, 0x00000000); 5999 #endif 6000 } 6001 6002 static void register_power6_dbg_sprs(CPUPPCState *env) 6003 { 6004 #if !defined(CONFIG_USER_ONLY) 6005 spr_register(env, SPR_CFAR, "SPR_CFAR", 6006 SPR_NOACCESS, SPR_NOACCESS, 6007 &spr_read_cfar, &spr_write_cfar, 6008 0x00000000); 6009 #endif 6010 } 6011 6012 static void register_power5p_common_sprs(CPUPPCState *env) 6013 { 6014 spr_register_kvm(env, SPR_PPR, "PPR", 6015 &spr_read_generic, &spr_write_generic, 6016 &spr_read_generic, &spr_write_generic, 6017 KVM_REG_PPC_PPR, 0x00000000); 6018 } 6019 6020 static void register_power6_common_sprs(CPUPPCState *env) 6021 { 6022 #if !defined(CONFIG_USER_ONLY) 6023 spr_register_kvm(env, SPR_DSCR, "SPR_DSCR", 6024 SPR_NOACCESS, SPR_NOACCESS, 6025 &spr_read_generic, &spr_write_generic, 6026 KVM_REG_PPC_DSCR, 0x00000000); 6027 #endif 6028 /* 6029 * Register PCR to report POWERPC_EXCP_PRIV_REG instead of 6030 * POWERPC_EXCP_INVAL_SPR in userspace. Permit hypervisor access. 6031 */ 6032 spr_register_hv(env, SPR_PCR, "PCR", 6033 SPR_NOACCESS, SPR_NOACCESS, 6034 SPR_NOACCESS, SPR_NOACCESS, 6035 &spr_read_generic, &spr_write_pcr, 6036 0x00000000); 6037 } 6038 6039 static void register_power8_tce_address_control_sprs(CPUPPCState *env) 6040 { 6041 spr_register_kvm(env, SPR_TAR, "TAR", 6042 &spr_read_tar, &spr_write_tar, 6043 &spr_read_generic, &spr_write_generic, 6044 KVM_REG_PPC_TAR, 0x00000000); 6045 } 6046 6047 static void register_power8_tm_sprs(CPUPPCState *env) 6048 { 6049 spr_register_kvm(env, SPR_TFHAR, "TFHAR", 6050 &spr_read_tm, &spr_write_tm, 6051 &spr_read_tm, &spr_write_tm, 6052 KVM_REG_PPC_TFHAR, 0x00000000); 6053 spr_register_kvm(env, SPR_TFIAR, "TFIAR", 6054 &spr_read_tm, &spr_write_tm, 6055 &spr_read_tm, &spr_write_tm, 6056 KVM_REG_PPC_TFIAR, 0x00000000); 6057 spr_register_kvm(env, SPR_TEXASR, "TEXASR", 6058 &spr_read_tm, &spr_write_tm, 6059 &spr_read_tm, &spr_write_tm, 6060 KVM_REG_PPC_TEXASR, 0x00000000); 6061 spr_register(env, SPR_TEXASRU, "TEXASRU", 6062 &spr_read_tm_upper32, &spr_write_tm_upper32, 6063 &spr_read_tm_upper32, &spr_write_tm_upper32, 6064 0x00000000); 6065 } 6066 6067 static void register_power8_ebb_sprs(CPUPPCState *env) 6068 { 6069 spr_register(env, SPR_BESCRS, "BESCRS", 6070 &spr_read_ebb, &spr_write_ebb, 6071 &spr_read_generic, &spr_write_generic, 6072 0x00000000); 6073 spr_register(env, SPR_BESCRSU, "BESCRSU", 6074 &spr_read_ebb_upper32, &spr_write_ebb_upper32, 6075 &spr_read_prev_upper32, &spr_write_prev_upper32, 6076 0x00000000); 6077 spr_register(env, SPR_BESCRR, "BESCRR", 6078 &spr_read_ebb, &spr_write_ebb, 6079 &spr_read_generic, &spr_write_generic, 6080 0x00000000); 6081 spr_register(env, SPR_BESCRRU, "BESCRRU", 6082 &spr_read_ebb_upper32, &spr_write_ebb_upper32, 6083 &spr_read_prev_upper32, &spr_write_prev_upper32, 6084 0x00000000); 6085 spr_register_kvm(env, SPR_EBBHR, "EBBHR", 6086 &spr_read_ebb, &spr_write_ebb, 6087 &spr_read_generic, &spr_write_generic, 6088 KVM_REG_PPC_EBBHR, 0x00000000); 6089 spr_register_kvm(env, SPR_EBBRR, "EBBRR", 6090 &spr_read_ebb, &spr_write_ebb, 6091 &spr_read_generic, &spr_write_generic, 6092 KVM_REG_PPC_EBBRR, 0x00000000); 6093 spr_register_kvm(env, SPR_BESCR, "BESCR", 6094 &spr_read_ebb, &spr_write_ebb, 6095 &spr_read_generic, &spr_write_generic, 6096 KVM_REG_PPC_BESCR, 0x00000000); 6097 } 6098 6099 /* Virtual Time Base */ 6100 static void register_vtb_sprs(CPUPPCState *env) 6101 { 6102 spr_register_kvm_hv(env, SPR_VTB, "VTB", 6103 SPR_NOACCESS, SPR_NOACCESS, 6104 &spr_read_vtb, SPR_NOACCESS, 6105 &spr_read_vtb, &spr_write_vtb, 6106 KVM_REG_PPC_VTB, 0x00000000); 6107 } 6108 6109 static void register_power8_fscr_sprs(CPUPPCState *env) 6110 { 6111 #if defined(CONFIG_USER_ONLY) 6112 target_ulong initval = 1ULL << FSCR_TAR; 6113 #else 6114 target_ulong initval = 0; 6115 #endif 6116 spr_register_kvm(env, SPR_FSCR, "FSCR", 6117 SPR_NOACCESS, SPR_NOACCESS, 6118 &spr_read_generic, &spr_write_generic, 6119 KVM_REG_PPC_FSCR, initval); 6120 } 6121 6122 static void register_power8_pspb_sprs(CPUPPCState *env) 6123 { 6124 spr_register_kvm(env, SPR_PSPB, "PSPB", 6125 SPR_NOACCESS, SPR_NOACCESS, 6126 &spr_read_generic, &spr_write_generic32, 6127 KVM_REG_PPC_PSPB, 0); 6128 } 6129 6130 static void register_power8_dpdes_sprs(CPUPPCState *env) 6131 { 6132 #if !defined(CONFIG_USER_ONLY) 6133 /* Directed Privileged Door-bell Exception State, used for IPI */ 6134 spr_register_kvm_hv(env, SPR_DPDES, "DPDES", 6135 SPR_NOACCESS, SPR_NOACCESS, 6136 &spr_read_dpdes, SPR_NOACCESS, 6137 &spr_read_dpdes, &spr_write_dpdes, 6138 KVM_REG_PPC_DPDES, 0x00000000); 6139 #endif 6140 } 6141 6142 static void register_power8_ic_sprs(CPUPPCState *env) 6143 { 6144 #if !defined(CONFIG_USER_ONLY) 6145 spr_register_hv(env, SPR_IC, "IC", 6146 SPR_NOACCESS, SPR_NOACCESS, 6147 &spr_read_generic, SPR_NOACCESS, 6148 &spr_read_generic, &spr_write_generic, 6149 0); 6150 #endif 6151 } 6152 6153 static void register_power8_book4_sprs(CPUPPCState *env) 6154 { 6155 /* Add a number of P8 book4 registers */ 6156 #if !defined(CONFIG_USER_ONLY) 6157 spr_register_kvm(env, SPR_ACOP, "ACOP", 6158 SPR_NOACCESS, SPR_NOACCESS, 6159 &spr_read_generic, &spr_write_generic, 6160 KVM_REG_PPC_ACOP, 0); 6161 spr_register_kvm(env, SPR_BOOKS_PID, "PID", 6162 SPR_NOACCESS, SPR_NOACCESS, 6163 &spr_read_generic, &spr_write_pidr, 6164 KVM_REG_PPC_PID, 0); 6165 spr_register_kvm(env, SPR_WORT, "WORT", 6166 SPR_NOACCESS, SPR_NOACCESS, 6167 &spr_read_generic, &spr_write_generic, 6168 KVM_REG_PPC_WORT, 0); 6169 #endif 6170 } 6171 6172 static void register_power7_book4_sprs(CPUPPCState *env) 6173 { 6174 /* Add a number of P7 book4 registers */ 6175 #if !defined(CONFIG_USER_ONLY) 6176 spr_register_kvm(env, SPR_ACOP, "ACOP", 6177 SPR_NOACCESS, SPR_NOACCESS, 6178 &spr_read_generic, &spr_write_generic, 6179 KVM_REG_PPC_ACOP, 0); 6180 spr_register_kvm(env, SPR_BOOKS_PID, "PID", 6181 SPR_NOACCESS, SPR_NOACCESS, 6182 &spr_read_generic, &spr_write_generic, 6183 KVM_REG_PPC_PID, 0); 6184 #endif 6185 } 6186 6187 static void register_power8_rpr_sprs(CPUPPCState *env) 6188 { 6189 #if !defined(CONFIG_USER_ONLY) 6190 spr_register_hv(env, SPR_RPR, "RPR", 6191 SPR_NOACCESS, SPR_NOACCESS, 6192 SPR_NOACCESS, SPR_NOACCESS, 6193 &spr_read_generic, &spr_write_generic, 6194 0x00000103070F1F3F); 6195 #endif 6196 } 6197 6198 static void register_power9_mmu_sprs(CPUPPCState *env) 6199 { 6200 #if !defined(CONFIG_USER_ONLY) 6201 /* Partition Table Control */ 6202 spr_register_kvm_hv(env, SPR_PTCR, "PTCR", 6203 SPR_NOACCESS, SPR_NOACCESS, 6204 SPR_NOACCESS, SPR_NOACCESS, 6205 &spr_read_generic, &spr_write_ptcr, 6206 KVM_REG_PPC_PTCR, 0x00000000); 6207 /* Address Segment Descriptor Register */ 6208 spr_register_hv(env, SPR_ASDR, "ASDR", 6209 SPR_NOACCESS, SPR_NOACCESS, 6210 SPR_NOACCESS, SPR_NOACCESS, 6211 &spr_read_generic, &spr_write_generic, 6212 0x0000000000000000); 6213 #endif 6214 } 6215 6216 /* 6217 * Initialize PMU counter overflow timers for Power8 and 6218 * newer Power chips when using TCG. 6219 */ 6220 static void init_tcg_pmu_power8(CPUPPCState *env) 6221 { 6222 #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY) 6223 /* Init PMU overflow timers */ 6224 if (!kvm_enabled()) { 6225 cpu_ppc_pmu_init(env); 6226 } 6227 #endif 6228 } 6229 6230 static void init_proc_book3s_common(CPUPPCState *env) 6231 { 6232 register_ne_601_sprs(env); 6233 register_usprg3_sprs(env); 6234 register_book3s_altivec_sprs(env); 6235 register_book3s_pmu_sup_sprs(env); 6236 register_book3s_pmu_user_sprs(env); 6237 register_book3s_ctrl_sprs(env); 6238 /* 6239 * Can't find information on what this should be on reset. This 6240 * value is the one used by 74xx processors. 6241 */ 6242 vscr_init(env, 0x00010000); 6243 } 6244 6245 static void init_proc_970(CPUPPCState *env) 6246 { 6247 /* Common Registers */ 6248 init_proc_book3s_common(env); 6249 register_sdr1_sprs(env); 6250 register_book3s_dbg_sprs(env); 6251 6252 /* 970 Specific Registers */ 6253 register_970_hid_sprs(env); 6254 register_970_hior_sprs(env); 6255 register_low_BATs(env); 6256 register_970_pmu_sup_sprs(env); 6257 register_970_pmu_user_sprs(env); 6258 register_970_lpar_sprs(env); 6259 register_970_dbg_sprs(env); 6260 6261 /* env variables */ 6262 env->dcache_line_size = 128; 6263 env->icache_line_size = 128; 6264 6265 /* Allocate hardware IRQ controller */ 6266 init_excp_970(env); 6267 ppc970_irq_init(env_archcpu(env)); 6268 } 6269 6270 POWERPC_FAMILY(970)(ObjectClass *oc, void *data) 6271 { 6272 DeviceClass *dc = DEVICE_CLASS(oc); 6273 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 6274 6275 dc->desc = "PowerPC 970"; 6276 pcc->init_proc = init_proc_970; 6277 pcc->check_pow = check_pow_970; 6278 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 6279 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 6280 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE | 6281 PPC_FLOAT_STFIWX | 6282 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 6283 PPC_MEM_SYNC | PPC_MEM_EIEIO | 6284 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 6285 PPC_64B | PPC_ALTIVEC | 6286 PPC_SEGMENT_64B | PPC_SLBI; 6287 pcc->insns_flags2 = PPC2_FP_CVT_S64; 6288 pcc->msr_mask = (1ull << MSR_SF) | 6289 (1ull << MSR_VR) | 6290 (1ull << MSR_POW) | 6291 (1ull << MSR_EE) | 6292 (1ull << MSR_PR) | 6293 (1ull << MSR_FP) | 6294 (1ull << MSR_ME) | 6295 (1ull << MSR_FE0) | 6296 (1ull << MSR_SE) | 6297 (1ull << MSR_DE) | 6298 (1ull << MSR_FE1) | 6299 (1ull << MSR_IR) | 6300 (1ull << MSR_DR) | 6301 (1ull << MSR_PMM) | 6302 (1ull << MSR_RI); 6303 pcc->mmu_model = POWERPC_MMU_64B; 6304 #if defined(CONFIG_SOFTMMU) 6305 pcc->hash64_opts = &ppc_hash64_opts_basic; 6306 #endif 6307 pcc->excp_model = POWERPC_EXCP_970; 6308 pcc->bus_model = PPC_FLAGS_INPUT_970; 6309 pcc->bfd_mach = bfd_mach_ppc64; 6310 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE | 6311 POWERPC_FLAG_BE | POWERPC_FLAG_PMM | 6312 POWERPC_FLAG_BUS_CLK; 6313 pcc->l1_dcache_size = 0x8000; 6314 pcc->l1_icache_size = 0x10000; 6315 } 6316 6317 static void init_proc_power5plus(CPUPPCState *env) 6318 { 6319 /* Common Registers */ 6320 init_proc_book3s_common(env); 6321 register_sdr1_sprs(env); 6322 register_book3s_dbg_sprs(env); 6323 6324 /* POWER5+ Specific Registers */ 6325 register_970_hid_sprs(env); 6326 register_970_hior_sprs(env); 6327 register_low_BATs(env); 6328 register_970_pmu_sup_sprs(env); 6329 register_970_pmu_user_sprs(env); 6330 register_power5p_common_sprs(env); 6331 register_power5p_lpar_sprs(env); 6332 register_power5p_ear_sprs(env); 6333 register_power5p_tb_sprs(env); 6334 6335 /* env variables */ 6336 env->dcache_line_size = 128; 6337 env->icache_line_size = 128; 6338 6339 /* Allocate hardware IRQ controller */ 6340 init_excp_970(env); 6341 ppc970_irq_init(env_archcpu(env)); 6342 } 6343 6344 POWERPC_FAMILY(POWER5P)(ObjectClass *oc, void *data) 6345 { 6346 DeviceClass *dc = DEVICE_CLASS(oc); 6347 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 6348 6349 dc->fw_name = "PowerPC,POWER5"; 6350 dc->desc = "POWER5+"; 6351 pcc->init_proc = init_proc_power5plus; 6352 pcc->check_pow = check_pow_970; 6353 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB | 6354 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 6355 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE | 6356 PPC_FLOAT_STFIWX | 6357 PPC_FLOAT_EXT | 6358 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 6359 PPC_MEM_SYNC | PPC_MEM_EIEIO | 6360 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 6361 PPC_64B | 6362 PPC_POPCNTB | 6363 PPC_SEGMENT_64B | PPC_SLBI; 6364 pcc->insns_flags2 = PPC2_FP_CVT_S64; 6365 pcc->msr_mask = (1ull << MSR_SF) | 6366 (1ull << MSR_VR) | 6367 (1ull << MSR_POW) | 6368 (1ull << MSR_EE) | 6369 (1ull << MSR_PR) | 6370 (1ull << MSR_FP) | 6371 (1ull << MSR_ME) | 6372 (1ull << MSR_FE0) | 6373 (1ull << MSR_SE) | 6374 (1ull << MSR_DE) | 6375 (1ull << MSR_FE1) | 6376 (1ull << MSR_IR) | 6377 (1ull << MSR_DR) | 6378 (1ull << MSR_PMM) | 6379 (1ull << MSR_RI); 6380 pcc->lpcr_mask = LPCR_RMLS | LPCR_ILE | LPCR_LPES0 | LPCR_LPES1 | 6381 LPCR_RMI | LPCR_HDICE; 6382 pcc->mmu_model = POWERPC_MMU_2_03; 6383 #if defined(CONFIG_SOFTMMU) 6384 pcc->hash64_opts = &ppc_hash64_opts_basic; 6385 pcc->lrg_decr_bits = 32; 6386 #endif 6387 pcc->excp_model = POWERPC_EXCP_970; 6388 pcc->bus_model = PPC_FLAGS_INPUT_970; 6389 pcc->bfd_mach = bfd_mach_ppc64; 6390 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE | 6391 POWERPC_FLAG_BE | POWERPC_FLAG_PMM | 6392 POWERPC_FLAG_BUS_CLK; 6393 pcc->l1_dcache_size = 0x8000; 6394 pcc->l1_icache_size = 0x10000; 6395 } 6396 6397 static void init_proc_POWER7(CPUPPCState *env) 6398 { 6399 /* Common Registers */ 6400 init_proc_book3s_common(env); 6401 register_sdr1_sprs(env); 6402 register_book3s_dbg_sprs(env); 6403 6404 /* POWER7 Specific Registers */ 6405 register_book3s_ids_sprs(env); 6406 register_rmor_sprs(env); 6407 register_amr_sprs(env); 6408 register_book3s_purr_sprs(env); 6409 register_power5p_common_sprs(env); 6410 register_power5p_lpar_sprs(env); 6411 register_power5p_ear_sprs(env); 6412 register_power5p_tb_sprs(env); 6413 register_power6_common_sprs(env); 6414 register_power6_dbg_sprs(env); 6415 register_power7_book4_sprs(env); 6416 6417 /* env variables */ 6418 env->dcache_line_size = 128; 6419 env->icache_line_size = 128; 6420 6421 /* Allocate hardware IRQ controller */ 6422 init_excp_POWER7(env); 6423 ppcPOWER7_irq_init(env_archcpu(env)); 6424 } 6425 6426 static bool ppc_pvr_match_power7(PowerPCCPUClass *pcc, uint32_t pvr) 6427 { 6428 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER7P_BASE) { 6429 return true; 6430 } 6431 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER7_BASE) { 6432 return true; 6433 } 6434 return false; 6435 } 6436 6437 static bool cpu_has_work_POWER7(CPUState *cs) 6438 { 6439 PowerPCCPU *cpu = POWERPC_CPU(cs); 6440 CPUPPCState *env = &cpu->env; 6441 6442 if (cs->halted) { 6443 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) { 6444 return false; 6445 } 6446 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) && 6447 (env->spr[SPR_LPCR] & LPCR_P7_PECE0)) { 6448 return true; 6449 } 6450 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DECR)) && 6451 (env->spr[SPR_LPCR] & LPCR_P7_PECE1)) { 6452 return true; 6453 } 6454 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_MCK)) && 6455 (env->spr[SPR_LPCR] & LPCR_P7_PECE2)) { 6456 return true; 6457 } 6458 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HMI)) && 6459 (env->spr[SPR_LPCR] & LPCR_P7_PECE2)) { 6460 return true; 6461 } 6462 if (env->pending_interrupts & (1u << PPC_INTERRUPT_RESET)) { 6463 return true; 6464 } 6465 return false; 6466 } else { 6467 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD); 6468 } 6469 } 6470 6471 POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data) 6472 { 6473 DeviceClass *dc = DEVICE_CLASS(oc); 6474 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 6475 CPUClass *cc = CPU_CLASS(oc); 6476 6477 dc->fw_name = "PowerPC,POWER7"; 6478 dc->desc = "POWER7"; 6479 pcc->pvr_match = ppc_pvr_match_power7; 6480 pcc->pcr_mask = PCR_VEC_DIS | PCR_VSX_DIS | PCR_COMPAT_2_05; 6481 pcc->pcr_supported = PCR_COMPAT_2_06 | PCR_COMPAT_2_05; 6482 pcc->init_proc = init_proc_POWER7; 6483 pcc->check_pow = check_pow_nocheck; 6484 cc->has_work = cpu_has_work_POWER7; 6485 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB | 6486 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 6487 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE | 6488 PPC_FLOAT_FRSQRTES | 6489 PPC_FLOAT_STFIWX | 6490 PPC_FLOAT_EXT | 6491 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 6492 PPC_MEM_SYNC | PPC_MEM_EIEIO | 6493 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 6494 PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC | 6495 PPC_SEGMENT_64B | PPC_SLBI | 6496 PPC_POPCNTB | PPC_POPCNTWD | 6497 PPC_CILDST; 6498 pcc->insns_flags2 = PPC2_VSX | PPC2_DFP | PPC2_DBRX | PPC2_ISA205 | 6499 PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 | 6500 PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 | 6501 PPC2_FP_TST_ISA206 | PPC2_FP_CVT_S64 | 6502 PPC2_PM_ISA206; 6503 pcc->msr_mask = (1ull << MSR_SF) | 6504 (1ull << MSR_VR) | 6505 (1ull << MSR_VSX) | 6506 (1ull << MSR_EE) | 6507 (1ull << MSR_PR) | 6508 (1ull << MSR_FP) | 6509 (1ull << MSR_ME) | 6510 (1ull << MSR_FE0) | 6511 (1ull << MSR_SE) | 6512 (1ull << MSR_DE) | 6513 (1ull << MSR_FE1) | 6514 (1ull << MSR_IR) | 6515 (1ull << MSR_DR) | 6516 (1ull << MSR_PMM) | 6517 (1ull << MSR_RI) | 6518 (1ull << MSR_LE); 6519 pcc->lpcr_mask = LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_DPFD | 6520 LPCR_VRMASD | LPCR_RMLS | LPCR_ILE | 6521 LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2 | 6522 LPCR_MER | LPCR_TC | 6523 LPCR_LPES0 | LPCR_LPES1 | LPCR_HDICE; 6524 pcc->lpcr_pm = LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2; 6525 pcc->mmu_model = POWERPC_MMU_2_06; 6526 #if defined(CONFIG_SOFTMMU) 6527 pcc->hash64_opts = &ppc_hash64_opts_POWER7; 6528 pcc->lrg_decr_bits = 32; 6529 #endif 6530 pcc->excp_model = POWERPC_EXCP_POWER7; 6531 pcc->bus_model = PPC_FLAGS_INPUT_POWER7; 6532 pcc->bfd_mach = bfd_mach_ppc64; 6533 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE | 6534 POWERPC_FLAG_BE | POWERPC_FLAG_PMM | 6535 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR | 6536 POWERPC_FLAG_VSX; 6537 pcc->l1_dcache_size = 0x8000; 6538 pcc->l1_icache_size = 0x8000; 6539 } 6540 6541 static void init_proc_POWER8(CPUPPCState *env) 6542 { 6543 /* Common Registers */ 6544 init_proc_book3s_common(env); 6545 register_sdr1_sprs(env); 6546 register_book3s_207_dbg_sprs(env); 6547 6548 /* Common TCG PMU */ 6549 init_tcg_pmu_power8(env); 6550 6551 /* POWER8 Specific Registers */ 6552 register_book3s_ids_sprs(env); 6553 register_rmor_sprs(env); 6554 register_amr_sprs(env); 6555 register_iamr_sprs(env); 6556 register_book3s_purr_sprs(env); 6557 register_power5p_common_sprs(env); 6558 register_power5p_lpar_sprs(env); 6559 register_power5p_ear_sprs(env); 6560 register_power5p_tb_sprs(env); 6561 register_power6_common_sprs(env); 6562 register_power6_dbg_sprs(env); 6563 register_power8_tce_address_control_sprs(env); 6564 register_power8_ids_sprs(env); 6565 register_power8_ebb_sprs(env); 6566 register_power8_fscr_sprs(env); 6567 register_power8_pmu_sup_sprs(env); 6568 register_power8_pmu_user_sprs(env); 6569 register_power8_tm_sprs(env); 6570 register_power8_pspb_sprs(env); 6571 register_power8_dpdes_sprs(env); 6572 register_vtb_sprs(env); 6573 register_power8_ic_sprs(env); 6574 register_power8_book4_sprs(env); 6575 register_power8_rpr_sprs(env); 6576 6577 /* env variables */ 6578 env->dcache_line_size = 128; 6579 env->icache_line_size = 128; 6580 6581 /* Allocate hardware IRQ controller */ 6582 init_excp_POWER8(env); 6583 ppcPOWER7_irq_init(env_archcpu(env)); 6584 } 6585 6586 static bool ppc_pvr_match_power8(PowerPCCPUClass *pcc, uint32_t pvr) 6587 { 6588 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER8NVL_BASE) { 6589 return true; 6590 } 6591 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER8E_BASE) { 6592 return true; 6593 } 6594 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER8_BASE) { 6595 return true; 6596 } 6597 return false; 6598 } 6599 6600 static bool cpu_has_work_POWER8(CPUState *cs) 6601 { 6602 PowerPCCPU *cpu = POWERPC_CPU(cs); 6603 CPUPPCState *env = &cpu->env; 6604 6605 if (cs->halted) { 6606 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) { 6607 return false; 6608 } 6609 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) && 6610 (env->spr[SPR_LPCR] & LPCR_P8_PECE2)) { 6611 return true; 6612 } 6613 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DECR)) && 6614 (env->spr[SPR_LPCR] & LPCR_P8_PECE3)) { 6615 return true; 6616 } 6617 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_MCK)) && 6618 (env->spr[SPR_LPCR] & LPCR_P8_PECE4)) { 6619 return true; 6620 } 6621 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HMI)) && 6622 (env->spr[SPR_LPCR] & LPCR_P8_PECE4)) { 6623 return true; 6624 } 6625 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DOORBELL)) && 6626 (env->spr[SPR_LPCR] & LPCR_P8_PECE0)) { 6627 return true; 6628 } 6629 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HDOORBELL)) && 6630 (env->spr[SPR_LPCR] & LPCR_P8_PECE1)) { 6631 return true; 6632 } 6633 if (env->pending_interrupts & (1u << PPC_INTERRUPT_RESET)) { 6634 return true; 6635 } 6636 return false; 6637 } else { 6638 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD); 6639 } 6640 } 6641 6642 POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data) 6643 { 6644 DeviceClass *dc = DEVICE_CLASS(oc); 6645 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 6646 CPUClass *cc = CPU_CLASS(oc); 6647 6648 dc->fw_name = "PowerPC,POWER8"; 6649 dc->desc = "POWER8"; 6650 pcc->pvr_match = ppc_pvr_match_power8; 6651 pcc->pcr_mask = PCR_TM_DIS | PCR_COMPAT_2_06 | PCR_COMPAT_2_05; 6652 pcc->pcr_supported = PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_COMPAT_2_05; 6653 pcc->init_proc = init_proc_POWER8; 6654 pcc->check_pow = check_pow_nocheck; 6655 cc->has_work = cpu_has_work_POWER8; 6656 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB | 6657 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 6658 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE | 6659 PPC_FLOAT_FRSQRTES | 6660 PPC_FLOAT_STFIWX | 6661 PPC_FLOAT_EXT | 6662 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 6663 PPC_MEM_SYNC | PPC_MEM_EIEIO | 6664 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | 6665 PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC | 6666 PPC_SEGMENT_64B | PPC_SLBI | 6667 PPC_POPCNTB | PPC_POPCNTWD | 6668 PPC_CILDST; 6669 pcc->insns_flags2 = PPC2_VSX | PPC2_VSX207 | PPC2_DFP | PPC2_DBRX | 6670 PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 | 6671 PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 | 6672 PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 | 6673 PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 | 6674 PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 | 6675 PPC2_TM | PPC2_PM_ISA206; 6676 pcc->msr_mask = (1ull << MSR_SF) | 6677 (1ull << MSR_HV) | 6678 (1ull << MSR_TM) | 6679 (1ull << MSR_VR) | 6680 (1ull << MSR_VSX) | 6681 (1ull << MSR_EE) | 6682 (1ull << MSR_PR) | 6683 (1ull << MSR_FP) | 6684 (1ull << MSR_ME) | 6685 (1ull << MSR_FE0) | 6686 (1ull << MSR_SE) | 6687 (1ull << MSR_DE) | 6688 (1ull << MSR_FE1) | 6689 (1ull << MSR_IR) | 6690 (1ull << MSR_DR) | 6691 (1ull << MSR_PMM) | 6692 (1ull << MSR_RI) | 6693 (1ull << MSR_TS0) | 6694 (1ull << MSR_TS1) | 6695 (1ull << MSR_LE); 6696 pcc->lpcr_mask = LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_KBV | 6697 LPCR_DPFD | LPCR_VRMASD | LPCR_RMLS | LPCR_ILE | 6698 LPCR_AIL | LPCR_ONL | LPCR_P8_PECE0 | LPCR_P8_PECE1 | 6699 LPCR_P8_PECE2 | LPCR_P8_PECE3 | LPCR_P8_PECE4 | 6700 LPCR_MER | LPCR_TC | LPCR_LPES0 | LPCR_HDICE; 6701 pcc->lpcr_pm = LPCR_P8_PECE0 | LPCR_P8_PECE1 | LPCR_P8_PECE2 | 6702 LPCR_P8_PECE3 | LPCR_P8_PECE4; 6703 pcc->mmu_model = POWERPC_MMU_2_07; 6704 #if defined(CONFIG_SOFTMMU) 6705 pcc->hash64_opts = &ppc_hash64_opts_POWER7; 6706 pcc->lrg_decr_bits = 32; 6707 pcc->n_host_threads = 8; 6708 #endif 6709 pcc->excp_model = POWERPC_EXCP_POWER8; 6710 pcc->bus_model = PPC_FLAGS_INPUT_POWER7; 6711 pcc->bfd_mach = bfd_mach_ppc64; 6712 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE | 6713 POWERPC_FLAG_BE | POWERPC_FLAG_PMM | 6714 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR | 6715 POWERPC_FLAG_VSX | POWERPC_FLAG_TM; 6716 pcc->l1_dcache_size = 0x8000; 6717 pcc->l1_icache_size = 0x8000; 6718 } 6719 6720 #ifdef CONFIG_SOFTMMU 6721 /* 6722 * Radix pg sizes and AP encodings for dt node ibm,processor-radix-AP-encodings 6723 * Encoded as array of int_32s in the form: 6724 * 0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 6725 * x -> AP encoding 6726 * y -> radix mode supported page size (encoded as a shift) 6727 */ 6728 static struct ppc_radix_page_info POWER9_radix_page_info = { 6729 .count = 4, 6730 .entries = { 6731 0x0000000c, /* 4K - enc: 0x0 */ 6732 0xa0000010, /* 64K - enc: 0x5 */ 6733 0x20000015, /* 2M - enc: 0x1 */ 6734 0x4000001e /* 1G - enc: 0x2 */ 6735 } 6736 }; 6737 #endif /* CONFIG_SOFTMMU */ 6738 6739 static void init_proc_POWER9(CPUPPCState *env) 6740 { 6741 /* Common Registers */ 6742 init_proc_book3s_common(env); 6743 register_book3s_207_dbg_sprs(env); 6744 6745 /* Common TCG PMU */ 6746 init_tcg_pmu_power8(env); 6747 6748 /* POWER8 Specific Registers */ 6749 register_book3s_ids_sprs(env); 6750 register_amr_sprs(env); 6751 register_iamr_sprs(env); 6752 register_book3s_purr_sprs(env); 6753 register_power5p_common_sprs(env); 6754 register_power5p_lpar_sprs(env); 6755 register_power5p_ear_sprs(env); 6756 register_power5p_tb_sprs(env); 6757 register_power6_common_sprs(env); 6758 register_power6_dbg_sprs(env); 6759 register_power8_tce_address_control_sprs(env); 6760 register_power8_ids_sprs(env); 6761 register_power8_ebb_sprs(env); 6762 register_power8_fscr_sprs(env); 6763 register_power8_pmu_sup_sprs(env); 6764 register_power8_pmu_user_sprs(env); 6765 register_power8_tm_sprs(env); 6766 register_power8_pspb_sprs(env); 6767 register_power8_dpdes_sprs(env); 6768 register_vtb_sprs(env); 6769 register_power8_ic_sprs(env); 6770 register_power8_book4_sprs(env); 6771 register_power8_rpr_sprs(env); 6772 register_power9_mmu_sprs(env); 6773 6774 /* POWER9 Specific registers */ 6775 spr_register_kvm(env, SPR_TIDR, "TIDR", NULL, NULL, 6776 spr_read_generic, spr_write_generic, 6777 KVM_REG_PPC_TIDR, 0); 6778 6779 /* FIXME: Filter fields properly based on privilege level */ 6780 spr_register_kvm_hv(env, SPR_PSSCR, "PSSCR", NULL, NULL, NULL, NULL, 6781 spr_read_generic, spr_write_generic, 6782 KVM_REG_PPC_PSSCR, 0); 6783 6784 /* env variables */ 6785 env->dcache_line_size = 128; 6786 env->icache_line_size = 128; 6787 6788 /* Allocate hardware IRQ controller */ 6789 init_excp_POWER9(env); 6790 ppcPOWER9_irq_init(env_archcpu(env)); 6791 } 6792 6793 static bool ppc_pvr_match_power9(PowerPCCPUClass *pcc, uint32_t pvr) 6794 { 6795 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER9_BASE) { 6796 return true; 6797 } 6798 return false; 6799 } 6800 6801 static bool cpu_has_work_POWER9(CPUState *cs) 6802 { 6803 PowerPCCPU *cpu = POWERPC_CPU(cs); 6804 CPUPPCState *env = &cpu->env; 6805 6806 if (cs->halted) { 6807 uint64_t psscr = env->spr[SPR_PSSCR]; 6808 6809 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) { 6810 return false; 6811 } 6812 6813 /* If EC is clear, just return true on any pending interrupt */ 6814 if (!(psscr & PSSCR_EC)) { 6815 return true; 6816 } 6817 /* External Exception */ 6818 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) && 6819 (env->spr[SPR_LPCR] & LPCR_EEE)) { 6820 bool heic = !!(env->spr[SPR_LPCR] & LPCR_HEIC); 6821 if (heic == 0 || !msr_hv || msr_pr) { 6822 return true; 6823 } 6824 } 6825 /* Decrementer Exception */ 6826 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DECR)) && 6827 (env->spr[SPR_LPCR] & LPCR_DEE)) { 6828 return true; 6829 } 6830 /* Machine Check or Hypervisor Maintenance Exception */ 6831 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_MCK | 6832 1u << PPC_INTERRUPT_HMI)) && (env->spr[SPR_LPCR] & LPCR_OEE)) { 6833 return true; 6834 } 6835 /* Privileged Doorbell Exception */ 6836 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DOORBELL)) && 6837 (env->spr[SPR_LPCR] & LPCR_PDEE)) { 6838 return true; 6839 } 6840 /* Hypervisor Doorbell Exception */ 6841 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HDOORBELL)) && 6842 (env->spr[SPR_LPCR] & LPCR_HDEE)) { 6843 return true; 6844 } 6845 /* Hypervisor virtualization exception */ 6846 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HVIRT)) && 6847 (env->spr[SPR_LPCR] & LPCR_HVEE)) { 6848 return true; 6849 } 6850 if (env->pending_interrupts & (1u << PPC_INTERRUPT_RESET)) { 6851 return true; 6852 } 6853 return false; 6854 } else { 6855 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD); 6856 } 6857 } 6858 6859 POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data) 6860 { 6861 DeviceClass *dc = DEVICE_CLASS(oc); 6862 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 6863 CPUClass *cc = CPU_CLASS(oc); 6864 6865 dc->fw_name = "PowerPC,POWER9"; 6866 dc->desc = "POWER9"; 6867 pcc->pvr_match = ppc_pvr_match_power9; 6868 pcc->pcr_mask = PCR_COMPAT_2_05 | PCR_COMPAT_2_06 | PCR_COMPAT_2_07; 6869 pcc->pcr_supported = PCR_COMPAT_3_00 | PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | 6870 PCR_COMPAT_2_05; 6871 pcc->init_proc = init_proc_POWER9; 6872 pcc->check_pow = check_pow_nocheck; 6873 cc->has_work = cpu_has_work_POWER9; 6874 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB | 6875 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 6876 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE | 6877 PPC_FLOAT_FRSQRTES | 6878 PPC_FLOAT_STFIWX | 6879 PPC_FLOAT_EXT | 6880 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 6881 PPC_MEM_SYNC | PPC_MEM_EIEIO | 6882 PPC_MEM_TLBSYNC | 6883 PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC | 6884 PPC_SEGMENT_64B | PPC_SLBI | 6885 PPC_POPCNTB | PPC_POPCNTWD | 6886 PPC_CILDST; 6887 pcc->insns_flags2 = PPC2_VSX | PPC2_VSX207 | PPC2_DFP | PPC2_DBRX | 6888 PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 | 6889 PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 | 6890 PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 | 6891 PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 | 6892 PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 | 6893 PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL; 6894 pcc->msr_mask = (1ull << MSR_SF) | 6895 (1ull << MSR_HV) | 6896 (1ull << MSR_TM) | 6897 (1ull << MSR_VR) | 6898 (1ull << MSR_VSX) | 6899 (1ull << MSR_EE) | 6900 (1ull << MSR_PR) | 6901 (1ull << MSR_FP) | 6902 (1ull << MSR_ME) | 6903 (1ull << MSR_FE0) | 6904 (1ull << MSR_SE) | 6905 (1ull << MSR_DE) | 6906 (1ull << MSR_FE1) | 6907 (1ull << MSR_IR) | 6908 (1ull << MSR_DR) | 6909 (1ull << MSR_PMM) | 6910 (1ull << MSR_RI) | 6911 (1ull << MSR_LE); 6912 pcc->lpcr_mask = LPCR_VPM1 | LPCR_ISL | LPCR_KBV | LPCR_DPFD | 6913 (LPCR_PECE_U_MASK & LPCR_HVEE) | LPCR_ILE | LPCR_AIL | 6914 LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR | LPCR_LD | 6915 (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE | 6916 LPCR_DEE | LPCR_OEE)) 6917 | LPCR_MER | LPCR_GTSE | LPCR_TC | 6918 LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE; 6919 pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE; 6920 pcc->mmu_model = POWERPC_MMU_3_00; 6921 #if defined(CONFIG_SOFTMMU) 6922 /* segment page size remain the same */ 6923 pcc->hash64_opts = &ppc_hash64_opts_POWER7; 6924 pcc->radix_page_info = &POWER9_radix_page_info; 6925 pcc->lrg_decr_bits = 56; 6926 pcc->n_host_threads = 4; 6927 #endif 6928 pcc->excp_model = POWERPC_EXCP_POWER9; 6929 pcc->bus_model = PPC_FLAGS_INPUT_POWER9; 6930 pcc->bfd_mach = bfd_mach_ppc64; 6931 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE | 6932 POWERPC_FLAG_BE | POWERPC_FLAG_PMM | 6933 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR | 6934 POWERPC_FLAG_VSX | POWERPC_FLAG_TM | POWERPC_FLAG_SCV; 6935 pcc->l1_dcache_size = 0x8000; 6936 pcc->l1_icache_size = 0x8000; 6937 } 6938 6939 #ifdef CONFIG_SOFTMMU 6940 /* 6941 * Radix pg sizes and AP encodings for dt node ibm,processor-radix-AP-encodings 6942 * Encoded as array of int_32s in the form: 6943 * 0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 6944 * x -> AP encoding 6945 * y -> radix mode supported page size (encoded as a shift) 6946 */ 6947 static struct ppc_radix_page_info POWER10_radix_page_info = { 6948 .count = 4, 6949 .entries = { 6950 0x0000000c, /* 4K - enc: 0x0 */ 6951 0xa0000010, /* 64K - enc: 0x5 */ 6952 0x20000015, /* 2M - enc: 0x1 */ 6953 0x4000001e /* 1G - enc: 0x2 */ 6954 } 6955 }; 6956 #endif /* CONFIG_SOFTMMU */ 6957 6958 static void init_proc_POWER10(CPUPPCState *env) 6959 { 6960 /* Common Registers */ 6961 init_proc_book3s_common(env); 6962 register_book3s_207_dbg_sprs(env); 6963 6964 /* Common TCG PMU */ 6965 init_tcg_pmu_power8(env); 6966 6967 /* POWER8 Specific Registers */ 6968 register_book3s_ids_sprs(env); 6969 register_amr_sprs(env); 6970 register_iamr_sprs(env); 6971 register_book3s_purr_sprs(env); 6972 register_power5p_common_sprs(env); 6973 register_power5p_lpar_sprs(env); 6974 register_power5p_ear_sprs(env); 6975 register_power6_common_sprs(env); 6976 register_power6_dbg_sprs(env); 6977 register_power8_tce_address_control_sprs(env); 6978 register_power8_ids_sprs(env); 6979 register_power8_ebb_sprs(env); 6980 register_power8_fscr_sprs(env); 6981 register_power8_pmu_sup_sprs(env); 6982 register_power8_pmu_user_sprs(env); 6983 register_power8_tm_sprs(env); 6984 register_power8_pspb_sprs(env); 6985 register_vtb_sprs(env); 6986 register_power8_ic_sprs(env); 6987 register_power8_book4_sprs(env); 6988 register_power8_rpr_sprs(env); 6989 register_power9_mmu_sprs(env); 6990 6991 /* FIXME: Filter fields properly based on privilege level */ 6992 spr_register_kvm_hv(env, SPR_PSSCR, "PSSCR", NULL, NULL, NULL, NULL, 6993 spr_read_generic, spr_write_generic, 6994 KVM_REG_PPC_PSSCR, 0); 6995 6996 /* env variables */ 6997 env->dcache_line_size = 128; 6998 env->icache_line_size = 128; 6999 7000 /* Allocate hardware IRQ controller */ 7001 init_excp_POWER10(env); 7002 ppcPOWER9_irq_init(env_archcpu(env)); 7003 } 7004 7005 static bool ppc_pvr_match_power10(PowerPCCPUClass *pcc, uint32_t pvr) 7006 { 7007 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER10_BASE) { 7008 return true; 7009 } 7010 return false; 7011 } 7012 7013 static bool cpu_has_work_POWER10(CPUState *cs) 7014 { 7015 PowerPCCPU *cpu = POWERPC_CPU(cs); 7016 CPUPPCState *env = &cpu->env; 7017 7018 if (cs->halted) { 7019 uint64_t psscr = env->spr[SPR_PSSCR]; 7020 7021 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) { 7022 return false; 7023 } 7024 7025 /* If EC is clear, just return true on any pending interrupt */ 7026 if (!(psscr & PSSCR_EC)) { 7027 return true; 7028 } 7029 /* External Exception */ 7030 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) && 7031 (env->spr[SPR_LPCR] & LPCR_EEE)) { 7032 bool heic = !!(env->spr[SPR_LPCR] & LPCR_HEIC); 7033 if (heic == 0 || !msr_hv || msr_pr) { 7034 return true; 7035 } 7036 } 7037 /* Decrementer Exception */ 7038 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DECR)) && 7039 (env->spr[SPR_LPCR] & LPCR_DEE)) { 7040 return true; 7041 } 7042 /* Machine Check or Hypervisor Maintenance Exception */ 7043 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_MCK | 7044 1u << PPC_INTERRUPT_HMI)) && (env->spr[SPR_LPCR] & LPCR_OEE)) { 7045 return true; 7046 } 7047 /* Privileged Doorbell Exception */ 7048 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DOORBELL)) && 7049 (env->spr[SPR_LPCR] & LPCR_PDEE)) { 7050 return true; 7051 } 7052 /* Hypervisor Doorbell Exception */ 7053 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HDOORBELL)) && 7054 (env->spr[SPR_LPCR] & LPCR_HDEE)) { 7055 return true; 7056 } 7057 /* Hypervisor virtualization exception */ 7058 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HVIRT)) && 7059 (env->spr[SPR_LPCR] & LPCR_HVEE)) { 7060 return true; 7061 } 7062 if (env->pending_interrupts & (1u << PPC_INTERRUPT_RESET)) { 7063 return true; 7064 } 7065 return false; 7066 } else { 7067 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD); 7068 } 7069 } 7070 7071 POWERPC_FAMILY(POWER10)(ObjectClass *oc, void *data) 7072 { 7073 DeviceClass *dc = DEVICE_CLASS(oc); 7074 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 7075 CPUClass *cc = CPU_CLASS(oc); 7076 7077 dc->fw_name = "PowerPC,POWER10"; 7078 dc->desc = "POWER10"; 7079 pcc->pvr_match = ppc_pvr_match_power10; 7080 pcc->pcr_mask = PCR_COMPAT_2_05 | PCR_COMPAT_2_06 | PCR_COMPAT_2_07 | 7081 PCR_COMPAT_3_00; 7082 pcc->pcr_supported = PCR_COMPAT_3_10 | PCR_COMPAT_3_00 | PCR_COMPAT_2_07 | 7083 PCR_COMPAT_2_06 | PCR_COMPAT_2_05; 7084 pcc->init_proc = init_proc_POWER10; 7085 pcc->check_pow = check_pow_nocheck; 7086 cc->has_work = cpu_has_work_POWER10; 7087 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB | 7088 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | 7089 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE | 7090 PPC_FLOAT_FRSQRTES | 7091 PPC_FLOAT_STFIWX | 7092 PPC_FLOAT_EXT | 7093 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | 7094 PPC_MEM_SYNC | PPC_MEM_EIEIO | 7095 PPC_MEM_TLBSYNC | 7096 PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC | 7097 PPC_SEGMENT_64B | PPC_SLBI | 7098 PPC_POPCNTB | PPC_POPCNTWD | 7099 PPC_CILDST; 7100 pcc->insns_flags2 = PPC2_VSX | PPC2_VSX207 | PPC2_DFP | PPC2_DBRX | 7101 PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 | 7102 PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 | 7103 PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 | 7104 PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 | 7105 PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 | 7106 PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL | PPC2_ISA310; 7107 pcc->msr_mask = (1ull << MSR_SF) | 7108 (1ull << MSR_HV) | 7109 (1ull << MSR_TM) | 7110 (1ull << MSR_VR) | 7111 (1ull << MSR_VSX) | 7112 (1ull << MSR_EE) | 7113 (1ull << MSR_PR) | 7114 (1ull << MSR_FP) | 7115 (1ull << MSR_ME) | 7116 (1ull << MSR_FE0) | 7117 (1ull << MSR_SE) | 7118 (1ull << MSR_DE) | 7119 (1ull << MSR_FE1) | 7120 (1ull << MSR_IR) | 7121 (1ull << MSR_DR) | 7122 (1ull << MSR_PMM) | 7123 (1ull << MSR_RI) | 7124 (1ull << MSR_LE); 7125 pcc->lpcr_mask = LPCR_VPM1 | LPCR_ISL | LPCR_KBV | LPCR_DPFD | 7126 (LPCR_PECE_U_MASK & LPCR_HVEE) | LPCR_ILE | LPCR_AIL | 7127 LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR | LPCR_LD | 7128 (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE | 7129 LPCR_DEE | LPCR_OEE)) 7130 | LPCR_MER | LPCR_GTSE | LPCR_TC | 7131 LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE; 7132 /* DD2 adds an extra HAIL bit */ 7133 pcc->lpcr_mask |= LPCR_HAIL; 7134 7135 pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE; 7136 pcc->mmu_model = POWERPC_MMU_3_00; 7137 #if defined(CONFIG_SOFTMMU) 7138 /* segment page size remain the same */ 7139 pcc->hash64_opts = &ppc_hash64_opts_POWER7; 7140 pcc->radix_page_info = &POWER10_radix_page_info; 7141 pcc->lrg_decr_bits = 56; 7142 #endif 7143 pcc->excp_model = POWERPC_EXCP_POWER10; 7144 pcc->bus_model = PPC_FLAGS_INPUT_POWER9; 7145 pcc->bfd_mach = bfd_mach_ppc64; 7146 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE | 7147 POWERPC_FLAG_BE | POWERPC_FLAG_PMM | 7148 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR | 7149 POWERPC_FLAG_VSX | POWERPC_FLAG_TM | POWERPC_FLAG_SCV; 7150 pcc->l1_dcache_size = 0x8000; 7151 pcc->l1_icache_size = 0x8000; 7152 } 7153 7154 #if !defined(CONFIG_USER_ONLY) 7155 void cpu_ppc_set_vhyp(PowerPCCPU *cpu, PPCVirtualHypervisor *vhyp) 7156 { 7157 CPUPPCState *env = &cpu->env; 7158 7159 cpu->vhyp = vhyp; 7160 7161 /* 7162 * With a virtual hypervisor mode we never allow the CPU to go 7163 * hypervisor mode itself 7164 */ 7165 env->msr_mask &= ~MSR_HVB; 7166 } 7167 7168 #endif /* !defined(CONFIG_USER_ONLY) */ 7169 7170 #endif /* defined(TARGET_PPC64) */ 7171 7172 /*****************************************************************************/ 7173 /* Generic CPU instantiation routine */ 7174 static void init_ppc_proc(PowerPCCPU *cpu) 7175 { 7176 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); 7177 CPUPPCState *env = &cpu->env; 7178 #if !defined(CONFIG_USER_ONLY) 7179 int i; 7180 7181 env->irq_inputs = NULL; 7182 /* Set all exception vectors to an invalid address */ 7183 for (i = 0; i < POWERPC_EXCP_NB; i++) { 7184 env->excp_vectors[i] = (target_ulong)(-1ULL); 7185 } 7186 env->ivor_mask = 0x00000000; 7187 env->ivpr_mask = 0x00000000; 7188 /* Default MMU definitions */ 7189 env->nb_BATs = 0; 7190 env->nb_tlb = 0; 7191 env->nb_ways = 0; 7192 env->tlb_type = TLB_NONE; 7193 #endif 7194 /* Register SPR common to all PowerPC implementations */ 7195 register_generic_sprs(cpu); 7196 7197 /* PowerPC implementation specific initialisations (SPRs, timers, ...) */ 7198 (*pcc->init_proc)(env); 7199 7200 #if !defined(CONFIG_USER_ONLY) 7201 ppc_gdb_gen_spr_xml(cpu); 7202 #endif 7203 7204 /* MSR bits & flags consistency checks */ 7205 if (env->msr_mask & (1 << 25)) { 7206 switch (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) { 7207 case POWERPC_FLAG_SPE: 7208 case POWERPC_FLAG_VRE: 7209 break; 7210 default: 7211 fprintf(stderr, "PowerPC MSR definition inconsistency\n" 7212 "Should define POWERPC_FLAG_SPE or POWERPC_FLAG_VRE\n"); 7213 exit(1); 7214 } 7215 } else if (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) { 7216 fprintf(stderr, "PowerPC MSR definition inconsistency\n" 7217 "Should not define POWERPC_FLAG_SPE nor POWERPC_FLAG_VRE\n"); 7218 exit(1); 7219 } 7220 if (env->msr_mask & (1 << 17)) { 7221 switch (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) { 7222 case POWERPC_FLAG_TGPR: 7223 case POWERPC_FLAG_CE: 7224 break; 7225 default: 7226 fprintf(stderr, "PowerPC MSR definition inconsistency\n" 7227 "Should define POWERPC_FLAG_TGPR or POWERPC_FLAG_CE\n"); 7228 exit(1); 7229 } 7230 } else if (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) { 7231 fprintf(stderr, "PowerPC MSR definition inconsistency\n" 7232 "Should not define POWERPC_FLAG_TGPR nor POWERPC_FLAG_CE\n"); 7233 exit(1); 7234 } 7235 if (env->msr_mask & (1 << 10)) { 7236 switch (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE | 7237 POWERPC_FLAG_UBLE)) { 7238 case POWERPC_FLAG_SE: 7239 case POWERPC_FLAG_DWE: 7240 case POWERPC_FLAG_UBLE: 7241 break; 7242 default: 7243 fprintf(stderr, "PowerPC MSR definition inconsistency\n" 7244 "Should define POWERPC_FLAG_SE or POWERPC_FLAG_DWE or " 7245 "POWERPC_FLAG_UBLE\n"); 7246 exit(1); 7247 } 7248 } else if (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE | 7249 POWERPC_FLAG_UBLE)) { 7250 fprintf(stderr, "PowerPC MSR definition inconsistency\n" 7251 "Should not define POWERPC_FLAG_SE nor POWERPC_FLAG_DWE nor " 7252 "POWERPC_FLAG_UBLE\n"); 7253 exit(1); 7254 } 7255 if (env->msr_mask & (1 << 9)) { 7256 switch (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) { 7257 case POWERPC_FLAG_BE: 7258 case POWERPC_FLAG_DE: 7259 break; 7260 default: 7261 fprintf(stderr, "PowerPC MSR definition inconsistency\n" 7262 "Should define POWERPC_FLAG_BE or POWERPC_FLAG_DE\n"); 7263 exit(1); 7264 } 7265 } else if (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) { 7266 fprintf(stderr, "PowerPC MSR definition inconsistency\n" 7267 "Should not define POWERPC_FLAG_BE nor POWERPC_FLAG_DE\n"); 7268 exit(1); 7269 } 7270 if (env->msr_mask & (1 << 2)) { 7271 switch (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) { 7272 case POWERPC_FLAG_PX: 7273 case POWERPC_FLAG_PMM: 7274 break; 7275 default: 7276 fprintf(stderr, "PowerPC MSR definition inconsistency\n" 7277 "Should define POWERPC_FLAG_PX or POWERPC_FLAG_PMM\n"); 7278 exit(1); 7279 } 7280 } else if (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) { 7281 fprintf(stderr, "PowerPC MSR definition inconsistency\n" 7282 "Should not define POWERPC_FLAG_PX nor POWERPC_FLAG_PMM\n"); 7283 exit(1); 7284 } 7285 if ((env->flags & POWERPC_FLAG_BUS_CLK) == 0) { 7286 fprintf(stderr, "PowerPC flags inconsistency\n" 7287 "Should define the time-base and decrementer clock source\n"); 7288 exit(1); 7289 } 7290 /* Allocate TLBs buffer when needed */ 7291 #if !defined(CONFIG_USER_ONLY) 7292 if (env->nb_tlb != 0) { 7293 int nb_tlb = env->nb_tlb; 7294 if (env->id_tlbs != 0) { 7295 nb_tlb *= 2; 7296 } 7297 switch (env->tlb_type) { 7298 case TLB_6XX: 7299 env->tlb.tlb6 = g_new0(ppc6xx_tlb_t, nb_tlb); 7300 break; 7301 case TLB_EMB: 7302 env->tlb.tlbe = g_new0(ppcemb_tlb_t, nb_tlb); 7303 break; 7304 case TLB_MAS: 7305 env->tlb.tlbm = g_new0(ppcmas_tlb_t, nb_tlb); 7306 break; 7307 } 7308 /* Pre-compute some useful values */ 7309 env->tlb_per_way = env->nb_tlb / env->nb_ways; 7310 } 7311 if (env->irq_inputs == NULL) { 7312 warn_report("no internal IRQ controller registered." 7313 " Attempt QEMU to crash very soon !"); 7314 } 7315 #endif 7316 if (env->check_pow == NULL) { 7317 warn_report("no power management check handler registered." 7318 " Attempt QEMU to crash very soon !"); 7319 } 7320 } 7321 7322 7323 static void ppc_cpu_realize(DeviceState *dev, Error **errp) 7324 { 7325 CPUState *cs = CPU(dev); 7326 PowerPCCPU *cpu = POWERPC_CPU(dev); 7327 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); 7328 Error *local_err = NULL; 7329 7330 cpu_exec_realizefn(cs, &local_err); 7331 if (local_err != NULL) { 7332 error_propagate(errp, local_err); 7333 return; 7334 } 7335 if (cpu->vcpu_id == UNASSIGNED_CPU_INDEX) { 7336 cpu->vcpu_id = cs->cpu_index; 7337 } 7338 7339 if (tcg_enabled()) { 7340 if (ppc_fixup_cpu(cpu) != 0) { 7341 error_setg(errp, "Unable to emulate selected CPU with TCG"); 7342 goto unrealize; 7343 } 7344 } 7345 7346 create_ppc_opcodes(cpu, &local_err); 7347 if (local_err != NULL) { 7348 error_propagate(errp, local_err); 7349 goto unrealize; 7350 } 7351 init_ppc_proc(cpu); 7352 7353 ppc_gdb_init(cs, pcc); 7354 qemu_init_vcpu(cs); 7355 7356 pcc->parent_realize(dev, errp); 7357 7358 return; 7359 7360 unrealize: 7361 cpu_exec_unrealizefn(cs); 7362 } 7363 7364 static void ppc_cpu_unrealize(DeviceState *dev) 7365 { 7366 PowerPCCPU *cpu = POWERPC_CPU(dev); 7367 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); 7368 7369 pcc->parent_unrealize(dev); 7370 7371 cpu_remove_sync(CPU(cpu)); 7372 7373 destroy_ppc_opcodes(cpu); 7374 } 7375 7376 static gint ppc_cpu_compare_class_pvr(gconstpointer a, gconstpointer b) 7377 { 7378 ObjectClass *oc = (ObjectClass *)a; 7379 uint32_t pvr = *(uint32_t *)b; 7380 PowerPCCPUClass *pcc = (PowerPCCPUClass *)a; 7381 7382 /* -cpu host does a PVR lookup during construction */ 7383 if (unlikely(strcmp(object_class_get_name(oc), 7384 TYPE_HOST_POWERPC_CPU) == 0)) { 7385 return -1; 7386 } 7387 7388 return pcc->pvr == pvr ? 0 : -1; 7389 } 7390 7391 PowerPCCPUClass *ppc_cpu_class_by_pvr(uint32_t pvr) 7392 { 7393 GSList *list, *item; 7394 PowerPCCPUClass *pcc = NULL; 7395 7396 list = object_class_get_list(TYPE_POWERPC_CPU, false); 7397 item = g_slist_find_custom(list, &pvr, ppc_cpu_compare_class_pvr); 7398 if (item != NULL) { 7399 pcc = POWERPC_CPU_CLASS(item->data); 7400 } 7401 g_slist_free(list); 7402 7403 return pcc; 7404 } 7405 7406 static gint ppc_cpu_compare_class_pvr_mask(gconstpointer a, gconstpointer b) 7407 { 7408 ObjectClass *oc = (ObjectClass *)a; 7409 uint32_t pvr = *(uint32_t *)b; 7410 PowerPCCPUClass *pcc = (PowerPCCPUClass *)a; 7411 7412 /* -cpu host does a PVR lookup during construction */ 7413 if (unlikely(strcmp(object_class_get_name(oc), 7414 TYPE_HOST_POWERPC_CPU) == 0)) { 7415 return -1; 7416 } 7417 7418 if (pcc->pvr_match(pcc, pvr)) { 7419 return 0; 7420 } 7421 7422 return -1; 7423 } 7424 7425 PowerPCCPUClass *ppc_cpu_class_by_pvr_mask(uint32_t pvr) 7426 { 7427 GSList *list, *item; 7428 PowerPCCPUClass *pcc = NULL; 7429 7430 list = object_class_get_list(TYPE_POWERPC_CPU, true); 7431 item = g_slist_find_custom(list, &pvr, ppc_cpu_compare_class_pvr_mask); 7432 if (item != NULL) { 7433 pcc = POWERPC_CPU_CLASS(item->data); 7434 } 7435 g_slist_free(list); 7436 7437 return pcc; 7438 } 7439 7440 static const char *ppc_cpu_lookup_alias(const char *alias) 7441 { 7442 int ai; 7443 7444 for (ai = 0; ppc_cpu_aliases[ai].alias != NULL; ai++) { 7445 if (strcmp(ppc_cpu_aliases[ai].alias, alias) == 0) { 7446 return ppc_cpu_aliases[ai].model; 7447 } 7448 } 7449 7450 return NULL; 7451 } 7452 7453 static ObjectClass *ppc_cpu_class_by_name(const char *name) 7454 { 7455 char *cpu_model, *typename; 7456 ObjectClass *oc; 7457 const char *p; 7458 unsigned long pvr; 7459 7460 /* 7461 * Lookup by PVR if cpu_model is valid 8 digit hex number (excl: 7462 * 0x prefix if present) 7463 */ 7464 if (!qemu_strtoul(name, &p, 16, &pvr)) { 7465 int len = p - name; 7466 len = (len == 10) && (name[1] == 'x') ? len - 2 : len; 7467 if ((len == 8) && (*p == '\0')) { 7468 return OBJECT_CLASS(ppc_cpu_class_by_pvr(pvr)); 7469 } 7470 } 7471 7472 cpu_model = g_ascii_strdown(name, -1); 7473 p = ppc_cpu_lookup_alias(cpu_model); 7474 if (p) { 7475 g_free(cpu_model); 7476 cpu_model = g_strdup(p); 7477 } 7478 7479 typename = g_strdup_printf("%s" POWERPC_CPU_TYPE_SUFFIX, cpu_model); 7480 oc = object_class_by_name(typename); 7481 g_free(typename); 7482 g_free(cpu_model); 7483 7484 return oc; 7485 } 7486 7487 PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc) 7488 { 7489 ObjectClass *oc = OBJECT_CLASS(pcc); 7490 7491 while (oc && !object_class_is_abstract(oc)) { 7492 oc = object_class_get_parent(oc); 7493 } 7494 assert(oc); 7495 7496 return POWERPC_CPU_CLASS(oc); 7497 } 7498 7499 /* Sort by PVR, ordering special case "host" last. */ 7500 static gint ppc_cpu_list_compare(gconstpointer a, gconstpointer b) 7501 { 7502 ObjectClass *oc_a = (ObjectClass *)a; 7503 ObjectClass *oc_b = (ObjectClass *)b; 7504 PowerPCCPUClass *pcc_a = POWERPC_CPU_CLASS(oc_a); 7505 PowerPCCPUClass *pcc_b = POWERPC_CPU_CLASS(oc_b); 7506 const char *name_a = object_class_get_name(oc_a); 7507 const char *name_b = object_class_get_name(oc_b); 7508 7509 if (strcmp(name_a, TYPE_HOST_POWERPC_CPU) == 0) { 7510 return 1; 7511 } else if (strcmp(name_b, TYPE_HOST_POWERPC_CPU) == 0) { 7512 return -1; 7513 } else { 7514 /* Avoid an integer overflow during subtraction */ 7515 if (pcc_a->pvr < pcc_b->pvr) { 7516 return -1; 7517 } else if (pcc_a->pvr > pcc_b->pvr) { 7518 return 1; 7519 } else { 7520 return 0; 7521 } 7522 } 7523 } 7524 7525 static void ppc_cpu_list_entry(gpointer data, gpointer user_data) 7526 { 7527 ObjectClass *oc = data; 7528 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 7529 DeviceClass *family = DEVICE_CLASS(ppc_cpu_get_family_class(pcc)); 7530 const char *typename = object_class_get_name(oc); 7531 char *name; 7532 int i; 7533 7534 if (unlikely(strcmp(typename, TYPE_HOST_POWERPC_CPU) == 0)) { 7535 return; 7536 } 7537 7538 name = g_strndup(typename, 7539 strlen(typename) - strlen(POWERPC_CPU_TYPE_SUFFIX)); 7540 qemu_printf("PowerPC %-16s PVR %08x\n", name, pcc->pvr); 7541 for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) { 7542 PowerPCCPUAlias *alias = &ppc_cpu_aliases[i]; 7543 ObjectClass *alias_oc = ppc_cpu_class_by_name(alias->model); 7544 7545 if (alias_oc != oc) { 7546 continue; 7547 } 7548 /* 7549 * If running with KVM, we might update the family alias later, so 7550 * avoid printing the wrong alias here and use "preferred" instead 7551 */ 7552 if (strcmp(alias->alias, family->desc) == 0) { 7553 qemu_printf("PowerPC %-16s (alias for preferred %s CPU)\n", 7554 alias->alias, family->desc); 7555 } else { 7556 qemu_printf("PowerPC %-16s (alias for %s)\n", 7557 alias->alias, name); 7558 } 7559 } 7560 g_free(name); 7561 } 7562 7563 void ppc_cpu_list(void) 7564 { 7565 GSList *list; 7566 7567 list = object_class_get_list(TYPE_POWERPC_CPU, false); 7568 list = g_slist_sort(list, ppc_cpu_list_compare); 7569 g_slist_foreach(list, ppc_cpu_list_entry, NULL); 7570 g_slist_free(list); 7571 7572 #ifdef CONFIG_KVM 7573 qemu_printf("\n"); 7574 qemu_printf("PowerPC %s\n", "host"); 7575 #endif 7576 } 7577 7578 static void ppc_cpu_defs_entry(gpointer data, gpointer user_data) 7579 { 7580 ObjectClass *oc = data; 7581 CpuDefinitionInfoList **first = user_data; 7582 const char *typename; 7583 CpuDefinitionInfo *info; 7584 7585 typename = object_class_get_name(oc); 7586 info = g_malloc0(sizeof(*info)); 7587 info->name = g_strndup(typename, 7588 strlen(typename) - strlen(POWERPC_CPU_TYPE_SUFFIX)); 7589 7590 QAPI_LIST_PREPEND(*first, info); 7591 } 7592 7593 CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp) 7594 { 7595 CpuDefinitionInfoList *cpu_list = NULL; 7596 GSList *list; 7597 int i; 7598 7599 list = object_class_get_list(TYPE_POWERPC_CPU, false); 7600 g_slist_foreach(list, ppc_cpu_defs_entry, &cpu_list); 7601 g_slist_free(list); 7602 7603 for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) { 7604 PowerPCCPUAlias *alias = &ppc_cpu_aliases[i]; 7605 ObjectClass *oc; 7606 CpuDefinitionInfo *info; 7607 7608 oc = ppc_cpu_class_by_name(alias->model); 7609 if (oc == NULL) { 7610 continue; 7611 } 7612 7613 info = g_malloc0(sizeof(*info)); 7614 info->name = g_strdup(alias->alias); 7615 info->q_typename = g_strdup(object_class_get_name(oc)); 7616 7617 QAPI_LIST_PREPEND(cpu_list, info); 7618 } 7619 7620 return cpu_list; 7621 } 7622 7623 static void ppc_cpu_set_pc(CPUState *cs, vaddr value) 7624 { 7625 PowerPCCPU *cpu = POWERPC_CPU(cs); 7626 7627 cpu->env.nip = value; 7628 } 7629 7630 static bool ppc_cpu_has_work(CPUState *cs) 7631 { 7632 PowerPCCPU *cpu = POWERPC_CPU(cs); 7633 CPUPPCState *env = &cpu->env; 7634 7635 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD); 7636 } 7637 7638 static void ppc_cpu_reset(DeviceState *dev) 7639 { 7640 CPUState *s = CPU(dev); 7641 PowerPCCPU *cpu = POWERPC_CPU(s); 7642 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); 7643 CPUPPCState *env = &cpu->env; 7644 target_ulong msr; 7645 int i; 7646 7647 pcc->parent_reset(dev); 7648 7649 msr = (target_ulong)0; 7650 msr |= (target_ulong)MSR_HVB; 7651 msr |= (target_ulong)1 << MSR_EP; 7652 #if defined(DO_SINGLE_STEP) && 0 7653 /* Single step trace mode */ 7654 msr |= (target_ulong)1 << MSR_SE; 7655 msr |= (target_ulong)1 << MSR_BE; 7656 #endif 7657 #if defined(CONFIG_USER_ONLY) 7658 msr |= (target_ulong)1 << MSR_FP; /* Allow floating point usage */ 7659 msr |= (target_ulong)1 << MSR_FE0; /* Allow floating point exceptions */ 7660 msr |= (target_ulong)1 << MSR_FE1; 7661 msr |= (target_ulong)1 << MSR_VR; /* Allow altivec usage */ 7662 msr |= (target_ulong)1 << MSR_VSX; /* Allow VSX usage */ 7663 msr |= (target_ulong)1 << MSR_SPE; /* Allow SPE usage */ 7664 msr |= (target_ulong)1 << MSR_PR; 7665 #if defined(TARGET_PPC64) 7666 msr |= (target_ulong)1 << MSR_TM; /* Transactional memory */ 7667 #endif 7668 #if !defined(TARGET_WORDS_BIGENDIAN) 7669 msr |= (target_ulong)1 << MSR_LE; /* Little-endian user mode */ 7670 if (!((env->msr_mask >> MSR_LE) & 1)) { 7671 fprintf(stderr, "Selected CPU does not support little-endian.\n"); 7672 exit(1); 7673 } 7674 #endif 7675 #endif 7676 7677 #if defined(TARGET_PPC64) 7678 if (mmu_is_64bit(env->mmu_model)) { 7679 msr |= (1ULL << MSR_SF); 7680 } 7681 #endif 7682 7683 hreg_store_msr(env, msr, 1); 7684 7685 #if !defined(CONFIG_USER_ONLY) 7686 env->nip = env->hreset_vector | env->excp_prefix; 7687 #if defined(CONFIG_TCG) 7688 if (env->mmu_model != POWERPC_MMU_REAL) { 7689 ppc_tlb_invalidate_all(env); 7690 } 7691 #endif /* CONFIG_TCG */ 7692 #endif 7693 7694 pmu_update_summaries(env); 7695 hreg_compute_hflags(env); 7696 env->reserve_addr = (target_ulong)-1ULL; 7697 /* Be sure no exception or interrupt is pending */ 7698 env->pending_interrupts = 0; 7699 s->exception_index = POWERPC_EXCP_NONE; 7700 env->error_code = 0; 7701 ppc_irq_reset(cpu); 7702 7703 /* tininess for underflow is detected before rounding */ 7704 set_float_detect_tininess(float_tininess_before_rounding, 7705 &env->fp_status); 7706 7707 for (i = 0; i < ARRAY_SIZE(env->spr_cb); i++) { 7708 ppc_spr_t *spr = &env->spr_cb[i]; 7709 7710 if (!spr->name) { 7711 continue; 7712 } 7713 env->spr[i] = spr->default_value; 7714 } 7715 } 7716 7717 #ifndef CONFIG_USER_ONLY 7718 7719 static bool ppc_cpu_is_big_endian(CPUState *cs) 7720 { 7721 PowerPCCPU *cpu = POWERPC_CPU(cs); 7722 CPUPPCState *env = &cpu->env; 7723 7724 cpu_synchronize_state(cs); 7725 7726 return !msr_le; 7727 } 7728 7729 #ifdef CONFIG_TCG 7730 static void ppc_cpu_exec_enter(CPUState *cs) 7731 { 7732 PowerPCCPU *cpu = POWERPC_CPU(cs); 7733 7734 if (cpu->vhyp) { 7735 PPCVirtualHypervisorClass *vhc = 7736 PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp); 7737 vhc->cpu_exec_enter(cpu->vhyp, cpu); 7738 } 7739 } 7740 7741 static void ppc_cpu_exec_exit(CPUState *cs) 7742 { 7743 PowerPCCPU *cpu = POWERPC_CPU(cs); 7744 7745 if (cpu->vhyp) { 7746 PPCVirtualHypervisorClass *vhc = 7747 PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp); 7748 vhc->cpu_exec_exit(cpu->vhyp, cpu); 7749 } 7750 } 7751 #endif /* CONFIG_TCG */ 7752 7753 #endif /* !CONFIG_USER_ONLY */ 7754 7755 static void ppc_cpu_instance_init(Object *obj) 7756 { 7757 PowerPCCPU *cpu = POWERPC_CPU(obj); 7758 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); 7759 CPUPPCState *env = &cpu->env; 7760 7761 cpu_set_cpustate_pointers(cpu); 7762 cpu->vcpu_id = UNASSIGNED_CPU_INDEX; 7763 7764 env->msr_mask = pcc->msr_mask; 7765 env->mmu_model = pcc->mmu_model; 7766 env->excp_model = pcc->excp_model; 7767 env->bus_model = pcc->bus_model; 7768 env->insns_flags = pcc->insns_flags; 7769 env->insns_flags2 = pcc->insns_flags2; 7770 env->flags = pcc->flags; 7771 env->bfd_mach = pcc->bfd_mach; 7772 env->check_pow = pcc->check_pow; 7773 7774 /* 7775 * Mark HV mode as supported if the CPU has an MSR_HV bit in the 7776 * msr_mask. The mask can later be cleared by PAPR mode but the hv 7777 * mode support will remain, thus enforcing that we cannot use 7778 * priv. instructions in guest in PAPR mode. For 970 we currently 7779 * simply don't set HV in msr_mask thus simulating an "Apple mode" 7780 * 970. If we ever want to support 970 HV mode, we'll have to add 7781 * a processor attribute of some sort. 7782 */ 7783 #if !defined(CONFIG_USER_ONLY) 7784 env->has_hv_mode = !!(env->msr_mask & MSR_HVB); 7785 #endif 7786 7787 ppc_hash64_init(cpu); 7788 } 7789 7790 static void ppc_cpu_instance_finalize(Object *obj) 7791 { 7792 PowerPCCPU *cpu = POWERPC_CPU(obj); 7793 7794 ppc_hash64_finalize(cpu); 7795 } 7796 7797 static bool ppc_pvr_match_default(PowerPCCPUClass *pcc, uint32_t pvr) 7798 { 7799 return pcc->pvr == pvr; 7800 } 7801 7802 static void ppc_disas_set_info(CPUState *cs, disassemble_info *info) 7803 { 7804 PowerPCCPU *cpu = POWERPC_CPU(cs); 7805 CPUPPCState *env = &cpu->env; 7806 7807 if ((env->hflags >> MSR_LE) & 1) { 7808 info->endian = BFD_ENDIAN_LITTLE; 7809 } 7810 info->mach = env->bfd_mach; 7811 if (!env->bfd_mach) { 7812 #ifdef TARGET_PPC64 7813 info->mach = bfd_mach_ppc64; 7814 #else 7815 info->mach = bfd_mach_ppc; 7816 #endif 7817 } 7818 info->disassembler_options = (char *)"any"; 7819 info->print_insn = print_insn_ppc; 7820 7821 info->cap_arch = CS_ARCH_PPC; 7822 #ifdef TARGET_PPC64 7823 info->cap_mode = CS_MODE_64; 7824 #endif 7825 } 7826 7827 static Property ppc_cpu_properties[] = { 7828 DEFINE_PROP_BOOL("pre-2.8-migration", PowerPCCPU, pre_2_8_migration, false), 7829 DEFINE_PROP_BOOL("pre-2.10-migration", PowerPCCPU, pre_2_10_migration, 7830 false), 7831 DEFINE_PROP_BOOL("pre-3.0-migration", PowerPCCPU, pre_3_0_migration, 7832 false), 7833 DEFINE_PROP_END_OF_LIST(), 7834 }; 7835 7836 #ifndef CONFIG_USER_ONLY 7837 #include "hw/core/sysemu-cpu-ops.h" 7838 7839 static const struct SysemuCPUOps ppc_sysemu_ops = { 7840 .get_phys_page_debug = ppc_cpu_get_phys_page_debug, 7841 .write_elf32_note = ppc32_cpu_write_elf32_note, 7842 .write_elf64_note = ppc64_cpu_write_elf64_note, 7843 .virtio_is_big_endian = ppc_cpu_is_big_endian, 7844 .legacy_vmsd = &vmstate_ppc_cpu, 7845 }; 7846 #endif 7847 7848 #ifdef CONFIG_TCG 7849 #include "hw/core/tcg-cpu-ops.h" 7850 7851 static const struct TCGCPUOps ppc_tcg_ops = { 7852 .initialize = ppc_translate_init, 7853 7854 #ifdef CONFIG_USER_ONLY 7855 .record_sigsegv = ppc_cpu_record_sigsegv, 7856 #else 7857 .tlb_fill = ppc_cpu_tlb_fill, 7858 .cpu_exec_interrupt = ppc_cpu_exec_interrupt, 7859 .do_interrupt = ppc_cpu_do_interrupt, 7860 .cpu_exec_enter = ppc_cpu_exec_enter, 7861 .cpu_exec_exit = ppc_cpu_exec_exit, 7862 .do_unaligned_access = ppc_cpu_do_unaligned_access, 7863 #endif /* !CONFIG_USER_ONLY */ 7864 }; 7865 #endif /* CONFIG_TCG */ 7866 7867 static void ppc_cpu_class_init(ObjectClass *oc, void *data) 7868 { 7869 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc); 7870 CPUClass *cc = CPU_CLASS(oc); 7871 DeviceClass *dc = DEVICE_CLASS(oc); 7872 7873 device_class_set_parent_realize(dc, ppc_cpu_realize, 7874 &pcc->parent_realize); 7875 device_class_set_parent_unrealize(dc, ppc_cpu_unrealize, 7876 &pcc->parent_unrealize); 7877 pcc->pvr_match = ppc_pvr_match_default; 7878 device_class_set_props(dc, ppc_cpu_properties); 7879 7880 device_class_set_parent_reset(dc, ppc_cpu_reset, &pcc->parent_reset); 7881 7882 cc->class_by_name = ppc_cpu_class_by_name; 7883 cc->has_work = ppc_cpu_has_work; 7884 cc->dump_state = ppc_cpu_dump_state; 7885 cc->set_pc = ppc_cpu_set_pc; 7886 cc->gdb_read_register = ppc_cpu_gdb_read_register; 7887 cc->gdb_write_register = ppc_cpu_gdb_write_register; 7888 #ifndef CONFIG_USER_ONLY 7889 cc->sysemu_ops = &ppc_sysemu_ops; 7890 #endif 7891 7892 cc->gdb_num_core_regs = 71; 7893 #ifndef CONFIG_USER_ONLY 7894 cc->gdb_get_dynamic_xml = ppc_gdb_get_dynamic_xml; 7895 #endif 7896 #ifdef USE_APPLE_GDB 7897 cc->gdb_read_register = ppc_cpu_gdb_read_register_apple; 7898 cc->gdb_write_register = ppc_cpu_gdb_write_register_apple; 7899 cc->gdb_num_core_regs = 71 + 32; 7900 #endif 7901 7902 cc->gdb_arch_name = ppc_gdb_arch_name; 7903 #if defined(TARGET_PPC64) 7904 cc->gdb_core_xml_file = "power64-core.xml"; 7905 #else 7906 cc->gdb_core_xml_file = "power-core.xml"; 7907 #endif 7908 cc->disas_set_info = ppc_disas_set_info; 7909 7910 dc->fw_name = "PowerPC,UNKNOWN"; 7911 7912 #ifdef CONFIG_TCG 7913 cc->tcg_ops = &ppc_tcg_ops; 7914 #endif /* CONFIG_TCG */ 7915 } 7916 7917 static const TypeInfo ppc_cpu_type_info = { 7918 .name = TYPE_POWERPC_CPU, 7919 .parent = TYPE_CPU, 7920 .instance_size = sizeof(PowerPCCPU), 7921 .instance_align = __alignof__(PowerPCCPU), 7922 .instance_init = ppc_cpu_instance_init, 7923 .instance_finalize = ppc_cpu_instance_finalize, 7924 .abstract = true, 7925 .class_size = sizeof(PowerPCCPUClass), 7926 .class_init = ppc_cpu_class_init, 7927 }; 7928 7929 #ifndef CONFIG_USER_ONLY 7930 static const TypeInfo ppc_vhyp_type_info = { 7931 .name = TYPE_PPC_VIRTUAL_HYPERVISOR, 7932 .parent = TYPE_INTERFACE, 7933 .class_size = sizeof(PPCVirtualHypervisorClass), 7934 }; 7935 #endif 7936 7937 static void ppc_cpu_register_types(void) 7938 { 7939 type_register_static(&ppc_cpu_type_info); 7940 #ifndef CONFIG_USER_ONLY 7941 type_register_static(&ppc_vhyp_type_info); 7942 #endif 7943 } 7944 7945 void ppc_cpu_dump_state(CPUState *cs, FILE *f, int flags) 7946 { 7947 #define RGPL 4 7948 #define RFPL 4 7949 7950 PowerPCCPU *cpu = POWERPC_CPU(cs); 7951 CPUPPCState *env = &cpu->env; 7952 int i; 7953 7954 qemu_fprintf(f, "NIP " TARGET_FMT_lx " LR " TARGET_FMT_lx " CTR " 7955 TARGET_FMT_lx " XER " TARGET_FMT_lx " CPU#%d\n", 7956 env->nip, env->lr, env->ctr, cpu_read_xer(env), 7957 cs->cpu_index); 7958 qemu_fprintf(f, "MSR " TARGET_FMT_lx " HID0 " TARGET_FMT_lx " HF " 7959 "%08x iidx %d didx %d\n", 7960 env->msr, env->spr[SPR_HID0], env->hflags, 7961 cpu_mmu_index(env, true), cpu_mmu_index(env, false)); 7962 #if !defined(NO_TIMER_DUMP) 7963 qemu_fprintf(f, "TB %08" PRIu32 " %08" PRIu64 7964 #if !defined(CONFIG_USER_ONLY) 7965 " DECR " TARGET_FMT_lu 7966 #endif 7967 "\n", 7968 cpu_ppc_load_tbu(env), cpu_ppc_load_tbl(env) 7969 #if !defined(CONFIG_USER_ONLY) 7970 , cpu_ppc_load_decr(env) 7971 #endif 7972 ); 7973 #endif 7974 for (i = 0; i < 32; i++) { 7975 if ((i & (RGPL - 1)) == 0) { 7976 qemu_fprintf(f, "GPR%02d", i); 7977 } 7978 qemu_fprintf(f, " %016" PRIx64, ppc_dump_gpr(env, i)); 7979 if ((i & (RGPL - 1)) == (RGPL - 1)) { 7980 qemu_fprintf(f, "\n"); 7981 } 7982 } 7983 qemu_fprintf(f, "CR "); 7984 for (i = 0; i < 8; i++) 7985 qemu_fprintf(f, "%01x", env->crf[i]); 7986 qemu_fprintf(f, " ["); 7987 for (i = 0; i < 8; i++) { 7988 char a = '-'; 7989 if (env->crf[i] & 0x08) { 7990 a = 'L'; 7991 } else if (env->crf[i] & 0x04) { 7992 a = 'G'; 7993 } else if (env->crf[i] & 0x02) { 7994 a = 'E'; 7995 } 7996 qemu_fprintf(f, " %c%c", a, env->crf[i] & 0x01 ? 'O' : ' '); 7997 } 7998 qemu_fprintf(f, " ] RES " TARGET_FMT_lx "\n", 7999 env->reserve_addr); 8000 8001 if (flags & CPU_DUMP_FPU) { 8002 for (i = 0; i < 32; i++) { 8003 if ((i & (RFPL - 1)) == 0) { 8004 qemu_fprintf(f, "FPR%02d", i); 8005 } 8006 qemu_fprintf(f, " %016" PRIx64, *cpu_fpr_ptr(env, i)); 8007 if ((i & (RFPL - 1)) == (RFPL - 1)) { 8008 qemu_fprintf(f, "\n"); 8009 } 8010 } 8011 qemu_fprintf(f, "FPSCR " TARGET_FMT_lx "\n", env->fpscr); 8012 } 8013 8014 #if !defined(CONFIG_USER_ONLY) 8015 qemu_fprintf(f, " SRR0 " TARGET_FMT_lx " SRR1 " TARGET_FMT_lx 8016 " PVR " TARGET_FMT_lx " VRSAVE " TARGET_FMT_lx "\n", 8017 env->spr[SPR_SRR0], env->spr[SPR_SRR1], 8018 env->spr[SPR_PVR], env->spr[SPR_VRSAVE]); 8019 8020 qemu_fprintf(f, "SPRG0 " TARGET_FMT_lx " SPRG1 " TARGET_FMT_lx 8021 " SPRG2 " TARGET_FMT_lx " SPRG3 " TARGET_FMT_lx "\n", 8022 env->spr[SPR_SPRG0], env->spr[SPR_SPRG1], 8023 env->spr[SPR_SPRG2], env->spr[SPR_SPRG3]); 8024 8025 qemu_fprintf(f, "SPRG4 " TARGET_FMT_lx " SPRG5 " TARGET_FMT_lx 8026 " SPRG6 " TARGET_FMT_lx " SPRG7 " TARGET_FMT_lx "\n", 8027 env->spr[SPR_SPRG4], env->spr[SPR_SPRG5], 8028 env->spr[SPR_SPRG6], env->spr[SPR_SPRG7]); 8029 8030 switch (env->excp_model) { 8031 #if defined(TARGET_PPC64) 8032 case POWERPC_EXCP_POWER7: 8033 case POWERPC_EXCP_POWER8: 8034 case POWERPC_EXCP_POWER9: 8035 case POWERPC_EXCP_POWER10: 8036 qemu_fprintf(f, "HSRR0 " TARGET_FMT_lx " HSRR1 " TARGET_FMT_lx "\n", 8037 env->spr[SPR_HSRR0], env->spr[SPR_HSRR1]); 8038 break; 8039 #endif 8040 case POWERPC_EXCP_BOOKE: 8041 qemu_fprintf(f, "CSRR0 " TARGET_FMT_lx " CSRR1 " TARGET_FMT_lx 8042 " MCSRR0 " TARGET_FMT_lx " MCSRR1 " TARGET_FMT_lx "\n", 8043 env->spr[SPR_BOOKE_CSRR0], env->spr[SPR_BOOKE_CSRR1], 8044 env->spr[SPR_BOOKE_MCSRR0], env->spr[SPR_BOOKE_MCSRR1]); 8045 8046 qemu_fprintf(f, " TCR " TARGET_FMT_lx " TSR " TARGET_FMT_lx 8047 " ESR " TARGET_FMT_lx " DEAR " TARGET_FMT_lx "\n", 8048 env->spr[SPR_BOOKE_TCR], env->spr[SPR_BOOKE_TSR], 8049 env->spr[SPR_BOOKE_ESR], env->spr[SPR_BOOKE_DEAR]); 8050 8051 qemu_fprintf(f, " PIR " TARGET_FMT_lx " DECAR " TARGET_FMT_lx 8052 " IVPR " TARGET_FMT_lx " EPCR " TARGET_FMT_lx "\n", 8053 env->spr[SPR_BOOKE_PIR], env->spr[SPR_BOOKE_DECAR], 8054 env->spr[SPR_BOOKE_IVPR], env->spr[SPR_BOOKE_EPCR]); 8055 8056 qemu_fprintf(f, " MCSR " TARGET_FMT_lx " SPRG8 " TARGET_FMT_lx 8057 " EPR " TARGET_FMT_lx "\n", 8058 env->spr[SPR_BOOKE_MCSR], env->spr[SPR_BOOKE_SPRG8], 8059 env->spr[SPR_BOOKE_EPR]); 8060 8061 /* FSL-specific */ 8062 qemu_fprintf(f, " MCAR " TARGET_FMT_lx " PID1 " TARGET_FMT_lx 8063 " PID2 " TARGET_FMT_lx " SVR " TARGET_FMT_lx "\n", 8064 env->spr[SPR_Exxx_MCAR], env->spr[SPR_BOOKE_PID1], 8065 env->spr[SPR_BOOKE_PID2], env->spr[SPR_E500_SVR]); 8066 8067 /* 8068 * IVORs are left out as they are large and do not change often -- 8069 * they can be read with "p $ivor0", "p $ivor1", etc. 8070 */ 8071 break; 8072 case POWERPC_EXCP_40x: 8073 qemu_fprintf(f, " TCR " TARGET_FMT_lx " TSR " TARGET_FMT_lx 8074 " ESR " TARGET_FMT_lx " DEAR " TARGET_FMT_lx "\n", 8075 env->spr[SPR_40x_TCR], env->spr[SPR_40x_TSR], 8076 env->spr[SPR_40x_ESR], env->spr[SPR_40x_DEAR]); 8077 8078 qemu_fprintf(f, " EVPR " TARGET_FMT_lx " SRR2 " TARGET_FMT_lx 8079 " SRR3 " TARGET_FMT_lx " PID " TARGET_FMT_lx "\n", 8080 env->spr[SPR_40x_EVPR], env->spr[SPR_40x_SRR2], 8081 env->spr[SPR_40x_SRR3], env->spr[SPR_40x_PID]); 8082 break; 8083 default: 8084 break; 8085 } 8086 8087 #if defined(TARGET_PPC64) 8088 if (env->flags & POWERPC_FLAG_CFAR) { 8089 qemu_fprintf(f, " CFAR " TARGET_FMT_lx"\n", env->cfar); 8090 } 8091 #endif 8092 8093 if (env->spr_cb[SPR_LPCR].name) { 8094 qemu_fprintf(f, " LPCR " TARGET_FMT_lx "\n", env->spr[SPR_LPCR]); 8095 } 8096 8097 switch (env->mmu_model) { 8098 case POWERPC_MMU_32B: 8099 case POWERPC_MMU_SOFT_6xx: 8100 #if defined(TARGET_PPC64) 8101 case POWERPC_MMU_64B: 8102 case POWERPC_MMU_2_03: 8103 case POWERPC_MMU_2_06: 8104 case POWERPC_MMU_2_07: 8105 case POWERPC_MMU_3_00: 8106 #endif 8107 if (env->spr_cb[SPR_SDR1].name) { /* SDR1 Exists */ 8108 qemu_fprintf(f, " SDR1 " TARGET_FMT_lx " ", env->spr[SPR_SDR1]); 8109 } 8110 if (env->spr_cb[SPR_PTCR].name) { /* PTCR Exists */ 8111 qemu_fprintf(f, " PTCR " TARGET_FMT_lx " ", env->spr[SPR_PTCR]); 8112 } 8113 qemu_fprintf(f, " DAR " TARGET_FMT_lx " DSISR " TARGET_FMT_lx "\n", 8114 env->spr[SPR_DAR], env->spr[SPR_DSISR]); 8115 break; 8116 case POWERPC_MMU_BOOKE206: 8117 qemu_fprintf(f, " MAS0 " TARGET_FMT_lx " MAS1 " TARGET_FMT_lx 8118 " MAS2 " TARGET_FMT_lx " MAS3 " TARGET_FMT_lx "\n", 8119 env->spr[SPR_BOOKE_MAS0], env->spr[SPR_BOOKE_MAS1], 8120 env->spr[SPR_BOOKE_MAS2], env->spr[SPR_BOOKE_MAS3]); 8121 8122 qemu_fprintf(f, " MAS4 " TARGET_FMT_lx " MAS6 " TARGET_FMT_lx 8123 " MAS7 " TARGET_FMT_lx " PID " TARGET_FMT_lx "\n", 8124 env->spr[SPR_BOOKE_MAS4], env->spr[SPR_BOOKE_MAS6], 8125 env->spr[SPR_BOOKE_MAS7], env->spr[SPR_BOOKE_PID]); 8126 8127 qemu_fprintf(f, "MMUCFG " TARGET_FMT_lx " TLB0CFG " TARGET_FMT_lx 8128 " TLB1CFG " TARGET_FMT_lx "\n", 8129 env->spr[SPR_MMUCFG], env->spr[SPR_BOOKE_TLB0CFG], 8130 env->spr[SPR_BOOKE_TLB1CFG]); 8131 break; 8132 default: 8133 break; 8134 } 8135 #endif 8136 8137 #undef RGPL 8138 #undef RFPL 8139 } 8140 type_init(ppc_cpu_register_types) 8141