00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #if !defined(__HELPER_REGS_H__)
00022 #define __HELPER_REGS_H__
00023
00024
00025 static always_inline void hreg_swap_gpr_tgpr (CPUPPCState *env)
00026 {
00027 target_ulong tmp;
00028
00029 tmp = env->gpr[0];
00030 env->gpr[0] = env->tgpr[0];
00031 env->tgpr[0] = tmp;
00032 tmp = env->gpr[1];
00033 env->gpr[1] = env->tgpr[1];
00034 env->tgpr[1] = tmp;
00035 tmp = env->gpr[2];
00036 env->gpr[2] = env->tgpr[2];
00037 env->tgpr[2] = tmp;
00038 tmp = env->gpr[3];
00039 env->gpr[3] = env->tgpr[3];
00040 env->tgpr[3] = tmp;
00041 }
00042
00043 static always_inline void hreg_compute_mem_idx (CPUPPCState *env)
00044 {
00045
00046 if (msr_pr == 0 && msr_hv != 0) {
00047 env->mmu_idx = 2;
00048 } else {
00049 env->mmu_idx = 1 - msr_pr;
00050 }
00051 }
00052
00053 static always_inline void hreg_compute_hflags (CPUPPCState *env)
00054 {
00055 target_ulong hflags_mask;
00056
00057
00058 hflags_mask = (1 << MSR_VR) | (1 << MSR_AP) | (1 << MSR_SA) |
00059 (1 << MSR_PR) | (1 << MSR_FP) | (1 << MSR_SE) | (1 << MSR_BE) |
00060 (1 << MSR_LE);
00061 hflags_mask |= (1ULL << MSR_CM) | (1ULL << MSR_SF) | MSR_HVB;
00062 hreg_compute_mem_idx(env);
00063 env->hflags = env->msr & hflags_mask;
00064
00065 env->hflags |= env->hflags_nmsr;
00066 }
00067
00068 static always_inline int hreg_store_msr (CPUPPCState *env, target_ulong value,
00069 int alter_hv)
00070 {
00071 int excp;
00072
00073 excp = 0;
00074 value &= env->msr_mask;
00075 #if !defined (CONFIG_USER_ONLY)
00076 if (!alter_hv) {
00077
00078 value &= ~MSR_HVB;
00079 value |= env->msr & MSR_HVB;
00080 }
00081 if (((value >> MSR_IR) & 1) != msr_ir ||
00082 ((value >> MSR_DR) & 1) != msr_dr) {
00083
00084 tlb_flush(env, 1);
00085 excp = POWERPC_EXCP_NONE;
00086 env->interrupt_request |= CPU_INTERRUPT_EXITTB;
00087 }
00088 if (unlikely((env->flags & POWERPC_FLAG_TGPR) &&
00089 ((value ^ env->msr) & (1 << MSR_TGPR)))) {
00090
00091 hreg_swap_gpr_tgpr(env);
00092 }
00093 if (unlikely((value >> MSR_EP) & 1) != msr_ep) {
00094
00095 env->excp_prefix = ((value >> MSR_EP) & 1) * 0xFFF00000;
00096 }
00097 #endif
00098 env->msr = value;
00099 hreg_compute_hflags(env);
00100 #if !defined (CONFIG_USER_ONLY)
00101 if (unlikely(msr_pow == 1)) {
00102 if ((*env->check_pow)(env)) {
00103 env->halted = 1;
00104 excp = EXCP_HALTED;
00105 }
00106 }
00107 #endif
00108
00109 return excp;
00110 }
00111
00112 #endif