[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PULL 07/12] ppc: Get out of emulation on SMT "OR" ops
From: |
David Gibson |
Subject: |
[Qemu-ppc] [PULL 07/12] ppc: Get out of emulation on SMT "OR" ops |
Date: |
Tue, 31 May 2016 10:41:12 +1000 |
From: Benjamin Herrenschmidt <address@hidden>
Otherwise tight loops at smt_low for example, which OPAL does,
eat so much CPU that we can't boot a kernel anymore. With that,
I can boot 8 CPUs just fine with powernv.
Signed-off-by: Benjamin Herrenschmidt <address@hidden>
Reviewed-by: David Gibson <address@hidden>
Signed-off-by: David Gibson <address@hidden>
---
target-ppc/translate.c | 21 ++++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 51f6eb1..fe10bf8 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -1392,6 +1392,19 @@ GEN_LOGICAL2(nand, tcg_gen_nand_tl, 0x0E, PPC_INTEGER);
/* nor & nor. */
GEN_LOGICAL2(nor, tcg_gen_nor_tl, 0x03, PPC_INTEGER);
+#if defined(TARGET_PPC64)
+static void gen_pause(DisasContext *ctx)
+{
+ TCGv_i32 t0 = tcg_const_i32(0);
+ tcg_gen_st_i32(t0, cpu_env,
+ -offsetof(PowerPCCPU, env) + offsetof(CPUState, halted));
+ tcg_temp_free_i32(t0);
+
+ /* Stop translation, this gives other CPUs a chance to run */
+ gen_exception_err(ctx, EXCP_HLT, 1);
+}
+#endif /* defined(TARGET_PPC64) */
+
/* or & or. */
static void gen_or(DisasContext *ctx)
{
@@ -1447,7 +1460,7 @@ static void gen_or(DisasContext *ctx)
}
break;
case 7:
- if (ctx->hv) {
+ if (ctx->hv && !ctx->pr) {
/* Set process priority to very high */
prio = 7;
}
@@ -1464,6 +1477,10 @@ static void gen_or(DisasContext *ctx)
tcg_gen_ori_tl(t0, t0, ((uint64_t)prio) << 50);
gen_store_spr(SPR_PPR, t0);
tcg_temp_free(t0);
+ /* Pause us out of TCG otherwise spin loops with smt_low
+ * eat too much CPU and the kernel hangs
+ */
+ gen_pause(ctx);
}
#endif
}
@@ -1489,8 +1506,6 @@ static void gen_ori(DisasContext *ctx)
target_ulong uimm = UIMM(ctx->opcode);
if (rS(ctx->opcode) == rA(ctx->opcode) && uimm == 0) {
- /* NOP */
- /* XXX: should handle special NOPs for POWER series */
return;
}
tcg_gen_ori_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)], uimm);
--
2.5.5
- Re: [Qemu-ppc] [PULL 04/12] ppc: tlbie, tlbia and tlbisync are HV only, (continued)
- [Qemu-ppc] [PULL 09/12] exec: Remove cpu from cpus list during cpu_exec_exit(), David Gibson, 2016/05/30
- [Qemu-ppc] [PULL 01/12] ppc: Remove MMU_MODEn_SUFFIX definitions, David Gibson, 2016/05/30
- [Qemu-ppc] [PULL 02/12] ppc: Use split I/D mmu modes to avoid flushes on interrupts, David Gibson, 2016/05/30
- [Qemu-ppc] [PULL 03/12] ppc: Do some batching of TCG tlb flushes, David Gibson, 2016/05/30
- [Qemu-ppc] [PULL 05/12] ppc: Change 'invalid' bit mask of tlbiel and tlbie, David Gibson, 2016/05/30
- [Qemu-ppc] [PULL 10/12] exec: Do vmstate unregistration from cpu_exec_exit(), David Gibson, 2016/05/30
- [Qemu-ppc] [PULL 08/12] ppc: Add PPC_64H instruction flag to POWER7 and POWER8, David Gibson, 2016/05/30
- [Qemu-ppc] [PULL 11/12] cpu: Reclaim vCPU objects, David Gibson, 2016/05/30
- [Qemu-ppc] [PULL 07/12] ppc: Get out of emulation on SMT "OR" ops,
David Gibson <=
- [Qemu-ppc] [PULL 12/12] cpu: Add a sync version of cpu_remove(), David Gibson, 2016/05/30
- [Qemu-ppc] [PULL 06/12] ppc: Fix sign extension issue in mtmsr(d) emulation, David Gibson, 2016/05/30