Revision f9fdea6b target-ppc/helper.c
b/target-ppc/helper.c | ||
---|---|---|
2002 | 2002 |
{ |
2003 | 2003 |
target_ulong msr, new_msr, vector; |
2004 | 2004 |
int srr0, srr1, asrr0, asrr1; |
2005 |
#if defined(TARGET_PPC64H) |
|
2006 |
int lpes0, lpes1, lev; |
|
2007 |
|
|
2008 |
lpes0 = (env->spr[SPR_LPCR] >> 1) & 1; |
|
2009 |
lpes1 = (env->spr[SPR_LPCR] >> 2) & 1; |
|
2010 |
#endif |
|
2005 | 2011 |
|
2006 | 2012 |
if (loglevel & CPU_LOG_INT) { |
2007 | 2013 |
fprintf(logfile, "Raise exception at 0x" ADDRX " => 0x%08x (%02x)\n", |
... | ... | |
2201 | 2207 |
} |
2202 | 2208 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2203 | 2209 |
#if defined(TARGET_PPC64H) |
2210 |
lev = env->error_code; |
|
2204 | 2211 |
if (lev == 1 || (lpes0 == 0 && lpes1 == 0)) |
2205 | 2212 |
new_msr |= (target_ulong)1 << MSR_HV; |
2206 | 2213 |
#endif |
... | ... | |
2322 | 2329 |
#if defined(TARGET_PPC64H) |
2323 | 2330 |
case POWERPC_EXCP_HDECR: /* Hypervisor decrementer exception */ |
2324 | 2331 |
srr0 = SPR_HSRR0; |
2325 |
srr1 = SPR_HSSR1;
|
|
2332 |
srr1 = SPR_HSRR1;
|
|
2326 | 2333 |
new_msr |= (target_ulong)1 << MSR_HV; |
2327 | 2334 |
goto store_next; |
2328 | 2335 |
#endif |
... | ... | |
2336 | 2343 |
#if defined(TARGET_PPC64H) |
2337 | 2344 |
case POWERPC_EXCP_HDSI: /* Hypervisor data storage exception */ |
2338 | 2345 |
srr0 = SPR_HSRR0; |
2339 |
srr1 = SPR_HSSR1;
|
|
2346 |
srr1 = SPR_HSRR1;
|
|
2340 | 2347 |
new_msr |= (target_ulong)1 << MSR_HV; |
2341 | 2348 |
goto store_next; |
2342 | 2349 |
case POWERPC_EXCP_HISI: /* Hypervisor instruction storage exception */ |
2343 | 2350 |
srr0 = SPR_HSRR0; |
2344 |
srr1 = SPR_HSSR1;
|
|
2351 |
srr1 = SPR_HSRR1;
|
|
2345 | 2352 |
new_msr |= (target_ulong)1 << MSR_HV; |
2346 | 2353 |
goto store_next; |
2347 | 2354 |
case POWERPC_EXCP_HDSEG: /* Hypervisor data segment exception */ |
2348 | 2355 |
srr0 = SPR_HSRR0; |
2349 |
srr1 = SPR_HSSR1;
|
|
2356 |
srr1 = SPR_HSRR1;
|
|
2350 | 2357 |
new_msr |= (target_ulong)1 << MSR_HV; |
2351 | 2358 |
goto store_next; |
2352 | 2359 |
case POWERPC_EXCP_HISEG: /* Hypervisor instruction segment exception */ |
2353 | 2360 |
srr0 = SPR_HSRR0; |
2354 |
srr1 = SPR_HSSR1;
|
|
2361 |
srr1 = SPR_HSRR1;
|
|
2355 | 2362 |
new_msr |= (target_ulong)1 << MSR_HV; |
2356 | 2363 |
goto store_next; |
2357 | 2364 |
#endif /* defined(TARGET_PPC64H) */ |
... | ... | |
2633 | 2640 |
|
2634 | 2641 |
void ppc_hw_interrupt (CPUPPCState *env) |
2635 | 2642 |
{ |
2643 |
#if defined(TARGET_PPC64H) |
|
2644 |
int hdice; |
|
2645 |
#endif |
|
2646 |
|
|
2636 | 2647 |
#if 0 |
2637 | 2648 |
if (loglevel & CPU_LOG_INT) { |
2638 | 2649 |
fprintf(logfile, "%s: %p pending %08x req %08x me %d ee %d\n", |
... | ... | |
2661 | 2672 |
} |
2662 | 2673 |
#endif |
2663 | 2674 |
#if defined(TARGET_PPC64H) |
2664 |
if ((msr_ee != 0 || msr_hv == 0 || msr_pr != 0) & hdice != 0) { |
|
2675 |
hdice = env->spr[SPR_LPCR] & 1; |
|
2676 |
if ((msr_ee != 0 || msr_hv == 0 || msr_pr != 0) && hdice != 0) { |
|
2665 | 2677 |
/* Hypervisor decrementer exception */ |
2666 | 2678 |
if (env->pending_interrupts & (1 << PPC_INTERRUPT_HDECR)) { |
2667 | 2679 |
env->pending_interrupts &= ~(1 << PPC_INTERRUPT_HDECR); |
Also available in: Unified diff