blob: 81666bb0350d0f632f1253d7129017b79cdb241e [file] [log] [blame]
#include <vfs.h>
#include <kfs.h>
#include <slab.h>
#include <kmalloc.h>
#include <kref.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <error.h>
#include <cpio.h>
#include <pmap.h>
#include <smp.h>
static short endian = 1;
static uint8_t *aendian = (uint8_t *) & endian;
#define LITTLE *aendian
uint16_t ptclbsum(uint8_t * addr, int len)
{
uint32_t losum, hisum, mdsum, x;
uint32_t t1, t2;
losum = 0;
hisum = 0;
mdsum = 0;
x = 0;
if (((uintptr_t) addr) & 1) {
if (len) {
hisum += addr[0];
len--;
addr++;
}
x = 1;
}
while (len >= 16) {
t1 = *(uint16_t *) (addr + 0);
t2 = *(uint16_t *) (addr + 2);
mdsum += t1;
t1 = *(uint16_t *) (addr + 4);
mdsum += t2;
t2 = *(uint16_t *) (addr + 6);
mdsum += t1;
t1 = *(uint16_t *) (addr + 8);
mdsum += t2;
t2 = *(uint16_t *) (addr + 10);
mdsum += t1;
t1 = *(uint16_t *) (addr + 12);
mdsum += t2;
t2 = *(uint16_t *) (addr + 14);
mdsum += t1;
mdsum += t2;
len -= 16;
addr += 16;
}
while (len >= 2) {
mdsum += *(uint16_t *) addr;
len -= 2;
addr += 2;
}
if (x) {
if (len)
losum += addr[0];
if (LITTLE)
losum += mdsum;
else
hisum += mdsum;
} else {
if (len)
hisum += addr[0];
if (LITTLE)
hisum += mdsum;
else
losum += mdsum;
}
losum += hisum >> 8;
losum += (hisum & 0xff) << 8;
while ((hisum = (losum >> 16)))
losum = hisum + (losum & 0xffff);
return losum & 0xffff;
}