Am 19.04.2015 um 20:07 schrieb Cormac O'Brien:
From: Cormac O'Brien cormac@c-obrien.org
Not sure how strict we take this for OpenBIOS these days, but I notice that you haven't signed this off. You mention below another implementation - what license is that under, and did you copy code or just the algorithm? Would be worth a mention in the commit message.
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..f9989ed 100644 --- a/arch/ppc/qemu/init.c +++ b/arch/ppc/qemu/init.c @@ -680,6 +680,57 @@ static void ffilll(void) } }
+/* adler32 (len buf adler -- checksum)
- Adapted from Mark Adler's zlib implementation */
FWIW this end-of-comment looks unusual...
+#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 = POP();
- char *buf = POP();
- uint32_t adler = 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 +996,9 @@ arch_of_init(void)
/* Implementation of filll word (required by BootX) */ bind_func("filll", ffilll);
- /* Implementation of Adler-32 required by Mac OS 9 */
- bind_func("adler32", adler32);
I know OpenBIOS is inconsistent at this in places, but please make sure the two lines you add use the same indentation. :) Surrounding lines seem to use four spaces, not tabs.
bind_func("platform-boot", boot); bind_func("(go)", go);
Regards, Andreas