qemu/hw/ppc/ppc.c
<<
>>
Prefs
   1/*
   2 * QEMU generic PowerPC hardware System Emulator
   3 *
   4 * Copyright (c) 2003-2007 Jocelyn Mayer
   5 *
   6 * Permission is hereby granted, free of charge, to any person obtaining a copy
   7 * of this software and associated documentation files (the "Software"), to deal
   8 * in the Software without restriction, including without limitation the rights
   9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 * copies of the Software, and to permit persons to whom the Software is
  11 * furnished to do so, subject to the following conditions:
  12 *
  13 * The above copyright notice and this permission notice shall be included in
  14 * all copies or substantial portions of the Software.
  15 *
  16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 * THE SOFTWARE.
  23 */
  24#include "qemu/osdep.h"
  25#include "qemu-common.h"
  26#include "cpu.h"
  27#include "hw/hw.h"
  28#include "hw/ppc/ppc.h"
  29#include "hw/ppc/ppc_e500.h"
  30#include "qemu/timer.h"
  31#include "sysemu/sysemu.h"
  32#include "sysemu/cpus.h"
  33#include "hw/timer/m48t59.h"
  34#include "qemu/log.h"
  35#include "qemu/error-report.h"
  36#include "hw/loader.h"
  37#include "sysemu/kvm.h"
  38#include "kvm_ppc.h"
  39#include "trace.h"
  40
  41//#define PPC_DEBUG_IRQ
  42//#define PPC_DEBUG_TB
  43
  44#ifdef PPC_DEBUG_IRQ
  45#  define LOG_IRQ(...) qemu_log_mask(CPU_LOG_INT, ## __VA_ARGS__)
  46#else
  47#  define LOG_IRQ(...) do { } while (0)
  48#endif
  49
  50
  51#ifdef PPC_DEBUG_TB
  52#  define LOG_TB(...) qemu_log(__VA_ARGS__)
  53#else
  54#  define LOG_TB(...) do { } while (0)
  55#endif
  56
  57static void cpu_ppc_tb_stop (CPUPPCState *env);
  58static void cpu_ppc_tb_start (CPUPPCState *env);
  59
  60void ppc_set_irq(PowerPCCPU *cpu, int n_IRQ, int level)
  61{
  62    CPUState *cs = CPU(cpu);
  63    CPUPPCState *env = &cpu->env;
  64    unsigned int old_pending = env->pending_interrupts;
  65
  66    if (level) {
  67        env->pending_interrupts |= 1 << n_IRQ;
  68        cpu_interrupt(cs, CPU_INTERRUPT_HARD);
  69    } else {
  70        env->pending_interrupts &= ~(1 << n_IRQ);
  71        if (env->pending_interrupts == 0) {
  72            cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD);
  73        }
  74    }
  75
  76    if (old_pending != env->pending_interrupts) {
  77#ifdef CONFIG_KVM
  78        kvmppc_set_interrupt(cpu, n_IRQ, level);
  79#endif
  80    }
  81
  82    LOG_IRQ("%s: %p n_IRQ %d level %d => pending %08" PRIx32
  83                "req %08x\n", __func__, env, n_IRQ, level,
  84                env->pending_interrupts, CPU(cpu)->interrupt_request);
  85}
  86
  87/* PowerPC 6xx / 7xx internal IRQ controller */
  88static void ppc6xx_set_irq(void *opaque, int pin, int level)
  89{
  90    PowerPCCPU *cpu = opaque;
  91    CPUPPCState *env = &cpu->env;
  92    int cur_level;
  93
  94    LOG_IRQ("%s: env %p pin %d level %d\n", __func__,
  95                env, pin, level);
  96    cur_level = (env->irq_input_state >> pin) & 1;
  97    /* Don't generate spurious events */
  98    if ((cur_level == 1 && level == 0) || (cur_level == 0 && level != 0)) {
  99        CPUState *cs = CPU(cpu);
 100
 101        switch (pin) {
 102        case PPC6xx_INPUT_TBEN:
 103            /* Level sensitive - active high */
 104            LOG_IRQ("%s: %s the time base\n",
 105                        __func__, level ? "start" : "stop");
 106            if (level) {
 107                cpu_ppc_tb_start(env);
 108            } else {
 109                cpu_ppc_tb_stop(env);
 110            }
 111        case PPC6xx_INPUT_INT:
 112            /* Level sensitive - active high */
 113            LOG_IRQ("%s: set the external IRQ state to %d\n",
 114                        __func__, level);
 115            ppc_set_irq(cpu, PPC_INTERRUPT_EXT, level);
 116            break;
 117        case PPC6xx_INPUT_SMI:
 118            /* Level sensitive - active high */
 119            LOG_IRQ("%s: set the SMI IRQ state to %d\n",
 120                        __func__, level);
 121            ppc_set_irq(cpu, PPC_INTERRUPT_SMI, level);
 122            break;
 123        case PPC6xx_INPUT_MCP:
 124            /* Negative edge sensitive */
 125            /* XXX: TODO: actual reaction may depends on HID0 status
 126             *            603/604/740/750: check HID0[EMCP]
 127             */
 128            if (cur_level == 1 && level == 0) {
 129                LOG_IRQ("%s: raise machine check state\n",
 130                            __func__);
 131                ppc_set_irq(cpu, PPC_INTERRUPT_MCK, 1);
 132            }
 133            break;
 134        case PPC6xx_INPUT_CKSTP_IN:
 135            /* Level sensitive - active low */
 136            /* XXX: TODO: relay the signal to CKSTP_OUT pin */
 137            /* XXX: Note that the only way to restart the CPU is to reset it */
 138            if (level) {
 139                LOG_IRQ("%s: stop the CPU\n", __func__);
 140                cs->halted = 1;
 141            }
 142            break;
 143        case PPC6xx_INPUT_HRESET:
 144            /* Level sensitive - active low */
 145            if (level) {
 146                LOG_IRQ("%s: reset the CPU\n", __func__);
 147                cpu_interrupt(cs, CPU_INTERRUPT_RESET);
 148            }
 149            break;
 150        case PPC6xx_INPUT_SRESET:
 151            LOG_IRQ("%s: set the RESET IRQ state to %d\n",
 152                        __func__, level);
 153            ppc_set_irq(cpu, PPC_INTERRUPT_RESET, level);
 154            break;
 155        default:
 156            /* Unknown pin - do nothing */
 157            LOG_IRQ("%s: unknown IRQ pin %d\n", __func__, pin);
 158            return;
 159        }
 160        if (level)
 161            env->irq_input_state |= 1 << pin;
 162        else
 163            env->irq_input_state &= ~(1 << pin);
 164    }
 165}
 166
 167void ppc6xx_irq_init(PowerPCCPU *cpu)
 168{
 169    CPUPPCState *env = &cpu->env;
 170
 171    env->irq_inputs = (void **)qemu_allocate_irqs(&ppc6xx_set_irq, cpu,
 172                                                  PPC6xx_INPUT_NB);
 173}
 174
 175#if defined(TARGET_PPC64)
 176/* PowerPC 970 internal IRQ controller */
 177static void ppc970_set_irq(void *opaque, int pin, int level)
 178{
 179    PowerPCCPU *cpu = opaque;
 180    CPUPPCState *env = &cpu->env;
 181    int cur_level;
 182
 183    LOG_IRQ("%s: env %p pin %d level %d\n", __func__,
 184                env, pin, level);
 185    cur_level = (env->irq_input_state >> pin) & 1;
 186    /* Don't generate spurious events */
 187    if ((cur_level == 1 && level == 0) || (cur_level == 0 && level != 0)) {
 188        CPUState *cs = CPU(cpu);
 189
 190        switch (pin) {
 191        case PPC970_INPUT_INT:
 192            /* Level sensitive - active high */
 193            LOG_IRQ("%s: set the external IRQ state to %d\n",
 194                        __func__, level);
 195            ppc_set_irq(cpu, PPC_INTERRUPT_EXT, level);
 196            break;
 197        case PPC970_INPUT_THINT:
 198            /* Level sensitive - active high */
 199            LOG_IRQ("%s: set the SMI IRQ state to %d\n", __func__,
 200                        level);
 201            ppc_set_irq(cpu, PPC_INTERRUPT_THERM, level);
 202            break;
 203        case PPC970_INPUT_MCP:
 204            /* Negative edge sensitive */
 205            /* XXX: TODO: actual reaction may depends on HID0 status
 206             *            603/604/740/750: check HID0[EMCP]
 207             */
 208            if (cur_level == 1 && level == 0) {
 209                LOG_IRQ("%s: raise machine check state\n",
 210                            __func__);
 211                ppc_set_irq(cpu, PPC_INTERRUPT_MCK, 1);
 212            }
 213            break;
 214        case PPC970_INPUT_CKSTP:
 215            /* Level sensitive - active low */
 216            /* XXX: TODO: relay the signal to CKSTP_OUT pin */
 217            if (level) {
 218                LOG_IRQ("%s: stop the CPU\n", __func__);
 219                cs->halted = 1;
 220            } else {
 221                LOG_IRQ("%s: restart the CPU\n", __func__);
 222                cs->halted = 0;
 223                qemu_cpu_kick(cs);
 224            }
 225            break;
 226        case PPC970_INPUT_HRESET:
 227            /* Level sensitive - active low */
 228            if (level) {
 229                cpu_interrupt(cs, CPU_INTERRUPT_RESET);
 230            }
 231            break;
 232        case PPC970_INPUT_SRESET:
 233            LOG_IRQ("%s: set the RESET IRQ state to %d\n",
 234                        __func__, level);
 235            ppc_set_irq(cpu, PPC_INTERRUPT_RESET, level);
 236            break;
 237        case PPC970_INPUT_TBEN:
 238            LOG_IRQ("%s: set the TBEN state to %d\n", __func__,
 239                        level);
 240            /* XXX: TODO */
 241            break;
 242        default:
 243            /* Unknown pin - do nothing */
 244            LOG_IRQ("%s: unknown IRQ pin %d\n", __func__, pin);
 245            return;
 246        }
 247        if (level)
 248            env->irq_input_state |= 1 << pin;
 249        else
 250            env->irq_input_state &= ~(1 << pin);
 251    }
 252}
 253
 254void ppc970_irq_init(PowerPCCPU *cpu)
 255{
 256    CPUPPCState *env = &cpu->env;
 257
 258    env->irq_inputs = (void **)qemu_allocate_irqs(&ppc970_set_irq, cpu,
 259                                                  PPC970_INPUT_NB);
 260}
 261
 262/* POWER7 internal IRQ controller */
 263static void power7_set_irq(void *opaque, int pin, int level)
 264{
 265    PowerPCCPU *cpu = opaque;
 266    CPUPPCState *env = &cpu->env;
 267
 268    LOG_IRQ("%s: env %p pin %d level %d\n", __func__,
 269                env, pin, level);
 270
 271    switch (pin) {
 272    case POWER7_INPUT_INT:
 273        /* Level sensitive - active high */
 274        LOG_IRQ("%s: set the external IRQ state to %d\n",
 275                __func__, level);
 276        ppc_set_irq(cpu, PPC_INTERRUPT_EXT, level);
 277        break;
 278    default:
 279        /* Unknown pin - do nothing */
 280        LOG_IRQ("%s: unknown IRQ pin %d\n", __func__, pin);
 281        return;
 282    }
 283    if (level) {
 284        env->irq_input_state |= 1 << pin;
 285    } else {
 286        env->irq_input_state &= ~(1 << pin);
 287    }
 288}
 289
 290void ppcPOWER7_irq_init(PowerPCCPU *cpu)
 291{
 292    CPUPPCState *env = &cpu->env;
 293
 294    env->irq_inputs = (void **)qemu_allocate_irqs(&power7_set_irq, cpu,
 295                                                  POWER7_INPUT_NB);
 296}
 297#endif /* defined(TARGET_PPC64) */
 298
 299/* PowerPC 40x internal IRQ controller */
 300static void ppc40x_set_irq(void *opaque, int pin, int level)
 301{
 302    PowerPCCPU *cpu = opaque;
 303    CPUPPCState *env = &cpu->env;
 304    int cur_level;
 305
 306    LOG_IRQ("%s: env %p pin %d level %d\n", __func__,
 307                env, pin, level);
 308    cur_level = (env->irq_input_state >> pin) & 1;
 309    /* Don't generate spurious events */
 310    if ((cur_level == 1 && level == 0) || (cur_level == 0 && level != 0)) {
 311        CPUState *cs = CPU(cpu);
 312
 313        switch (pin) {
 314        case PPC40x_INPUT_RESET_SYS:
 315            if (level) {
 316                LOG_IRQ("%s: reset the PowerPC system\n",
 317                            __func__);
 318                ppc40x_system_reset(cpu);
 319            }
 320            break;
 321        case PPC40x_INPUT_RESET_CHIP:
 322            if (level) {
 323                LOG_IRQ("%s: reset the PowerPC chip\n", __func__);
 324                ppc40x_chip_reset(cpu);
 325            }
 326            break;
 327        case PPC40x_INPUT_RESET_CORE:
 328            /* XXX: TODO: update DBSR[MRR] */
 329            if (level) {
 330                LOG_IRQ("%s: reset the PowerPC core\n", __func__);
 331                ppc40x_core_reset(cpu);
 332            }
 333            break;
 334        case PPC40x_INPUT_CINT:
 335            /* Level sensitive - active high */
 336            LOG_IRQ("%s: set the critical IRQ state to %d\n",
 337                        __func__, level);
 338            ppc_set_irq(cpu, PPC_INTERRUPT_CEXT, level);
 339            break;
 340        case PPC40x_INPUT_INT:
 341            /* Level sensitive - active high */
 342            LOG_IRQ("%s: set the external IRQ state to %d\n",
 343                        __func__, level);
 344            ppc_set_irq(cpu, PPC_INTERRUPT_EXT, level);
 345            break;
 346        case PPC40x_INPUT_HALT:
 347            /* Level sensitive - active low */
 348            if (level) {
 349                LOG_IRQ("%s: stop the CPU\n", __func__);
 350                cs->halted = 1;
 351            } else {
 352                LOG_IRQ("%s: restart the CPU\n", __func__);
 353                cs->halted = 0;
 354                qemu_cpu_kick(cs);
 355            }
 356            break;
 357        case PPC40x_INPUT_DEBUG:
 358            /* Level sensitive - active high */
 359            LOG_IRQ("%s: set the debug pin state to %d\n",
 360                        __func__, level);
 361            ppc_set_irq(cpu, PPC_INTERRUPT_DEBUG, level);
 362            break;
 363        default:
 364            /* Unknown pin - do nothing */
 365            LOG_IRQ("%s: unknown IRQ pin %d\n", __func__, pin);
 366            return;
 367        }
 368        if (level)
 369            env->irq_input_state |= 1 << pin;
 370        else
 371            env->irq_input_state &= ~(1 << pin);
 372    }
 373}
 374
 375void ppc40x_irq_init(PowerPCCPU *cpu)
 376{
 377    CPUPPCState *env = &cpu->env;
 378
 379    env->irq_inputs = (void **)qemu_allocate_irqs(&ppc40x_set_irq,
 380                                                  cpu, PPC40x_INPUT_NB);
 381}
 382
 383/* PowerPC E500 internal IRQ controller */
 384static void ppce500_set_irq(void *opaque, int pin, int level)
 385{
 386    PowerPCCPU *cpu = opaque;
 387    CPUPPCState *env = &cpu->env;
 388    int cur_level;
 389
 390    LOG_IRQ("%s: env %p pin %d level %d\n", __func__,
 391                env, pin, level);
 392    cur_level = (env->irq_input_state >> pin) & 1;
 393    /* Don't generate spurious events */
 394    if ((cur_level == 1 && level == 0) || (cur_level == 0 && level != 0)) {
 395        switch (pin) {
 396        case PPCE500_INPUT_MCK:
 397            if (level) {
 398                LOG_IRQ("%s: reset the PowerPC system\n",
 399                            __func__);
 400                qemu_system_reset_request();
 401            }
 402            break;
 403        case PPCE500_INPUT_RESET_CORE:
 404            if (level) {
 405                LOG_IRQ("%s: reset the PowerPC core\n", __func__);
 406                ppc_set_irq(cpu, PPC_INTERRUPT_MCK, level);
 407            }
 408            break;
 409        case PPCE500_INPUT_CINT:
 410            /* Level sensitive - active high */
 411            LOG_IRQ("%s: set the critical IRQ state to %d\n",
 412                        __func__, level);
 413            ppc_set_irq(cpu, PPC_INTERRUPT_CEXT, level);
 414            break;
 415        case PPCE500_INPUT_INT:
 416            /* Level sensitive - active high */
 417            LOG_IRQ("%s: set the core IRQ state to %d\n",
 418                        __func__, level);
 419            ppc_set_irq(cpu, PPC_INTERRUPT_EXT, level);
 420            break;
 421        case PPCE500_INPUT_DEBUG:
 422            /* Level sensitive - active high */
 423            LOG_IRQ("%s: set the debug pin state to %d\n",
 424                        __func__, level);
 425            ppc_set_irq(cpu, PPC_INTERRUPT_DEBUG, level);
 426            break;
 427        default:
 428            /* Unknown pin - do nothing */
 429            LOG_IRQ("%s: unknown IRQ pin %d\n", __func__, pin);
 430            return;
 431        }
 432        if (level)
 433            env->irq_input_state |= 1 << pin;
 434        else
 435            env->irq_input_state &= ~(1 << pin);
 436    }
 437}
 438
 439void ppce500_irq_init(PowerPCCPU *cpu)
 440{
 441    CPUPPCState *env = &cpu->env;
 442
 443    env->irq_inputs = (void **)qemu_allocate_irqs(&ppce500_set_irq,
 444                                                  cpu, PPCE500_INPUT_NB);
 445}
 446
 447/* Enable or Disable the E500 EPR capability */
 448void ppce500_set_mpic_proxy(bool enabled)
 449{
 450    CPUState *cs;
 451
 452    CPU_FOREACH(cs) {
 453        PowerPCCPU *cpu = POWERPC_CPU(cs);
 454
 455        cpu->env.mpic_proxy = enabled;
 456        if (kvm_enabled()) {
 457            kvmppc_set_mpic_proxy(cpu, enabled);
 458        }
 459    }
 460}
 461
 462/*****************************************************************************/
 463/* PowerPC time base and decrementer emulation */
 464
 465uint64_t cpu_ppc_get_tb(ppc_tb_t *tb_env, uint64_t vmclk, int64_t tb_offset)
 466{
 467    /* TB time in tb periods */
 468    return muldiv64(vmclk, tb_env->tb_freq, NANOSECONDS_PER_SECOND) + tb_offset;
 469}
 470
 471uint64_t cpu_ppc_load_tbl (CPUPPCState *env)
 472{
 473    ppc_tb_t *tb_env = env->tb_env;
 474    uint64_t tb;
 475
 476    if (kvm_enabled()) {
 477        return env->spr[SPR_TBL];
 478    }
 479
 480    tb = cpu_ppc_get_tb(tb_env, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL), tb_env->tb_offset);
 481    LOG_TB("%s: tb %016" PRIx64 "\n", __func__, tb);
 482
 483    return tb;
 484}
 485
 486static inline uint32_t _cpu_ppc_load_tbu(CPUPPCState *env)
 487{
 488    ppc_tb_t *tb_env = env->tb_env;
 489    uint64_t tb;
 490
 491    tb = cpu_ppc_get_tb(tb_env, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL), tb_env->tb_offset);
 492    LOG_TB("%s: tb %016" PRIx64 "\n", __func__, tb);
 493
 494    return tb >> 32;
 495}
 496
 497uint32_t cpu_ppc_load_tbu (CPUPPCState *env)
 498{
 499    if (kvm_enabled()) {
 500        return env->spr[SPR_TBU];
 501    }
 502
 503    return _cpu_ppc_load_tbu(env);
 504}
 505
 506static inline void cpu_ppc_store_tb(ppc_tb_t *tb_env, uint64_t vmclk,
 507                                    int64_t *tb_offsetp, uint64_t value)
 508{
 509    *tb_offsetp = value -
 510        muldiv64(vmclk, tb_env->tb_freq, NANOSECONDS_PER_SECOND);
 511
 512    LOG_TB("%s: tb %016" PRIx64 " offset %08" PRIx64 "\n",
 513                __func__, value, *tb_offsetp);
 514}
 515
 516void cpu_ppc_store_tbl (CPUPPCState *env, uint32_t value)
 517{
 518    ppc_tb_t *tb_env = env->tb_env;
 519    uint64_t tb;
 520
 521    tb = cpu_ppc_get_tb(tb_env, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL), tb_env->tb_offset);
 522    tb &= 0xFFFFFFFF00000000ULL;
 523    cpu_ppc_store_tb(tb_env, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL),
 524                     &tb_env->tb_offset, tb | (uint64_t)value);
 525}
 526
 527static inline void _cpu_ppc_store_tbu(CPUPPCState *env, uint32_t value)
 528{
 529    ppc_tb_t *tb_env = env->tb_env;
 530    uint64_t tb;
 531
 532    tb = cpu_ppc_get_tb(tb_env, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL), tb_env->tb_offset);
 533    tb &= 0x00000000FFFFFFFFULL;
 534    cpu_ppc_store_tb(tb_env, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL),
 535                     &tb_env->tb_offset, ((uint64_t)value << 32) | tb);
 536}
 537
 538void cpu_ppc_store_tbu (CPUPPCState *env, uint32_t value)
 539{
 540    _cpu_ppc_store_tbu(env, value);
 541}
 542
 543uint64_t cpu_ppc_load_atbl (CPUPPCState *env)
 544{
 545    ppc_tb_t *tb_env = env->tb_env;
 546    uint64_t tb;
 547
 548    tb = cpu_ppc_get_tb(tb_env, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL), tb_env->atb_offset);
 549    LOG_TB("%s: tb %016" PRIx64 "\n", __func__, tb);
 550
 551    return tb;
 552}
 553
 554uint32_t cpu_ppc_load_atbu (CPUPPCState *env)
 555{
 556    ppc_tb_t *tb_env = env->tb_env;
 557    uint64_t tb;
 558
 559    tb = cpu_ppc_get_tb(tb_env, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL), tb_env->atb_offset);
 560    LOG_TB("%s: tb %016" PRIx64 "\n", __func__, tb);
 561
 562    return tb >> 32;
 563}
 564
 565void cpu_ppc_store_atbl (CPUPPCState *env, uint32_t value)
 566{
 567    ppc_tb_t *tb_env = env->tb_env;
 568    uint64_t tb;
 569
 570    tb = cpu_ppc_get_tb(tb_env, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL), tb_env->atb_offset);
 571    tb &= 0xFFFFFFFF00000000ULL;
 572    cpu_ppc_store_tb(tb_env, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL),
 573                     &tb_env->atb_offset, tb | (uint64_t)value);
 574}
 575
 576void cpu_ppc_store_atbu (CPUPPCState *env, uint32_t value)
 577{
 578    ppc_tb_t *tb_env = env->tb_env;
 579    uint64_t tb;
 580
 581    tb = cpu_ppc_get_tb(tb_env, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL), tb_env->atb_offset);
 582    tb &= 0x00000000FFFFFFFFULL;
 583    cpu_ppc_store_tb(tb_env, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL),
 584                     &tb_env->atb_offset, ((uint64_t)value << 32) | tb);
 585}
 586
 587static void cpu_ppc_tb_stop (CPUPPCState *env)
 588{
 589    ppc_tb_t *tb_env = env->tb_env;
 590    uint64_t tb, atb, vmclk;
 591
 592    /* If the time base is already frozen, do nothing */
 593    if (tb_env->tb_freq != 0) {
 594        vmclk = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
 595        /* Get the time base */
 596        tb = cpu_ppc_get_tb(tb_env, vmclk, tb_env->tb_offset);
 597        /* Get the alternate time base */
 598        atb = cpu_ppc_get_tb(tb_env, vmclk, tb_env->atb_offset);
 599        /* Store the time base value (ie compute the current offset) */
 600        cpu_ppc_store_tb(tb_env, vmclk, &tb_env->tb_offset, tb);
 601        /* Store the alternate time base value (compute the current offset) */
 602        cpu_ppc_store_tb(tb_env, vmclk, &tb_env->atb_offset, atb);
 603        /* Set the time base frequency to zero */
 604        tb_env->tb_freq = 0;
 605        /* Now, the time bases are frozen to tb_offset / atb_offset value */
 606    }
 607}
 608
 609static void cpu_ppc_tb_start (CPUPPCState *env)
 610{
 611    ppc_tb_t *tb_env = env->tb_env;
 612    uint64_t tb, atb, vmclk;
 613
 614    /* If the time base is not frozen, do nothing */
 615    if (tb_env->tb_freq == 0) {
 616        vmclk = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
 617        /* Get the time base from tb_offset */
 618        tb = tb_env->tb_offset;
 619        /* Get the alternate time base from atb_offset */
 620        atb = tb_env->atb_offset;
 621        /* Restore the tb frequency from the decrementer frequency */
 622        tb_env->tb_freq = tb_env->decr_freq;
 623        /* Store the time base value */
 624        cpu_ppc_store_tb(tb_env, vmclk, &tb_env->tb_offset, tb);
 625        /* Store the alternate time base value */
 626        cpu_ppc_store_tb(tb_env, vmclk, &tb_env->atb_offset, atb);
 627    }
 628}
 629
 630bool ppc_decr_clear_on_delivery(CPUPPCState *env)
 631{
 632    ppc_tb_t *tb_env = env->tb_env;
 633    int flags = PPC_DECR_UNDERFLOW_TRIGGERED | PPC_DECR_UNDERFLOW_LEVEL;
 634    return ((tb_env->flags & flags) == PPC_DECR_UNDERFLOW_TRIGGERED);
 635}
 636
 637static inline uint32_t _cpu_ppc_load_decr(CPUPPCState *env, uint64_t next)
 638{
 639    ppc_tb_t *tb_env = env->tb_env;
 640    uint32_t decr;
 641    int64_t diff;
 642
 643    diff = next - qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
 644    if (diff >= 0) {
 645        decr = muldiv64(diff, tb_env->decr_freq, NANOSECONDS_PER_SECOND);
 646    } else if (tb_env->flags & PPC_TIMER_BOOKE) {
 647        decr = 0;
 648    }  else {
 649        decr = -muldiv64(-diff, tb_env->decr_freq, NANOSECONDS_PER_SECOND);
 650    }
 651    LOG_TB("%s: %08" PRIx32 "\n", __func__, decr);
 652
 653    return decr;
 654}
 655
 656uint32_t cpu_ppc_load_decr (CPUPPCState *env)
 657{
 658    ppc_tb_t *tb_env = env->tb_env;
 659
 660    if (kvm_enabled()) {
 661        return env->spr[SPR_DECR];
 662    }
 663
 664    return _cpu_ppc_load_decr(env, tb_env->decr_next);
 665}
 666
 667uint32_t cpu_ppc_load_hdecr (CPUPPCState *env)
 668{
 669    ppc_tb_t *tb_env = env->tb_env;
 670
 671    return _cpu_ppc_load_decr(env, tb_env->hdecr_next);
 672}
 673
 674uint64_t cpu_ppc_load_purr (CPUPPCState *env)
 675{
 676    ppc_tb_t *tb_env = env->tb_env;
 677    uint64_t diff;
 678
 679    diff = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) - tb_env->purr_start;
 680
 681    return tb_env->purr_load +
 682        muldiv64(diff, tb_env->tb_freq, NANOSECONDS_PER_SECOND);
 683}
 684
 685/* When decrementer expires,
 686 * all we need to do is generate or queue a CPU exception
 687 */
 688static inline void cpu_ppc_decr_excp(PowerPCCPU *cpu)
 689{
 690    /* Raise it */
 691    LOG_TB("raise decrementer exception\n");
 692    ppc_set_irq(cpu, PPC_INTERRUPT_DECR, 1);
 693}
 694
 695static inline void cpu_ppc_decr_lower(PowerPCCPU *cpu)
 696{
 697    ppc_set_irq(cpu, PPC_INTERRUPT_DECR, 0);
 698}
 699
 700static inline void cpu_ppc_hdecr_excp(PowerPCCPU *cpu)
 701{
 702    /* Raise it */
 703    LOG_TB("raise decrementer exception\n");
 704    ppc_set_irq(cpu, PPC_INTERRUPT_HDECR, 1);
 705}
 706
 707static inline void cpu_ppc_hdecr_lower(PowerPCCPU *cpu)
 708{
 709    ppc_set_irq(cpu, PPC_INTERRUPT_HDECR, 0);
 710}
 711
 712static void __cpu_ppc_store_decr(PowerPCCPU *cpu, uint64_t *nextp,
 713                                 QEMUTimer *timer,
 714                                 void (*raise_excp)(void *),
 715                                 void (*lower_excp)(PowerPCCPU *),
 716                                 uint32_t decr, uint32_t value)
 717{
 718    CPUPPCState *env = &cpu->env;
 719    ppc_tb_t *tb_env = env->tb_env;
 720    uint64_t now, next;
 721
 722    LOG_TB("%s: %08" PRIx32 " => %08" PRIx32 "\n", __func__,
 723                decr, value);
 724
 725    if (kvm_enabled()) {
 726        /* KVM handles decrementer exceptions, we don't need our own timer */
 727        return;
 728    }
 729
 730    /*
 731     * Going from 2 -> 1, 1 -> 0 or 0 -> -1 is the event to generate a DEC
 732     * interrupt.
 733     *
 734     * If we get a really small DEC value, we can assume that by the time we
 735     * handled it we should inject an interrupt already.
 736     *
 737     * On MSB level based DEC implementations the MSB always means the interrupt
 738     * is pending, so raise it on those.
 739     *
 740     * On MSB edge based DEC implementations the MSB going from 0 -> 1 triggers
 741     * an edge interrupt, so raise it here too.
 742     */
 743    if ((value < 3) ||
 744        ((tb_env->flags & PPC_DECR_UNDERFLOW_LEVEL) && (value & 0x80000000)) ||
 745        ((tb_env->flags & PPC_DECR_UNDERFLOW_TRIGGERED) && (value & 0x80000000)
 746          && !(decr & 0x80000000))) {
 747        (*raise_excp)(cpu);
 748        return;
 749    }
 750
 751    /* On MSB level based systems a 0 for the MSB stops interrupt delivery */
 752    if (!(value & 0x80000000) && (tb_env->flags & PPC_DECR_UNDERFLOW_LEVEL)) {
 753        (*lower_excp)(cpu);
 754    }
 755
 756    /* Calculate the next timer event */
 757    now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
 758    next = now + muldiv64(value, NANOSECONDS_PER_SECOND, tb_env->decr_freq);
 759    *nextp = next;
 760
 761    /* Adjust timer */
 762    timer_mod(timer, next);
 763}
 764
 765static inline void _cpu_ppc_store_decr(PowerPCCPU *cpu, uint32_t decr,
 766                                       uint32_t value)
 767{
 768    ppc_tb_t *tb_env = cpu->env.tb_env;
 769
 770    __cpu_ppc_store_decr(cpu, &tb_env->decr_next, tb_env->decr_timer,
 771                         tb_env->decr_timer->cb, &cpu_ppc_decr_lower, decr,
 772                         value);
 773}
 774
 775void cpu_ppc_store_decr (CPUPPCState *env, uint32_t value)
 776{
 777    PowerPCCPU *cpu = ppc_env_get_cpu(env);
 778
 779    _cpu_ppc_store_decr(cpu, cpu_ppc_load_decr(env), value);
 780}
 781
 782static void cpu_ppc_decr_cb(void *opaque)
 783{
 784    PowerPCCPU *cpu = opaque;
 785
 786    cpu_ppc_decr_excp(cpu);
 787}
 788
 789static inline void _cpu_ppc_store_hdecr(PowerPCCPU *cpu, uint32_t hdecr,
 790                                        uint32_t value)
 791{
 792    ppc_tb_t *tb_env = cpu->env.tb_env;
 793
 794    if (tb_env->hdecr_timer != NULL) {
 795        __cpu_ppc_store_decr(cpu, &tb_env->hdecr_next, tb_env->hdecr_timer,
 796                             tb_env->hdecr_timer->cb, &cpu_ppc_hdecr_lower,
 797                             hdecr, value);
 798    }
 799}
 800
 801void cpu_ppc_store_hdecr (CPUPPCState *env, uint32_t value)
 802{
 803    PowerPCCPU *cpu = ppc_env_get_cpu(env);
 804
 805    _cpu_ppc_store_hdecr(cpu, cpu_ppc_load_hdecr(env), value);
 806}
 807
 808static void cpu_ppc_hdecr_cb(void *opaque)
 809{
 810    PowerPCCPU *cpu = opaque;
 811
 812    cpu_ppc_hdecr_excp(cpu);
 813}
 814
 815static void cpu_ppc_store_purr(PowerPCCPU *cpu, uint64_t value)
 816{
 817    ppc_tb_t *tb_env = cpu->env.tb_env;
 818
 819    tb_env->purr_load = value;
 820    tb_env->purr_start = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
 821}
 822
 823static void cpu_ppc_set_tb_clk (void *opaque, uint32_t freq)
 824{
 825    CPUPPCState *env = opaque;
 826    PowerPCCPU *cpu = ppc_env_get_cpu(env);
 827    ppc_tb_t *tb_env = env->tb_env;
 828
 829    tb_env->tb_freq = freq;
 830    tb_env->decr_freq = freq;
 831    /* There is a bug in Linux 2.4 kernels:
 832     * if a decrementer exception is pending when it enables msr_ee at startup,
 833     * it's not ready to handle it...
 834     */
 835    _cpu_ppc_store_decr(cpu, 0xFFFFFFFF, 0xFFFFFFFF);
 836    _cpu_ppc_store_hdecr(cpu, 0xFFFFFFFF, 0xFFFFFFFF);
 837    cpu_ppc_store_purr(cpu, 0x0000000000000000ULL);
 838}
 839
 840static void timebase_pre_save(void *opaque)
 841{
 842    PPCTimebase *tb = opaque;
 843    uint64_t ticks = cpu_get_host_ticks();
 844    PowerPCCPU *first_ppc_cpu = POWERPC_CPU(first_cpu);
 845
 846    if (!first_ppc_cpu->env.tb_env) {
 847        error_report("No timebase object");
 848        return;
 849    }
 850
 851    tb->time_of_the_day_ns = qemu_clock_get_ns(QEMU_CLOCK_HOST);
 852    /*
 853     * tb_offset is only expected to be changed by migration so
 854     * there is no need to update it from KVM here
 855     */
 856    tb->guest_timebase = ticks + first_ppc_cpu->env.tb_env->tb_offset;
 857}
 858
 859static int timebase_post_load(void *opaque, int version_id)
 860{
 861    PPCTimebase *tb_remote = opaque;
 862    CPUState *cpu;
 863    PowerPCCPU *first_ppc_cpu = POWERPC_CPU(first_cpu);
 864    int64_t tb_off_adj, tb_off, ns_diff;
 865    int64_t migration_duration_ns, migration_duration_tb, guest_tb, host_ns;
 866    unsigned long freq;
 867
 868    if (!first_ppc_cpu->env.tb_env) {
 869        error_report("No timebase object");
 870        return -1;
 871    }
 872
 873    freq = first_ppc_cpu->env.tb_env->tb_freq;
 874    /*
 875     * Calculate timebase on the destination side of migration.
 876     * The destination timebase must be not less than the source timebase.
 877     * We try to adjust timebase by downtime if host clocks are not
 878     * too much out of sync (1 second for now).
 879     */
 880    host_ns = qemu_clock_get_ns(QEMU_CLOCK_HOST);
 881    ns_diff = MAX(0, host_ns - tb_remote->time_of_the_day_ns);
 882    migration_duration_ns = MIN(NANOSECONDS_PER_SECOND, ns_diff);
 883    migration_duration_tb = muldiv64(migration_duration_ns, freq,
 884                                     NANOSECONDS_PER_SECOND);
 885    guest_tb = tb_remote->guest_timebase + MIN(0, migration_duration_tb);
 886
 887    tb_off_adj = guest_tb - cpu_get_host_ticks();
 888
 889    tb_off = first_ppc_cpu->env.tb_env->tb_offset;
 890    trace_ppc_tb_adjust(tb_off, tb_off_adj, tb_off_adj - tb_off,
 891                        (tb_off_adj - tb_off) / freq);
 892
 893    /* Set new offset to all CPUs */
 894    CPU_FOREACH(cpu) {
 895        PowerPCCPU *pcpu = POWERPC_CPU(cpu);
 896        pcpu->env.tb_env->tb_offset = tb_off_adj;
 897    }
 898
 899    return 0;
 900}
 901
 902const VMStateDescription vmstate_ppc_timebase = {
 903    .name = "timebase",
 904    .version_id = 1,
 905    .minimum_version_id = 1,
 906    .minimum_version_id_old = 1,
 907    .pre_save = timebase_pre_save,
 908    .post_load = timebase_post_load,
 909    .fields      = (VMStateField []) {
 910        VMSTATE_UINT64(guest_timebase, PPCTimebase),
 911        VMSTATE_INT64(time_of_the_day_ns, PPCTimebase),
 912        VMSTATE_END_OF_LIST()
 913    },
 914};
 915
 916/* Set up (once) timebase frequency (in Hz) */
 917clk_setup_cb cpu_ppc_tb_init (CPUPPCState *env, uint32_t freq)
 918{
 919    PowerPCCPU *cpu = ppc_env_get_cpu(env);
 920    ppc_tb_t *tb_env;
 921
 922    tb_env = g_malloc0(sizeof(ppc_tb_t));
 923    env->tb_env = tb_env;
 924    tb_env->flags = PPC_DECR_UNDERFLOW_TRIGGERED;
 925    if (env->insns_flags & PPC_SEGMENT_64B) {
 926        /* All Book3S 64bit CPUs implement level based DEC logic */
 927        tb_env->flags |= PPC_DECR_UNDERFLOW_LEVEL;
 928    }
 929    /* Create new timer */
 930    tb_env->decr_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, &cpu_ppc_decr_cb, cpu);
 931    if (0) {
 932        /* XXX: find a suitable condition to enable the hypervisor decrementer
 933         */
 934        tb_env->hdecr_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, &cpu_ppc_hdecr_cb,
 935                                                cpu);
 936    } else {
 937        tb_env->hdecr_timer = NULL;
 938    }
 939    cpu_ppc_set_tb_clk(env, freq);
 940
 941    return &cpu_ppc_set_tb_clk;
 942}
 943
 944/* Specific helpers for POWER & PowerPC 601 RTC */
 945#if 0
 946static clk_setup_cb cpu_ppc601_rtc_init (CPUPPCState *env)
 947{
 948    return cpu_ppc_tb_init(env, 7812500);
 949}
 950#endif
 951
 952void cpu_ppc601_store_rtcu (CPUPPCState *env, uint32_t value)
 953{
 954    _cpu_ppc_store_tbu(env, value);
 955}
 956
 957uint32_t cpu_ppc601_load_rtcu (CPUPPCState *env)
 958{
 959    return _cpu_ppc_load_tbu(env);
 960}
 961
 962void cpu_ppc601_store_rtcl (CPUPPCState *env, uint32_t value)
 963{
 964    cpu_ppc_store_tbl(env, value & 0x3FFFFF80);
 965}
 966
 967uint32_t cpu_ppc601_load_rtcl (CPUPPCState *env)
 968{
 969    return cpu_ppc_load_tbl(env) & 0x3FFFFF80;
 970}
 971
 972/*****************************************************************************/
 973/* PowerPC 40x timers */
 974
 975/* PIT, FIT & WDT */
 976typedef struct ppc40x_timer_t ppc40x_timer_t;
 977struct ppc40x_timer_t {
 978    uint64_t pit_reload;  /* PIT auto-reload value        */
 979    uint64_t fit_next;    /* Tick for next FIT interrupt  */
 980    QEMUTimer *fit_timer;
 981    uint64_t wdt_next;    /* Tick for next WDT interrupt  */
 982    QEMUTimer *wdt_timer;
 983
 984    /* 405 have the PIT, 440 have a DECR.  */
 985    unsigned int decr_excp;
 986};
 987
 988/* Fixed interval timer */
 989static void cpu_4xx_fit_cb (void *opaque)
 990{
 991    PowerPCCPU *cpu;
 992    CPUPPCState *env;
 993    ppc_tb_t *tb_env;
 994    ppc40x_timer_t *ppc40x_timer;
 995    uint64_t now, next;
 996
 997    env = opaque;
 998    cpu = ppc_env_get_cpu(env);
 999    tb_env = env->tb_env;
1000    ppc40x_timer = tb_env->opaque;
1001    now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
1002    switch ((env->spr[SPR_40x_TCR] >> 24) & 0x3) {
1003    case 0:
1004        next = 1 << 9;
1005        break;
1006    case 1:
1007        next = 1 << 13;
1008        break;
1009    case 2:
1010        next = 1 << 17;
1011        break;
1012    case 3:
1013        next = 1 << 21;
1014        break;
1015    default:
1016        /* Cannot occur, but makes gcc happy */
1017        return;
1018    }
1019    next = now + muldiv64(next, NANOSECONDS_PER_SECOND, tb_env->tb_freq);
1020    if (next == now)
1021        next++;
1022    timer_mod(ppc40x_timer->fit_timer, next);
1023    env->spr[SPR_40x_TSR] |= 1 << 26;
1024    if ((env->spr[SPR_40x_TCR] >> 23) & 0x1) {
1025        ppc_set_irq(cpu, PPC_INTERRUPT_FIT, 1);
1026    }
1027    LOG_TB("%s: ir %d TCR " TARGET_FMT_lx " TSR " TARGET_FMT_lx "\n", __func__,
1028           (int)((env->spr[SPR_40x_TCR] >> 23) & 0x1),
1029           env->spr[SPR_40x_TCR], env->spr[SPR_40x_TSR]);
1030}
1031
1032/* Programmable interval timer */
1033static void start_stop_pit (CPUPPCState *env, ppc_tb_t *tb_env, int is_excp)
1034{
1035    ppc40x_timer_t *ppc40x_timer;
1036    uint64_t now, next;
1037
1038    ppc40x_timer = tb_env->opaque;
1039    if (ppc40x_timer->pit_reload <= 1 ||
1040        !((env->spr[SPR_40x_TCR] >> 26) & 0x1) ||
1041        (is_excp && !((env->spr[SPR_40x_TCR] >> 22) & 0x1))) {
1042        /* Stop PIT */
1043        LOG_TB("%s: stop PIT\n", __func__);
1044        timer_del(tb_env->decr_timer);
1045    } else {
1046        LOG_TB("%s: start PIT %016" PRIx64 "\n",
1047                    __func__, ppc40x_timer->pit_reload);
1048        now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
1049        next = now + muldiv64(ppc40x_timer->pit_reload,
1050                              NANOSECONDS_PER_SECOND, tb_env->decr_freq);
1051        if (is_excp)
1052            next += tb_env->decr_next - now;
1053        if (next == now)
1054            next++;
1055        timer_mod(tb_env->decr_timer, next);
1056        tb_env->decr_next = next;
1057    }
1058}
1059
1060static void cpu_4xx_pit_cb (void *opaque)
1061{
1062    PowerPCCPU *cpu;
1063    CPUPPCState *env;
1064    ppc_tb_t *tb_env;
1065    ppc40x_timer_t *ppc40x_timer;
1066
1067    env = opaque;
1068    cpu = ppc_env_get_cpu(env);
1069    tb_env = env->tb_env;
1070    ppc40x_timer = tb_env->opaque;
1071    env->spr[SPR_40x_TSR] |= 1 << 27;
1072    if ((env->spr[SPR_40x_TCR] >> 26) & 0x1) {
1073        ppc_set_irq(cpu, ppc40x_timer->decr_excp, 1);
1074    }
1075    start_stop_pit(env, tb_env, 1);
1076    LOG_TB("%s: ar %d ir %d TCR " TARGET_FMT_lx " TSR " TARGET_FMT_lx " "
1077           "%016" PRIx64 "\n", __func__,
1078           (int)((env->spr[SPR_40x_TCR] >> 22) & 0x1),
1079           (int)((env->spr[SPR_40x_TCR] >> 26) & 0x1),
1080           env->spr[SPR_40x_TCR], env->spr[SPR_40x_TSR],
1081           ppc40x_timer->pit_reload);
1082}
1083
1084/* Watchdog timer */
1085static void cpu_4xx_wdt_cb (void *opaque)
1086{
1087    PowerPCCPU *cpu;
1088    CPUPPCState *env;
1089    ppc_tb_t *tb_env;
1090    ppc40x_timer_t *ppc40x_timer;
1091    uint64_t now, next;
1092
1093    env = opaque;
1094    cpu = ppc_env_get_cpu(env);
1095    tb_env = env->tb_env;
1096    ppc40x_timer = tb_env->opaque;
1097    now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
1098    switch ((env->spr[SPR_40x_TCR] >> 30) & 0x3) {
1099    case 0:
1100        next = 1 << 17;
1101        break;
1102    case 1:
1103        next = 1 << 21;
1104        break;
1105    case 2:
1106        next = 1 << 25;
1107        break;
1108    case 3:
1109        next = 1 << 29;
1110        break;
1111    default:
1112        /* Cannot occur, but makes gcc happy */
1113        return;
1114    }
1115    next = now + muldiv64(next, NANOSECONDS_PER_SECOND, tb_env->decr_freq);
1116    if (next == now)
1117        next++;
1118    LOG_TB("%s: TCR " TARGET_FMT_lx " TSR " TARGET_FMT_lx "\n", __func__,
1119           env->spr[SPR_40x_TCR], env->spr[SPR_40x_TSR]);
1120    switch ((env->spr[SPR_40x_TSR] >> 30) & 0x3) {
1121    case 0x0:
1122    case 0x1:
1123        timer_mod(ppc40x_timer->wdt_timer, next);
1124        ppc40x_timer->wdt_next = next;
1125        env->spr[SPR_40x_TSR] |= 1U << 31;
1126        break;
1127    case 0x2:
1128        timer_mod(ppc40x_timer->wdt_timer, next);
1129        ppc40x_timer->wdt_next = next;
1130        env->spr[SPR_40x_TSR] |= 1 << 30;
1131        if ((env->spr[SPR_40x_TCR] >> 27) & 0x1) {
1132            ppc_set_irq(cpu, PPC_INTERRUPT_WDT, 1);
1133        }
1134        break;
1135    case 0x3:
1136        env->spr[SPR_40x_TSR] &= ~0x30000000;
1137        env->spr[SPR_40x_TSR] |= env->spr[SPR_40x_TCR] & 0x30000000;
1138        switch ((env->spr[SPR_40x_TCR] >> 28) & 0x3) {
1139        case 0x0:
1140            /* No reset */
1141            break;
1142        case 0x1: /* Core reset */
1143            ppc40x_core_reset(cpu);
1144            break;
1145        case 0x2: /* Chip reset */
1146            ppc40x_chip_reset(cpu);
1147            break;
1148        case 0x3: /* System reset */
1149            ppc40x_system_reset(cpu);
1150            break;
1151        }
1152    }
1153}
1154
1155void store_40x_pit (CPUPPCState *env, target_ulong val)
1156{
1157    ppc_tb_t *tb_env;
1158    ppc40x_timer_t *ppc40x_timer;
1159
1160    tb_env = env->tb_env;
1161    ppc40x_timer = tb_env->opaque;
1162    LOG_TB("%s val" TARGET_FMT_lx "\n", __func__, val);
1163    ppc40x_timer->pit_reload = val;
1164    start_stop_pit(env, tb_env, 0);
1165}
1166
1167target_ulong load_40x_pit (CPUPPCState *env)
1168{
1169    return cpu_ppc_load_decr(env);
1170}
1171
1172static void ppc_40x_set_tb_clk (void *opaque, uint32_t freq)
1173{
1174    CPUPPCState *env = opaque;
1175    ppc_tb_t *tb_env = env->tb_env;
1176
1177    LOG_TB("%s set new frequency to %" PRIu32 "\n", __func__,
1178                freq);
1179    tb_env->tb_freq = freq;
1180    tb_env->decr_freq = freq;
1181    /* XXX: we should also update all timers */
1182}
1183
1184clk_setup_cb ppc_40x_timers_init (CPUPPCState *env, uint32_t freq,
1185                                  unsigned int decr_excp)
1186{
1187    ppc_tb_t *tb_env;
1188    ppc40x_timer_t *ppc40x_timer;
1189
1190    tb_env = g_malloc0(sizeof(ppc_tb_t));
1191    env->tb_env = tb_env;
1192    tb_env->flags = PPC_DECR_UNDERFLOW_TRIGGERED;
1193    ppc40x_timer = g_malloc0(sizeof(ppc40x_timer_t));
1194    tb_env->tb_freq = freq;
1195    tb_env->decr_freq = freq;
1196    tb_env->opaque = ppc40x_timer;
1197    LOG_TB("%s freq %" PRIu32 "\n", __func__, freq);
1198    if (ppc40x_timer != NULL) {
1199        /* We use decr timer for PIT */
1200        tb_env->decr_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, &cpu_4xx_pit_cb, env);
1201        ppc40x_timer->fit_timer =
1202            timer_new_ns(QEMU_CLOCK_VIRTUAL, &cpu_4xx_fit_cb, env);
1203        ppc40x_timer->wdt_timer =
1204            timer_new_ns(QEMU_CLOCK_VIRTUAL, &cpu_4xx_wdt_cb, env);
1205        ppc40x_timer->decr_excp = decr_excp;
1206    }
1207
1208    return &ppc_40x_set_tb_clk;
1209}
1210
1211/*****************************************************************************/
1212/* Embedded PowerPC Device Control Registers */
1213typedef struct ppc_dcrn_t ppc_dcrn_t;
1214struct ppc_dcrn_t {
1215    dcr_read_cb dcr_read;
1216    dcr_write_cb dcr_write;
1217    void *opaque;
1218};
1219
1220/* XXX: on 460, DCR addresses are 32 bits wide,
1221 *      using DCRIPR to get the 22 upper bits of the DCR address
1222 */
1223#define DCRN_NB 1024
1224struct ppc_dcr_t {
1225    ppc_dcrn_t dcrn[DCRN_NB];
1226    int (*read_error)(int dcrn);
1227    int (*write_error)(int dcrn);
1228};
1229
1230int ppc_dcr_read (ppc_dcr_t *dcr_env, int dcrn, uint32_t *valp)
1231{
1232    ppc_dcrn_t *dcr;
1233
1234    if (dcrn < 0 || dcrn >= DCRN_NB)
1235        goto error;
1236    dcr = &dcr_env->dcrn[dcrn];
1237    if (dcr->dcr_read == NULL)
1238        goto error;
1239    *valp = (*dcr->dcr_read)(dcr->opaque, dcrn);
1240
1241    return 0;
1242
1243 error:
1244    if (dcr_env->read_error != NULL)
1245        return (*dcr_env->read_error)(dcrn);
1246
1247    return -1;
1248}
1249
1250int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, uint32_t val)
1251{
1252    ppc_dcrn_t *dcr;
1253
1254    if (dcrn < 0 || dcrn >= DCRN_NB)
1255        goto error;
1256    dcr = &dcr_env->dcrn[dcrn];
1257    if (dcr->dcr_write == NULL)
1258        goto error;
1259    (*dcr->dcr_write)(dcr->opaque, dcrn, val);
1260
1261    return 0;
1262
1263 error:
1264    if (dcr_env->write_error != NULL)
1265        return (*dcr_env->write_error)(dcrn);
1266
1267    return -1;
1268}
1269
1270int ppc_dcr_register (CPUPPCState *env, int dcrn, void *opaque,
1271                      dcr_read_cb dcr_read, dcr_write_cb dcr_write)
1272{
1273    ppc_dcr_t *dcr_env;
1274    ppc_dcrn_t *dcr;
1275
1276    dcr_env = env->dcr_env;
1277    if (dcr_env == NULL)
1278        return -1;
1279    if (dcrn < 0 || dcrn >= DCRN_NB)
1280        return -1;
1281    dcr = &dcr_env->dcrn[dcrn];
1282    if (dcr->opaque != NULL ||
1283        dcr->dcr_read != NULL ||
1284        dcr->dcr_write != NULL)
1285        return -1;
1286    dcr->opaque = opaque;
1287    dcr->dcr_read = dcr_read;
1288    dcr->dcr_write = dcr_write;
1289
1290    return 0;
1291}
1292
1293int ppc_dcr_init (CPUPPCState *env, int (*read_error)(int dcrn),
1294                  int (*write_error)(int dcrn))
1295{
1296    ppc_dcr_t *dcr_env;
1297
1298    dcr_env = g_malloc0(sizeof(ppc_dcr_t));
1299    dcr_env->read_error = read_error;
1300    dcr_env->write_error = write_error;
1301    env->dcr_env = dcr_env;
1302
1303    return 0;
1304}
1305
1306/*****************************************************************************/
1307/* Debug port */
1308void PPC_debug_write (void *opaque, uint32_t addr, uint32_t val)
1309{
1310    addr &= 0xF;
1311    switch (addr) {
1312    case 0:
1313        printf("%c", val);
1314        break;
1315    case 1:
1316        printf("\n");
1317        fflush(stdout);
1318        break;
1319    case 2:
1320        printf("Set loglevel to %04" PRIx32 "\n", val);
1321        qemu_set_log(val | 0x100);
1322        break;
1323    }
1324}
1325
1326/* CPU device-tree ID helpers */
1327int ppc_get_vcpu_dt_id(PowerPCCPU *cpu)
1328{
1329    return cpu->cpu_dt_id;
1330}
1331
1332PowerPCCPU *ppc_get_vcpu_by_dt_id(int cpu_dt_id)
1333{
1334    CPUState *cs;
1335
1336    CPU_FOREACH(cs) {
1337        PowerPCCPU *cpu = POWERPC_CPU(cs);
1338
1339        if (cpu->cpu_dt_id == cpu_dt_id) {
1340            return cpu;
1341        }
1342    }
1343
1344    return NULL;
1345}
1346