Revision 426613db

b/target-ppc/cpu.h
384 384
    PPC_SPE         = 0x0000000100000000ULL,
385 385
    /* PowerPC 2.03 SPE floating-point extension */
386 386
    PPC_SPEFPU      = 0x0000000200000000ULL,
387
    /* SLB management */
388
    PPC_SLBI        = 0x0000000400000000ULL,
387 389
};
388 390

  
389 391
/* CPU run-time flags (MMU and exception model) */
......
503 505
#define PPC_INSNS_74xx (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_ALTIVEC |      \
504 506
                        PPC_MEM_TLBSYNC | PPC_TB)
505 507
#define PPC_FLAGS_74xx (PPC_FLAGS_MMU_32B | PPC_FLAGS_EXCP_74xx)
508
/* PowerPC 970 (aka G5) */
509
#define PPC_INSNS_970  (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_FLOAT_OPT |    \
510
                        PPC_ALTIVEC | PPC_MEM_TLBSYNC | PPC_TB |              \
511
                        PPC_64B | PPC_64_BRIDGE | PPC_SLBI)
512
#define PPC_FLAGS_970  (PPC_FLAGS_MMU_64B | PPC_FLAGS_EXCP_970)
506 513

  
507 514
/* Default PowerPC will be 604/970 */
508 515
#define PPC_INSNS_PPC32 PPC_INSNS_604
509 516
#define PPC_FLAGS_PPC32 PPC_FLAGS_604
510
#if 0
517
#if 1
511 518
#define PPC_INSNS_PPC64 PPC_INSNS_970
512 519
#define PPC_FLAGS_PPC64 PPC_FLAGS_970
513 520
#endif
......
801 808
void ppc_store_xer (CPUPPCState *env, uint32_t value);
802 809
target_ulong do_load_msr (CPUPPCState *env);
803 810
void do_store_msr (CPUPPCState *env, target_ulong value);
804
void ppc_store_msr32 (CPUPPCState *env, uint32_t value);
811
void ppc_store_msr_32 (CPUPPCState *env, uint32_t value);
805 812

  
806 813
void do_compute_hflags (CPUPPCState *env);
807 814

  
b/target-ppc/helper.c
1203 1203
}
1204 1204

  
1205 1205
#if defined(TARGET_PPC64)
1206
void ppc_store_msr_32 (CPUPPCState *env, target_ulong value)
1206
void ppc_store_msr_32 (CPUPPCState *env, uint32_t value)
1207 1207
{
1208
    do_store_msr(env, (uint32_t)value);
1208
    do_store_msr(env,
1209
                 (do_load_msr(env) & ~0xFFFFFFFFULL) | (value & 0xFFFFFFFF));
1209 1210
}
1210 1211
#endif
1211 1212

  
b/target-ppc/op.c
1721 1721
    RETURN();
1722 1722
}
1723 1723

  
1724
#if defined(TARGET_PPC64)
1725
/* fcfid - fcfid. */
1726
PPC_OP(fcfid)
1727
{
1728
    do_fcfid();
1729
    RETURN();
1730
}
1731

  
1732
/* fctid - fctid. */
1733
PPC_OP(fctid)
1734
{
1735
    do_fctid();
1736
    RETURN();
1737
}
1738

  
1739
/* fctidz - fctidz. */
1740
PPC_OP(fctidz)
1741
{
1742
    do_fctidz();
1743
    RETURN();
1744
}
1745
#endif
1746

  
1724 1747
/***                         Floating-Point compare                        ***/
1725 1748
/* fcmpu */
1726 1749
PPC_OP(fcmpu)
......
1803 1826
    do_rfi_32();
1804 1827
    RETURN();
1805 1828
}
1829

  
1830
void OPPROTO op_rfid (void)
1831
{
1832
    do_rfid();
1833
    RETURN();
1834
}
1835

  
1836
void OPPROTO op_rfid_32 (void)
1837
{
1838
    do_rfid_32();
1839
    RETURN();
1840
}
1806 1841
#endif
1807 1842
#endif
1808 1843

  
b/target-ppc/op_helper.c
642 642
    FT0 = p.d;
643 643
}
644 644

  
645
#if defined(TARGET_PPC64)
646
void do_fcfid (void)
647
{
648
    union {
649
        double d;
650
        uint64_t i;
651
    } p;
652

  
653
    p.d = FT0;
654
    FT0 = int64_to_float64(p.i, &env->fp_status);
655
}
656

  
657
void do_fctid (void)
658
{
659
    union {
660
        double d;
661
        uint64_t i;
662
    } p;
663

  
664
    p.i = float64_to_int64(FT0, &env->fp_status);
665
    FT0 = p.d;
666
}
667

  
668
void do_fctidz (void)
669
{
670
    union {
671
        double d;
672
        uint64_t i;
673
    } p;
674

  
675
    p.i = float64_to_int64_round_to_zero(FT0, &env->fp_status);
676
    FT0 = p.d;
677
}
678

  
679
#endif
680

  
645 681
#if USE_PRECISE_EMULATION
646 682
void do_fmadd (void)
647 683
{
......
846 882
void do_rfi (void)
847 883
{
848 884
    env->nip = (target_ulong)(env->spr[SPR_SRR0] & ~0x00000003);
849
    T0 = (target_ulong)(env->spr[SPR_SRR1] & ~0xFFFF0000UL);
885
    T0 = (uint32_t)(env->spr[SPR_SRR1] & ~0xFFFF0000UL);
886
#if defined(TARGET_PPC64)
887
    ppc_store_msr_32(env, T0);
888
#else
850 889
    do_store_msr(env, T0);
890
#endif
851 891
#if defined (DEBUG_OP)
852 892
    dump_rfi();
853 893
#endif
......
859 899
{
860 900
    env->nip = (uint32_t)(env->spr[SPR_SRR0] & ~0x00000003);
861 901
    T0 = (uint32_t)(env->spr[SPR_SRR1] & ~0xFFFF0000UL);
902
    ppc_store_msr_32(env, T0);
903
#if defined (DEBUG_OP)
904
    dump_rfi();
905
#endif
906
    env->interrupt_request |= CPU_INTERRUPT_EXITTB;
907
}
908

  
909
void do_rfid (void)
910
{
911
    env->nip = (target_ulong)(env->spr[SPR_SRR0] & ~0x00000003);
912
    T0 = (uint64_t)(env->spr[SPR_SRR1] & ~0xFFFF0000UL);
913
    do_store_msr(env, T0);
914
#if defined (DEBUG_OP)
915
    dump_rfi();
916
#endif
917
    env->interrupt_request |= CPU_INTERRUPT_EXITTB;
918
}
919

  
920
void do_rfid_32 (void)
921
{
922
    env->nip = (uint32_t)(env->spr[SPR_SRR0] & ~0x00000003);
923
    T0 = (uint64_t)(env->spr[SPR_SRR1] & ~0xFFFF0000UL);
862 924
    do_store_msr(env, T0);
863 925
#if defined (DEBUG_OP)
864 926
    dump_rfi();
b/target-ppc/op_helper.h
101 101
void do_fnmsub (void);
102 102
void do_fctiw (void);
103 103
void do_fctiwz (void);
104
#if defined(TARGET_PPC64)
105
void do_fcfid (void);
106
void do_fctid (void);
107
void do_fctidz (void);
108
#endif
104 109
void do_fcmpu (void);
105 110
void do_fcmpo (void);
106 111

  
......
113 118
void do_rfi (void);
114 119
#if defined(TARGET_PPC64)
115 120
void do_rfi_32 (void);
121
void do_rfid (void);
122
void do_rfid_32 (void);
116 123
#endif
117 124
void do_tlbia (void);
118 125
void do_tlbie (void);
b/target-ppc/op_mem.h
534 534
    RETURN();
535 535
}
536 536

  
537
void OPPROTO glue(op_ldarx, MEMSUFFIX) (void)
538
{
539
    if (unlikely(T0 & 0x03)) {
540
        do_raise_exception(EXCP_ALIGN);
541
    } else {
542
        T1 = glue(ldq, MEMSUFFIX)((uint32_t)T0);
543
        regs->reserve = (uint32_t)T0;
544
    }
545
    RETURN();
546
}
547

  
537 548
void OPPROTO glue(op_ldarx_64, MEMSUFFIX) (void)
538 549
{
539 550
    if (unlikely(T0 & 0x03)) {
......
569 580
    RETURN();
570 581
}
571 582

  
583
void OPPROTO glue(op_ldarx_le, MEMSUFFIX) (void)
584
{
585
    if (unlikely(T0 & 0x03)) {
586
        do_raise_exception(EXCP_ALIGN);
587
    } else {
588
        T1 = glue(ld64r, MEMSUFFIX)((uint32_t)T0);
589
        regs->reserve = (uint32_t)T0;
590
    }
591
    RETURN();
592
}
593

  
572 594
void OPPROTO glue(op_ldarx_le_64, MEMSUFFIX) (void)
573 595
{
574 596
    if (unlikely(T0 & 0x03)) {
......
615 637
    RETURN();
616 638
}
617 639

  
640
void OPPROTO glue(op_stdcx, MEMSUFFIX) (void)
641
{
642
    if (unlikely(T0 & 0x03)) {
643
        do_raise_exception(EXCP_ALIGN);
644
    } else {
645
        if (unlikely(regs->reserve != (uint32_t)T0)) {
646
            env->crf[0] = xer_ov;
647
        } else {
648
            glue(stq, MEMSUFFIX)((uint32_t)T0, T1);
649
            env->crf[0] = xer_ov | 0x02;
650
        }
651
    }
652
    regs->reserve = -1;
653
    RETURN();
654
}
655

  
618 656
void OPPROTO glue(op_stdcx_64, MEMSUFFIX) (void)
619 657
{
620 658
    if (unlikely(T0 & 0x03)) {
......
665 703
    RETURN();
666 704
}
667 705

  
706
void OPPROTO glue(op_stdcx_le, MEMSUFFIX) (void)
707
{
708
    if (unlikely(T0 & 0x03)) {
709
        do_raise_exception(EXCP_ALIGN);
710
    } else {
711
        if (unlikely(regs->reserve != (uint32_t)T0)) {
712
            env->crf[0] = xer_ov;
713
        } else {
714
            glue(st64r, MEMSUFFIX)((uint32_t)T0, T1);
715
            env->crf[0] = xer_ov | 0x02;
716
        }
717
    }
718
    regs->reserve = -1;
719
    RETURN();
720
}
721

  
668 722
void OPPROTO glue(op_stdcx_le_64, MEMSUFFIX) (void)
669 723
{
670 724
    if (unlikely(T0 & 0x03)) {
b/target-ppc/translate.c
1584 1584
GEN_FLOAT_B(ctiwz, 0x0F, 0x00);
1585 1585
/* frsp */
1586 1586
GEN_FLOAT_B(rsp, 0x0C, 0x00);
1587
#if defined(TARGET_PPC64)
1588
/* fcfid */
1589
GEN_FLOAT_B(cfid, 0x0E, 0x1A);
1590
/* fctid */
1591
GEN_FLOAT_B(ctid, 0x0E, 0x19);
1592
/* fctidz */
1593
GEN_FLOAT_B(ctidz, 0x0F, 0x19);
1594
#endif
1587 1595

  
1588 1596
/***                         Floating-Point compare                        ***/
1589 1597
/* fcmpo */
......
1996 2004
GEN_STS(w, 0x04, PPC_INTEGER);
1997 2005
#if defined(TARGET_PPC64)
1998 2006
OP_ST_TABLE(d);
1999
GEN_STUX(d, 0x15, 0x01, PPC_64B);
2000
GEN_STX(d, 0x15, 0x00, PPC_64B);
2007
GEN_STUX(d, 0x15, 0x05, PPC_64B);
2008
GEN_STX(d, 0x15, 0x04, PPC_64B);
2001 2009
GEN_HANDLER(std, 0x3E, 0xFF, 0xFF, 0x00000002, PPC_64B)
2002 2010
{
2003 2011
    if (Rc(ctx->opcode)) {
......
2358 2366
    op_stwcx();
2359 2367
}
2360 2368

  
2369
#if defined(TARGET_PPC64)
2370
#define op_ldarx() (*gen_op_ldarx[ctx->mem_idx])()
2371
#define op_stdcx() (*gen_op_stdcx[ctx->mem_idx])()
2372
#if defined(CONFIG_USER_ONLY)
2373
static GenOpFunc *gen_op_ldarx[] = {
2374
    &gen_op_ldarx_raw,
2375
    &gen_op_ldarx_le_raw,
2376
    &gen_op_ldarx_64_raw,
2377
    &gen_op_ldarx_le_64_raw,
2378
};
2379
static GenOpFunc *gen_op_stdcx[] = {
2380
    &gen_op_stdcx_raw,
2381
    &gen_op_stdcx_le_raw,
2382
    &gen_op_stdcx_64_raw,
2383
    &gen_op_stdcx_le_64_raw,
2384
};
2385
#else
2386
static GenOpFunc *gen_op_ldarx[] = {
2387
    &gen_op_ldarx_user,
2388
    &gen_op_ldarx_le_user,
2389
    &gen_op_ldarx_kernel,
2390
    &gen_op_ldarx_le_kernel,
2391
    &gen_op_ldarx_64_user,
2392
    &gen_op_ldarx_le_64_user,
2393
    &gen_op_ldarx_64_kernel,
2394
    &gen_op_ldarx_le_64_kernel,
2395
};
2396
static GenOpFunc *gen_op_stdcx[] = {
2397
    &gen_op_stdcx_user,
2398
    &gen_op_stdcx_le_user,
2399
    &gen_op_stdcx_kernel,
2400
    &gen_op_stdcx_le_kernel,
2401
    &gen_op_stdcx_64_user,
2402
    &gen_op_stdcx_le_64_user,
2403
    &gen_op_stdcx_64_kernel,
2404
    &gen_op_stdcx_le_64_kernel,
2405
};
2406
#endif
2407

  
2408
/* ldarx */
2409
GEN_HANDLER(ldarx, 0x1F, 0x14, 0x02, 0x00000001, PPC_RES)
2410
{
2411
    gen_addr_reg_index(ctx);
2412
    op_ldarx();
2413
    gen_op_store_T1_gpr(rD(ctx->opcode));
2414
}
2415

  
2416
/* stdcx. */
2417
GEN_HANDLER(stdcx_, 0x1F, 0x16, 0x06, 0x00000000, PPC_RES)
2418
{
2419
    gen_addr_reg_index(ctx);
2420
    gen_op_load_gpr_T1(rS(ctx->opcode));
2421
    op_stdcx();
2422
}
2423
#endif /* defined(TARGET_PPC64) */
2424

  
2361 2425
/* sync */
2362 2426
GEN_HANDLER(sync, 0x1F, 0x16, 0x12, 0x03FF0801, PPC_MEM_SYNC)
2363 2427
{
......
2807 2871
#endif
2808 2872
}
2809 2873

  
2874
#if defined(TARGET_PPC64)
2875
GEN_HANDLER(rfid, 0x13, 0x12, 0x00, 0x03FF8001, PPC_FLOW)
2876
{
2877
#if defined(CONFIG_USER_ONLY)
2878
    RET_PRIVOPC(ctx);
2879
#else
2880
    /* Restore CPU state */
2881
    if (unlikely(!ctx->supervisor)) {
2882
        RET_PRIVOPC(ctx);
2883
        return;
2884
    }
2885
    if (!ctx->sf_mode)
2886
        gen_op_rfid_32();
2887
    else
2888
        gen_op_rfid();
2889
    RET_CHG_FLOW(ctx);
2890
#endif
2891
}
2892
#endif
2893

  
2810 2894
/* sc */
2811 2895
GEN_HANDLER(sc, 0x11, 0xFF, 0xFF, 0x03FFFFFD, PPC_FLOW)
2812 2896
{
......
2978 3062
}
2979 3063

  
2980 3064
/* mtmsr */
3065
#if defined(TARGET_PPC64)
3066
GEN_HANDLER(mtmsrd, 0x1F, 0x12, 0x05, 0x001FF801, PPC_MISC)
3067
{
3068
#if defined(CONFIG_USER_ONLY)
3069
    RET_PRIVREG(ctx);
3070
#else
3071
    if (unlikely(!ctx->supervisor)) {
3072
        RET_PRIVREG(ctx);
3073
        return;
3074
    }
3075
    gen_update_nip(ctx, ctx->nip);
3076
    gen_op_load_gpr_T0(rS(ctx->opcode));
3077
    gen_op_store_msr();
3078
    /* Must stop the translation as machine state (may have) changed */
3079
    RET_CHG_FLOW(ctx);
3080
#endif
3081
}
3082
#endif
3083

  
2981 3084
GEN_HANDLER(mtmsr, 0x1F, 0x12, 0x04, 0x001FF801, PPC_MISC)
2982 3085
{
2983 3086
#if defined(CONFIG_USER_ONLY)
......
3313 3416
#endif
3314 3417
}
3315 3418

  
3419
#if defined(TARGET_PPC64)
3420
/* slbia */
3421
GEN_HANDLER(slbia, 0x1F, 0x12, 0x0F, 0x03FFFC01, PPC_SLBI)
3422
{
3423
#if defined(CONFIG_USER_ONLY)
3424
    RET_PRIVOPC(ctx);
3425
#else
3426
    if (unlikely(!ctx->supervisor)) {
3427
        if (loglevel)
3428
            fprintf(logfile, "%s: ! supervisor\n", __func__);
3429
        RET_PRIVOPC(ctx);
3430
        return;
3431
    }
3432
    gen_op_slbia();
3433
    RET_STOP(ctx);
3434
#endif
3435
}
3436

  
3437
/* slbie */
3438
GEN_HANDLER(slbie, 0x1F, 0x12, 0x0D, 0x03FF0001, PPC_SLBI)
3439
{
3440
#if defined(CONFIG_USER_ONLY)
3441
    RET_PRIVOPC(ctx);
3442
#else
3443
    if (unlikely(!ctx->supervisor)) {
3444
        RET_PRIVOPC(ctx);
3445
        return;
3446
    }
3447
    gen_op_load_gpr_T0(rB(ctx->opcode));
3448
    gen_op_slbie();
3449
    RET_STOP(ctx);
3450
#endif
3451
}
3452
#endif
3453

  
3316 3454
/***                              External control                         ***/
3317 3455
/* Optional: */
3318 3456
#define op_eciwx() (*gen_op_eciwx[ctx->mem_idx])()
b/target-ppc/translate_init.c
1716 1716
    printf("%s: PVR %08x mask %08x => %08x\n", __func__,
1717 1717
           def->pvr, def->pvr_mask, def->pvr & def->pvr_mask);
1718 1718
    switch (def->pvr & def->pvr_mask) {
1719
        /* Embedded PowerPC from IBM                           */
1719
    /* Embedded PowerPC from IBM                           */
1720 1720
    case CPU_PPC_401A1:   /* 401 A1 family                 */
1721 1721
    case CPU_PPC_401B2:   /* 401 B2 family                 */
1722 1722
    case CPU_PPC_401C2:   /* 401 C2 family                 */
......
1833 1833
        env->id_tlbs = 0;
1834 1834
        break;
1835 1835

  
1836
        /* Embedded PowerPC from Freescale                     */
1836
    /* Embedded PowerPC from Freescale                     */
1837 1837
#if defined (TODO)
1838 1838
    case CPU_PPC_5xx:
1839 1839
        break;
......
1852 1852
        break;
1853 1853
#endif
1854 1854

  
1855
        /* XXX: Use MPC8540 PVR to implement a test PowerPC BookE target */
1855
    /* XXX: Use MPC8540 PVR to implement a test PowerPC BookE target */
1856 1856
    case CPU_PPC_e500v110:
1857 1857
    case CPU_PPC_e500v120:
1858 1858
    case CPU_PPC_e500v210:
......
1872 1872
        break;
1873 1873
#endif
1874 1874

  
1875
        /* 32 bits PowerPC                                     */
1875
    /* 32 bits PowerPC                                     */
1876 1876
    case CPU_PPC_601:     /* PowerPC 601                   */
1877 1877
        gen_spr_generic(env);
1878 1878
        gen_spr_ne_601(env);
......
2131 2131
        break;
2132 2132

  
2133 2133
#if defined (TODO)
2134
        /* G4 family */
2134
    /* G4 family */
2135 2135
    case CPU_PPC_7400:    /* PowerPC 7400                  */
2136 2136
    case CPU_PPC_7410C:   /* PowerPC 7410                  */
2137 2137
    case CPU_PPC_7410D:
......
2154 2154
        break;
2155 2155
#endif
2156 2156

  
2157
    /* 64 bits PowerPC                                     */
2158
#if defined (TARGET_PPC64)
2157 2159
#if defined (TODO)
2158
        /* 64 bits PowerPC                                     */
2159 2160
    case CPU_PPC_620:     /* PowerPC 620                   */
2160 2161
    case CPU_PPC_630:     /* PowerPC 630 (Power 3)         */
2161 2162
    case CPU_PPC_631:     /* PowerPC 631 (Power 3+)        */
......
2163 2164
    case CPU_PPC_POWER4P: /* Power 4+                      */
2164 2165
    case CPU_PPC_POWER5:  /* Power 5                       */
2165 2166
    case CPU_PPC_POWER5P: /* Power 5+                      */
2167
#endif
2166 2168
    case CPU_PPC_970:     /* PowerPC 970                   */
2167 2169
    case CPU_PPC_970FX10: /* PowerPC 970 FX                */
2168 2170
    case CPU_PPC_970FX20:
......
2171 2173
    case CPU_PPC_970FX31:
2172 2174
    case CPU_PPC_970MP10: /* PowerPC 970 MP                */
2173 2175
    case CPU_PPC_970MP11:
2176
#if defined (TODO)
2174 2177
    case CPU_PPC_CELL10:  /* Cell family                   */
2175 2178
    case CPU_PPC_CELL20:
2176 2179
    case CPU_PPC_CELL30:
2177 2180
    case CPU_PPC_CELL31:
2181
#endif
2182
#if defined (TODO)
2178 2183
    case CPU_PPC_RS64:    /* Apache (RS64/A35)             */
2179 2184
    case CPU_PPC_RS64II:  /* NorthStar (RS64-II/A50)       */
2180 2185
    case CPU_PPC_RS64III: /* Pulsar (RS64-III)             */
2181 2186
    case CPU_PPC_RS64IV:  /* IceStar/IStar/SStar (RS64-IV) */
2182
        break;
2183 2187
#endif
2188
        break;
2189
#endif /* defined (TARGET_PPC64) */
2184 2190

  
2185 2191
#if defined (TODO)
2186 2192
        /* POWER                                               */
......
3412 3418
        },
3413 3419
#endif
3414 3420
        /* 64 bits PowerPC */
3421
#if defined (TARGET_PPC64)
3415 3422
#if defined (TODO)
3416 3423
        /* PowerPC 620 */
3417 3424
        {
......
3650 3657
            .msr_mask    = xxx,
3651 3658
        },
3652 3659
#endif
3660
#endif /* defined (TARGET_PPC64) */
3653 3661
#if defined (TODO)
3654 3662
        /* POWER2 */
3655 3663
        {

Also available in: Unified diff