| 807 |
|
|
| 808 |
void do_store_msr (CPUPPCState *env, target_ulong value) |
void do_store_msr (CPUPPCState *env, target_ulong value) |
| 809 |
{ |
{ |
| 810 |
|
int enter_pm; |
| 811 |
|
|
| 812 |
value &= env->msr_mask; |
value &= env->msr_mask; |
| 813 |
if (((value >> MSR_IR) & 1) != msr_ir || |
if (((value >> MSR_IR) & 1) != msr_ir || |
| 814 |
((value >> MSR_DR) & 1) != msr_dr) { |
((value >> MSR_DR) & 1) != msr_dr) { |
| 848 |
msr_ri = (value >> MSR_RI) & 1; |
msr_ri = (value >> MSR_RI) & 1; |
| 849 |
msr_le = (value >> MSR_LE) & 1; |
msr_le = (value >> MSR_LE) & 1; |
| 850 |
do_compute_hflags(env); |
do_compute_hflags(env); |
| 851 |
if (msr_pow) { |
|
| 852 |
|
enter_pm = 0; |
| 853 |
|
switch (PPC_EXCP(env)) { |
| 854 |
|
case PPC_FLAGS_EXCP_7x0: |
| 855 |
|
if (msr_pow == 1 && (env->spr[SPR_HID0] & 0x00E00000) != 0) |
| 856 |
|
enter_pm = 1; |
| 857 |
|
break; |
| 858 |
|
default: |
| 859 |
|
break; |
| 860 |
|
} |
| 861 |
|
if (enter_pm) { |
| 862 |
/* power save: exit cpu loop */ |
/* power save: exit cpu loop */ |
| 863 |
|
env->halted = 1; |
| 864 |
env->exception_index = EXCP_HLT; |
env->exception_index = EXCP_HLT; |
| 865 |
cpu_loop_exit(); |
cpu_loop_exit(); |
| 866 |
} |
} |