Revision 2aae2b8e

b/target-sparc/cpu.h
92 92
#define PSR_CARRY_SHIFT 20
93 93
#define PSR_CARRY (1 << PSR_CARRY_SHIFT)
94 94
#define PSR_ICC   (PSR_NEG|PSR_ZERO|PSR_OVF|PSR_CARRY)
95
#if !defined(TARGET_SPARC64)
95 96
#define PSR_EF    (1<<12)
96 97
#define PSR_PIL   0xf00
97 98
#define PSR_S     (1<<7)
98 99
#define PSR_PS    (1<<6)
99 100
#define PSR_ET    (1<<5)
100 101
#define PSR_CWP   0x1f
102
#endif
101 103

  
102 104
#define CC_SRC (env->cc_src)
103 105
#define CC_SRC2 (env->cc_src2)
......
341 343
    uint32_t wim;      /* window invalid mask */
342 344
#endif
343 345
    target_ulong tbr;  /* trap base register */
346
#if !defined(TARGET_SPARC64)
344 347
    int      psrs;     /* supervisor mode (extracted from PSR) */
345 348
    int      psrps;    /* previous supervisor mode */
346
#if !defined(TARGET_SPARC64)
347 349
    int      psret;    /* enable traps */
348 350
#endif
349 351
    uint32_t psrpil;   /* interrupt blocking level */
350 352
    uint32_t pil_in;   /* incoming interrupt level bitmap */
353
#if !defined(TARGET_SPARC64)
351 354
    int      psref;    /* enable fpu */
355
#endif
352 356
    target_ulong version;
353 357
    int interrupt_index;
354 358
    uint32_t nwindows;
......
508 512
#define CPU_SAVE_VERSION 6
509 513

  
510 514
/* MMU modes definitions */
515
#if defined (TARGET_SPARC64)
516
#define MMU_USER_IDX   0
511 517
#define MMU_MODE0_SUFFIX _user
512
#define MMU_MODE1_SUFFIX _kernel
513
#ifdef TARGET_SPARC64
514
#define MMU_MODE2_SUFFIX _hypv
515
#define MMU_MODE3_SUFFIX _nucleus
516
#define MMU_MODE4_SUFFIX _user_secondary
517
#define MMU_MODE5_SUFFIX _kernel_secondary
518
#endif
518
#define MMU_USER_SECONDARY_IDX   1
519
#define MMU_MODE1_SUFFIX _user_secondary
520
#define MMU_KERNEL_IDX 2
521
#define MMU_MODE2_SUFFIX _kernel
522
#define MMU_KERNEL_SECONDARY_IDX 3
523
#define MMU_MODE3_SUFFIX _kernel_secondary
524
#define MMU_NUCLEUS_IDX 4
525
#define MMU_MODE4_SUFFIX _nucleus
526
#define MMU_HYPV_IDX   5
527
#define MMU_MODE5_SUFFIX _hypv
528
#else
519 529
#define MMU_USER_IDX   0
530
#define MMU_MODE0_SUFFIX _user
520 531
#define MMU_KERNEL_IDX 1
521
#define MMU_HYPV_IDX   2
522
#ifdef TARGET_SPARC64
523
#define MMU_NUCLEUS_IDX 3
524
#define MMU_USER_SECONDARY_IDX   4
525
#define MMU_KERNEL_SECONDARY_IDX 5
532
#define MMU_MODE1_SUFFIX _kernel
533
#endif
534

  
535
#if defined (TARGET_SPARC64)
536
static inline int cpu_has_hypervisor(CPUState *env1)
537
{
538
    return env1->def->features & CPU_FEATURE_HYPV;
539
}
540

  
541
static inline int cpu_hypervisor_mode(CPUState *env1)
542
{
543
    return cpu_has_hypervisor(env1) && (env1->hpstate & HS_PRIV);
544
}
545

  
546
static inline int cpu_supervisor_mode(CPUState *env1)
547
{
548
    return env1->pstate & PS_PRIV;
549
}
526 550
#endif
527 551

  
528 552
static inline int cpu_mmu_index(CPUState *env1)
......
532 556
#elif !defined(TARGET_SPARC64)
533 557
    return env1->psrs;
534 558
#else
535
    if (!env1->psrs)
536
        return MMU_USER_IDX;
537
    else if ((env1->hpstate & HS_PRIV) == 0)
538
        return MMU_KERNEL_IDX;
539
    else
559
    if (cpu_hypervisor_mode(env1)) {
540 560
        return MMU_HYPV_IDX;
561
    } else if (cpu_supervisor_mode(env1)) {
562
        return MMU_KERNEL_IDX;
563
    } else {
564
        return MMU_USER_IDX;
565
    }
541 566
#endif
542 567
}
543 568

  
b/target-sparc/helper.c
746 746
#else
747 747
#if !defined(TARGET_SPARC64)
748 748
    env->psret = 0;
749
#endif
750 749
    env->psrs = 1;
751 750
    env->psrps = 1;
751
#endif
752 752
#ifdef TARGET_SPARC64
753 753
    env->pstate = PS_PRIV|PS_RED|PS_PEF|PS_AG;
754
    env->hpstate = HS_PRIV;
754
    env->hpstate = cpu_has_hypervisor(env) ? HS_PRIV : 0;
755 755
    env->tl = env->maxtl;
756 756
    cpu_tsptr(env)->tt = TT_POWER_ON_RESET;
757 757
    env->lsu = 0;
b/target-sparc/op_helper.c
1404 1404
        (env->psrps? PSR_PS : 0) |
1405 1405
        (env->psret? PSR_ET : 0) | env->cwp;
1406 1406
#else
1407
    return env->version | (env->psr & PSR_ICC) |
1408
        (env->psref? PSR_EF : 0) |
1409
        (env->psrpil << 8) |
1410
        (env->psrs? PSR_S : 0) |
1411
        (env->psrps? PSR_PS : 0) | env->cwp;
1407
    return env->psr & PSR_ICC;
1412 1408
#endif
1413 1409
}
1414 1410

  
......
1427 1423
static void put_psr(target_ulong val)
1428 1424
{
1429 1425
    env->psr = val & PSR_ICC;
1426
#if !defined (TARGET_SPARC64)
1430 1427
    env->psref = (val & PSR_EF)? 1 : 0;
1431 1428
    env->psrpil = (val & PSR_PIL) >> 8;
1429
#endif
1432 1430
#if ((!defined (TARGET_SPARC64)) && !defined(CONFIG_USER_ONLY))
1433 1431
    cpu_check_irqs(env);
1434 1432
#endif
1433
#if !defined (TARGET_SPARC64)
1435 1434
    env->psrs = (val & PSR_S)? 1 : 0;
1436 1435
    env->psrps = (val & PSR_PS)? 1 : 0;
1437
#if !defined (TARGET_SPARC64)
1438 1436
    env->psret = (val & PSR_ET)? 1 : 0;
1439
#endif
1440 1437
    set_cwp(val & PSR_CWP);
1438
#endif
1441 1439
    env->cc_op = CC_OP_FLAGS;
1442 1440
}
1443 1441

  
......
2326 2324
    asi &= 0xff;
2327 2325

  
2328 2326
    if ((asi < 0x80 && (env->pstate & PS_PRIV) == 0)
2329
        || ((env->def->features & CPU_FEATURE_HYPV)
2327
        || (cpu_has_hypervisor(env)
2330 2328
            && asi >= 0x30 && asi < 0x80
2331 2329
            && !(env->hpstate & HS_PRIV)))
2332 2330
        raise_exception(TT_PRIV_ACT);
......
2361 2359
    case 0xe2: // UA2007 Primary block init
2362 2360
    case 0xe3: // UA2007 Secondary block init
2363 2361
        if ((asi & 0x80) && (env->pstate & PS_PRIV)) {
2364
            if ((env->def->features & CPU_FEATURE_HYPV)
2365
                && env->hpstate & HS_PRIV) {
2362
            if (cpu_hypervisor_mode(env)) {
2366 2363
                switch(size) {
2367 2364
                case 1:
2368 2365
                    ret = ldub_hypv(addr);
......
2678 2675
    asi &= 0xff;
2679 2676

  
2680 2677
    if ((asi < 0x80 && (env->pstate & PS_PRIV) == 0)
2681
        || ((env->def->features & CPU_FEATURE_HYPV)
2678
        || (cpu_has_hypervisor(env)
2682 2679
            && asi >= 0x30 && asi < 0x80
2683 2680
            && !(env->hpstate & HS_PRIV)))
2684 2681
        raise_exception(TT_PRIV_ACT);
......
2722 2719
    case 0xe2: // UA2007 Primary block init
2723 2720
    case 0xe3: // UA2007 Secondary block init
2724 2721
        if ((asi & 0x80) && (env->pstate & PS_PRIV)) {
2725
            if ((env->def->features & CPU_FEATURE_HYPV)
2726
                && env->hpstate & HS_PRIV) {
2722
            if (cpu_hypervisor_mode(env)) {
2727 2723
                switch(size) {
2728 2724
                case 1:
2729 2725
                    stb_hypv(addr, val);
......
3048 3044
void helper_ldda_asi(target_ulong addr, int asi, int rd)
3049 3045
{
3050 3046
    if ((asi < 0x80 && (env->pstate & PS_PRIV) == 0)
3051
        || ((env->def->features & CPU_FEATURE_HYPV)
3047
        || (cpu_has_hypervisor(env)
3052 3048
            && asi >= 0x30 && asi < 0x80
3053 3049
            && !(env->hpstate & HS_PRIV)))
3054 3050
        raise_exception(TT_PRIV_ACT);
b/target-sparc/translate.c
183 183
#define hypervisor(dc) 0
184 184
#endif
185 185
#else
186
#define supervisor(dc) (dc->mem_idx >= 1)
186
#define supervisor(dc) (dc->mem_idx >= MMU_KERNEL_IDX)
187 187
#ifdef TARGET_SPARC64
188
#define hypervisor(dc) (dc->mem_idx == 2)
188
#define hypervisor(dc) (dc->mem_idx == MMU_HYPV_IDX)
189 189
#else
190 190
#endif
191 191
#endif

Also available in: Unified diff