[OpenBIOS] [PATCH] ppc: add Adler-32 checksum capability with copyright hack

Cormac O'Brien i.am.cormac.obrien at gmail.com
Tue May 26 18:48:09 CEST 2015


This patch implements Adler-32 checksum support for compatibility with Mac
OS 9. Since OS 9 is the only client known to use the Adler-32 function, we
bind the copyright message needed by OS 9 when the function is called.

Signed-off-by: Cormac O'Brien <i.am.cormac.obrien at gmail.com>

---
 arch/ppc/qemu/init.c  | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++
 arch/ppc/qemu/qemu.fs | 13 ++++++++++++
 2 files changed, 68 insertions(+)

diff --git a/arch/ppc/qemu/init.c b/arch/ppc/qemu/init.c
index 4fe8b72..84a3615 100644
--- a/arch/ppc/qemu/init.c
+++ b/arch/ppc/qemu/init.c
@@ -680,6 +680,58 @@ static void ffilll(void)
     }   
 }
 
+/*
+ * adler32        ( adler buf len -- checksum )
+ *
+ * Adapted from Mark Adler's original implementation (zlib license)
+ */
+
+#define DO1(buf,i)  {s1 += buf[i]; s2 += s1;}
+#define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);
+#define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);
+#define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);
+#define DO16(buf)   DO8(buf,0); DO8(buf,8);
+
+static void adler32(void)
+{
+    uint32_t len = (uint32_t)POP();
+    char *buf = (char *)POP();
+    uint32_t adler = (uint32_t)POP();
+
+    if (buf == NULL) {
+        RET(-1);
+    }
+
+    uint32_t base = 65521;
+    uint32_t nmax = 5552;
+
+    uint32_t s1 = adler & 0xffff;
+    uint32_t s2 = (adler >> 16) & 0xffff;
+
+    uint32_t k;
+    while (len > 0) {
+        k = (len < nmax ? len : nmax);
+        len -= k;
+
+        while (k >= 16) {
+            DO16(buf);
+            buf += 16;
+            k -= 16;
+        }
+        if (k != 0) {
+            do {
+                s1 += *buf++;
+                s2 += s1;
+            } while (--k);
+        }
+
+        s1 %= base;
+        s2 %= base;
+    }
+
+    RET(s2 << 16 | s1);
+}
+
 void
 arch_of_init(void)
 {
@@ -945,6 +997,9 @@ arch_of_init(void)
 
     /* Implementation of filll word (required by BootX) */
     bind_func("filll", ffilll);
+
+    /* Adler-32 required by Mac OS 9 */
+    bind_func("(adler32)", adler32);
     
     bind_func("platform-boot", boot);
     bind_func("(go)", go);
diff --git a/arch/ppc/qemu/qemu.fs b/arch/ppc/qemu/qemu.fs
index 458af1b..d2c6a4c 100644
--- a/arch/ppc/qemu/qemu.fs
+++ b/arch/ppc/qemu/qemu.fs
@@ -93,3 +93,16 @@ variable keyboard-phandle 0 keyboard-phandle !
 :noname
   set-defaults
 ; PREPOST-initializer
+
+\ -------------------------------------------------------------------------
+\ Apple copyright hack
+\ -------------------------------------------------------------------------
+
+: adler32 ( adler buf len -- checksum )
+  \ The only OS that calls this is Mac OS 9, so we take this opportunity to
+  \ patch in the required copyright string.
+  " /" find-device
+  " Copyright 1983-2001 Apple Computer, Inc. THIS MESSAGE FOR COMPATIBILITY PURPOSES ONLY. COPYRIGHT IS HELD BY THE OPENBIOS PROJECT AND ITS CONTRIBUTORS."
+  encode-string " copyright" property
+  " (adler32)" evaluate
+;
-- 
2.4.1




More information about the OpenBIOS mailing list