[OpenBIOS] [PATCH v4] ppc: add Adler-32 checksum capability

Mark Cave-Ayland mark.cave-ayland at ilande.co.uk
Thu Jun 11 00:15:26 CEST 2015


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 at 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.




More information about the OpenBIOS mailing list