On 10/06/15 00:21, Cormac O'Brien wrote:
This patch adds an Adler-32 checksum function to OpenBIOS as required by Mac OS 9. This and the copyright patch have been split as requested by Mark Cave-Ayland.
Heh. I wouldn't worry about that last sentence, although I can fix that up on commit.
Signed-off-by: Cormac O'Brien i.am.cormac.obrien@gmail.com
arch/ppc/qemu/init.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+)
diff --git a/arch/ppc/qemu/init.c b/arch/ppc/qemu/init.c index 4fe8b72..f261e82 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,8 @@ arch_of_init(void)
/* Implementation of filll word (required by BootX) */ bind_func("filll", ffilll);
Small comment here about adler32 word being used by OS 9 (and possibly BootX according to Alex)? I know it's in the commit log but it's unusual enough that it's worth noting its users so we know which OSs we need to test if we decide to tweak the function in future (e.g. come up with a libopenbios version that works cross-architecture).
bind_func("adler32", adler32);
bind_func("platform-boot", boot); bind_func("(go)", go);
I'll compile-test it shortly, but the basic patch looks fairly solid. Given that QEMU freeze is coming up in a few days, I'll probably bundle up what we have in trunk now for 2.4 before committing this so then we have the freedom of the tree for the remainder of the summer :)
ATB,
Mark.