Revision b172c56a target-ppc/helper.c
b/target-ppc/helper.c | ||
---|---|---|
2134 | 2134 |
{ |
2135 | 2135 |
target_ulong msr, new_msr, vector; |
2136 | 2136 |
int srr0, srr1, asrr0, asrr1; |
2137 |
#if defined(TARGET_PPC64H) |
|
2138 |
int lpes0, lpes1, lev; |
|
2139 |
|
|
2140 |
lpes0 = (env->spr[SPR_LPCR] >> 1) & 1; |
|
2141 |
lpes1 = (env->spr[SPR_LPCR] >> 2) & 1; |
|
2137 |
int lpes0, lpes1; |
|
2138 |
#if defined(TARGET_PPC64) |
|
2139 |
int lev; |
|
2142 | 2140 |
#endif |
2143 | 2141 |
|
2142 |
if (0) { |
|
2143 |
/* XXX: find a suitable condition to enable the hypervisor mode */ |
|
2144 |
lpes0 = (env->spr[SPR_LPCR] >> 1) & 1; |
|
2145 |
lpes1 = (env->spr[SPR_LPCR] >> 2) & 1; |
|
2146 |
} else { |
|
2147 |
/* Those values ensure we won't enter the hypervisor mode */ |
|
2148 |
lpes0 = 0; |
|
2149 |
lpes1 = 1; |
|
2150 |
} |
|
2151 |
|
|
2144 | 2152 |
if (loglevel & CPU_LOG_INT) { |
2145 | 2153 |
fprintf(logfile, "Raise exception at 0x" ADDRX " => 0x%08x (%02x)\n", |
2146 | 2154 |
env->nip, excp, env->error_code); |
... | ... | |
2190 | 2198 |
} |
2191 | 2199 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2192 | 2200 |
new_msr &= ~((target_ulong)1 << MSR_ME); |
2193 |
#if defined(TARGET_PPC64H) |
|
2194 |
new_msr |= (target_ulong)1 << MSR_HV; |
|
2201 |
#if defined(TARGET_PPC64) |
|
2202 |
if (0) { |
|
2203 |
/* XXX: find a suitable condition to enable the hypervisor mode */ |
|
2204 |
new_msr |= (target_ulong)1 << MSR_HV; |
|
2205 |
} |
|
2195 | 2206 |
#endif |
2196 | 2207 |
/* XXX: should also have something loaded in DAR / DSISR */ |
2197 | 2208 |
switch (excp_model) { |
... | ... | |
2217 | 2228 |
} |
2218 | 2229 |
#endif |
2219 | 2230 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2220 |
#if defined(TARGET_PPC64H)
|
|
2231 |
#if defined(TARGET_PPC64) |
|
2221 | 2232 |
if (lpes1 == 0) |
2222 | 2233 |
new_msr |= (target_ulong)1 << MSR_HV; |
2223 | 2234 |
#endif |
... | ... | |
2230 | 2241 |
} |
2231 | 2242 |
#endif |
2232 | 2243 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2233 |
#if defined(TARGET_PPC64H)
|
|
2244 |
#if defined(TARGET_PPC64) |
|
2234 | 2245 |
if (lpes1 == 0) |
2235 | 2246 |
new_msr |= (target_ulong)1 << MSR_HV; |
2236 | 2247 |
#endif |
... | ... | |
2238 | 2249 |
goto store_next; |
2239 | 2250 |
case POWERPC_EXCP_EXTERNAL: /* External input */ |
2240 | 2251 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2241 |
#if defined(TARGET_PPC64H)
|
|
2252 |
#if defined(TARGET_PPC64) |
|
2242 | 2253 |
if (lpes0 == 1) |
2243 | 2254 |
new_msr |= (target_ulong)1 << MSR_HV; |
2244 | 2255 |
#endif |
2245 | 2256 |
goto store_next; |
2246 | 2257 |
case POWERPC_EXCP_ALIGN: /* Alignment exception */ |
2247 | 2258 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2248 |
#if defined(TARGET_PPC64H)
|
|
2259 |
#if defined(TARGET_PPC64) |
|
2249 | 2260 |
if (lpes1 == 0) |
2250 | 2261 |
new_msr |= (target_ulong)1 << MSR_HV; |
2251 | 2262 |
#endif |
... | ... | |
2267 | 2278 |
return; |
2268 | 2279 |
} |
2269 | 2280 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2270 |
#if defined(TARGET_PPC64H)
|
|
2281 |
#if defined(TARGET_PPC64) |
|
2271 | 2282 |
if (lpes1 == 0) |
2272 | 2283 |
new_msr |= (target_ulong)1 << MSR_HV; |
2273 | 2284 |
#endif |
... | ... | |
2284 | 2295 |
} |
2285 | 2296 |
#endif |
2286 | 2297 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2287 |
#if defined(TARGET_PPC64H)
|
|
2298 |
#if defined(TARGET_PPC64) |
|
2288 | 2299 |
if (lpes1 == 0) |
2289 | 2300 |
new_msr |= (target_ulong)1 << MSR_HV; |
2290 | 2301 |
#endif |
... | ... | |
2292 | 2303 |
break; |
2293 | 2304 |
case POWERPC_EXCP_PRIV: |
2294 | 2305 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2295 |
#if defined(TARGET_PPC64H)
|
|
2306 |
#if defined(TARGET_PPC64) |
|
2296 | 2307 |
if (lpes1 == 0) |
2297 | 2308 |
new_msr |= (target_ulong)1 << MSR_HV; |
2298 | 2309 |
#endif |
... | ... | |
2300 | 2311 |
break; |
2301 | 2312 |
case POWERPC_EXCP_TRAP: |
2302 | 2313 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2303 |
#if defined(TARGET_PPC64H)
|
|
2314 |
#if defined(TARGET_PPC64) |
|
2304 | 2315 |
if (lpes1 == 0) |
2305 | 2316 |
new_msr |= (target_ulong)1 << MSR_HV; |
2306 | 2317 |
#endif |
... | ... | |
2315 | 2326 |
goto store_current; |
2316 | 2327 |
case POWERPC_EXCP_FPU: /* Floating-point unavailable exception */ |
2317 | 2328 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2318 |
#if defined(TARGET_PPC64H)
|
|
2329 |
#if defined(TARGET_PPC64) |
|
2319 | 2330 |
if (lpes1 == 0) |
2320 | 2331 |
new_msr |= (target_ulong)1 << MSR_HV; |
2321 | 2332 |
#endif |
... | ... | |
2336 | 2347 |
dump_syscall(env); |
2337 | 2348 |
} |
2338 | 2349 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2339 |
#if defined(TARGET_PPC64H)
|
|
2350 |
#if defined(TARGET_PPC64) |
|
2340 | 2351 |
lev = env->error_code; |
2341 | 2352 |
if (lev == 1 || (lpes0 == 0 && lpes1 == 0)) |
2342 | 2353 |
new_msr |= (target_ulong)1 << MSR_HV; |
... | ... | |
2347 | 2358 |
goto store_current; |
2348 | 2359 |
case POWERPC_EXCP_DECR: /* Decrementer exception */ |
2349 | 2360 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2350 |
#if defined(TARGET_PPC64H)
|
|
2361 |
#if defined(TARGET_PPC64) |
|
2351 | 2362 |
if (lpes1 == 0) |
2352 | 2363 |
new_msr |= (target_ulong)1 << MSR_HV; |
2353 | 2364 |
#endif |
... | ... | |
2434 | 2445 |
goto store_next; |
2435 | 2446 |
case POWERPC_EXCP_RESET: /* System reset exception */ |
2436 | 2447 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2437 |
#if defined(TARGET_PPC64H)
|
|
2448 |
#if defined(TARGET_PPC64) |
|
2438 | 2449 |
new_msr |= (target_ulong)1 << MSR_HV; |
2439 | 2450 |
#endif |
2440 | 2451 |
goto store_next; |
2441 |
#if defined(TARGET_PPC64) |
|
2442 | 2452 |
case POWERPC_EXCP_DSEG: /* Data segment exception */ |
2443 | 2453 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2444 |
#if defined(TARGET_PPC64H)
|
|
2454 |
#if defined(TARGET_PPC64) |
|
2445 | 2455 |
if (lpes1 == 0) |
2446 | 2456 |
new_msr |= (target_ulong)1 << MSR_HV; |
2447 | 2457 |
#endif |
2448 | 2458 |
goto store_next; |
2449 | 2459 |
case POWERPC_EXCP_ISEG: /* Instruction segment exception */ |
2450 | 2460 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2451 |
#if defined(TARGET_PPC64H)
|
|
2461 |
#if defined(TARGET_PPC64) |
|
2452 | 2462 |
if (lpes1 == 0) |
2453 | 2463 |
new_msr |= (target_ulong)1 << MSR_HV; |
2454 | 2464 |
#endif |
2455 | 2465 |
goto store_next; |
2456 |
#endif /* defined(TARGET_PPC64) */ |
|
2457 |
#if defined(TARGET_PPC64H) |
|
2458 | 2466 |
case POWERPC_EXCP_HDECR: /* Hypervisor decrementer exception */ |
2459 | 2467 |
srr0 = SPR_HSRR0; |
2460 | 2468 |
srr1 = SPR_HSRR1; |
2469 |
#if defined(TARGET_PPC64) |
|
2461 | 2470 |
new_msr |= (target_ulong)1 << MSR_HV; |
2462 |
goto store_next; |
|
2463 | 2471 |
#endif |
2472 |
goto store_next; |
|
2464 | 2473 |
case POWERPC_EXCP_TRACE: /* Trace exception */ |
2465 | 2474 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2466 |
#if defined(TARGET_PPC64H)
|
|
2475 |
#if defined(TARGET_PPC64) |
|
2467 | 2476 |
if (lpes1 == 0) |
2468 | 2477 |
new_msr |= (target_ulong)1 << MSR_HV; |
2469 | 2478 |
#endif |
2470 | 2479 |
goto store_next; |
2471 |
#if defined(TARGET_PPC64H) |
|
2472 | 2480 |
case POWERPC_EXCP_HDSI: /* Hypervisor data storage exception */ |
2473 | 2481 |
srr0 = SPR_HSRR0; |
2474 | 2482 |
srr1 = SPR_HSRR1; |
2483 |
#if defined(TARGET_PPC64) |
|
2475 | 2484 |
new_msr |= (target_ulong)1 << MSR_HV; |
2485 |
#endif |
|
2476 | 2486 |
goto store_next; |
2477 | 2487 |
case POWERPC_EXCP_HISI: /* Hypervisor instruction storage exception */ |
2478 | 2488 |
srr0 = SPR_HSRR0; |
2479 | 2489 |
srr1 = SPR_HSRR1; |
2490 |
#if defined(TARGET_PPC64) |
|
2480 | 2491 |
new_msr |= (target_ulong)1 << MSR_HV; |
2492 |
#endif |
|
2481 | 2493 |
goto store_next; |
2482 | 2494 |
case POWERPC_EXCP_HDSEG: /* Hypervisor data segment exception */ |
2483 | 2495 |
srr0 = SPR_HSRR0; |
2484 | 2496 |
srr1 = SPR_HSRR1; |
2497 |
#if defined(TARGET_PPC64) |
|
2485 | 2498 |
new_msr |= (target_ulong)1 << MSR_HV; |
2499 |
#endif |
|
2486 | 2500 |
goto store_next; |
2487 | 2501 |
case POWERPC_EXCP_HISEG: /* Hypervisor instruction segment exception */ |
2488 | 2502 |
srr0 = SPR_HSRR0; |
2489 | 2503 |
srr1 = SPR_HSRR1; |
2504 |
#if defined(TARGET_PPC64) |
|
2490 | 2505 |
new_msr |= (target_ulong)1 << MSR_HV; |
2506 |
#endif |
|
2491 | 2507 |
goto store_next; |
2492 |
#endif /* defined(TARGET_PPC64H) */ |
|
2493 | 2508 |
case POWERPC_EXCP_VPU: /* Vector unavailable exception */ |
2494 | 2509 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2495 |
#if defined(TARGET_PPC64H)
|
|
2510 |
#if defined(TARGET_PPC64) |
|
2496 | 2511 |
if (lpes1 == 0) |
2497 | 2512 |
new_msr |= (target_ulong)1 << MSR_HV; |
2498 | 2513 |
#endif |
... | ... | |
2519 | 2534 |
goto store_next; |
2520 | 2535 |
case POWERPC_EXCP_IFTLB: /* Instruction fetch TLB error */ |
2521 | 2536 |
new_msr &= ~((target_ulong)1 << MSR_RI); /* XXX: check this */ |
2522 |
#if defined(TARGET_PPC64H) /* XXX: check this */
|
|
2537 |
#if defined(TARGET_PPC64) /* XXX: check this */ |
|
2523 | 2538 |
if (lpes1 == 0) |
2524 | 2539 |
new_msr |= (target_ulong)1 << MSR_HV; |
2525 | 2540 |
#endif |
... | ... | |
2540 | 2555 |
break; |
2541 | 2556 |
case POWERPC_EXCP_DLTLB: /* Data load TLB miss */ |
2542 | 2557 |
new_msr &= ~((target_ulong)1 << MSR_RI); /* XXX: check this */ |
2543 |
#if defined(TARGET_PPC64H) /* XXX: check this */
|
|
2558 |
#if defined(TARGET_PPC64) /* XXX: check this */ |
|
2544 | 2559 |
if (lpes1 == 0) |
2545 | 2560 |
new_msr |= (target_ulong)1 << MSR_HV; |
2546 | 2561 |
#endif |
... | ... | |
2561 | 2576 |
break; |
2562 | 2577 |
case POWERPC_EXCP_DSTLB: /* Data store TLB miss */ |
2563 | 2578 |
new_msr &= ~((target_ulong)1 << MSR_RI); /* XXX: check this */ |
2564 |
#if defined(TARGET_PPC64H) /* XXX: check this */
|
|
2579 |
#if defined(TARGET_PPC64) /* XXX: check this */ |
|
2565 | 2580 |
if (lpes1 == 0) |
2566 | 2581 |
new_msr |= (target_ulong)1 << MSR_HV; |
2567 | 2582 |
#endif |
... | ... | |
2663 | 2678 |
goto store_next; |
2664 | 2679 |
case POWERPC_EXCP_PERFM: /* Embedded performance monitor interrupt */ |
2665 | 2680 |
new_msr &= ~((target_ulong)1 << MSR_RI); |
2666 |
#if defined(TARGET_PPC64H)
|
|
2681 |
#if defined(TARGET_PPC64) |
|
2667 | 2682 |
if (lpes1 == 0) |
2668 | 2683 |
new_msr |= (target_ulong)1 << MSR_HV; |
2669 | 2684 |
#endif |
... | ... | |
2769 | 2784 |
|
2770 | 2785 |
void ppc_hw_interrupt (CPUPPCState *env) |
2771 | 2786 |
{ |
2772 |
#if defined(TARGET_PPC64H)
|
|
2787 |
#if defined(TARGET_PPC64) |
|
2773 | 2788 |
int hdice; |
2774 | 2789 |
#endif |
2775 | 2790 |
|
... | ... | |
2800 | 2815 |
return; |
2801 | 2816 |
} |
2802 | 2817 |
#endif |
2803 |
#if defined(TARGET_PPC64H) |
|
2804 |
hdice = env->spr[SPR_LPCR] & 1; |
|
2818 |
#if defined(TARGET_PPC64) |
|
2819 |
if (0) { |
|
2820 |
/* XXX: find a suitable condition to enable the hypervisor mode */ |
|
2821 |
hdice = env->spr[SPR_LPCR] & 1; |
|
2822 |
} else { |
|
2823 |
hdice = 0; |
|
2824 |
} |
|
2805 | 2825 |
if ((msr_ee != 0 || msr_hv == 0 || msr_pr != 0) && hdice != 0) { |
2806 | 2826 |
/* Hypervisor decrementer exception */ |
2807 | 2827 |
if (env->pending_interrupts & (1 << PPC_INTERRUPT_HDECR)) { |
Also available in: Unified diff