Skip to contentSkip to conversation

ppc: Improve emulation of THRM registers

PATCH In review G 3 2 participants 3 messages Jun 19, 2016 1 message not in the archive

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

G 3

author
#1 lore raw

PATCH 1/1 ppc: Improve emulation of THRM registers

Quoted 11 lines · On 6/19/16 12:12 AM, [email protected] wrote:

Message: 5
Date: Sun, 19 Jun 2016 10:54:13 +1000
From: Benjamin Herrenschmidt<[email protected]> To:[email protected] Cc:[email protected],[email protected], Mark

	Cave-Ayland	<[email protected]>, Alexander Graf
	<[email protected]>

Subject: [Qemu-devel] [PATCH] ppc: Improve emulation of THRM registers Message-ID:<[email protected]>
Content-Type: text/plain; charset="UTF-8"

Quoted 8 lines

The 75x and 74xx processors have some thermal monitoring SPRs that some OSes such as MacOS do use. Our current "dumb" implementation isn't good enough and will cause some versions of MacOS to hang during boot.

This lifts an improved emulation from MacOnLinux and adapts it to qemu, thus fixing the problem.

Which versions of the Mac OS hang?

#2 lore raw
Quoted 20 lines · On Sun, 2016-06-19 at 11:09 -0400, G 3 wrote:
Quoted 19 lines · On 6/19/16 12:12 AM, [email protected] wrote:

Message: 5
Date: Sun, 19 Jun 2016 10:54:13 +1000
From: Benjamin Herrenschmidt<[email protected]> To:[email protected] Cc:[email protected],[email protected], Mark
Cave-Ayland <[email protected]>, Alexander
Graf

	<[email protected]>

Subject: [Qemu-devel] [PATCH] ppc: Improve emulation of THRM registers Message-ID:<[email protected]>
Content-Type: text/plain; charset="UTF-8"

The 75x and 74xx processors have some thermal monitoring SPRs that some OSes such as MacOS do use. Our current "dumb" implementation isn't good enough and will cause some versions of MacOS to hang during
boot.

Quoted 4 lines
Quoted 3 lines

This lifts an improved emulation from MacOnLinux and adapts it to qemu, thus fixing the problem.

Which versions of the Mac OS hang?

The Apple CPU Plugin in 9.2.x afaik (well 9.2.2 for sure).

Cheers,
Ben.

#3 lore raw

PATCH 1/1 ppc: Improve emulation of THRM registers

In reply to a message not in the archive
Quoted 112 lines · On Jun 19, 2016, at 12:12 AM, [email protected] wrote:

Message: 5
Date: Sun, 19 Jun 2016 10:54:13 +1000
From: Benjamin Herrenschmidt <[email protected]>
To: [email protected]
Cc: [email protected], [email protected], Mark

	Cave-Ayland	<[email protected]>, Alexander Graf
	<[email protected]>

Subject: [Qemu-devel] [PATCH] ppc: Improve emulation of THRM registers
Message-ID: <[email protected]>
Content-Type: text/plain; charset="UTF-8"

The 75x and 74xx processors have some thermal monitoring SPRs that some OSes such as MacOS do use. Our current "dumb" implementation isn't good enough and will cause some versions of MacOS to hang during boot.

This lifts an improved emulation from MacOnLinux and adapts it to qemu, thus fixing the problem.

---

target-ppc/helper.h         |  1 +
target-ppc/misc_helper.c    | 41 +++++++++++++++++++++++++++++++++++++++++
target-ppc/translate_init.c | 13 ++++++++++---
3 files changed, 52 insertions(+), 3 deletions(-)
target-ppc/helper.h +1 -0
index f4410a8..18eb52f 100644
@@ -670,3 +670,4 @@ DEF_HELPER_4(dscli, void, env, fprp, fprp, i32)
 DEF_HELPER_4(dscliq, void, env, fprp, fprp, i32)
 
 DEF_HELPER_1(tbegin, void, env)
+DEF_HELPER_1(fixup_thrm, void, env)
target-ppc/misc_helper.c +41 -0
index 7d41b01..4315778 100644
@@ -166,3 +166,44 @@ void ppc_store_msr(CPUPPCState *env, target_ulong value)
 {
    hreg_store_msr(env, value, 0);
 }
+
+/* This code is lifted from MacOnLinux. It is called whenever
+ * THRM1,2 or 3 is read an fixes up the values in such a way
+ * that will mac MacOS not hang. These registers exist on some
+ * 75x and 74xx processors.
+ */
+void helper_fixup_thrm(CPUPPCState *env)
+{
+    target_ulong v, t;
+    int i;
+
+#define THRM1_TIN       (1 << 31)
+#define THRM1_TIV       (1 << 30)
+#define THRM1_THRES(x)  ((x&0x7f)<<23)
+#define THRM1_TID       (1<<2)
+#define THRM1_TIE       (1<<1)
+#define THRM1_V         (1<<0)
+#define THRM3_E         (1<<0)
+
+    if(!(env->spr[SPR_THRM3] & THRM3_E)) {
+        return;
+    }
+
+    /* Note: Thermal interrupts are unimplemented */
+    for (i=SPR_THRM1 ; i<= SPR_THRM2 ; i++) {
+        v = env->spr[i];
+        if (!(v & THRM1_V)) {
+            continue;
+        }
+        v |= THRM1_TIV;
+        v &= ~THRM1_TIN;
+        t = v & THRM1_THRES(127);
+        if ((v & THRM1_TID) && t < THRM1_THRES(24)) {
+            v |= THRM1_TIN;
+        }
+        if (!(v & THRM1_TID) && t > THRM1_THRES(24)) {
+            v |= THRM1_TIN;
+        }
+        env->spr[i] = v;
+    }
+}
target-ppc/translate_init.c +8 -2
index ca894ff..0f18abf 100644
@@ -1179,23 +1179,30 @@ static void gen_spr_amr(CPUPPCState *env, bool has_iamr)
 }
 #endif /* TARGET_PPC64 */
 
+static void spr_read_thrm(DisasContext *ctx, int gprn, int sprn)
+{
+    gen_helper_fixup_thrm(cpu_env);
+    gen_load_spr(cpu_gpr[gprn], sprn);
+    spr_load_dump_spr(sprn);
+}
+
 static void gen_spr_thrm (CPUPPCState *env)
 {
    /* Thermal management */
    /* XXX : not implemented */
    spr_register(env, SPR_THRM1, "THRM1",
                 SPR_NOACCESS, SPR_NOACCESS,
-                 &spr_read_generic, &spr_write_generic,
+                 &spr_read_thrm, &spr_write_generic,
                 0x00000000);
    /* XXX : not implemented */
    spr_register(env, SPR_THRM2, "THRM2",
                 SPR_NOACCESS, SPR_NOACCESS,
-                 &spr_read_generic, &spr_write_generic,

target-ppc/translate_init.c static void gen_spr_amr(CPUPPCState *env, bool has_iamr) · line 1208

Quoted 10 lines
target-ppc/translate_init.c +2 -1
+                 &spr_read_thrm, &spr_write_generic,
                 0x00000000);
    /* XXX : not implemented */
    spr_register(env, SPR_THRM3, "THRM3",
                 SPR_NOACCESS, SPR_NOACCESS,
-                 &spr_read_generic, &spr_write_generic,
+                 &spr_read_thrm, &spr_write_generic,
                 0x00000000);
 }
 

I have test this patch using Mac OS 10.2.8, Mac OS 10.4.0, and Mac OS 9.2.2. They all worked. Mac OS 9.2.2 successfully booted with the multiprocessing folder in the Extensions folder.

Excellent job.