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

Mark Cave-Ayland mark.cave-ayland at ilande.co.uk
Wed May 27 08:41:16 CEST 2015


On 26/05/15 17:48, Cormac O'Brien wrote:

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

Thinking about this again after some sleep, can we keep this as two
separate patches i.e. one for the adler32 and one for the copyright? The
reason here is that we know the behaviour of guests can change depending
upon this property value, so with two patches we get a definite
bisection point should a guest that previously worked starts to fail.
It's fairly easy to spin this out as a 2 patch series using git.

One of the things Alex mentioned yesterday was whether or not the
copyright patch would affect BootX or not, and so I'd like to see
something along the lines of "Tested on both OS 9 and BootX" included in
the commit message. Did you manage to test the 2 patches on any other
OSs at all?


ATB,

Mark.




More information about the OpenBIOS mailing list