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@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 +;