Revision d63001d1 target-ppc/translate.c
b/target-ppc/translate.c | ||
---|---|---|
169 | 169 |
#endif |
170 | 170 |
ppc_spr_t *spr_cb; /* Needed to check rights for mfspr/mtspr */ |
171 | 171 |
int singlestep_enabled; |
172 |
int dcache_line_size; |
|
172 | 173 |
} DisasContext; |
173 | 174 |
|
174 | 175 |
struct opc_handler_t { |
... | ... | |
482 | 483 |
PPC_WAIT = 0x0000100000000000ULL, |
483 | 484 |
/* New 64 bits extensions (PowerPC 2.0x) */ |
484 | 485 |
PPC_64BX = 0x0000200000000000ULL, |
486 |
/* dcbz instruction with fixed cache line size */ |
|
487 |
PPC_CACHE_DCBZ = 0x0000400000000000ULL, |
|
488 |
/* dcbz instruction with tunable cache line size */ |
|
489 |
PPC_CACHE_DCBZT = 0x0000800000000000ULL, |
|
485 | 490 |
}; |
486 | 491 |
|
487 | 492 |
/*****************************************************************************/ |
... | ... | |
3623 | 3628 |
} |
3624 | 3629 |
|
3625 | 3630 |
/* dcbz */ |
3626 |
#define op_dcbz() (*gen_op_dcbz[ctx->mem_idx])()
|
|
3631 |
#define op_dcbz(n) (*gen_op_dcbz[n][ctx->mem_idx])()
|
|
3627 | 3632 |
#if defined(CONFIG_USER_ONLY) |
3628 | 3633 |
/* User-mode only */ |
3629 |
static GenOpFunc *gen_op_dcbz[] = { |
|
3630 |
&gen_op_dcbz_raw, |
|
3631 |
&gen_op_dcbz_raw, |
|
3634 |
static GenOpFunc *gen_op_dcbz[4][4] = { |
|
3635 |
{ |
|
3636 |
&gen_op_dcbz_l32_raw, |
|
3637 |
&gen_op_dcbz_l32_raw, |
|
3632 | 3638 |
#if defined(TARGET_PPC64) |
3633 |
&gen_op_dcbz_64_raw,
|
|
3634 |
&gen_op_dcbz_64_raw,
|
|
3639 |
&gen_op_dcbz_l32_64_raw,
|
|
3640 |
&gen_op_dcbz_l32_64_raw,
|
|
3635 | 3641 |
#endif |
3642 |
}, |
|
3643 |
{ |
|
3644 |
&gen_op_dcbz_l64_raw, |
|
3645 |
&gen_op_dcbz_l64_raw, |
|
3646 |
#if defined(TARGET_PPC64) |
|
3647 |
&gen_op_dcbz_l64_64_raw, |
|
3648 |
&gen_op_dcbz_l64_64_raw, |
|
3649 |
#endif |
|
3650 |
}, |
|
3651 |
{ |
|
3652 |
&gen_op_dcbz_l128_raw, |
|
3653 |
&gen_op_dcbz_l128_raw, |
|
3654 |
#if defined(TARGET_PPC64) |
|
3655 |
&gen_op_dcbz_l128_64_raw, |
|
3656 |
&gen_op_dcbz_l128_64_raw, |
|
3657 |
#endif |
|
3658 |
}, |
|
3659 |
{ |
|
3660 |
&gen_op_dcbz_raw, |
|
3661 |
&gen_op_dcbz_raw, |
|
3662 |
#if defined(TARGET_PPC64) |
|
3663 |
&gen_op_dcbz_64_raw, |
|
3664 |
&gen_op_dcbz_64_raw, |
|
3665 |
#endif |
|
3666 |
}, |
|
3636 | 3667 |
}; |
3637 | 3668 |
#else |
3638 | 3669 |
#if defined(TARGET_PPC64) |
3639 | 3670 |
/* Full system - 64 bits mode */ |
3640 |
static GenOpFunc *gen_op_dcbz[] = { |
|
3641 |
&gen_op_dcbz_user, |
|
3642 |
&gen_op_dcbz_user, |
|
3643 |
&gen_op_dcbz_64_user, |
|
3644 |
&gen_op_dcbz_64_user, |
|
3645 |
&gen_op_dcbz_kernel, |
|
3646 |
&gen_op_dcbz_kernel, |
|
3647 |
&gen_op_dcbz_64_kernel, |
|
3648 |
&gen_op_dcbz_64_kernel, |
|
3671 |
static GenOpFunc *gen_op_dcbz[4][12] = { |
|
3672 |
{ |
|
3673 |
&gen_op_dcbz_l32_user, |
|
3674 |
&gen_op_dcbz_l32_user, |
|
3675 |
&gen_op_dcbz_l32_64_user, |
|
3676 |
&gen_op_dcbz_l32_64_user, |
|
3677 |
&gen_op_dcbz_l32_kernel, |
|
3678 |
&gen_op_dcbz_l32_kernel, |
|
3679 |
&gen_op_dcbz_l32_64_kernel, |
|
3680 |
&gen_op_dcbz_l32_64_kernel, |
|
3681 |
#if defined(TARGET_PPC64H) |
|
3682 |
&gen_op_dcbz_l32_hypv, |
|
3683 |
&gen_op_dcbz_l32_hypv, |
|
3684 |
&gen_op_dcbz_l32_64_hypv, |
|
3685 |
&gen_op_dcbz_l32_64_hypv, |
|
3686 |
#endif |
|
3687 |
}, |
|
3688 |
{ |
|
3689 |
&gen_op_dcbz_l64_user, |
|
3690 |
&gen_op_dcbz_l64_user, |
|
3691 |
&gen_op_dcbz_l64_64_user, |
|
3692 |
&gen_op_dcbz_l64_64_user, |
|
3693 |
&gen_op_dcbz_l64_kernel, |
|
3694 |
&gen_op_dcbz_l64_kernel, |
|
3695 |
&gen_op_dcbz_l64_64_kernel, |
|
3696 |
&gen_op_dcbz_l64_64_kernel, |
|
3649 | 3697 |
#if defined(TARGET_PPC64H) |
3650 |
&gen_op_dcbz_hypv, |
|
3651 |
&gen_op_dcbz_hypv, |
|
3652 |
&gen_op_dcbz_64_hypv, |
|
3653 |
&gen_op_dcbz_64_hypv, |
|
3698 |
&gen_op_dcbz_l64_hypv, |
|
3699 |
&gen_op_dcbz_l64_hypv, |
|
3700 |
&gen_op_dcbz_l64_64_hypv, |
|
3701 |
&gen_op_dcbz_l64_64_hypv, |
|
3702 |
#endif |
|
3703 |
}, |
|
3704 |
{ |
|
3705 |
&gen_op_dcbz_l128_user, |
|
3706 |
&gen_op_dcbz_l128_user, |
|
3707 |
&gen_op_dcbz_l128_64_user, |
|
3708 |
&gen_op_dcbz_l128_64_user, |
|
3709 |
&gen_op_dcbz_l128_kernel, |
|
3710 |
&gen_op_dcbz_l128_kernel, |
|
3711 |
&gen_op_dcbz_l128_64_kernel, |
|
3712 |
&gen_op_dcbz_l128_64_kernel, |
|
3713 |
#if defined(TARGET_PPC64H) |
|
3714 |
&gen_op_dcbz_l128_hypv, |
|
3715 |
&gen_op_dcbz_l128_hypv, |
|
3716 |
&gen_op_dcbz_l128_64_hypv, |
|
3717 |
&gen_op_dcbz_l128_64_hypv, |
|
3718 |
#endif |
|
3719 |
}, |
|
3720 |
{ |
|
3721 |
&gen_op_dcbz_user, |
|
3722 |
&gen_op_dcbz_user, |
|
3723 |
&gen_op_dcbz_64_user, |
|
3724 |
&gen_op_dcbz_64_user, |
|
3725 |
&gen_op_dcbz_kernel, |
|
3726 |
&gen_op_dcbz_kernel, |
|
3727 |
&gen_op_dcbz_64_kernel, |
|
3728 |
&gen_op_dcbz_64_kernel, |
|
3729 |
#if defined(TARGET_PPC64H) |
|
3730 |
&gen_op_dcbz_hypv, |
|
3731 |
&gen_op_dcbz_hypv, |
|
3732 |
&gen_op_dcbz_64_hypv, |
|
3733 |
&gen_op_dcbz_64_hypv, |
|
3654 | 3734 |
#endif |
3735 |
}, |
|
3655 | 3736 |
}; |
3656 | 3737 |
#else |
3657 | 3738 |
/* Full system - 32 bits mode */ |
3658 |
static GenOpFunc *gen_op_dcbz[] = { |
|
3659 |
&gen_op_dcbz_user, |
|
3660 |
&gen_op_dcbz_user, |
|
3661 |
&gen_op_dcbz_kernel, |
|
3662 |
&gen_op_dcbz_kernel, |
|
3739 |
static GenOpFunc *gen_op_dcbz[4][4] = { |
|
3740 |
{ |
|
3741 |
&gen_op_dcbz_l32_user, |
|
3742 |
&gen_op_dcbz_l32_user, |
|
3743 |
&gen_op_dcbz_l32_kernel, |
|
3744 |
&gen_op_dcbz_l32_kernel, |
|
3745 |
}, |
|
3746 |
{ |
|
3747 |
&gen_op_dcbz_l64_user, |
|
3748 |
&gen_op_dcbz_l64_user, |
|
3749 |
&gen_op_dcbz_l64_kernel, |
|
3750 |
&gen_op_dcbz_l64_kernel, |
|
3751 |
}, |
|
3752 |
{ |
|
3753 |
&gen_op_dcbz_l128_user, |
|
3754 |
&gen_op_dcbz_l128_user, |
|
3755 |
&gen_op_dcbz_l128_kernel, |
|
3756 |
&gen_op_dcbz_l128_kernel, |
|
3757 |
}, |
|
3758 |
{ |
|
3759 |
&gen_op_dcbz_user, |
|
3760 |
&gen_op_dcbz_user, |
|
3761 |
&gen_op_dcbz_kernel, |
|
3762 |
&gen_op_dcbz_kernel, |
|
3763 |
}, |
|
3663 | 3764 |
}; |
3664 | 3765 |
#endif |
3665 | 3766 |
#endif |
3666 | 3767 |
|
3667 |
GEN_HANDLER(dcbz, 0x1F, 0x16, 0x1F, 0x03E00001, PPC_CACHE) |
|
3768 |
static inline void handler_dcbz (DisasContext *ctx, int dcache_line_size) |
|
3769 |
{ |
|
3770 |
int n; |
|
3771 |
|
|
3772 |
switch (dcache_line_size) { |
|
3773 |
case 32: |
|
3774 |
n = 0; |
|
3775 |
break; |
|
3776 |
case 64: |
|
3777 |
n = 1; |
|
3778 |
break; |
|
3779 |
case 128: |
|
3780 |
n = 2; |
|
3781 |
break; |
|
3782 |
default: |
|
3783 |
n = 3; |
|
3784 |
break; |
|
3785 |
} |
|
3786 |
op_dcbz(n); |
|
3787 |
} |
|
3788 |
|
|
3789 |
GEN_HANDLER(dcbz, 0x1F, 0x16, 0x1F, 0x03E00001, PPC_CACHE_DCBZ) |
|
3668 | 3790 |
{ |
3669 | 3791 |
gen_addr_reg_index(ctx); |
3670 |
op_dcbz(); |
|
3792 |
handler_dcbz(ctx, ctx->dcache_line_size); |
|
3793 |
gen_op_check_reservation(); |
|
3794 |
} |
|
3795 |
|
|
3796 |
GEN_HANDLER(dcbz_970, 0x1F, 0x16, 0x1F, 0x03C00001, PPC_CACHE_DCBZT) |
|
3797 |
{ |
|
3798 |
gen_addr_reg_index(ctx); |
|
3799 |
if (ctx->opcode & 0x00200000) |
|
3800 |
handler_dcbz(ctx, ctx->dcache_line_size); |
|
3801 |
else |
|
3802 |
handler_dcbz(ctx, -1); |
|
3671 | 3803 |
gen_op_check_reservation(); |
3672 | 3804 |
} |
3673 | 3805 |
|
... | ... | |
6341 | 6473 |
#else |
6342 | 6474 |
ctx.mem_idx = (supervisor << 1) | msr_le; |
6343 | 6475 |
#endif |
6476 |
ctx.dcache_line_size = env->dcache_line_size; |
|
6344 | 6477 |
ctx.fpu_enabled = msr_fp; |
6345 | 6478 |
#if defined(TARGET_PPCEMB) |
6346 | 6479 |
ctx.spe_enabled = msr_spe; |
Also available in: Unified diff