[OpenBIOS] [PATCH] init: add Adler-32 checksum support

Mark Cave-Ayland mark.cave-ayland at ilande.co.uk
Mon Apr 20 20:38:05 CEST 2015


On 19/04/15 19:07, Cormac O'Brien wrote:

> From: Cormac O'Brien <cormac at c-obrien.org>
> 
> ---
>  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)

I think this stack diagram is back-to-front?

> + *
> + * Adapted from Mark Adler's zlib implementation */
> +
> +#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);
>      
>      bind_func("platform-boot", boot);
>      bind_func("(go)", go);


One thing to think about here is the subject line: I'd probably go for a
"ppc:" or similar prefix in order for two reasons: firstly there is more
than one init.c in the codebase, and secondly it's easy to tell from the
git shortlog that this patch only affects PPC and no other architecture.

Possibly there are a few minor whitespace changes that need some
touching up, but I'm generally happy with the mechanics of this patch -
I think with these minor points taken care of and a Signed-off-by then
this is ready for commit.


ATB,

Mark.




More information about the OpenBIOS mailing list